var isIE		= (navigator.appName.indexOf('Internet Explorer') != -1);
var isOpera		= (navigator.userAgent.indexOf("Opera")>-1);

var cache		= new Array();
var isBlocked 	= false;


var JsRequest = {
	req:new Array(),
	rid:new Array(),
	url:new Array(),
	history:new Array(),
	xmlUrl:new Array(),
	reqXSL:new Array(),
	onLoad:null,
	onError:null,
    onProcess:null,
    responseObject:null,
    xml:new Array(),


    initRequestXSL:function (id)
	{

        if (window.XMLHttpRequest)
		{
            this.reqXSL[id] = new XMLHttpRequest ();
		}

        else if (window.ActiveXObject)
		{
            this.reqXSL[id] = new ActiveXObject ("Microsoft.XMLHTTP");
        }

        if (this.reqXSL[id] == null)
		{
            return false;
		}

		var obj = this;

        this.reqXSL[id].onreadystatechange = function ()
		{
            if (obj.reqXSL[id].readyState == 4)
			{

                if (obj.reqXSL[id].status == 200)
				{
	                if (obj.reqXSL[id].onLoad)
					{
						obj.reqXSL[id].onLoad ();
					}

                }

				else if (obj.reqXSL[id].onError)
				{
					obj.reqXSL[id].onError ();
				}
            }
        }

        return true;
    },

    openXSL:function (url)
	{
		var id = Math.random();

        if (!this.initRequestXSL (id))
		{
            return;
		}
        if (this.onProcess)
		{
            this.onProcess ();
		}

        this.reqXSL[id].open ("GET", url, false);
        this.reqXSL[id].send (null);

		return id;
    },


    initRequest:function (id)
	{

        if (window.XMLHttpRequest)
		{
            this.req[id] = new XMLHttpRequest ();
		}

        else if (window.ActiveXObject)
		{
            this.req[id] = new ActiveXObject ("Microsoft.XMLHTTP");
        }

        if (this.req[id] == null)
		{
            return false;
		}

		var obj = this;

        this.req[id].onreadystatechange = function ()
		{
            if (obj.req[id].readyState == 4)
			{
                if (obj.req[id].status == 200)
				{
	                if (obj.req[id].onLoad)
					{
						obj.req[id].onLoad ();
					}

    				obj.handleResponse(id);
                }
				else if (obj.req[id].onError)
				{
					obj.req[id].onError ();
				}
            }
        }

        return true;
    },

    openPOST:function (url, postData)
	{
		var id = Math.random ();

        if (!this.initRequest (id))
		{
            return;
		}
        if (this.onProcess)
		{
            this.onProcess ();
		}

        this.req[id].open ("POST", url, true);
        this.req[id].setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        this.req[id].send (postData);
    },

    openGET:function (url, rid, history)
	{
		var id = Math.random ();

        if (!this.initRequest (id))
		{
            return;
		}
        if (this.onProcess)
		{
            this.onProcess ();
		}

        this.req[id].open ("GET", url, true);
        this.req[id].send (null);
		this.rid[id] = rid;
		this.url[id] = url;
		this.history[id] = history;
		this.xmlUrl[id] = url;
    },

    handleResponse:function (id)
	{
		// Load XML
		var xmlDoc = Sarissa.getDomDocument();
	//alert(this.req[id].responseText);
		try
		{
			var xmlDoc = this.req[id].responseXML;
			var replaceId = this.rid[id];

			if(!xmlDoc)
			{
				throw("Bad XML was responsed!");
			}

			if(xmlDoc.selectSingleNode('/index/errors') || xmlDoc.selectSingleNode('/index/chselect') || xmlDoc.selectSingleNode('/index/function'))
			{
				// Errors for form
				if (xmlDoc.selectSingleNode('/index/errors'))
				{
					this.setFormErrors(xmlDoc);
				}

				// Selects replace
				if (xmlDoc.selectSingleNode('/index/chselect'))
				{
					this.chSelect(xmlDoc);
					unblock(scrollUp, true);
					return true;
				}

				// CallFunction
				if(xmlDoc.selectSingleNode('/index/function'))
				{
					this.callBackHandler(xmlDoc);
				}

				unblock(scrollUp);
				return true;
			}

			// Redirect "ajax-304 :)" from location(..., 2);
			if (xmlDoc.selectSingleNode('/index/redirect'))
			{
				location.href = xmlDoc.selectSingleNode('/index/redirect').text;
				return false;
			}

			if (mtitle = xmlDoc.selectSingleNode('/index/data/meta-title'))
			{
				document.title = mtitle.text;
			}

			if (!replaceId)
			{
				replaceId = xmlDoc.selectSingleNode('/index/data/id').text;
			}

			navId = xmlDoc.selectSingleNode('/index/data/nav-id').text;
/*
			try {replaceSiblingId = xmlDoc.selectSingleNode('/index/data/sibling-id').text} catch(e) {};
*/
			try {BaseXml = xmlDoc.selectSingleNode('/index/data/base-xml').text} catch(e) {};

			if (replaceId == "_")
			{
				window.location = xmlDoc.selectSingleNode('/index/data/base-html').text;
			}
			// !CACHE
			//cache[this.xmlUrl[id]] = xmlDoc;

			var xslSrc = xmlDoc.selectSingleNode('/index/data/xsl').text;
			var xslId = xmlDoc.selectSingleNode('/index/data/xsl-cache-id').text;
			var scrollUp = xmlDoc.selectSingleNode('/index/data/scroll-up').text;
		}
		catch (e)
		{
			alert(e);
			// Developing phase
			document.write(this.req[id].responseText);
			document.close();

			// Live
			alert(this.req[id].responseText)

			return false;
		}

		if (!cache[xslId])
		{
			// Load XSL
			idXSL = this.openXSL(xslSrc);

			// Create XSL
			var xslDoc = Sarissa.getDomDocument();
			var xslDoc = this.reqXSL[idXSL].responseXML;
			// !CACHE
			//cache[xslId] = xslDoc;
		}
		else
		{
			xslDoc = cache[xslId];
		}

		// Create an instance of XSLTProcessor
		var processor = new XSLTProcessor();
		processor.importStylesheet(xslDoc);

		// Transform
		var newDocument = processor.transformToDocument(xmlDoc);
		newText = Sarissa.serialize(newDocument.selectSingleNode('/index/body'));
//		newText = newText.replace('<body>', '').replace('</body>', '');

		// Replace
		if (document.getElementById(replaceId))
		{

			repl = document.getElementById(replaceId);
			repl.style.visibility	= 'hidden';
			repl.id					= replaceId;
			repl.innerHTML		= newText;
			repl.style.visibility	= 'visible';
//alert(repl.innerHTML);
			// History
			try
			{
				if (!this.history[id])
				{
					dhtmlHistory.add(navId, this.url[id]);
				}
			}

			catch(e){}

			go_decoding();
			unblock(scrollUp);
		}
		else
		{
			unblock(scrollUp);
			get(BaseXml);
		}

		// Destroy
		delete this.req[id];
		delete this.reqXSL[idXSL];
		delete this.rid[id];
    },

    callBackHandler:function (obj)
    {
    	var items = obj.selectNodes('/index/function');

		for(var i = 0; i < items.length; i++)
    	{
    		var functionName = items[i].getAttribute('name');

    		var xmlCBDocument = Sarissa.getDomDocument();
    		var index = xmlCBDocument.createElement('index');
    		xmlCBDocument.appendChild(index);
    		var nodes = obj.selectNodes('/index/function/*');
	/*
    		for(var o = 0; o < nodes.length; o++)
    		{
				if (nodes[o])
				{
					var tmpNode = nodes[o].cloneNode(true);
					index.appendChild(tmpNode);
				}
    		}
*/
//debugger;
    		eval(functionName+'(obj)');
    	}
    },

	setFormErrors:function (obj)
	{
		var formName = obj.selectSingleNode('/index').getAttribute('name');
		var item = obj.selectNodes('/index/errors/error');

		for(var i=0; i<item.length; i++)
		{
			var name	= item[i].getAttribute('name');
			var pclass	= item[i].getAttribute('class');
			var text	= item[i].text;
			var id		= formName + '_' + name + '_error';

			var elem	= document.getElementById(id)
			elem.innerHTML = text;

			if (pclass)
			{
				elem.className = elem.className + ' ' + pclass;
			}
			else
			{
				elem.className = 'error';
			}

			elem.style.display = 'block';

		}

		try {killMessage()} catch (e) {}

	},

	chSelect:function (obj)
	{

			var name = obj.selectSingleNode('/index/chselect').getAttribute('name');
			var item = obj.selectNodes('/index/chselect/o');
			var item1 = obj.selectNodes('/index/chselect/o1');
			var clear = obj.selectNodes('/index/clear');
			var elem = document.getElementsByName(name);
			elem = elem[0];

			// Clear
			if (clear)
			{

				for(var i=0; i<clear.length; i++)
				{
					var celem = document.getElementsByName(clear[i].text);

					celem = celem[0];

					celem.options.length = 0;
					var opt = document.createElement("option")
					celem.options.add(opt);
					opt.text	= '-- выберите значение --';
					opt.value	= '';
				}
				//**** для plaza (админка-каталоги-ноутбуки) ******
				try
				{
					if (clear[0].text == 'series')
					{
							var series = obj.selectNodes('/index/series1');

							var el1 = document.getElementById('series1');

							if (series[0].text == '0')
							{
								el1.className = 'hideel';
							}
							if (series[0].text == '1')
							{
								var el2 = document.getElementById('series');
								el2.className = 'showel';

								el2.options.length = 0
								var opt = document.createElement("option")
								el2.options.add(opt);
								opt.text	= '-- выберите значение --';
								opt.value	= '';

								for(var i=0; i<item1.length; i++)
								{

									var value	= item1[i].getAttribute('v');
									var text	= item1[i].text;

									var opt 	= document.createElement("option");
									opt.text	= text;
									opt.value	= value;

									el2.options.add(opt);
								}
							}

					}
				} catch(e){
				}
				//***** ---------------- *************
			}

			elem.options.length = 0
			var opt = document.createElement("option")
			elem.options.add(opt);
			opt.text	= '-- выберите значение --';
			opt.value	= '';

			for(var i=0; i<item.length; i++)
			{

				var value	= item[i].getAttribute('v');
				var text	= item[i].text;

				var opt 	= document.createElement("option");
				opt.text	= text;
				opt.value	= value;

				elem.options.add(opt);
			}
	}
}

