/*-------------------------------------------------------------------------
|Amac: Xml ile yapılacak işlemleri içerir.                                |
|                                                                         |
|-------------------------------------------------------------------------|
|Function'lar:                                                            |
|		- IsError                                                         |
|		- GetXMLDocument                                                  |
|		- GetXMLRes                                                       |
|		- CreateXmlDocument                                               |
|		- CreateXmlHttp                                                   |
|		- GetXmlNodeValue                                                 |
|		- GetXmlNodes                                                     |
|		- XmlMessage                                                      |
|		- XmlMessageParam                                                 |
|-------------------------------------------------------------------------|
|                    Gordion Bilgi Hizmet Ltd. Sti.                       |
|                      http://www.gordion.com.tr                          |
-------------------------------------------------------------------------*/

var isIE = (document.all) ? true : false;

//------------------------------------------------------------------------------------------------------
//url'yi acar. Server'dan gelen string gecerli bir xml ise bunu 
//Msxml2.DOMDocument nesnesine yukleyip geri dondurur.
//aksi takdirde gelen string'i alert edip null dondurur.
function GetXMLDocument(url)
{
	var sXml;
	if(arguments.length > 1)
		sXml = GetXMLRes(url, arguments[1]);
	else
		sXml = GetXMLRes(url);

	var xmlDoc = CreateXmlDocument(sXml);
	
	if(IsError(xmlDoc, sXml)) return null;
			
	return xmlDoc;
}

//------------------------------------------------------------------------------------------------------
//Servera XMLHTTP ActiveXObject'i gonderir.
//Geri donus degeri Server'dan gelen cevaptir.
//1.parametre URL olarak degerlendirilir.
//Eger "?" ile basliyorsa basina sayfanin path'i eklenir.
//2.parametre opsioneldir, varsa  protocol PORT'a cevirilir ve
//send methoduna parametre olarak verilir.
//22.12.03 - Vace
//temp
function GetXMLRes()
{
	var sUrl = arguments[0];
	if(sUrl.charAt(0) == "?")
		sUrl = "http://" + window.location.host + window.location.pathname + sUrl;

	var xmlHttp = CreateXmlHttp();
	if(arguments.length > 1)
	{
		xmlHttp.open("POST", sUrl, false);
		var packet = arguments[1];
		if(typeof packet == "string" && packet.indexOf("<?xml version") != -1)
		{
			var xmlDoc = CreateXmlDocument(packet);
			if(xmlDoc != null)
				xmlHttp.send(xmlDoc);
			else
				xmlHttp.send(packet);
		}
		else
			xmlHttp.send(packet);
	}
	else
	{
		xmlHttp.open("GET", sUrl, false);
		xmlHttp.send();		
	}

	return xmlHttp.responseText;
}

//------------------------------------------------------------------------------------------------------
//Browser'a uygun XmlHttp object'i elde etmek icin kullanilir. Test asamasinda
//function XmlHttp() {}

function CreateXmlHttp()
{
	try 
	{
		if (window.XMLHttpRequest) 
		{
			var req = new XMLHttpRequest();
			return req;
		}
		if (window.ActiveXObject) {
			return new ActiveXObject("Msxml2.XmlHttp");
		}
	}
	catch (ex) {}
	throw new Error("Your browser does not support XmlHttp objects");
}

//------------------------------------------------------------------------------------------------------
//Browser'a uygun XmlDocument object'i elde etmek icin kullanilir. Test asamasinda

function CreateXmlDocument()
{
	//Standard
	if(document.implementation && document.implementation.createDocument && DOMParser)
	{
		if(arguments.length > 0 && typeof arguments[0] == "string")
		{
			var xmlDoc = new DOMParser().parseFromString(arguments[0], "text/xml");
			if(xmlDoc.childNodes.item(0).nodeName == "parsererror") 
				return null;
			return xmlDoc;
		}
		else
		{
			return document.implementation.createDocument("", "", null);
		}
	}
	
	//IE
	if(window.ActiveXObject)
	{
		var xmlDoc = new ActiveXObject("Msxml2.DOMDocument");		
		if(arguments.length > 0 && typeof arguments[0] == "string" && !xmlDoc.loadXML(arguments[0]))
			return null;
		
		return xmlDoc;
	}
	else
		throw new Error("Your browser does not support XmlDocument objects");
}

//------------------------------------------------------------------------------------------------------
//Clienta gelen xml data'nin Error olup olamadigina bakar.
//Error ise gerekli mesaji gosterir.
function IsError(xmlDoc)
{
	if(xmlDoc == null)
	{
		if(arguments.length > 1)
		{
			var w = window.open("", "hata");
			w.document.write(arguments[1]);
			w.document.close();
		}
		else
			alert("Error");
		return true;
	}

	type = GetXmlNodeValue(xmlDoc, "//TYPE");
	if(typeof type == "string" && type == "Error")
	{
		try
		{
			alert(GetXmlNodeValue(xmlDoc, "//ErrorDesc"));
		}
		catch(e)
		{
			alert("Error ");
		}
		return true;
	}
	return false;
}

