/*-------------------------------------------------------------------------
|Amac: Her sayfada kullanılacak javascript'leri içerir.                   |
|                                                                         |
|-------------------------------------------------------------------------|
|Function'lar:                                                            |
|		DUZELTILECEKLER                                                   |
|		- CheckDateMask                                                   |
|		- CheckMask                                                       |
|		- DisplayError                                                    |
|		- InputMask                                                       |
|		- GetDate                                                         |
|                                                                         |
|		DUZELTILENLER                                                     |
|		- AddEvent                                                        |
|		- BlankERS                                                        |
|		- CheckNumericMask                                                |
|		- CreateXmlDocument                                               |
|		- CreateXmlHttp                                                   |
|		- DeleteData                                                      |
|		- DoErsAction                                                     |
|		- FireEvent                                                       |
|		- FolderClick                                                     |
|		- FormatNumericBox                                                |
|		- GetCntr                                                         |
|		- GetInputValue                                                   |
|		- GetLex                                                          | 
|		- GetSibling                                                      |
|		- GetXmlData                                                      |
|		- HideMsg                                                         |
|		- HideProcessing                                                  |
|		- InputFieldOnChange                                              |
|		- InputChangeForData                                              |
|		- InputChangeForGui                                               |
|		- InsertData                                                      |
|		- InitilizeRequiredAndKeyFields                                   |
|		- IsReadonlyCheckBoxSource                                        |
|		- MozAdap                                                         |
|		- MarkField                                                       |
|		- NumericInputMask                                                |
|		- NumericValue                                                    |
|		- RemoveEvent                                                     |
|		- ShowMsg                                                         |
|		- ShowProcessing                                                  |
|		- UpdateData                                                      |
|		- ValidateOnChange                                                |
|		- ValidateFields                                                  |
|		- ValidateField                                                   |
|                                                                         |
|-------------------------------------------------------------------------|
| Gerekli Dosyalar:                                                       |
|		- Xml.js                                                          |
|                                                                         |
|-------------------------------------------------------------------------|
|                    Gordion Bilgi Hizmet Ltd. Sti.                       |
|                      http://www.gordion.com.tr                          |
-------------------------------------------------------------------------*/




var isIE = (document.all) ? true : false;


//Mesajlarin gosterildigi Div. ShowMsg() tarafindan kullanilir.
var MessageDiv = document.createElement("<DIV class='MessageDiv' id='MessageDiv' " + 
										"style='Z-INDEX: 200; LEFT: 200px; POSITION: absolute; TOP: 150px;" + 
										"FILTER: progid:DXImageTransform.Microsoft.Fade(duration=0.25,overlap=1.0);' >");
MessageDiv.style.display = "none";
MessageDiv.onclick = HideProcessing;
if (document.forms.item(0) != null )
	document.forms.item(0).appendChild(MessageDiv);

//System Mesajlari
var SystemMessages = 
{
	RecordInserted : function() {return GetInputValue("hdnMsgInserted", "Record Inserted");},
	RecordUpdated  : function() {return GetInputValue("hdnMsgUpdated",  "Record Updated");},
	RecordDeleted  : function() {return GetInputValue("hdnMsgDeleted",  "Record Deleted");}
}

//Genel Default Value'ler
var GorDefaultValues = {
	NotValidColor : "#99ccff",
	FireEventDelay : 300
}

//Sayfa'da IsRequired attribute'u olan alanlar burada tutulur.
//Bkz. InitilizeRequiredAndKeyFields();
var RequiredFields;
var KeyFields;

//Duzeltilecekler/Yapilacaklar
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------


