// ZSite CMS
// JavaScript Runtime
// (c) Zagorodnikov Anton 2007-2008

var globaleval = function(code)
{
	if (window.execScript)
	{
		window.execScript(code);
	}
	else
	{
		return window.eval(code);
	}
}

function zsite_evalscripts(nodeid)
{
        var scrpts = dojo.byId(nodeid).getElementsByTagName('script');
	for(var i = 0;i < scrpts.length;i++)
	{
		if((scrpts[i].getAttribute('type') == 'dojo/connect')||(scrpts[i].getAttribute('type') == 'dojo/method'))
		{
//			alert(scrpts[i].innerHTML);
			continue;
		}

//		alert(scrpts[i].innerHTML);
		globaleval(scrpts[i].innerHTML);
	}
}

//
// create a new unique ZSite ID
// with chronological meaning also
//
function ZSite_GetID()
{
	var now = new Date();
	return ([(1900+now.getYear()),now.getMonth(),now.getDate(),now.getHours(),now.getMinutes(),now.getSeconds(),Math.round(Math.random()*100000000)].join(""));
}


// типа если не определен, не выдавать ошибки
if (!document.getElementById)
    document.getElementById = function()
{
	return null;
}

function createXMLHttpRequest( )
{
      try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
      try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
      try { return new XMLHttpRequest( ); } catch(e) {}
      alert("XMLHttpRequest not supported");
      return null;
}

function $(id)
{
  return document.getElementById(id);
}





























var prevposx = -1;
var prevposy = -1;

var mousex = -1;
var mousey = -1;

document.onmouseup = function(e)
{
	zsite_mouseup_handlers();


	return false;
}

document.onmousemove = function(e)
{
    

	if(e != null)
	{
		mousex=e.pageX;
		mousey=e.pageY;
	}
	else
	{
		mousex=event.x;
		mousey=event.y;
	}

	//now call all zsite mouse move handlers
	if(prevposx != -1)
	{
	    zsite_mousemove_handlers();
	}

	prevposx = mousex;
	prevposy = mousey;

	return false;
}

function zsite_mousemove_handlers()
{
	
}

function zsite_mouseup_handlers()
{
	
}

var zsite_lazyexec_times = Array();
var zsite_lazyexec_timerid = Array();

var zsite_lazyscroll_times = Array();
var zsite_lazyscroll_valx = Array();
var zsite_lazyscroll_timerid = Array();
var zsite_lazyscroll_valy = Array();

function zsite_lazyscroll(handler, valx, valy)
{
    var timestamp = new Date();

    //check if called first time
    if(zsite_lazyscroll_times[(handler)] != null)
    {
	var timepassed = timestamp - zsite_lazyscroll_times[handler];
//	alert(zsite_lazyscroll_times[handler]);
	if(timepassed > 100)
	{
	    eval(handler+"("+(zsite_lazyscroll_valx[handler]+valx)+","+(zsite_lazyscroll_valy[handler]+valy)+");");
//	    alert(handler+"("+(zsite_lazyscroll_valx[handler]+valx)+","+(zsite_lazyscroll_valy[handler]+valy)+");");
	    clearTimeout(zsite_lazyscroll_timerid[handler]);
	    zsite_lazyscroll_times[(handler)] = null;
	    zsite_lazyscroll_timerid[(handler)] = null;
	    zsite_lazyscroll_valx[(handler)] = null;
	    zsite_lazyscroll_valy[(handler)] = null;
	}
	else
	{
	    zsite_lazyscroll_valx[(handler)] += valx;
	    zsite_lazyscroll_valy[(handler)] += valy;
	}
    }
    else
    {
	zsite_lazyscroll_times[handler] = timestamp;
	zsite_lazyscroll_valx[handler] = valx;
	zsite_lazyscroll_valy[handler] = valy;
	//this is for the expression to be evaled even in a single call
	zsite_lazyscroll_timerid[handler] = setTimeout("zsite_lazyscroll('"+handler+"',0,0);", 200);
    }

    return false;
}