function loadFromCache(url)
{
	var xmlDoc = cache[url];
	replaceId = xmlDoc.selectSingleNode('/index/data/id').text;
	var xslSrc = xmlDoc.selectSingleNode('/index/data/xsl').text;
	var xslId = xmlDoc.selectSingleNode('/index/data/xsl-cache-id').text;

	if (!cache[xslId])
	{
		// Load XSL
		idXSL = this.openXSL(xslSrc);

		// Create XSL
		var xslDoc = Sarissa.getDomDocument();
		var xslDoc = this.reqXSL[idXSL].responseXML;
		cache[xslId] = xslDoc;
	}
	else
	{
		xslDoc = cache[xslId];
	}

	// Create an instance of XSLTProcessor
	var processor = new XSLTProcessor();
	processor.importStylesheet(xslDoc);

	// Transform
	var newDocument = processor.transformToDocument(xmlDoc);
	newText = Sarissa.serialize(newDocument.selectSingleNode('/index/body'));

	// Replace
	document.getElementById(replaceId).style.visibility = 'hidden';
	document.getElementById(replaceId).innerHTML = newText;
	document.getElementById(replaceId).style.visibility = 'visible';

	unblock();
	go_decoding();
}

function topget(url, history)
{
	document.body.scrollTop = 150;
	document.documentElement.scrollTop = 150;

	return get(url, history);
}

