var isIE		= (navigator.appName.indexOf('Internet Explorer') != -1);
var isOpera		= (navigator.userAgent.indexOf("Opera")>-1);

var cache		= new Array();
var isBlocked 	= false;
/*
function historyCall(hash, sl) 
{

	if(hash) 
	{
		// restore ajax loaded state
		if (!sl) 
		{

		}

	} else 
	{
		// start page
	}
}
*/

function historyCall(hash, sl) 
{
//	if(hash=="")
//		hash = "index";
	if(hash) 
	{
		// restore ajax loaded state
		if (!sl) 
		{
			if (hash == 'fc')
			{
				hash = $.cookie('last_url');
			}

			hash = hash.replace(/\:\:\:/gi, '=');
			hash = hash.replace(/\:\:/gi, '?');
			hash = hash.replace(/\:/gi, '/');
			
			getD(hash, true);
		}

	} else 
	{
		// start page
	}
}

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;
//		hash = url.replace(/^.*#/, '').replace(/\//gi, ':').replace(/\?/gi, '::').replace(/\=/gi, ':::');
//alert(12);
		if (!history)
		{
			this.historyAdd(url);
		}
    },

	historyAdd : function(url)
	{
		// dhtmlHistory.add('h' + Math.round(Math.random()*1000), url);

		url = url.replace(/\//gi, ':');
		url = url.replace(/\?/gi, '::');
		url = url.replace(/\=/gi, ':::');

		if (url != 'fc')
		{
			$.cookie('last_url', url, {path: '/'});
		}			
		
		$.historyLoad(url, true);
	},

    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);
			
			Slide.sets();

		}
		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 getD(url, history)
{
	if (document.getElementById('jocker')) 
	{

		if ($('#scrolling')) $('#scrolling').hide();
		if ($('#r-inner')) $('#r-inner').hide();
		if ($('.j-bg')) $('.j-bg').hide();
		if ($('.man')) $('.man').hide();
		if ($('.item')) $('.item').hide();
		$('#replace').hide();

		document.getElementById('jocker').JockerCardOff();

		get(url, history);

		window.setTimeout('Jocker.EndJockerCartOn()', ($.browser.msie ? 2700 : 3100));

		var url = url.replace('/-body/-joke/inner/jokes/index.xml?categoryid=', '/joke/') + '.html';

		pageTracker._trackPageview(url);

	}

	return false;
}

function block()
{

	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)
{
/*
	$('#replace').animate({"opacity": "show"}, "slow");
	if ($('#scrolling')) $('#scrolling').animate({"opacity": "show"}, "slow");
	if ($('.item')) $('.item').animate({"opacity": "show"}, "slow");

	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 = 'none';
		document.getElementById(id).style.display = 'none';
		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;
}