function zsite_lazyexec(expression)
{
    var timestamp = new Date();

    //check if called first time
    if(zsite_lazyexec_times[(expression)] != null)
    {
	var timepassed = timestamp - zsite_lazyexec_times[expression];
//	alert(zsite_lazyexec_times[expression]);
	if(timepassed > 100)
	{
//	    alert(expression);
	    eval(expression);
	    clearTimeout(zsite_lazyscroll_timerid[expression]);
	    zsite_lazyscroll_timerid[(expression)] = null;
	    zsite_lazyexec_times[(expression)] = null;
	}
    }
    else
    {
//	    alert(expression);
	zsite_lazyexec_times[expression] = timestamp;
	//this is for the expression to be evaled even in a single call
	zsite_lazyexec_timerid[expression] = setTimeout("zsite_lazyexec(\""+expression+"\");", 200);
    }

    return false;
}


function disableSelection(element)
{
	if(element == null)
		return;

	element.onselectstart = function()
	{
		return false;
	};

	element.unselectable = "on";


	element.style.MozUserSelect = "none";

//	element.style.cursor = "default";
}

function enableSelectionElement(element)
{
	var oldmouseover = element.onmouseover;
	element.onmouseover = function()
	{
//		alert(1);
		enableSelection(dojo.byId('body'));
		if(oldmouseover != null) return oldmouseover();
//		return true;
	};

	var oldmouseout = element.onmouseout;
	element.onmouseout = function()
	{
		disableSelection(dojo.byId('body'));
		if(oldmouseout != null) return oldmouseout();
	}

	var oldfocus = element.onfocus;
	element.onfocus = function()
	{
		enableSelection(dojo.byId('body'));
		if(oldfocus != null) return oldfocus();
	}

	var oldblur = element.onblur;
	element.onblur = function()
	{
		disableSelection(dojo.byId('body'));
		if(oldblur != null) return oldblur();
	}

//	element.onselectend = function()
//	{
//		dojo.byId('body').MozUserSelect = "none";
//	};

}

function enableSelection(element)
{
	if(element == null)
		return;

	//alert(element);
	delete element.onselectstart;
/*	element.onselectstart = function()
	{
		delete dojo.byId('body').MozUserSelect;
		return true;
	};

	element.onselectend = function()
	{
		dojo.byId('body').MozUserSelect = "none";
	};
*/
//	delete element.unselectable;
	element.unselectable = "off";

//	alert(element.style.MozUserSelect);
	delete element.style.MozUserSelect;
//	element.style.MozUserSelect = "true";

	element.style.MozUserSelect = "tri-state";
//	alert(element.style.MozUserSelect);
//	element.style.cursor = "default";
}


function zsite_ajax_reload(node, url)
{
	if(url.indexOf('?') > 0)
		var urlto = url+"&AJAX=1&ClientIdCounter="+ClientIdCounter;
	else
	{
		var urlto = url+"?AJAX=1&ClientIdCounter="+ClientIdCounter;
	}

	dojo.xhrGet( {
			url: urlto,
			handleAs: 'text',
			timeout: 50000,
			load: function(response, ioArgs)
			{
				var inode = dojo.byId(node).parentNode;
				inode.innerHTML = response;
				//also evaluate scripts
//				var scrpts = dojo.byId(id+'_container').getElementsByTagName('script');
//				for(var i = 0;i < scrpts.length;i++)
//				{
//					if(scrpts[i].innerHTML){
//					if(scrpts[i].innerHTML.substr(3,4)=='<!--') //some IE strangeness
//					try{ globaleval(scrpts[i].innerHTML.substr(8,scrpts[i].innerHTML.length-12)); } catch(e) {}
//					else globaleval(scrpts[i].innerHTML); }
//				}

				zsite_evalscripts(inode);
				//parse dojo widgets also
				dojo.parser.parse(dojo.byId(inode));
//				alert(1);
			},
			error: function(response, ioArgs)
			{
				if(ioArgs.xhr.status == '200') return; alert("An AJAX error occurred, HTTP status code: "+ioArgs.xhr.status+"."); 
			}
		} );
}

