﻿// JScript File
function getXMLHTTP()
{
	var A = null;
	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;
}

// controller for AjaxDropDownList
function AjaxDropDownController(controlClientId, lookupName, baseUrl)
{
	var self = this;
	
	// public members
	this.controlClientId = controlClientId;
	this.hiddenId = "__" + self.controlClientId;
	this.lookupName = lookupName;
	this.baseUrl = baseUrl;
	this.delimiter = "|";

	// XMLHTTP object
	var xmlHttp;

	// array to store observer list
	var observers = [];			
    var observersselect = [];			
    var InitialValue = -1;
    var BaseID = -1;

	// public methods
	this.getSource = getSource;
	this.addObserver = addObserver;
    this.addObserverSelect = addObserverSelect;
	this.notify = notify;
	this.load = load;
    this.updateSelected = updateSelected;
    this.getSelectedSource = getSelectedSource;
    this.DoUpdateSelected = DoUpdateSelected;
    this.doReadyStateChangeSelected = doReadyStateChangeSelected;
    
    this.SetInitialValue = SetInitialValue;
    this.init = init;
    this.preinit = preinit;
	this.persist = persist;

	// call XMLHTTP to get source data
	function getSource(filter)
	{
		var requestUrl = baseUrl + "?id=" + self.lookupName + "&tid=" + new Date().getTime();
		
		if (filter != undefined && filter != "")
		{
			requestUrl += "&filter=" + filter;
		}
		xmlHttp = getXMLHTTP();
		if (xmlHttp)
		{
			//alert(requestUrl);
			xmlHttp.onreadystatechange = doReadyStateChange;
			xmlHttp.open("GET", requestUrl, true);
			xmlHttp.send(null);
		}			
	}

	function getSelectedSource(filter)
	{
		var requestUrl = baseUrl + "?id=" + self.lookupName + "&tid=" + new Date().getTime();
		if (filter != undefined && filter != "")
		{
			requestUrl += "&filter=" + filter;
		}
        
        requestUrl += "&parentnode=true";
		
        xmlHttp = getXMLHTTP();
		if (xmlHttp)
		{
			//alert(requestUrl);
			xmlHttp.onreadystatechange = doReadyStateChangeSelected;
			xmlHttp.open("GET", requestUrl, true);
			xmlHttp.send(null);
		}			
	}			

	// process the response from XMLHTTP
	function doReadyStateChange()
	{
		if (xmlHttp.readyState == 4)
		{
			if (xmlHttp.status == 200)
			{
                try
                {   
				    eval("var d=" + xmlHttp.responseText);
				    if (d != null)
				    {
					    populateList(d);
				    }
                }
                catch(err) {}
			}
			else
			{
				//alert("There was a problem retrieving the data:\n" + xmlHttp.statusText);
			}
		}			
	}

	// process the response from XMLHTTP
	function doReadyStateChangeSelected()
	{
		if (xmlHttp.readyState == 4)
		{
			if (xmlHttp.status == 200)
			{
                try
                {   
					eval("var d=" + xmlHttp.responseText);
					if (d != null)
    				{
	    				DoUpdateSelected(d);
		    		}
                }
                catch(err) {}
			}
			else
			{
				//alert("There was a problem retrieving the data:\n" + xmlHttp.statusText);
			}
		}			
	}

	function DoUpdateSelected(namevalue)
	{
        if (oSelect = document.getElementById(self.controlClientId))
		{
            oSelect.value = namevalue;
        }
    }
	
	// populate dropdownlist
	function populateList(namevalue)
	{
		if (oSelect = document.getElementById(self.controlClientId))
		{
			var content = "";
			
			// clear dropdownlist

            if (namevalue.length > 0)
            {
			    for(var i=oSelect.length-1; i>=0; i--)
			    {
				    oSelect.options[i] = null;
			    }
            }

			// populate dropdownlist from name-value object
			for(var i=0; i<namevalue.length; i++)
			{
				if (namevalue[i].value == undefined)
				{
					oSelect.options[oSelect.length] = new Option(namevalue[i].name);
					content += namevalue[i].name + self.delimiter + namevalue[i].name + self.delimiter;
				}
				else
				{
					opt = new Option(namevalue[i].name, namevalue[i].value);
					oSelect.options[oSelect.length] = opt;
					content += namevalue[i].name + self.delimiter + namevalue[i].value + self.delimiter;
				}
			}

    		// persist the content of dropdownlist as
			// value-delimited string in hidden field
			if (content.substr(content.length-1,1) == self.delimiter)
			{
				content = content.substr(0, content.length-1);
			}
			
			if (oHidden = document.getElementById(self.hiddenId))
			{
				oHidden.value = content;
			}

			if (oSelect.selectedIndex < -100)
            {
				if (oSelect.fireEvent)
				{
					oSelect.fireEvent("onchange");
				}
				else if(oSelect.dispatchEvent)
				{
					var oEvent = document.createEvent("HTMLEvents"); 
					oEvent.initEvent("change", true, true);
					oSelect.dispatchEvent(oEvent);
				}
			}
            if (InitialValue != -1)
            {
                oSelect.value = InitialValue;
                InitialValue = -1;
            }
		}
	}
	
	// add observer
	function addObserver(obj)
	{
		var length = observers.length;
		var found = false;
		for (var i=0; i<length; i++)
		{
			if (observers[i] == obj)
			{
				found = true;
				break;
			}
		}
		if (!found)
		{
			observers[observers.length] = obj;
		}			
	}

	function SetInitialValue(thevalue)
	{
	    InitialValue = thevalue;
	}

	// add observer
	function addObserverSelect(obj)
	{
		var length = observersselect.length;
		var found = false;
		for (var i=0; i<length; i++)
		{
			if (observersselect[i] == obj)
			{
				found = true;
				break;
			}
		}
		if (!found)
		{
			observersselect[observersselect.length] = obj;
		}			
	}
	
	// notify all observers
	function notify()
	{
		var filter = "";
		var oSelect = document.getElementById(self.controlClientId);
		
		var dDest = BaseID + 'ddlDest';
		var dGroup = BaseID + 'ddlGroup';
		var dCountry = BaseID + 'ddlCountry';
		var dCounty = BaseID + 'ddlCounty';
		
		if (oSelect != null && oSelect.selectedIndex != -1)
		{
			filter = self.lookupName + "," + oSelect.options[oSelect.selectedIndex].value;
		}

		for(i=0; i<observers.length; i++)
		{
            if (observers[i] == BaseID + 'ddlGroup' && oSelect.value == '-1')
            {
            }
            else
            {
                eval(observers[i] + '.load(filter);');
                //eval('if (' + observers[i] + '.InitialValue == -1) { ' + observers[i] + '.load(filter); } else { InitialValue = -1; }');
            }
		}

		for(i=0; i < observersselect.length; i++)
		{
			eval(observersselect[i] + '.updateSelected(filter);');
		}

        if (self.controlClientId != dGroup)
        {
            var oddlDest = document.getElementById(dDest);
            var destfilter = "";

            if (oddlDest.selectedIndex > 0)
            {
                destfilter = self.lookupName + "," + oddlDest.options[oddlDest.selectedIndex].value;
                eval(dGroup + '.load(destfilter);');
            }
            else
            {
                var oddlCounty = document.getElementById(dCounty);
                var countyfilter = "";

                if (oddlCounty.selectedIndex > 0)
                {
                    countyfilter = self.lookupName + "," + oddlCounty.options[oddlCounty.selectedIndex].value;
                    eval(dGroup + '.load(countyfilter);');
                }
                else
                {
                    var oddlCountry = document.getElementById(dCountry);
                    var countryfilter = "";

                    if (oddlCountry.value > 0)
                    {
                        countryfilter = self.lookupName + "," + oddlCountry.options[oddlCountry.selectedIndex].value;
                        eval(dGroup + '.load(countryfilter);');
                    }
                }
            }
        }
	}
	
	// load the source data for corresponding dropdownlist
	function updateSelected(filter)
	{
        this.getSelectedSource(filter);
    }

	// load the source data for corresponding dropdownlist
	function load(filter)
	{
		this.getSource(filter);
	}
	
	// initialize corresponding dropdownlist

	function preinit(theID)
	{
		if ((oSelect = document.getElementById(self.controlClientId)))
		{
		    BaseID = theID;
			// create hidden field to store dropdownlist content
			if (!(hidden = document.getElementById(self.hiddenId)))
			{
				hidden = document.createElement("input");
				hidden.id = self.hiddenId;
				hidden.name = self.hiddenId;
				hidden.type = "hidden";
				oSelect.form.appendChild(hidden);
			}				

			// load source data if dropdownlist is empty,
			// otherwise persist existing content
			if (oSelect.options.length == 0)
			{
                oSelect.options[oSelect.length] = new Option("--Select--");						
				this.load();
			}
			else
			{
				this.persist(oSelect);
			}
		}
	}


	function init()
	{
		if ((oSelect = document.getElementById(self.controlClientId)))
		{
			// attach notify event handler to onchange event
			if (oSelect.attachEvent)
			{
				oSelect.attachEvent("onchange", notify);
			}
			else if (oSelect.addEventListener)
			{
				oSelect.addEventListener("change", notify, false);
			}
			else
			{
				oSelect.onchange = notify;
			}
		}
	}
	
	// persist existing content of dropdownlist to hidden field
	function persist(oSelect)
	{
		var content = "";
		for(var i=0; i<oSelect.options.length; i++)
		{
			content += oSelect.options[i].text + self.delimiter + oSelect.options[i].value + self.delimiter;
		}
		
		if (content.substr(content.length-1,1) == self.delimiter)
		{
			content = content.substr(0, content.length-1);
		}
		
		if ((hidden = document.getElementById(self.hiddenId)))
		{
			hidden.value = content;
		}
	}
}