if (typeof(Function.prototype.bind) != "function")
{
	Function.prototype.bind = function(object) {
	  var func = this;
	  return function() { return func.apply(object, arguments); }
	}
}


var LanguageSelectController = function (source, countrySelector, languageSelector) { 
	this._countrySelector = (typeof(countrySelector) == "string") ? document.getElementById(countrySelector) : countrySelector;
	this._languageSelector = (typeof(languageSelector) == "string") ? document.getElementById(languageSelector) : languageSelector;
	
	this._languageSelectXMLDoc = {};
	this._languageSelectObj = {};
	
	this._countrySelector.onchange = this._countryChanged.bind(this);
	
	
	//detect type of source.  for now assume XML	
	this._source = source;
	if (typeof(source) == "string") {
		if (source.indexOf(".xml") != -1)  { //XML File
			this._importLanguageSelectXML(source);
		}
		else if (source.indexOf(".jsp") != -1) { //JSP File
			this._importLanguageSelectJSP(source);
		}
		else if (source.indexOf(".js") != -1) { //JSON File
			this._importLanguageSelectJSON(source);
		}
		else { //JSON String
			this._parseLanguageSelectJSON(source);
		}
	}
	else if (typeof(source) == "object")
	{
		
		this._languageSelectObj = this._processLanguageSelectObj(source);
		this._setupLanguageSelectors();
	}
	
	else { alert("Language Selector: Unsupported Data Format");}
	
	
}


LanguageSelectController.prototype = {
	_importLanguageSelectXML: function(xmlLocation) {
		if (document.implementation && document.implementation.createDocument)
		{
			this._languageSelectXMLDoc = document.implementation.createDocument("", "", null);
			this._languageSelectXMLDoc.onload = this._processLanguageSelectXML.bind(this);
		}
		else if (window.ActiveXObject)
		{
			this._languageSelectXMLDoc = new ActiveXObject("Microsoft.XMLDOM");
			this._languageSelectXMLDoc.onreadystatechange = function () {
				if (this._languageSelectXMLDoc.readyState == 4) this._processLanguageSelectXML();
			}.bind(this);
		}
		else
		{
			alert('Your browser can\'t handle this script');
			return;
		}
		this._languageSelectXMLDoc.load(xmlLocation);
	},

	_processLanguageSelectJSP: function(source) {
		var domParser = new DOMParser();
		this._languageSelectXMLDoc = domParser.parseFromString(source, "text/xml");
	
		this._processLanguageSelectXML();
	},

	_importLanguageSelectJSP: function(jspLocation) {
		if (document.implementation && document.implementation.createDocument) {
			this._getUrlContents(jspLocation, this._processLanguageSelectJSP.bind(this));
		}
		else {
			this._importLanguageSelectXML(jspLocation);
		}
	},

	_importLanguageSelectJSON: function(jsonLocation) {
		this._getUrlContents(jsonLocation, this._parseLanguageSelectJSON.bind(this));
	},
	

	_processLanguageSelectXML: function() {
		var countries = this._languageSelectXMLDoc.getElementsByTagName("country");
		var str = "";

		var _tempObj = {};


		for (var i = 0; i < countries.length ; i++ )
		{
			var countryName = countries[i].getAttribute("name");
			var countryCode =  countries[i].getAttribute("code");

			var languages = countries[i].getElementsByTagName("language");

			var languagesObj = Array();
			
			for (var j = 0; j < languages.length ; j++ )
			{
					var languageName = languages[j].firstChild.nodeValue
					var languageCode = languages[j].getAttribute("code");
					var url=languages[j].getAttribute("url");
					languagesObj.push({name:languageName, url:url, code:languageCode});
			}
			
			_tempObj[countryName] = {code: countryCode, languages: languagesObj};
			
		}
		this._languageSelectObj = this._processLanguageSelectObj(_tempObj);
		this._setupLanguageSelectors();
	},

	_parseLanguageSelectJSON: function(source) {
		try
		{
			this._languageSelectObj= this._processLanguageSelectObj(eval("(" + source + ")"));
		}
		catch (e)
		{
			alert("Language Selector: Unable to parse JSON String. " );
		}
		
		this._setupLanguageSelectors();
	},
	_processLanguageSelectObj: function(obj) {
		for (var country in obj ) {
			
			//fill in null country codes
			if (obj[country].code == null) 
				obj[country].code = country;
			
			
			for (var language in obj[country].languages ) {
				language = obj[country].languages[language];
				
				if (language.code == null)
					language.code = language.name;
			}
		}

		return obj;
	},

	_setupLanguageSelectors: function() {
		
		for (var country in this._languageSelectObj )
		{
			var countryName = country;
			var countryCode = this._languageSelectObj[countryName].code;
			
			var index = this._countrySelector.options.length;
			this._countrySelector.options[index] = new Option(countryName, countryCode);
		}

		this._countryChanged();
	},

	_countryChanged: function() {
		var countryName = this._countrySelector[this._countrySelector.selectedIndex].text;
		var languages = this._languageSelectObj[countryName].languages;
		
		this._removeChildrenFromNode(this._languageSelector);
		for (var i = 0; i < languages.length; i++)
		{
			var languageCode = languages[i].code;
			var languageName = languages[i].name;
			var businessUrl=languages[i].url;
			this._languageSelector.options[this._languageSelector.options.length] = new Option(languageName, languageCode + "|" + businessUrl);
		}
	},
	
	_removeChildrenFromNode: function(node) {
		if (node.childNodes == null)
			return;
		
		var len = node.childNodes.length;
   
		while (node.hasChildNodes())
		{
		  node.removeChild(node.firstChild);
		}
	},

	_getUrlContents: function (url, callback) {
		var req = false;
		// branch for native XMLHttpRequest object
		if(window.XMLHttpRequest && !(window.ActiveXObject)) {
			try {
				req = new XMLHttpRequest();
				req.overrideMimeType('text/xml');
			} catch(e) {
				req = false;
			}
		// branch for IE/Windows ActiveX version
		} else if(window.ActiveXObject) {
			try {
				req = new ActiveXObject("Msxml2.XMLHTTP");
			} catch(e) {
				try {
					req = new ActiveXObject("Microsoft.XMLHTTP");
				} catch(e) {
					req = false;
				}
			}
		}
		if(req) {
			req.onreadystatechange = function ( ) { if (req.readyState == 4) { callback(req.responseText) }};
			req.open("GET", url, true);
			req.send("");
		}
	}


}