function get(url, history)
{
	if (isOpera)
	{
		url = url.replace('.xml', '.html');

		document.location = url;

		return false;
	}

	url = url.replace('.html', '.xml');

	if (url)
	{
		block();
		hintHide();

		if (!cache[url])
		{
			loading();
			JsRequest.openGET(url, false, history);
		}
		else
		{
			loadFromCache(url);
		}

		return false;
	}
	else
	{
		return true;
	}
}

function nhget(url)
{
	get(url, true);
}

function rget(url, rid)
{
if (isOpera)
	{
		url = url.replace('.xml', '.html');

		document.location = url;

		return false;
	}

	url = url.replace('.html', '.xml');

	if (url)
	{
		block();
		hintHide();

		if (!cache[url])
		{
			loading();
			JsRequest.openGET(url, rid);
		}
		else
		{
			loadFromCache(url);
		}

		return false;
	}
	else
	{
		return true;
	}

}

function post(url, body_)
{
	if (isOpera)
	{
		return true;
	}

	url = url.replace('.html', '.xml');

	if (url)
	{
		block();
		loading();
		JsRequest.openPOST(url, body_);

		return false;
	}
	else
	{
		return true;
	}
}

function block()
{
	/*
	var name = gE('loading').getAttribute('name');

	if (isIE){height = (document.documentElement?document.documentElement.scrollTop:document.body.scrollTop) + 250;} else
	{height = (document.documentElement?document.documentElement.scrollTop:document.body.scrollTop) + (document.body.clientHeight / 2) - ((100+70) / 2);}

	left = (document.body.clientWidth / 2) - (200 / 2) - 10;

	if (name!='admin-loading') gE('loading').style.top = height + 'px';
	if (name!='admin-loading') gE('loading').style.left = left + 'px';
	*/
	try
	{
		document.getElementById('blocking').style.display = 'block';
		isBlocked = true;
	} catch (e) {}
}