//Kontrolun Mask property'sine gore kullanici girislerini kontrol eder.
function CheckMask(ctr)
{
	var val = ctr.value; 
	var mask = ctr.Mask;
	var isvalid = true;

	if(mask.length == 0) return true;

	//Date
	if(mask == 'Date')
		isvalid = CheckDateMask(val);

	//Numeric
	else if(mask == "numeric")
		isvalid = CheckNumericMask(ctr);

	//Email
	else if(mask == "email")
		isvalid = (val.match(/\w+(?:\.\w+)*@\w+(?:\.\w+)+/i) == val);

	//Capital
	else if(mask == "capital")
	{
		for (i=0; i < val.length && bValOK; i++)
		{
			mc = mask.charAt(i);
			vc  = val.charAt(i);
			isvalid != vc >= 'a' && vc <= 'z';
		}
	}

	//Other
	else
		isvalid = true;

	if (!isvalid)
		ctr.value = "";
		
	return isvalid;
}


//Tarih alanlarina girilen karakterlerin gecerli olup olmadigini kontrol eder. true/false dondurur.
function CheckDateMask(dateValue)
{
	if(dateValue.length < User.DateFormat.length)
		return false;
	
	var f = new DateFormat(User.DateFormat);
	return f.Check(dateValue);
}


// Kullanıcı klavye ile her değer girdiğinde Mask property'sine gore bu girişin kabul edilip edilmeyeceğini belirler.
// Örneğin rakam yazılan bir alana harf girildiğinde fonksiyon bunu red eder.
function InputMask(ctr)
{
	//date henuz implement edilmedi
	if(ctr.Mask.toLowerCase() == "date") return true;
	

	//Girilen karakter bulunur
	var newChar = String.fromCharCode(window.event.keyCode);

	//Copy paste ile deger girildiginde 
	//sadece uzunluk kontrolu yapilir
	if(document.selection.type != "None")
	{
		var range = document.selection.createRange();
		if(range.text.length >= ctr.Mask.length)
			ctr.value = "";
	}

	// email
	if(ctr.Mask == "email")
	{
		if(ctr.value.length >= parseInt(ctr.maxlength))
			return false;
	}
	
	// capital
	else if(ctr.Mask == "capital")
	{
		if(ctr.value.length >= parseInt(ctr.maxlength))
			return false;

		window.event.keyCode = newChar.toUpperCase().charCodeAt(0);
	}
	
	//numeric
	else if (ctr.Mask == "numeric")
	{
		return NumericInputMask(ctr, newChar);
	}
	
	//rakam
	else if(ctr.Mask.match(/9+/) != null)
	{
		if(ctr.value.length >= parseInt(ctr.maxlength))
			return false;
			
		return !isNaN(parseInt(newChar));
	}
		
	//other
	else if (ctr.value.length >= ctr.Mask.length)
	{
		return false;
	}

	return true;
}

//TODO:
//	- Bir onceki library'deki showModalDialog tarzi birsey olacak
function DisplayError(msg)
{
	alert(msg);
}

function GetDate(ctr) {}




























//Duzeltilenler
//---------------------------------------------------------------------------------------------------------

//---------------------------------------------------------------------------------------------------------
//ers'lerde insert
function InsertData()
{
	//Guard
	if(!ValidateFields("RequiredFields")) return;
	
	if(DoErsAction("InsertData"))
		ShowMsg(SystemMessages.RecordInserted());
}

//------------------------------------------------------------------------------------------------------
//ers'lerde update
function UpdateData()
{
	//Guard
	if(!ValidateFields("RequiredFields")) return;
	
	if(DoErsAction("UpdateData"))
		ShowMsg(SystemMessages.RecordUpdated());
}

//------------------------------------------------------------------------------------------------------
//ers'lerde delete
function DeleteData()
{
	
	
	//Guard
	if(!ValidateFields("RequiredFields")) return;
	
	var boolResult = confirm("Kayd\u0131 silmek istedi\u011Finize emin misiniz?");
	if (boolResult == false)
		return;		
	
	if(DoErsAction("DeleteData"))
		ShowMsg(SystemMessages.RecordDeleted());
}

//------------------------------------------------------------------------------------------------------
//ers'lerde kayit getirme
function GetXmlData()
{
	if(!ValidateFields("KeyFields")) return;

	DoErsAction("GetXmlData");
}

