mam.siteSelector = new function() {
	var that = this;
	// Public Methods
	jQuery.extend(this,  {
		version: "1.0",
		config: mam.config,
		indexHandler: function() {
			if(!mam.util.env.isDefaultHost()) {
				forwardToHomePage();
			} else {
				if(loadCookie()) {
					mam.config.initialize(function() {
						forwardToHomePage({host: getSiteHost()});
					}, {
						controlXml: true,
						siteSelectorXml: true
					});
				} else {
					forwardToSiteSelector();
				}
			}
		},
		siteSelectorHandler: function() {
			if(!mam.util.env.isDefaultHost()) {
				forwardToSiteSelector();
			} else {
				mam.config.initialize(function() {
					$(document).ready(function() {
						mam.page.setTitle("Site Selector");
						mam.page.setLogo();
						$("#location").change(function() {changeLocation()}); // initialise change location behaviour
						$("#go-button").click(function() {go(); return false;}); // initialise go button behaviour
						mam.util.dom.initSelect($("option", mam.util.dom.getElementsByAttribute($("select", mam.config.getSiteSelectorXml()), "id", "location")), $("#location").get(0));
						mam.util.dom.initSelect($("option", mam.util.dom.getElementsByAttribute($("select", mam.config.getSiteSelectorXml()), "id", "client-type")), $("#client-type").get(0));
						loadCookie();
						$("#location").get(0).value = location;
						var key = getMappingKey();
						var options = $("entry", mam.util.dom.getElementsByAttribute($("site-selector/mappings/key", mam.config.getSiteSelectorXml()), "id", key));
						mam.util.dom.filterSelect(options, $("#client-type").get(0));
						
						$("#client-type").get(0).value = clientType;
						$("#remember").get(0).checked = remember;
					});
				}, {
					controlXml: true,
					siteConfigXml: true,
					siteSelectorXml: true
				});
			}
		}
	});
	var siteSelectorPath = "/core/site_selector.html";
	var homePagePath = "/core/home/home.html";
	var location = "";
	var clientType = "";
	var remember = "";
	var cookieExists = false;
	
	// Private Methods
	var getSite = function() {
		var key, site, keyElements, entryElements;
		key = getMappingKey();
		keyElements = mam.util.dom.getElementsByAttribute($("site-selector/mappings/key", that.config.getSiteSelectorXml()), "id", key);
		// alert(keyElements.size());
		entryElements = mam.util.dom.getElementsByAttribute($("entry", keyElements), "id", clientType);
		// alert(entryElements.size());
		if(entryElements.size() != 0) {
			site = entryElements.get(0).getAttribute("site");
		} else { // no match return default
			site = "default";
		}
		// alert("getSite: "+site);
		return site;
	};
	var getMappingKey = function() {
		var key, mappingKeyElements, mappingGroupKeyElements, entryElements;
		// 1. explicit mapping
		mappingKeyElements = mam.util.dom.getElementsByAttribute($("site-selector/mappings/key", that.config.getSiteSelectorXml()), "id", location);
		mappingGroupKeyElements = mam.util.dom.getElementsByAttribute($("site-selector/mapping-groups/mapping-group/key", that.config.getSiteSelectorXml()), "id", location);
		// alert("getMappingKey: mappingKeyElements.size(): "+mappingKeyElements.size());
		if(mappingKeyElements.size() != 0) {
			key = location;
		}
		// 2. mapping group
		else if(mappingGroupKeyElements.size() != 0) {
			key = $("..", mappingGroupKeyElements).get(0).getAttribute("id");
		}
		// 3. default
		else {key = "default";}
		//alert("getMappingKey: key: "+key);
		return key;
	};
	var clearCookie = function() {
		var cookie = new Cookie(document, "site-selector", 0 , "/", null, false);
		cookie.remove();
	};
	var forwardToSiteSelector = function(parms) {
		var url;
		if(!parms) {
			parms = {
				preserveHistory: false,
				test: false
			}
		}
		// // alert("forwardToSiteSelector: host: "+parms.host+"\npreserveHistory: "+parms.preserveHistory+"\ntest: "+parms.test);
		url = mam.util.url.constructURL({
			host: mam.util.env.getDefaultHost(),
			pathname: siteSelectorPath
		});
		// var url = document.location.protocol+"//"+this.getDefaultHost()+this.siteSelectorPath;
		mam.util.url.forward({
			url: url,
			preserveHistory: parms.preserveHistory,
			test: parms.test
		});
	};
	var forwardToHomePage = function(parms) {
		var url;
		if(!parms) {
			parms = {
				host: "",
				preserveHistory: false,
				test: false
			}
		}
		if(parms.host == undefined) parms.host = "";
		// alert("forwardToHomePage: host: "+parms.host+"\npreserveHistory: "+parms.preserveHistory+"\ntest: "+parms.test);
		url = mam.util.url.constructURL({
			host: parms.host,
			pathname: homePagePath
		});
		// if(parms.host != "") url = document.location.protocol+"//"+parms.host;
		// url += this.homePagePath;
		mam.util.url.forward({
			url: url,
			preserveHistory: parms.preserveHistory,
			test: parms.test
		});
	};
	var getSiteHost = function(site) {
		var host, siteElements, hostElements;
		if(mam.config.getControlXml() != undefined) {
			if(site == undefined) site = getSite();
			// alert("method: getSiteHost\n\nsite: "+site+"\n\nenv: "+mam.util.getEnvName()+"\n\nlocation: "+this.location+"\n\nclientType: "+this.clientType);
			siteElements = mam.util.dom.getElementsByAttribute($("site", mam.config.getControlXml()), "id", site);
			if(siteElements.size() == 0) {site = "default";} // if site not found, try default
			siteElements = mam.util.dom.getElementsByAttribute($("site", mam.config.getControlXml()), "id", site);
			hostElements = mam.util.dom.getElementsByAttribute($("host", siteElements), "env", mam.util.env.getEnv());
			var host = hostElements.get(0).getAttribute("name");
		} else {
			host = "";
		}
		// alert("getSiteHost: "+host);
		return host;
	};
	var loadCookie = function() {
		var cookie = new Cookie(document, "site-selector", 8760 , "/", null, false);
		if(cookie.load()) {
			cookieExists = true;
			location = cookie.location;
			clientType = cookie.clientType;
			remember = cookie.remember;
		} else {
			cookieExists = false;
		}
		return cookieExists;
	};
	var storeCookie = function() {
		var cookie = new Cookie(document, "site-selector", 8760 , "/", null, false);
		cookie.location = location;
		cookie.clientType = clientType;
		cookie.remember = remember;
		cookie.store();
	};
	var setLocation = function(p_location) {
		location = p_location;
	};
	var setClientType = function(p_clientType) {
		clientType = p_clientType;
	};
	var setRemember = function(p_remember) {
		remember = p_remember;
	};
	var go = function() {
			if($("#location").get(0).value == "") {
				alert("Please select your location.");
				$("#location").get(0).focus();
				return false;
			}
			if($("#client-type").get(0).value == "") {
				alert("Please select your client type.");
				$("#client-type").get(0).focus();
				return false;
			}
			setLocation($("#location").get(0).value);
			setClientType($("#client-type").get(0).value);
			setRemember($("#remember").get(0).checked);
			if(remember) storeCookie(); else clearCookie();
			forwardToHomePage({host: getSiteHost(), preserveHistory: true});
			return true;
		};
	var changeLocation = function() {
			setLocation($("#location").get(0).value);
			setClientType($("#client-type").get(0).value);
			var key = getMappingKey();
			var options = $("entry", mam.util.dom.getElementsByAttribute($("site-selector/mappings/key", mam.config.getSiteSelectorXml()), "id", key));
			// alert(options.size());
			mam.util.dom.initSelect($("option", mam.util.dom.getElementsByAttribute($("select", mam.config.getSiteSelectorXml()), "id", "client-type")), $("#client-type").get(0));
			mam.util.dom.filterSelect(options, $("#client-type").get(0));
			$("#client-type").get(0).value = clientType;
		};
}