function zsite_ajax_exec(node, url)
{
	if(url.indexOf('?') > 0)
		var urlto = url+"&AJAX=1&ClientIdCounter="+ClientIdCounter;
	else
	{
		var urlto = url+"?AJAX=1&ClientIdCounter="+ClientIdCounter;
	}

	dojo.xhrGet( {
			url: urlto,
			handleAs: 'text',
			timeout: 50000,
			load: function(response, ioArgs)
			{
				if(node != null)
				{
					var inode = dojo.byId(node);
					inode.innerHTML = response;
					zsite_evalscripts(inode);
					//parse dojo widgets also
					dojo.parser.parse(dojo.byId(inode));
				}
				else
				{
					var inode = dojo.byId("ajaxloading");
					inode.innerHTML = response;
					zsite_evalscripts(inode);
					//parse dojo widgets also
					dojo.parser.parse(dojo.byId(inode));
				}
			},
			error: function(response, ioArgs)
			{
				if(ioArgs.xhr.status == '200') return; alert("An AJAX error occurred, HTTP status code: "+ioArgs.xhr.status+"."); 
			}
		} );
}








function trim(string)
{
	return string.replace(/(^\s+)|(\s+$)/g, "");
}




// these functions are used in CSS editor

function getCSSNumber(string)
{
	var str = trim(string);
	var a = 0;
	for(a = 1; a < str.length; a++)
	{
		if(parseInt(str.substr(0,a)) == false)
			break;
	}

	if(a == 0) return "0";
	if(parseInt(str.substr(0,a)) == "NaN") return "0";
	if(parseInt(str.substr(0,a)) == false) return "0";

	return (parseInt(str.substr(0,a)));
}

function getCSSUnit(string)
{
	var str = trim(string);
	var a = 0;
	for(a = 1; a < str.length; a++)
	{
		if((str[a] != "0")&&(str[a] != "1")&&(str[a] != "2")&&(str[a] != "3")&&(str[a] != "4")&&(str[a] != "5")&&(str[a] != "6")&&(str[a] != "7")&&(str[a] != "8")&&(str[a] != "9")&&(str[a] != ".")&&(str[a] != ",")&&(str[a] != " "))
			break;
	}
	return ((str.substr(a)));
}

function ajaxShowLoading(node)
{
	var lh = dojo._getContentBox(node).h;
	var lw = dojo._getContentBox(node).w;
	var lt = dojo.coords(node, true).y;
	var ll = dojo.coords(node, true).x;
	dojo.byId('ajaxloading').innerHTML = "<table height=\"100%\" width=\"100%\" style=\"text-align: center; height: 100%;\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr><td valign=\"center\"><img src=\""+zsitewww+"res/images/zsite_updatebusy.gif\"/><br/>Loading...</td></tr></table>";
	dojo.byId('ajaxloading').style.background = "url("+zsitewww+"res/images/admin_lightbg.gif) repeat";
	dojo.byId('ajaxloading').style.width = lw+"px";
	dojo.byId('ajaxloading').style.height = lh+"px";
	dojo.byId('ajaxloading').style.left = ll+"px";
	dojo.byId('ajaxloading').style.top = lt+"px";
	dojo.byId('ajaxloading').style.textAlign = "center";
	dojo.byId('ajaxloading').style.display = "block";
}

function ajaxHideLoading()
{
	dojo.byId('ajaxloading').innerHTML = "";
	dojo.byId('ajaxloading').style.display = "none";
}

function zsite_getformvalues(formid)
{
	

}

function zsite_ajax_postexec(node, url, parameters)
{
	alert('todo');
}



function zsite_control_position(id)
{
	dojo.byId(id).style.width = dojo._getContentBox(dojo.byId(id).parentNode).w;

	//attach on resize recalculation
	dojo.connect(window, "onresize", function() { dojo.byId(id).style.width = dojo._getContentBox(dojo.byId(id).parentNode).w; });
}

var onloadfuncs = (onloadfuncs == null)?Array():onloadfuncs;


function zsite_addonload(func)
{

	onloadfuncs[onloadfuncs.length] = func;

	if(zsite_runtime_loaded)
	{
//		alert("we are loaded");
/*	
		try
		{
			dojo.addOnLoad(func);
		}
		catch(e)
		{
			if(window.onload != null)
			{
				window.onload = function() { window.onload; func; };
			}
			else
				window.onload = func;
		}
*/
		for(var i = 0; i < onloadfuncs.length; i++)
		{
//			alert(onloadfuncs[i]);
			if(onloadfuncs[i] != null)
				onloadfuncs[i]();
		}

		//clean onload functions stack
		onloadfuncs = Array();
	}
}

function zsite_setloaded()
{
	//hide loading screen if present
	if(dojo.byId('zsite_runtimesplash') != null)
	{
		dojo.byId('zsite_runtimesplash').style.display = 'none';
		dojo.byId('zsite_runtimesplash').parentNode.removeChild(dojo.byId('zsite_runtimesplash'));
	}

	zsite_runtime_loaded = true;

	//call onload function stack
	zsite_addonload(null);
}