//------------------------------------------------------------------------------------------------------
//Bazi ERS action'larini gerceklestirir.
//ActionKey "InsertData", "UpdateData", "DeleteData" gibi degerler alir.
//Sayfadaki ErsXml'i server'a gonderilip, gelen XML'e gore sayfadaki 
//control'leri degistirilir. degistirdiklerinin onChange event'i fire edilir.
var LastReceivedErsXml = null;
function DoErsAction(ActionKey)
{
	

	var ErsXml = document.getElementById("ErsXml").XMLDocument;
	
	var ResponseXml = GetXMLDocument("?Action=" + ActionKey, ErsXml);
	LastReceivedErsXml = ResponseXml;

	//Guard
	
	
	if(ResponseXml.selectSingleNode("//ERROR") != null)
    {
		alert(ResponseXml.selectSingleNode("//ERROR").text);
		return false;
    }
    ShowProcessing();
    if(ResponseXml == null)	
	{
		HideProcessing();
		return false;
	}
	//Elde edilen degerler control'lere atanir.
	//!!! Sadece <Data> tag'inin replace edilmesi 
	//control'lerin onChange'ini fire etmeyeceginden
	//bu sekilde imlement edilir.
	//Eski code:
	//ErsXml.removeChild(ErsXml.selectSingleNode("//Data"));
	//ErsXml.appendChild(ResponseXml.selectSingleNode("//Data"));
	var ctrs = document.all;
	for(var i = 0; i < ctrs.length; i++)
	{
		if(typeof(ctrs[i].dataSrc) == "string" && typeof(ctrs[i].dataFld) == "string")
		{
			var ersNode = ErsXml.selectSingleNode("//" + ctrs[i].dataFld);
			var dataFldNode = ResponseXml.selectSingleNode("//" + ctrs[i].dataFld);

			if(ctrs[i].dataSrc == "#ErsXml" && typeof(dataFldNode) == "object")
			{
				if(ersNode.xml != dataFldNode.xml)
				{
					//Bosalt
					while(ersNode.hasChildNodes())
						ersNode.removeChild(ersNode.childNodes.item(0));
					//Doldur	
					while(dataFldNode.hasChildNodes())
						ersNode.appendChild(dataFldNode.removeChild(dataFldNode.childNodes.item(0)));

					if(ctrs[i].id != "" )					
						window.setTimeout("InputChangeForGui(document.getElementById('" + ctrs[i].id + "'));", GorDefaultValues.FireEventDelay);					
				}
			}
		}
	}

	HideProcessing();
	return true;
}
//------------------------------------------------------------------------------------------------------
//RequiredFields'i ve KeyFields'i initilize eder.
//Sayfadaki tum IsRequired veya IsKeyField attribute'u olan controllerini bulur,
//onchange event'lerinin basina ValidateOnChange function'unu ekler.
function InitilizeRequiredAndKeyFields()
{
	RequiredFields = new Array();	
	KeyFields = new Array();
	var ctrs = document.getElementsByTagName("INPUT");

	for(var i = 0; i < ctrs.length; i++)
	{
		ctrs[i].IsRequired = ctrs[i].getAttribute("IsRequired") == "true";
		ctrs[i].IsKeyField = ctrs[i].getAttribute("IsKeyField") == "true";
		
		if(ctrs[i].IsRequired || ctrs[i].IsKeyField)
		{
			ctrs[i].InitialBackColor = getStyleAttr(ctrs[i], "background-color");
			ctrs[i].IsValid = true;
			var guiFuncs = ctrs[i].getAttribute("onChangeForGui");
			if(typeof guiFuncs == "undefined" || guiFuncs == null)
				guiFuncs = "";
			ctrs[i].setAttribute("onChangeForGui", "ValidateOnChange(this); " + guiFuncs);
		}

		if(ctrs[i].IsRequired)
			RequiredFields[RequiredFields.length] = ctrs[i];

		if(ctrs[i].IsKeyField)
			KeyFields[KeyFields.length] = ctrs[i];
	}
	
	RequiredFields.Clear = function(){
		for(var i = 0; i < this.length; i++)
		{
			this[i].style.backgroundColor = this[i].InitialBackColor;
			this[i].IsValid = true;
		}
	}
	
	KeyFields.Clear = function(){
		for(var i = 0; i < this.length; i++)
		{
			this[i].style.backgroundColor = this[i].InitialBackColor;
			this[i].IsValid = true;
		}
	}
}

