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

/*
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/
var getElementsByClassName = function (className, tag, elm){
	if (document.getElementsByClassName) {
		getElementsByClassName = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};

//create function, it expects 2 values.
function insertAfter(newElement,targetElement)
{
	//target is what you want it to go after. Look for this elements parent.
	var parent = targetElement.parentNode;
	
	//if the parents lastchild is the targetElement...
	if(parent.lastchild == targetElement) {
		//add the newElement after the target element.
		parent.appendChild(newElement);
		} else {
		// else the target has siblings, insert the new element between the target and it's next sibling.
		parent.insertBefore(newElement, targetElement.nextSibling);
		}
}

//used for FORM moving into global container
//before submitting, allowing nested FORM tags
//According to DOM specification, removeChild
//returns reference to removed DOM node
function zsite_moveDOMnode(container, node)
{
	var node = node.parentNode.removeChild(node);
	container.appendChild(node);
}

function zsite_submitProxyForm(formnodeid)
{
	zsite_formproxy(formnodeid);

	formnode = document.forms["zsite_formproxy_form"];

	formnode.selfnode = document.forms["zsite_formproxy_form"];

	formnode.submitproxy = function()
	{
		formnode = document.forms["zsite_formproxy_form"];

//		alert(formnode.getAttribute('action'));

		if(formnode.hasAttribute('submittarget'))
			ajaxShowLoading(dojo.byId(formnode.getAttribute('submittarget')));

		try{
			dojo.io.iframe.send({
//					url: formnode.getAttribute('action'),
					method: 'post',
					handleAs: 'text',
					form: formnode.selfnode,
					load: function(data)
					{
//						alert(data);


						try
						{
							if(formnode.hasAttribute('submittarget'))
								var inode = dojo.byId(formnode.getAttribute('submittarget'));
							else
								var inode = formnode;
						}
						catch(e)
						{
							//alert("sdfqwe123");
						}

						var olddata = data;

						try
						{
							while(data.indexOf('z'+'sitetextarea') != -1)
							{
								data = data.replace('z'+'sitetextarea', 'textarea');
							}
						}
						catch(e)
						{
							//alert("xxcvsdf");
						}

//						if(inode != null)
//						{
							inode.innerHTML = data;

							try
							{
								setTimeout(function(){zsite_evalscripts(inode);}, 100);
							}
							catch(e)
							{
								alert("proxyform evalscripts error:"+e);
							}
							         
							try
							{
								dojo.parser.parse(dojo.byId(inode));
							}
							catch(e)
							{
								//alert("sverfq");
							}
//						}

						ajaxHideLoading();
					},
					error: function(response, ioArgs)
					{
						alert("Error:"+response);

						ajaxHideLoading();
						if(ioArgs.xhr.status == '200') return;
						alert("An AJAX error occurred, HTTP status code: "+ioArgs.xhr.status+"."); 
					}
					
				});
		}
		catch(e)
		{
			//alert(e);
		}
	}

//	alert(formnode.submit);





//	var elements = formnode.getElementsByTagName("input");
//	for(var i = 0; i < elements.length; i++)
//	{
//		alert(elements[i]+" name:"+elements[i].getAttribute("name")+" type:"+elements[i].getAttribute("type"));
//	}

	formnode.submitproxy();
}

function zsite_formproxy(formnodeid)
{
	//1. clear form proxy div
	var proxynode = document.getElementById("zsite_formproxy");
	var sourcenode = document.getElementById(formnodeid);
	proxynode.innerHTML = "";

	//2. create form DOM node
//	var formnode = document.createElement("form");

//	proxynode.appendChild(formnode);	

//	formnode.setAttribute("id", "zsite_formproxy_form");
//	formnode.setAttribute("method", "POST");
//	formnode.setAttribute("enctype", "multipart/form-data");

	var formstring = "<form id='zsite_formproxy_form' method='post' enctype='multipart/form-data'></form>";
	proxynode.innerHTML = formstring;

	formnode = document.getElementById('zsite_formproxy_form');

//	alert(formnode);

	//3. set parameters
	//4. transfer fields

	var elements = dojo.byId(formnodeid).getElementsByTagName("input");
/*
	while(elements.length > 0)
	{
//		alert(elements[0]);
//		zsite_moveDOMnode(formnode, elements[0]);
		var ch = document.createElement("input");
		formnode.appendChild(ch);
		formnode.replaceChild(elements[0], ch);
	}
*/


	var nodestomove = new Array();
	for(var i = 0; i < elements.length; i++)
	{
//		alert(elements[i]+" name:"+elements[i].getAttribute("name")+" type:"+elements[i].getAttribute("type"));

		var name = elements[i].getAttribute("name");
		if(name == "formaction")
		{
			formnode.setAttribute("action", elements[i].value);
		}
		else if(name == "submittarget")
		{
			formnode.setAttribute("submittarget", elements[i].value);
		}
		else
		{
			nodestomove.push(elements[i]);
		}
	}

	for(var j = 0; j < nodestomove.length; j++)
	{
//		zsite_moveDOMnode(formnode, nodestomove[j]);
		if (/MSIE (\d+\.\d+);/.test(navigator.userAgent))
		{
			formnode.appendChild(nodestomove[j]);
		}	
		else
		{
			formnode.appendChild(nodestomove[j].cloneNode(true));
		}
	}



//	formnode.innerHTML = dojo.byId(formnodeid).innerHTML;

	//alert(proxynode.innerHTML);


	if(formnode.getAttribute('action').indexOf('?') > 0)
		formnode.setAttribute('action', formnode.getAttribute('action')+'&AJAX=1&ATEXTAREA=1&ClientIdCounter='+ClientIdCounter+'&nocache'+ZSite_GetID())
	else
		formnode.setAttribute('action', formnode.getAttribute('action')+'?AJAX=1&ATEXTAREA=1&ClientIdCounter='+ClientIdCounter+'&nocache'+ZSite_GetID())

}









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

function zsite_evalscripts(nodeid)
{
	var node;

	if(!isNode(nodeid))
	{
		//console.error("zsite_evalscripts: argument must be ID of DOM mode");
		node = dojo.byId(nodeid);
	}
	else
	{
		node = nodeid;
	}

	if(node == null)
		return;

        var scrpts = node.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);
		try
		{
			if(trim(scrpts[i].innerHTML) != "")
			{
				globaleval(scrpts[i].innerHTML);
			}
		}
		catch(e)
		{
			//alert(e);
		}

	}

	try
	{
		dojo.parser.parse(node);
	}
	catch(e)
	{
		alert("Error parsing dojo widgets"+e);
	}

}

//
// 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); }
//				}

				if(inode != null)
				{
					try
					{
						zsite_evalscripts(inode);
					}
					catch(e)
					{
						alert(e);
					}
					//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";

	try
	{
		if(zsite_recalclayout != null)
			zsite_recalclayout();
	}
	catch(e)
	{
	}
}

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;
}

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'));
	}

	//call onload function stack
	for(var i = 0; i < onloadfuncs.length; i++)
	{
		if(onloadfuncs[i] != null)
			onloadfuncs[i]();
	}

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















// 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_cookie_unset(name)
{
	document.cookie = name +'=; expires=Thu, 01-Jan-70 00:00:01 GMT;';
}




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)
	{
	}
}

//Returns true if it is a DOM node
function isNode(o){
  return (
    typeof Node === "object" ? o instanceof Node : 
    typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName==="string"
  );
}

//Returns true if it is a DOM element    
function isElement(o){
  return (
    typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2
    typeof o === "object" && o.nodeType === 1 && typeof o.nodeName==="string"
);
}