//------------------------------------------------------------------------------------------------------
//Verilen xml object'inin istenilen nodu'nun degerini dondurur.
//Istenilen node'un, text tipinde birtek child nodu oldugu veya
//leaf node oldugu varsayilir.
//Normalde her child'i icin recursif bir bicimde text'ini almasi lazim.
function GetXmlNodeValue(xmlDoc, xpath)
{
	var res = GetXmlNodes(xmlDoc, xpath);

	if(res.length == 0 || res[0].firstChild == null)
		return "";

	return res[0].firstChild.nodeValue;
}

//------------------------------------------------------------------------------------------------------
//Verilen xpath'e gore node'lar dondurur.
function GetXmlNodes(xmlDoc, xpath)
{
	if(typeof xmlDoc != "object" || xmlDoc == null || typeof xpath != "string" || xpath == "")
		return new Array();

	if(isIE)
		return xmlDoc.selectNodes(xpath);

	var xpe = new XPathEvaluator();
	var foundNodes = new Array();
	var nsresolver = xpe.createNSResolver((xmlDoc.documentElement ? xmlDoc.documentElement : xmlDoc));
	var result = xpe.evaluate(xpath, xmlDoc, nsresolver, 0, null);
	
	while (res = result.iterateNext())
		foundNodes.push(res);

	return foundNodes;
}

//------------------------------------------------------------------------------------------------------
//Servera xml messaji gonderen ve cevabi sorgulayan bir class.
function XmlMessage(action)
{
	//Properties
	this.Type = action || "";
	this.Params = new Array();
	this.Action = action || "";
	this.Url = "";
	this._xmlRes = null;
	
	
	//Methodes
	this.AddParam = function(name, value) 
	{
		this.Params.push(new XmlMessageParam(name, value));	
	};
	
	this.ClearParams = function()
	{
		this.Params = new Array();
	};
	
	this.SendAndReceive = function()
	{
		var params = "";
		for(var i = 0; i < this.Params.length; i++)
			params += "<" + this.Params[i].Name + ">" + this.Params[i].Value + "</" + this.Params[i].Name + ">";

		var sXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" +
					"<ROOT>" +
					"	<TYPE>" + this.Type + "</TYPE>" + 
					"	<DATA>" + params + "</DATA>" +
					"</ROOT>";
		this._xmlRes = GetXMLDocument(this.Url + "?Action=" + this.Action, sXml);
	};
	
	this.IsResponseReceived = function()
	{
		return this._xmlRes != null;
	};
	
	this.GetResponse = function(name) 
	{
		if(!this.IsResponseReceived)
			throw "XmlMessage hatasiz gonderilmeden cevap sorgulanamaz.";
		
		return GetXmlNodeValue(this._xmlRes, "//" + name);
	};
	this.GetResponseNodes = function(xpath)
	{
		if(!this.IsResponseReceived)
			throw "XmlMessage hatasiz gonderilmeden cevap sorgulanamaz.";
			
		return GetXmlNodes(this._xmlRes, xpath);
	}
	this.GetResponseXml = function()
	{
		return this._xmlRes;
	}
}

//------------------------------------------------------------------------------------------------------
//XmlMessage tarafindan servera gonderilecek parametreleri tutarken kullanilir
function XmlMessageParam(name, value)
{
	this.Name = (name != null ? name : "");
	this.Value = (value != null ? value : "");
}









//TESTS
//=============================================================================
//XmlJsTests();
function XmlJsTests()
{
	var xmlDoc = CreateXmlDocument();
	assert("object", typeof xmlDoc);

	var xmlString = '<?xml version="1.0" encoding="UTF-8"?><Data><Item><GUI_LEX__CD_LEX>sdfsdfss</GUI_LEX__CD_LEX><GUI_LEX__CD_LANGUAGE></GUI_LEX__CD_LANGUAGE><GUI_LEX__DS_LEX></GUI_LEX__DS_LEX></Item></Data>';

	xmlDoc = CreateXmlDocument(xmlString);

	assert("object" + typeof xmlDoc);
	assert(true, xmlDoc != null);
	if(isIE)
		assert("sdfsdfss", xmlDoc.childNodes[1].firstChild.firstChild.firstChild.nodeValue);
	else
		assert("sdfsdfss", xmlDoc.firstChild.firstChild.firstChild.firstChild.nodeValue);

	xmlString = '<?xmlvsdfvsdvss';
	xmlDoc = CreateXmlDocument(xmlString);	
	assert(false, xmlDoc != null);
}