//------------------------------------------------------------------------------------------------------
//zorunlu alanlarin dolu olup olmadiginin kontrolu.
//eger tumu dogruysa true dondurur. aksi takdirde false.
//Parametre olarak array'in name'inin kullanilmasinin
//amaci hem RequiredFields hem de KeyFields icin ayni
//fonction'i kullanma ve initilize olmamislarsa sorun 
//cikmamasi.
function ValidateFields(FieldArrayName)
{
	var FieldArray;
	eval("FieldArray = " + FieldArrayName);
	if(typeof(FieldArray) != "object")
	{
		InitilizeRequiredAndKeyFields();
		eval("FieldArray = " + FieldArrayName);
	}
	
	var bRet = true;
	for(var i = 0; i < FieldArray.length; i++)
	{
		ValidateField(FieldArray[i]);
		if(!FieldArray[i].IsValid)
			bRet = false;
	}
	return bRet;
}

//------------------------------------------------------------------------------------------------------
//zorunlu alanin dolu olup olmadiginin kontrolu.
function ValidateField(ctr)
{
	if(ctr.value == "")
	{
		ctr.style.backgroundColor = GorDefaultValues.NotValidColor;
		ctr.IsValid = false;
	}
	else
	{
		ctr.style.backgroundColor = ctr.InitialBackColor;
		ctr.IsValid = true;		
	}
}

//------------------------------------------------------------------------------------------------------
//zorunlu alanin onchange event'inde dolu olup olmadigini kontrol eder.
//InitilizeRequiredAndKeyFields() tarafindan o control'e assign edilir.
function ValidateOnChange(ctr)
{
	ValidateField(ctr);
}

//------------------------------------------------------------------------------------------------------
//ErsXml'i bosaltir.
function BlankERS()
{
	var items;
	try
	{
		items = document.getElementById("ErsXml").XMLDocument.selectSingleNode("//Data").childNodes.item(0).childNodes;
	}
	catch(exp)
	{
		DisplayError("ERROR_ERSXMLNOTWELLFORMED");
	}
	
	//Guard
	if(items == null || typeof(items) == "undefined") return;

	for(var i = 0; i < items.length; i++)
	{
		if(IsReadonlyCheckBoxSource(items[i]))
			items[i].text = "../img/empty_image.gif";
		else
			items[i].text = "";
	}
	
	if(typeof(RequiredFields) == "object" && RequiredFields.length != 0)
	{
		RequiredFields.Clear();
	}	
	if(typeof(KeyFields) == "object" && KeyFields.length != 0)
	{
		KeyFields.Clear();
	}
}

//------------------------------------------------------------------------------------------------------
//Parametre olarak verilen xmlnode'unu dataFld olarak 
//kullanan controllerin CheckBox'in Image mi oldugunu belirler.
function IsReadonlyCheckBoxSource(xmlnode)
{
	if(xmlnode.nodeName.indexOf("__SW_") == -1)
		return false;
	
	var images = document.getElementsByTagName("IMG");
	for(var i = 0; i < images.length; i++)	
	{
		if(images[i].dataFld == xmlnode.nodeName)
		{		
			return true;	
		}
	}
		
	return false;
}

