/**
 * @name LocalLang
 * @version 0.1
 * @author Pierrick Caillon
 * @copyright (c) 2009 In Cité Solution
 * @fileoverview
 *     <p>This library provides a singleton helper to load TYPO3 locallang XML files.</p>
 */

/**
 * Load the specified locallang XML file.
 * @param {String} llfile The URL of the XML file to load.
 */
function LocalLang(llfile, prefix)
{
	if ((!LocalLang.singleton) && (llfile))
		LocalLang.singleton = new LocalLang(null);
	if ((this != LocalLang.singleton) && (llfile))
		return LocalLang.call(LocalLang.singleton, llfile);
	if (!llfile)
		return;
	this.query(llfile, prefix);
}
/**
 * The loaded language keys.
 */
LocalLang.keys = {};
/**
 * Instantiate an XMLHttpRequest object.
 * @return A new XMLHttpRequest object.
 */
LocalLang.prototype.createXmlHttp = function()
{
	var A = null;
	if (typeof ActiveXObject != 'undefined')
	{
		try
		{
			A = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			try
			{
				A = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (oc)
			{
				A = null;
			}
		}
	}
	if (!A && typeof XMLHttpRequest != 'undefined')
	{
		A = new XMLHttpRequest();
	}
	return A;
};
/**
 * Send an XMLHTTP query to the serveur for the specified file.
 */
LocalLang.prototype.query = function(llfile, prefix)
{
	var x;
	x = this.createXmlHttp();
	if (!x)
		return;
	LocalLang.onLoaded.loading++;
	x.open('GET', llfile, true);
	x.onreadystatechange = function()
	{
		if (x.readyState != 4)  {
			return;
		}
		if ((x.status != 200) || (x.responseText == ''))
		{
			fdgmap.queryError(x, params);
			return;
		}
		var result = x.responseXML;
		LocalLang.singleton.importKeys(llfile, result, prefix);
	}
	x.send(null);
};
LocalLang.prototype.importKeys = function(llfile, result, prefix)
{
	var rootEl = result.documentElement;
	if (rootEl == null)
		return;
	var data = arguments.callee.getElements.call(rootEl, 'data');
	if (data.length == 0)
		return;
	data = data[0];
	var langKeys = arguments.callee.getElements.call(data, 'languageKey');
	var applicableLangKeys = [ null, null ];
	var lang = arguments.callee.getLang();
	for (var name in langKeys)
	{
		if (langKeys[name].getAttribute('index') == 'default')
			applicableLangKeys[0] = langKeys[name];
		if (lang && (langKeys[name].getAttribute('index') == lang))
			applicableLangKeys[1] = langKeys[name];
	}
	for (var index in applicableLangKeys)
	{
		var langKey = applicableLangKeys[index];
		if (!langKey)
			continue;
		var childNodes = langKey.childNodes;
		for (var i = 0; i < childNodes.length; i++)
		{
			var node = childNodes.item(i);
			if (node.nodeType != 1)
				continue;
			var key = node.getAttribute('index');
			var value = node.firstChild ? node.firstChild.nodeValue : '';
			if (prefix) key = prefix + key;
			LocalLang.keys[key] = value;
		}
	}
	LocalLang.onLoaded.loading--;
	if (LocalLang.onLoaded.loading == 0) {
		while (LocalLang.onLoaded.handlers.length > 0) {
			LocalLang.onLoaded.handlers.shift()();
		}
	}
};
// Called into node context
LocalLang.prototype.importKeys.getElements = function(elementName)
{
	var nodeList = [];
	var childNodes = this.childNodes;
	for (var i = 0; i < childNodes.length; i++)
	{
		if (childNodes.item(i).nodeName == elementName)
			nodeList.push(childNodes.item(i));
	}
	return nodeList;
};
LocalLang.prototype.importKeys.getLang = function()
{
	var lang = document.documentElement.getAttribute('lang');
	if (!lang)
		return null;
	return lang;
};
LocalLang.getLL = function(key, def)
{
	if (LocalLang.keys[key])
		return LocalLang.keys[key];
	if (def)
		return def;
	if (this.debug)
		return '<' + key + '>';
	return '';
};
LocalLang.onLoaded = function(handler) {
	if (!handler)
		return;
	if (arguments.callee.loading == 0) {
		handler();
	}
	else {
		arguments.callee.handlers.push(handler);
	}
}
LocalLang.onLoaded.loading = 0;
LocalLang.onLoaded.handlers = [];

