/*
sets visibility attribute of object obj to 'visible'
*/
function objShow (obj) {
	obj.style.visibility = 'visible';
	return false;
}

/*
sets visibility attribute of object identified by id to 'visible'
*/
function objShowById (id) {
	document.getElementById(id).style.visibility = 'visible';
	return false;
}

/*
sets visibility attribute of object obj to 'hidden'
*/
function objHide (obj) {
	obj.style.visibility = 'hidden';
	return false;
}

/*
sets visibility attribute of object identified by id to 'hidden'
*/
function objHideById (id) {
	document.getElementById(id).style.visibility = 'hidden';
	return false;
}

/*
sets visibility attribute of object obj to 'inherit'
*/
function objInherit (obj) {
	obj.style.visibility = 'inherit';
	return false;
}

/*
sets visibility attribute of object identified by id to 'inherit'
*/
function objInheritById (id) {
	document.getElementById(id).style.visibility = 'inherit';
	return false;
}

/*
sets object obj position according to event ev in such a way, that it is will be on visible page area
Works:
-IE/6.0
-Opera/7.0
Works after fix:
-Mozilla (Gecko)/1.2+
Not works:
-Mozilla (Geck0)/1.0-
*/
function posObjByEvent (obj, ev) {
	scrlTop = document.body.scrollTop;
	//alert ('scrlTop: ' + scrlTop);
	scrlLeft = document.body.scrollLeft;
	//alert ('scrlLeft: ' + scrlLeft);

	evTop = ev.clientY;
	//alert ('evTop: ' + evTop);
	evLeft = ev.clientX;
	//alert ('evLeft: ' + evLeft);

	wndHeight = document.body.clientHeight;
	//alert ('wndHeight: ' + wndHeight);
	wndWidth = document.body.clientWidth;
	//alert ('wndWidth: ' + wndWidth);

	//objHeight = obj.clientHeight; // don't work in Gecko, eg returns allways 0
	objHeight = obj.offsetHeight; // hotfix for Gecko
	//alert ('objHeight: ' + objHeight);
	//objWidth = obj.clientWidth; // don't work in Gecko, eg returns allways 0
	objWidth = obj.offsetWidth; // hotfix for Gecko
	//alert ('objWidth: ' + objWidth);

	if (evTop - objHeight / 2 < 0) {
		objTop = evTop + scrlTop;
		//alert ('Перебор по вертикали вверх');
	} else if (evTop + objHeight / 2 > wndHeight) {
		objTop = evTop + scrlTop - objHeight;
		//alert ('Перебор по вертикали вниз');
	} else {
		objTop = evTop + scrlTop - objHeight / 2;
		//alert ('Норма по вертикали');
	}
	obj.style.top = objTop;
	//alert ('objTop: ' + objTop);

	if (evLeft - objWidth / 2 < 0) {
		objLeft = evLeft + scrlLeft;
		//alert ('Перебор по горизонтали влево');
	} else if (evLeft + objWidth / 2 > wndWidth) {
		objLeft = evLeft + scrlLeft - objWidth;
		//alert ('Перебор по горизонтали вправо');
	} else {
		objLeft = evLeft + scrlLeft - objWidth / 2;
		//alert ('Норма по горизонтали');
	}
	obj.style.left = objLeft;
	//alert ('objLeft: ' + objLeft);
	return false;
}

/*
changes location property of window, i.e. loads specified url
*/
function urlJump (url, wind) {
	(wind ? wind : window).location = url;
	return false;
}

/*
creates object with info about current browser
*/
function browser () {
	this.dom = (document.createElement && document.appendChild && document.getElementsByTagName) ? true : false;

	var browser;
	if (navigator.appName.indexOf ('Netscape') >= 0) browser = 'ns';
	else if ((navigator.appName == 'Opera') || (navigator.userAgent.indexOf ('Opera') >= 0)) browser = 'opera';
	else if (navigator.appName == 'Microsoft Internet Explorer') browser = 'ie';
	else alert ('Unidentified browser. This browser is not supported');

	var version = navigator.appVersion;
	var versionNum = parseInt (version);

	if (browser == 'ns' && versionNum >= 4) {
		this.ns = 1.0;
		if (versionNum == 4) this.ns = 4.0;
		if (versionNum == 5) this.ns = 6.0;
	} else this.ns = false;
	
	if (browser == 'ie' && versionNum >= 4) {
		this.ie = 1.0;
		if (version.indexOf ('MSIE 4') >= 0) this.ie = 4.0;
		if (version.indexOf ('MSIE 5') >= 0) this.ie = 5.0;
		if (version.indexOf ('MSIE 5.5') >= 0) this.ie = 5.5;
		if (version.indexOf ('MSIE 6.0') >= 0) this.ie = 6.0;
	} else this.ie = false;
	
	if (browser == 'opera') {
		this.opera = 1.0;
		if (this.dom) this.opera = 5.0;
		if (this.dom && window.print) this.opera = 6.0;
		if (navigator.userAgent.indexOf ('Opera 7') >= 0) this.opera = 7.0;
		if (navigator.userAgent.indexOf ('Opera/7') >= 0) this.opera = 7.0;
	} else this.opera = false;

	var ua = navigator.userAgent.toLowerCase ();
	if (ua.indexOf ("win") > -1) this.platform = "win";
	else if (ua.indexOf ("mac") > -1) this.platform = "mac";
	else this.platform = "other";
}

/*
dumps an object obj properties in a new window
*/
function objDump (obj, except) {
	var dump = window.open ('about:blank', 'dumpWindow', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=no, width=400, height=400');

	dump.document.write ('<h3>Dumping object: ' + obj.toString () + '</h3>');
	for (var i in obj) {
		if (except && except.inArray (i)) continue;
		dump.document.write ('<b>' + i + '</b>: ');
		dump.document.write (obj[i] + '<br>');
	}
	document.close ();
	return false;
}

/*
returns a string with eval-able representation of given var
no recursion check
only for: strings, nums, arrays and simple objects (no functions)
*/
dumpVarForEval = function (evalVar) {
	var dumpObj = function (obj) {
		var objArr = new Array ();
		for (var prop in obj) {
			objArr.push (prop + ' : ' + dumpVar (obj[prop]));
		}
		var objStr = '{' + objArr.join (', ') + '}';
		return objStr;
	}
	var dumpArr = function (arr) {
		var arrArr = new Array ();
		for (var i = 0; i < arr.length; i++) {
			arrArr.push (dumpVar (arr[i]));
		}
		var arrStr = '[' + arrArr.join (', ') + ']';
		return arrStr;
	}
	var dumpStr = function (str) {
		return '"' + str + '"';
	}
	var dumpNum = function (num) {
		return num;
	}
	var dumpVar = function (variable) {
		switch (variable.constructor) {
			case Array:  return dumpArr (variable); break;
			case Object: return dumpObj (variable); break;
			case String: return dumpStr (variable); break;
			case Number: return dumpNum (variable); break;
		}
		return variable;
	}

	return dumpVar (evalVar);
}