//------------------------------------------------------------------------------------------------------
//Sayac bottonlari tarafindan cagirilir.
function GetCntr(cntrField, cntrType, prefixField, parentCounter)
{
	var ers = document.getElementById("ErsXml").documentElement;
	
	var prefix = "";
	if(prefixField != "")
	{
		var node = ers.selectSingleNode("//" + prefixField);
		if(node.text == "")
		{
			DisplayError("ERR_ENTERPREFIX");
			return;
		}
		prefix = node.text;
	}
	
	var parentCntrValue = "";
	if(parentCounter != "")
	{
		var node = ers.selectSingleNode("//" + parentCounter);
		if(node.text == "")
		{
			DisplayError("ERR_ENTERPARENTCOUNTER");
			return;
		}
		parentCntrValue = node.text;
	}
	
	var sXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" +
				"<ROOT>" +
				"	<TYPE>CounterParameter</TYPE>" + 
				"	<DATA>" +
				"		<CounterType>" + cntrType + "</CounterType>" +
				"		<CounterCode>" + prefix + "</CounterCode>" +
				"		<ParentCounter>" + parentCntrValue + "</ParentCounter>" +
				"	</DATA>" +
				"</ROOT>";
	var xmlDoc = GetXMLDocument("?Action=GetCounter", sXml);
	
	if(xmlDoc == null)
		return;
	
	ers.selectSingleNode("//" + cntrField).text = xmlDoc.selectSingleNode("//COUNTER").text;				
	
	InputFieldOnChange(document.getElementById(cntrField));
}


//------------------------------------------------------------------------------------------------------
//islem yapilmaya baslandigini gosterir.
function ShowProcessing()
{
	ShowMsg("Processing...");
}


//------------------------------------------------------------------------------------------------------
//Yapilan islemin bittigini gosterir.
function HideProcessing()
{
	HideMsg();
}


//------------------------------------------------------------------------------------------------------
//Bir Div icerisinde mesaj gosterir. 
function ShowMsg(msg)
{
	MessageDiv.innerText = msg;
	MessageDiv.style.left = (document.body.clientWidth - MessageDiv.offsetWidth) / 2;
	MessageDiv.style.top = parseInt((screen.availHeight - MessageDiv.offsetHeight - 200) / 2) + "px";
	MessageDiv.style.display = "block";
	var t = setTimeout(HideMsg, 1000);
}

//------------------------------------------------------------------------------------------------------
//Bir Div icerisinde gosterilen mesaji saklar.
function HideMsg()
{
	MessageDiv.style.display = "none";
}

//------------------------------------------------------------------------------------------------------
//parametre olarak verilen alani isaretler. zorunlu veya anahtar alanlardan 
//herhangi biri bossa bu fonksiyon cagirilir. void
function MarkField (field)
{
	field.className = "MissingField";
}

//------------------------------------------------------------------------------------------------------
//Input alanlarinin onChange event'inde cagirilir.
//Input alaninin iki tipi onChange methodlarini cagirir.
function InputFieldOnChange(ctr)
{
	if(InputChangeForData(ctr))
		InputChangeForGui(ctr);
}

//------------------------------------------------------------------------------------------------------
//Input alanlarinin datasinin rastgele bir sekilde 
//degistirilmesi durumlarinda cagirilir. Bu durumlar 
//genellikle user'in manuel olarak data girmesidir. 
//onChangeForData attribute'unda belirtilen function'lar
//cagirilirlar. Bu function'lar genellikle girilen datanin
//formati ile ilgilenmektedirler. ERSAction'larinda bu 
//function'lar cagirilmazlar.
function InputChangeForData(ctr)
{
	var funcs = ctr.getAttribute("onChangeForData");

	if(typeof funcs == "undefined" || funcs == null || funcs == "")
		return true;

	var res = eval(funcs.replace(new RegExp("this", "g"), "ctr").replace(/AND/g, "&&").replace(/OR/g, "||").replace(/NOT/g, "!"));
	
	if(typeof res == "boolean")
		return res;

	return false;
}

//------------------------------------------------------------------------------------------------------
//Input alanlarinin datasinin degismesi durumunda 
//sayfadaki gorsel degisikliklerin yerine getirilmesi
//amaci ile cagirilir. Data'nin controle uygun oldugu 
//varsayilmaktadir. Input alaninin onChangeForGui 
//attribute'unda belirtilen function'lar cagirilirlar.
//ERSAction'larinda bu function cagirilmaktadir.
function InputChangeForGui(ctr)
{
	var funcs = ctr.getAttribute("onChangeForGui");

	if(typeof funcs == "undefined" || funcs == null)
		return;

	eval(funcs.replace(new RegExp("this", "g"), "ctr"));
}

