﻿function TipTypeObject(id,dataSourceName,GlobalMenu,isCaseSensitive,findFromMiddle,isXML,maxRet,bufferQueries,ddWidth,ddMainClass,ddNormalClass,ddSelectClass,ddFoundClass,tAtt,vAtt,sp,appendStatParameter,je,enableJSMatch)
{
	var statPar=appendStatParameter;
	var sp=sp;
	var id=id;
	var dropDownWidth=ddWidth;
	var menu=null; //GlobalMenu;
	var retIds;
	var caseSensitive=isCaseSensitive;
	var findFromMid=findFromMiddle;
	var isXML=isXML;
	var maxRet=maxRet;
	var bufferQuery=bufferQueries;
	var loopMenu;
	var seld=-1;
	var bufferKeys=new Array;
	var buffer=new Array;
	var lastRequest='';
	var objsKeyPress;
	var objsOnBlur;
	var docsKeyDown;
	var div;
	var allowTouch=true;
	var getIndex;
	var obj;
	var idHidden;
	var myXML;
	var typeOfComponent;
	var dataSourceName=dataSourceName;
	var ddMain=ddMainClass;
	var ddNormal=ddNormalClass;
	var ddSelect=ddSelectClass;
	var ddFoundSelection=ddFoundClass;
	var textAttributeLocation=tAtt;
	var valueAttributeLocation=vAtt;
	var inImmed=false;
	var je=je;
	var enableJSMatch=enableJSMatch;
	
	this.prepareComplete=prepareComplete;
	this.quitComplete=quitComplete;
	this.removeDD=removeDD;
	this.touchBlocker=touchBlocker;
	this.hKeyDown=hKeyDown;
	this.select=tipType_select;
	this.checkForComplete=checkForComplete;
	this.checkDelegate=checkDelegate;
	this.getActive=getActive;
	this.prepareDD=prepareDD;
	this.ResultScript=ResultScript;
	this.menuFromXml=menuFromXml;
	this.validator=validate;
	this.setMiddleSearch=setMiddleSearch;
	this.setCaseSensitivity=setCaseSensitivity;
	this.setMaximumRetrieve=setMaximumRetrieve;
	this.setBuffering=setBuffering;
	this.performingImmediateAction=performingImmediateAction;
	this.isInList=isInList;
	this.setSP=setSP;
	try{this.immediateAction=immediateAction;}catch(ex) {}
	try{this.afterSelect=afterSelect;}catch(ex){}
	try{this.afterCompleteFunction=afterCompleteFunction;}catch(ex){}
	
	// use javascript array
	// array notation --> [{textfield:valuefield}, {textfield:valuefield}, ... ]
	if(!isXML) menuFromArray(GlobalMenu);
	//setMiddleSearch('false');
	
	function setSP(t)
	{
		sp=t;
	}
	function performingImmediateAction()
	{
		return inImmed;
	}
	function setMiddleSearch(newType)
	{
		findFromMid=newType;
	}
	function setCaseSensitivity(newType)
	{
		caseSensitive=newType;
	}
	function setMaximumRetrieve(newCount)
	{
		maxRet=newCount;
	}
	function setBuffering(newType)
	{
		bufferQuery=newType;
	}
	
	function isInList()
	{
		var statX=false;
			if(menu)
			{
				for (var i=0;i<menu.length;i++)
				{
					if(caseSensitive)
					{
						if(menu[i]==obj.value)
						{
							statX=true;
							return statX;	
						}
					}
					else
					{
						if(menu[i].toLowerCase()==obj.value.toLowerCase())
						{
							statX=true;
							return statX;	
						}
					}				
				}
			}
			return statX;
	}
	function validate(sender,args)
	{
		if(obj&&obj.value!='')
		{
			args.IsValid=isInList();
		}
		else
		{
			args.IsValid=true;
		}
	}
    function repIn(t,x,y)
    {
        while(t.indexOf(x)>=0)
        {
            t = t.replace(x,y);
        }
        return t;
    }
	function prepareComplete(t)
	{
		
		//Nesneyi al
		obj=t;
		idHidden=document.getElementById(t.id+"_id");
        if(idHidden==null)
        {
            idHidden=document.getElementById(repIn(t.id,'_','$')+"_id");
        }
        //alert(idHidden);
		//Dokümanın keydownunu al, eskisini sakla.
		docsKeyDown=document.onkeydown;
		document.onkeydown=hKeyDown;
		//Nesnenin keypressini al, eskisini sakla.
		objsKeyPress=obj.onkeypress;
		obj.onkeypress=touchBlocker;
		//Nesnenin onblurünü al, eskisini sakla.
		objsOnBlur=obj.onblur;
		obj.onblur=quitComplete;


		divN = document.createElement("div");
		divN.style.width=dropDownWidth+"px"
		divN.style.left=findLeft()+'px';
		divN.style.top=findTop()+'px';
		divN.style.zIndex=9999;
		divN.className=ddMain;
		document.getElementsByTagName('body')[0].appendChild(divN);
		div = divN;
		

		//dorpdownu hazırlayalım
		checkForComplete();
		
	}

	//Nesneden çıkıldı, formu bulduğumuz şekle döndürelim.
	function quitComplete()
	{
		if(idHidden)
		{
			var val=getId(obj.value);
			if(val==undefined)val='';
			idHidden.value=val;
		}

		window.setTimeout(id+'_object.removeDD()',200);
		//Nesnenin keypressini geri verelim
		obj.onkeypress=objsKeyPress;
		//Nesnenin onblurünü geri verelim
		obj.onblur=objsOnBlur;
		if (objsOnBlur!=null)
			objsOnBlur();
		//dokümanın keydownını geri verelim
		document.onkeydown=docsKeyDown;
	}

	function removeDD()
	{
		//click-close oluştuysa div artık yoktur
		try{
		document.getElementsByTagName('body')[0].removeChild(div);
		}
		catch(Ex)
		{}
	}

	//Nesnenin keypresinde işlemi engelleyeceğiz ya da açık bırakacağız.
	function touchBlocker()
	{
		return allowTouch;
	}

	function findLeft()
	{
		var aLoc=0;
		var tObj=obj;
		while(tObj)
		{
				aLoc += tObj.offsetLeft;
				tObj = tObj.offsetParent;
		}
		return aLoc;
	}
	function findTop()
	{
		var tObj=obj;
		var aLoc=tObj.offsetHeight;
		while(tObj)
		{
				aLoc += tObj.offsetTop;
				tObj = tObj.offsetParent;
		}
		return aLoc;
	}


	//Tuşa basılma yeri
	function hKeyDown(evt)
	{
	
		var ne;
		var ol;
		//IE ise event alalım
		if(!evt) evt=event;
		
		//Tuş kodunu alalım
		var kC=evt.keyCode;
		
		if(kC==9||kC==13)
		{
//			window.status=1;
			getActive();
			seld=-1;
			allowTouch=(kC==9);
			try
			{
				inImmed=true;
						if(idHidden)
		{
			var val=getId(obj.value);
			if(val==undefined)val='';
			idHidden.value=val;
		}

				immediateAction(kC);
				inImmed=false;
			}
			catch(ex)
			{}

		}
		else if(kC==38)
		{
//		window.status=2;
			if(seld!=0)
			{
				ol = document.getElementById('menuItem'+seld);
				ne = document.getElementById('menuItem'+(seld-1));
				if(seld==0)
				{
					seld=-1;
					return allowTouch;
				}
				else if(seld==loopMenu.length)
				{
					ol=ne;
				}
				dir=-1;
			}
			allowTouch=false;
		}
		else if(kC==40)
		{
//		window.status=3;
			if(seld!=loopMenu.length-1)
			{
				ne = document.getElementById('menuItem'+(seld+1));

				if(seld==loopMenu.length-1)
				{
					seld=loopMenu.length;
					return allowTouch;
				}
				else if(seld!=-1)
				{
					ol = document.getElementById('menuItem'+seld);
				}
				else
				{
					ol=ne;
				}
				
				dir=1;
			}
			allowTouch=false;
		}
		else if(kC==39||kC==37)
		{
//		window.status=4;
			allowTouch=true;
		}
		else
		{
//		window.status=5;
		window.setTimeout(checkForComplete,50);

		allowTouch=true;
		}
		if (ol&&ne)
		{
	/*		ol.style.backgroundColor=normColor;
			ol.style.color=normFore;
			ne.style.backgroundColor=selColor;
			ne.style.color=selFore;*/
			ol.className=ddNormal;
			ne.className=ddSelect;
			//ne.scrollIntoView();
			seld+=dir;
		}
		
		//IE'de çalışması için return edelim. Firefox istemiyor bunu.
		
		return allowTouch;
	}
	function getId(keyw)
	{
		if(menu){
			for(var i=0;i<menu.length;i++)
			{
				var c1;
				var c2;
				if(!caseSensitive)
				{
					c1=keyw.toLowerCase();
					c2=menu[i].toLowerCase();
				}
				else
				{
					c1=keyw;
					c2=menu[i]
				}

				if(c1==c2)
				{
					return retIds[i]
				}
			}
			}
		return '';
		
	}
	function tipType_select(selM,id,i,isClick)
	{
		obj.value=selM;
		if(idHidden) idHidden.value=id

		try
		{
			afterSelect(selM,id,i);
		}
		catch(ex)
		{}
		
        if(isClick)	
        {
            try
			{
				inImmed=true;
			    if(idHidden)
		        {
			        var val=getId(obj.value);
			        if(val==undefined)val='';
			        idHidden.value=val;
		        }
				immediateAction();
				inImmed=false;
			}
			catch(ex)
			{
			}
            quitComplete();
        }

	}
	function checkForComplete()
	{
	
	//	alert(isXML);
		if(isXML)
		{
			var reqNow=false;
			if(bufferQuery)
			{
				var fnd=false;
				for (var i=0;i<bufferKeys.length;i++)
				{
					if(bufferKeys[i]==obj.value+findFromMid)
					{
						menuFromXml(buffer[i]);
						checkDelegate();
						fnd=true;
						//window.status='buffer:'+obj.value+findFromMid;
					}			
				}
				reqNow=!fnd;
			}
			else
			{
				reqNow=true;
			}
			if(reqNow) 
			{
				lastRequest=obj.value;
				//if(lastRequest!='')
				//{
				//window.status='Request:'+lastRequest+findFromMid;
				var t;
				try
				{	t='&'+customQS;		
				}
				catch(ex)
				{
					t='';
				}
				var x='';
				if (statPar!='') 
				{
					x=','+statPar+'='
					if(findFromMid) x+='%%'
					x+=obj.value.replace(',','||')+'%%';
				}

				if(je!='')
				{
					x+='&je='+je;
				}
				if(obj.value!='')
				{
					div.style.display='block';
					var v=obj.value;
					RequestData(dataSourceName,'sp='+sp+x+'&stat='+v+'&max='+maxRet+'&mid='+findFromMid+t);
				}
				else
				{
					div.style.display='none';
				}
				//}
			}
		}
		else
		{
    		checkDelegate();
		}
	}
	function checkDelegate()
	{
		var t=obj.value;
		var itms=new Array();
		getIndex=new Array;
		for(var i=0;i<menu.length;i++)
		{
			if(!eval(findFromMid))
			{
				var c1;
				var c2;
				c1=menu[i].substring(0,t.length);
				c2=t;
				if(!eval(caseSensitive))
				{
					c1=c1.toLowerCase();
					c2=c2.toLowerCase();
				}
				if(!eval(enableJSMatch)||c1==c2)
				{
					itms[itms.length]=menu[i];
					getIndex[getIndex.length]=i;
				}
			}
			else
			{
				var c1;
				var c2;
				c1=menu[i];
				c2=t;
				if(!eval(caseSensitive))
				{
					c1=c1.toLowerCase();
					c2=c2.toLowerCase();
				}
				
				if(!eval(enableJSMatch)||c1.indexOf(c2)>=0)
				{
					itms[itms.length]=menu[i];
				}
			}
		}
		
		prepareDD(itms);
		if(seld!=-1)
		{
			if(seld<loopMenu.length)
			{
				/*document.getElementById('menuItem'+seld).style.backgroundColor=selColor;
				document.getElementById('menuItem'+seld).style.color=selFore;*/
				document.getElementById('menuItem'+seld).className=ddSelect;
			}
			else
			{
				seld=-1;
			}
		}
	}
	function getActive()
	{
		var idX;
		if(!loopMenu) return;
		
		if(seld!=-1)
		{
			obj.value=loopMenu[seld];
			div.style.display='none';
			idX=seld;
		}
		else if(loopMenu.length==1)
		{
			obj.value=loopMenu[0];
			div.style.display='none';
			idX=0;
		}

		try
		{
			afterCompleteFunction(getIndex[idX]);
		}
		catch(ex)
		{}
		
	}

	function prepareDD(ids)
		{
			var mDiv=div;

			var t=obj.value;
			mDiv.innerHTML='';

			if(ids==undefined)
			{
				loopMenu=menu;
			}
			else
			{
				loopMenu=ids;
			}

			if(loopMenu.length!=0)
			{
				for (var i=0;i<loopMenu.length;i++)
				{
					divN = document.createElement("div");
					divN.setAttribute("id","menuItem"+i);
					divN.style.width='100%';
					divN.style.cursor='hand';
					divN.style.padding='2px';
					divN.style.paddingLeft='5px';
					divN.className='ddNormal';
					var stLoc;
					var m=loopMenu[i].toLowerCase();
					if(!caseSensitive)
					{
						t=t.toLowerCase();
						m=loopMenu[i].toLowerCase();
					}
					
					stLoc=m.indexOf(t);
					var bef;
					var sld;
					var end;
					bef=loopMenu[i].substring(0,stLoc)
					sld=loopMenu[i].substring(stLoc,stLoc+t.length)
					end=loopMenu[i].substring(stLoc+t.length,m.length)
					//divN.innerHTML = '<a href=javascript:select("'+loopMenu[i]+'")><span class=ddFoundSection>'+ loopMenu[i].substring(0,t.length) + '</span>' + loopMenu[i].substring(t.length,loopMenu[i].length)+ "</a>";
					
					divN.innerHTML='<a href=\'javascript:'+id+'_object.select("'+ loopMenu[i] +'","'+(isXML?retIds[i]:loopMenu[i])+'",'+i+',true);\'>'+bef+'<span class='+ddFoundSelection+'>'+ sld + '</span>' + end+ "</a>";
					mDiv.appendChild(divN)
				}
				mDiv.style.display='block';
			}
			else
			{
				mDiv.style.display='none';
			}
			if(t.length==0)
			{
				mDiv.style.display='none'
			}
					
		}
		
	function ResultScript(xml)
	{
		if(bufferQuery)
		{
			var fnd=false;
			for(var i=0;i<bufferKeys.length;i++)
			{
				if(bufferKeys[i]==lastRequest+findFromMid)
				{
					fnd=true;
					break;
				}
			}
			if(!fnd)
			{
				bufferKeys[bufferKeys.length]=lastRequest+findFromMid;
				buffer[buffer.length]=xml;
				//window.status="Buffered:"+lastRequest;
			}
		}
		menuFromXml(xml)
		checkDelegate();
	}

	function menuFromXml(xml)
	{
		var mn=new Array();
		var idsI=new Array();
		
		for (var i=0;i<xml.childNodes.length;i++)
		{
			mn[mn.length]=xml.childNodes[i].attributes[textAttributeLocation].value;
			
			try{
			idsI[idsI.length]=xml.childNodes[i].attributes[valueAttributeLocation].value;
			}
			catch(ex){}
		}
		retIds=idsI;
		menu=mn;
	}

	function menuFromArray(arr) {
		var mn=new Array();
		var idsI=new Array();
		for (var i=0;i<arr.length;i++)
		{
			mn[mn.length]=arr[i][textAttributeLocation];
			try{
			//alert(valueAttributeLocation +'='+arr[i][valueAttributeLocation]);
			idsI[idsI.length]=arr[i][valueAttributeLocation];
			}
			catch(ex){}
			//if(i<=5)
			  //  alert(mn[mn.length-1] + "\n"+idsI[idsI.length-1]);
		}
		retIds=idsI;
		menu=mn;
	}

	/* DATAPAN */
	function RequestData(xmlSrc,params)
	{
		if (window.XMLHttpRequest) 
		{
			typeOfComponent = "XMLHttpRequest"
			myXML = new XMLHttpRequest();
			//IE de payloyor nedense 
			try{
			myXML.async=true;
			}
			catch(ex){}
			
			myXML.open("POST", xmlSrc);
			myXML.onreadystatechange = function() {CheckState()};
			myXML.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
			myXML.send(params);
		} 
		else if (window.ActiveXObject) 
		{
			myXML = new ActiveXObject("Microsoft.XMLHTTP");
			typeOfComponent = "XMLHTTP";						
			myXML.open("POST", xmlSrc, false);
			myXML.onreadystatechange = CheckState;
			myXML.setRequestHeader('Content-Type','application/x-www-form-urlencoded');		
			myXML.send(params);
		}
		else 
		{
			alert("Please use a newer browser!");
		}

	}

	function CheckState()
	{
		var state = myXML.readyState;

		if (state == 4)
		{
			var tmp;
			if (typeOfComponent=="XMLHTTP") 
			{
				var x = new ActiveXObject("Microsoft.XMLDOM");
				try{
				if(verboseTT) alert(myXML.responseText);}
				catch(ex){}
				x.loadXML(myXML.responseText);
				tmp = x.documentElement;
			}
			else 
			{
				/*alert(myXML.responseXML);
				alert(myXML.responseXML.documentElement);
				alert(myXML.responseText);
*/
				tmp = myXML.responseXML.documentElement;
			}

			//alert(<%=me.id %>_myXML.responseText);
			
	//		try
	//		{
				ResultScript(tmp);
	/*		}		
			catch(ex)
			{
				alert('No result function for DataPan control!\nPlease create a function named ResultScript" to handle result XML.\n\nIf function exists, there may be a problem in it that prevents action to be completed!');
			}*/
			
		} 
	} 
	
}