function blockById(id)
{
	try
	{
		document.getElementById(id).style.display = 'block';
		isBlocked = true;
	} catch (e) {}
}

function loading()
{
	try
	{
		document.getElementById('loading').style.display = 'block';
	} catch (e) {}
}

function unblock(scrollUp, offOnLoad)
{

	try
	{
		document.getElementById('blocking').style.display	= 'none';
		document.getElementById('loading').style.display	= 'none';
		isBlocked = false;

		if (scrollUp == 'yes')
		{
			//if (isIE)
			{
				document.body.scrollTop = 0;
			}
		}

	} catch (e) {}

	if (!offOnLoad)
	{
		//alert('onload');
		onLoad(true);
	}
}

function unblockById(id, scrollUp)
{

	try
	{
		//document.getElementById('loading').style.display = 'block';
		document.getElementById(id).style.display = 'block';
		isBlocked = false;

		if (scrollUp == 'yes')
		{
			//if (isIE)
			{
				document.body.scrollTop = 0;
			}
		}

	} catch (e) {}

	onLoad(true);
}
/*
if (isIE)
{
	window.onscroll = function()
	{
		//try
		{
		//alert(5 + document.body.scrollTop) + 'px');
			document.getElementById('loading').style.top = (5 + document.body.scrollTop) + 'px';
		} //catch (e) {}
	}
}
*/
function bodySize()
{
	/*if(isIE && document.body.clientWidth)
	{
		sObj = document.getElementsByTagName("div")[0].style;
		sObj.width = (document.body.clientWidth < 995) ? "995px" : "100%";
	}*/
}
function init()
{
	if(isIE)
	{
		bodySize();
	}
}

onload = init;

if(isIE)
{
	onresize = bodySize;
}