//------------------------------------------------------------------------------------------------------
//Numerik alanlara girilen karakterlerin gecerli olup olmadigini kontrol eder.
function CheckNumericMask(ctr)
{
	var num = new NumericValue(ctr.value);
	
	if(!num.IsNumeric())
		return false;
	
	if(ctr.getAttribute("NegValues") == "False" && ctr.value.indexOf("-") != -1)
		return false;
	
	if(num.DecPart.length > parseInt(ctr.getAttribute("Scale")))
		return false;
	if(num.DecPart.length + num.IntPart.length > parseInt(ctr.getAttribute("Precision")))
		return false;
	
	return true;
}


//------------------------------------------------------------------------------------------------------
//Numerik alanların onkeypressinde cagirilarak girilen karakterin dogrulugunu kontrol eder.
function NumericInputMask(ctr, newChar)
{
	if(newChar == User.DecSign)
	{
		if(parseInt(ctr.getAttribute("Scale")) <= 0)
			return false;
		
		if(ctr.value.indexOf(User.DecSign) != -1)
			return false;
		
		return true;
	}

	if(newChar == "-")
	{
		if(ctr.getAttribute("NegValues") == "False")
			return false;
		if(ctr.value != "")
			return false;
		return true;
	}
	
	if(newChar < '0' || newChar > '9')
		return false;

	var num = new NumericValue(ctr.value + newChar);
	
	if(num.DecPart.length > parseInt(ctr.getAttribute("Scale")))
		return false;
	if(num.IntPart.length > (parseInt(ctr.getAttribute("Precision")) - parseInt(ctr.getAttribute("Scale"))))
		return false;
	
	return true;
}

//------------------------------------------------------------------------------------------------------
//verilen degeri kullanicinin ayarlarina gore formatlar (virgul ekler)
function FormatNumericBox(ctr)
{
	var num = new NumericValue(ctr.value);
	var newvalue = num.FormattedValue;

	//Yeni girilen karakter DecSign ise gosterilmesi saglanir.
	if(num.DecPart == "" && ctr.value.indexOf(User.DecSign) != -1)
		newvalue += User.DecSign;

	if(ctr.value != newvalue)
		ctr.value = newvalue;
}

//------------------------------------------------------------------------------------------------------
//String olarak verilen numeric bir degeri parse ederek parcalarina ayirir.
function NumericValue(val)
{
	//Properties
	this.Value = val;
	this.IntPart = val;
	this.DecPart = "";
	this.FormattedValue = "";
	
	//Methods
	this.IsNumeric = function()
	{
		var re = new RegExp("\\-?\\d{0,3}(\\" + User.DigSign + "\\d{3})*(\\" + User.DecSign + "\\d+)?");
		return re.test(this.FormattedValue) && this.FormattedValue.match(re)[0] == this.FormattedValue;
	}

	//Initialization
	if(val.indexOf(User.DecSign) != -1)
	{
		this.IntPart = val.slice(0, val.indexOf(User.DecSign));
		this.DecPart = val.slice(val.indexOf(User.DecSign) + 1, val.length);
	}

	this.IntPart = this.IntPart.replace(new RegExp("\\" + User.DigSign, "gi"), "");

	this.FormattedValue = this.IntPart;	
	var re = /(-?[0-9]+)([0-9]{3})/; 
	while(re.test(this.FormattedValue)) 
		this.FormattedValue = this.FormattedValue.replace(re, '$1' + User.DigSign + '$2');

	this.FormattedValue = this.FormattedValue + (this.DecPart != "" ? User.DecSign + this.DecPart : "");
}