// controlid -- ID of a widget that intellisense is bound to
// tablename -- database table which contains matches
// fieldnames -- field names in table specified by tablename which contain matches

function z_attach_intellisense(controlid, tablename, fieldnames)
{
	if(document.getElementById(controlid).onkeydown == null)
	{
		document.getElementById(controlid).onkeydown = function()
		{
			zsite_lazyexec("z_intellisense_showmatches('"+controlid+"', '"+tablename+"', Array('"+fieldnames.join("','")+"'))");
		};
	}
	else
	{
		document.getElementById(controlid).onkeydown = function()
		{
			//call old onkeydown handler
			document.getElementById(controlid).onkeydown();

			zsite_lazyexec("z_intellisense_showmatches('"+controlid+"', '"+tablename+"', Array('"+fieldnames.join("','")+"'))");
		};		
	}
}

function z_intellisense_showmatches(controlid, tablename, fieldnames)
{
	var query = document.getElementById(controlid).value;

	var fields = "&";

	for(var i = 0; i < fieldnames.length; i++)
	{
		fields = fields + "fieldname"+i+"="+fieldnames[i];
	}

	var url = zsitewww+"core/z_intellisense.php?tablename="+tablename+fields+"&searchquery="+query;

	//now perform an AJAX request
	var ajaxrequest = new sack();
	ajaxrequest.requestFile = url;
	// Specify function that will be executed after file has been found
	ajaxrequest.onCompletion = function()
		{
			//alert(ajaxrequest.response);
			document.getElementById("is").innerHTML = ajaxrequest.response;
		};
	//Execute AJAX function
	ajaxrequest.runAJAX();
}






function zsite_cookie_set(name, value, expires, path, domain, secure)
{
	// set time, it's in milliseconds
	var today = new Date();
	today.setTime( today.getTime() );

	/*
	if the expires variable is set, make the correct
	expires time, the current script below will set
	it for x number of days, to make it for hours,
	delete * 24, for minutes, delete * 60 * 24
	*/
	if(expires)
	{
		expires = expires * 1000 * 60 * 60 * 24;
	}
	var expires_date = new Date( today.getTime() + (expires) );

	document.cookie = name + "=" +escape( value ) +
		( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) +
		( ( path ) ? ";path=" + path : "" ) +
		( ( domain ) ? ";domain=" + domain : "" ) +
		( ( secure ) ? ";secure" : "" );
}




function zsite_get_frame_height(frameid)
{
	function getElement(aID)
	{
	        return (document.getElementById != null) ? document.getElementById(aID) : document.all[aID];
	}
	
	function getIFrameDocument(aID)
	{
	        var rv = null; 
	        var frame=getElement(aID);
	        // if contentDocument exists, W3C compliant (e.g. Mozilla) 
	
	        if (frame.contentDocument)
	            rv = frame.contentDocument;
	        else // bad IE  ;)
	
	            rv = document.frames[aID].document;
	        return rv;
	}

	try
	{
	        var frame = getElement(frameid);
	        var frameDoc = getIFrameDocument(frameid);
	//	alert(frameDoc.body.scrollHeight);
	        return ((frameDoc.height != null) ? frameDoc.height : frameDoc.body.scrollHeight);
	}
	catch(ex)
	{
	}
}

function zsite_get_frame_width(frameid)
{
	function getElement(aID)
	{
	        return (document.getElementById != null) ? document.getElementById(aID) : document.all[aID];
	}
	
	function getIFrameDocument(aID)
	{
	        var rv = null; 
	        var frame=getElement(aID);
	        // if contentDocument exists, W3C compliant (e.g. Mozilla) 
	
	        if (frame.contentDocument)
	            rv = frame.contentDocument;
	        else // bad IE  ;)
	
	            rv = document.frames[aID].document;
	        return rv;
	}

	try
	{
	        var frame = getElement(frameid);
	        var frameDoc = getIFrameDocument(frameid);
	//	alert(frameDoc.body.scrollHeight);
	        return ((frameDoc.width != null) ? frameDoc.width : frameDoc.body.scrollWidth);
	}
	catch(ex)
	{
	}
}
