function AjaxCallbacks()
{
	this.dynamics = new Array;

	this.FillCombo = function (action, doc, selectbox, selectedValue, pattern, callback, wrapper)
	{		
		if (selectbox)
		{		
			if (typeof(selectbox)=="string") selectbox = document.getElementById(selectbox);				
			//selectbox.style.width = "100%";
			for(var i=selectbox.childNodes.length-1;i>-1;i--)
			{
				selectbox.removeChild(selectbox.childNodes[i]);
			}			

			if (!Tangora.Browser.Safari)
			{
				if (!pattern) pattern = "//response[@action='"+action+"']/item";
				var nodelist = doc.selectNodes(pattern);			
				var node = nodelist.Next();
				while (node)
				{							
					var opt = document.createElement("option");			
					opt.innerHTML = node.text;			
					opt.value = node.getAttribute("value");
					if (selectedValue) 
					{
						if (selectedValue==opt.value) opt.selected = true;
					}
					else
					{
						if (node.getAttribute("selected") == "true") opt.selected = true;
					}
					selectbox.appendChild(opt);				
					node = nodelist.Next();
				}
			}
			else
			{			
				var nodelist = doc.parser.getElementsByTagName("item");
				for (var i=0;i<nodelist.length;i++)
				{
					var node = nodelist[i];
//if (i==0) alert(node.childNodes[0].innerHTML);
					var opt = document.createElement("option");			
					opt.innerHTML = node.childNodes[0].data;	
					opt.value = node.getAttribute("value");
					if (selectedValue) 
					{
						if (selectedValue==opt.value) opt.selected = true;
					}
					else
					{
						if (node.getAttribute("selected") == "true") opt.selected = true;
					}
					selectbox.appendChild(opt);				
				}
			}

			if(wrapper)
			{
				selectbox.disabled = false;
				wrapper.style.display = "none";
				if (Tangora.Browser.IE && parseFloat(Tangora.Browser.Version)<7.0) selectbox.style.visibility = "visible";
			}

			if (callback) callback(selectbox, doc);
		}
	}
	
	this.DynamicContent = function (action, doc, ident, invoker, reciver, pattern)
	{			
		var src = document.getElementById(invoker);	
		var rec = document.getElementById(reciver);	
		var storage = Util.AjaxCallbacks.dynamics[ident];
		if (!storage) 
		{
			Util.AjaxCallbacks.dynamics[ident] = new Object();
			storage = Util.AjaxCallbacks.dynamics[ident];
			storage.doc = doc;
			storage.ident = ident;
			storage.invoker = src;			
			storage.reciver = rec;			
			storage.pattern = pattern;				
			rec.lastSelectedIndex = -1;
			rec.onkeyup = function(e) 
			{
				if(!e) e=window.event; 
				src = document.getElementById(invoker);
				if(e.keyCode==13 && this.selectedIndex>-1) 
				{
					src.value=this.options[this.selectedIndex].text; 
					this.style.display='none';
					src.focus();
				}
				if (e.keyCode==38)				
				{				
					if (this.selectedIndex==0 && this.lastSelectedIndex==0)	
					{						
						this.style.display='none';					
						src.focus();
					}
					else if (this.selectedIndex==0 && this.lastSelectedIndex!=0)
					{
						this.lastSelectedIndex = 0;
					}
					else this.lastSelectedIndex = this.selectedIndex;
				}
			}
		}		
		if (src)
		{
			tsCompat.addEvent(src,"onkeyup",function (e) {Util.AjaxCallbacks.DynamicLoad(ident, e)});			
		}
	}
	
	this.DynamicLoad = function (ident, e)
	{
		var storage = Util.AjaxCallbacks.dynamics[ident];
		if (e.keyCode!=40)
		{					
			var filter = storage.invoker.value;
			var pattern = storage.pattern;
			var s = pattern.replace(/\{0\}/gi, "'"+filter+"'");		
			document.title = s;			
			for(var i=storage.reciver.childNodes.length-1;i>-1;i--)
			{
				storage.reciver.removeChild(storage.reciver.childNodes[i]);
			}			
			this.FillCombo(ident, storage.doc, storage.reciver, '', s);
			if (storage.reciver.style.display=="none") storage.reciver.style.display = "block";
		}
		else
		{
			if (storage.reciver.style.display=="none") storage.reciver.style.display = "block";
			storage.reciver.focus();
			storage.reciver.selectedIndex = 0;
		}		
		
		//alert(storage.doc.root.collection.length);
	}
}

function AjaxHandlers()
{
	this.LoadComboboxContent = function(action_handler_name, additional_parameters, reciever, currently_selectedvalue, callback, waittext)
	{
		this.display = function()
		{
			if (wrapper.style.display!="none")
			{
				wrapper.style.visibility = "visible";		
				wrapper.removeAttribute("visibility");
				reciever.disabled = true;
				if (Tangora.Browser.IE && parseFloat(Tangora.Browser.Version)<7.0) reciever.style.visibility = "hidden";
			}
		}
		var wrapper = null;

		if(waittext)
		{
			if (typeof(reciever)=="string") reciever = document.getElementById(reciever);
			
			wrapper = document.createElement("span");
			wrapper.id = "waittext_" + reciever.id;
			wrapper.className = "section waittext";
			wrapper.style.visibility = "hidden";		
			wrapper.innerHTML = waittext;
			wrapper.style.position = "absolute";
			wrapper.style.marginLeft = "5px"; 
			reciever.parentNode.insertBefore(wrapper,reciever);
			wrapper.style.marginTop = (Math.round((reciever.offsetHeight - wrapper.offsetHeight)/2)>0)?Math.round((reciever.offsetHeight - wrapper.offsetHeight)/2):0 +"px"; 	
			window.setTimeout(this.display, 500);
		}

		Util.AjaxLib.ASyncGET(action_handler_name, additional_parameters, Util.AjaxCallbacks.FillCombo, reciever, currently_selectedvalue, null, callback, wrapper);
	}
	
	this.CreateDynamicList = function(action_handler_name, additional_parameters, ident, invoker, reciver, pattern)
	{
		Util.AjaxLib.ASyncGET(action_handler_name, additional_parameters, Util.AjaxCallbacks.DynamicContent, ident, invoker, reciver, pattern);
	}
	
	this.GetValueArray = function(action, qstring)
	{
		var s = Util.AjaxLib.SyncGET(action, qstring, null);
		var doc = new XML();
		doc.LoadXML(s);
		pattern = "//response[@action='"+action+"']/item";

		var arj = [];
		var nodelist = doc.selectNodes(pattern);			
		var node = nodelist.Next();
		while (node)
		{		
			var attrlist = node.attributes();
			while(attrlist.Next())
			{
				arj.push(attrlist.Current.value);				
			}
			node = nodelist.Next();
		}
		if (arj.length==0) return null;
		return arj;
	}
	
}

if (typeof(Util)=="undefined") Util = new Object();
Util.AjaxCallbacks = new AjaxCallbacks();
Util.AjaxHandlers = new AjaxHandlers();