//------------------------------------------------------------------------------------------------------
//Sayfadaki id ile belirtilen <INPUT> tag'inin value'sunu bulur.
//Ikinci parametre olarak default deger girilebilir.
function GetInputValue(id)
{
	var ctr = document.getElementById(id);
	if(ctr == null || typeof(ctr) == "undefined")
	{
		if(arguments.length > 1)
			return arguments[1];
		else
			return null;
	}

	return ctr.value;
}

//------------------------------------------------------------------------------------------------------
//Lex kodunu server'dan alir.
function GetLex(lexCode)
{
	if(typeof(lexCode) != "string" || lexCode == "")
		return "";

	var lexDesc = GetXMLDocument("?Action=GetLex&LexCode=" + lexCode);
	if(lexDesc != null)
		return lexDesc.documentElement.selectSingleNode("//LexDesc").text;
	else
		return "";
}


//------------------------------------------------------------------------------------------------------
//Menudeki folder iconuna basilinca yapilacak islemler.
function FolderClick(ctr)
{
	if(ctr.className.indexOf("Opened") == -1)
	{
		ctr.className += " Opened";
		
		var childList = GetSibling(ctr, "UL");
		if(childList)
			childList.style.display = "block";
	}
	else
	{
		ctr.className = ctr.className.replace(/\bOpened\b/gi, "");

		var childList = GetSibling(ctr, "UL");
		if(childList)
			childList.style.display = "none";
	}
}

//------------------------------------------------------------------------------------------------------
//belirtilen controlun tagName isimli kendinden sonra gelen ilk sibling'ini dondurur.
function GetSibling(ctr, tagName)
{
	tagName = tagName.toUpperCase();
	var sibling = ctr;
	while(typeof sibling != "undefined" && sibling != null && sibling.nodeName.toUpperCase() != tagName)
		sibling = sibling.nextSibling;
		
	if(typeof sibling == "undefined" || sibling == null)
		return null;

	return sibling;	
}

//Moz---------------------------------------------------------------------------------------------------
//Asagidaki methodlar Mozillayi desteklemek icin yazilmislardir

//------------------------------------------------------------------------------------------------------
//Ctr'e event ekler.
function AddEvent(ctr, evt, lis)
{
	if(isIE)
		ctr.attachEvent("on" + evt, lis);
	else
		ctr.addEventListener(evt, lis, false);
}

//------------------------------------------------------------------------------------------------------
//Ctr'den event soker alir.
function RemoveEvent(ctr, evt, lis)
{
	if(isIE)
		ctr.detachEvent("on" + evt, lis);
	else
		ctr.removeEventListener(evt, lis, false);
}

//------------------------------------------------------------------------------------------------------
//Ctr'den event soker alir.
function FireEvent(ctr, evt)
{
	//click ve focus gibi function'lari olan eventler
	if(typeof(eval("ctr." + evt)) == "function")
	{
		eval("ctr." + evt + "();");
		return;
	}
	
	evt = "on" + evt;	
	if(typeof(ctr.getAttribute(evt)) == "string" || typeof(ctr.getAttribute(evt)) == "function")
	{
		//IE. fireEvent kullanilir.
		if(typeof ctr.fireEvent != "undefined")
		{
			try 
			{
				ctr.fireEvent(evt);
			}
			catch(e)
			{
				try
				{
					eval(ctr.getAttribute(evt).replace(/\bthis\b/gi, "ctr"));
				}
				catch(e) {}
			}
		}
		/*//Mozilla. !!!Duzeltilecek. DOM 2 Event'e gore yazilacak
		else
		{
			try
			{
				ctr.dispatchEvent(evt);
			}
			catch(e) 
			{
				try
				{
					eval(ctr.getAttribute(evt).replace(/\bthis\b/gi, "ctr"));
				}
				catch(e) {}
			}
		}*/
	}
}

//------------------------------------------------------------------------------------------------------
//Event'lerin icinde kullanilir. Mozilla'yi ie'ye uyarlar
function MozAdap(e)
{
	if(isIE) return;
	
	window.event = e;
	window.event.srcElement = e.target;
}










