
function ArrayFindFree(arr) {
	var l = arr.length;
	for (var i=0; arr[i]; i++);
	return i;
}

function ArrayFillWithObj(arr,obj) {
	for (var i=0;i<arr.length;i++) arr[i] = obj;
}

function ArrayCount(arr) {
	for (var i in arr);
	return (i ? parseInt(i)+1 : 0);
}

function Elem(id) {
	return document.getElementById(id);
}

function ObjToComboArray(o) {
	var a = [];
	for (var p in o)
		a.push([o[p], p, ""]);
	return a;
}

function GetParams(o) {
	if (typeof(o)!="object")
		o=Elem(o);

	var i, j, a, s=[];
	var f = ["INPUT","TEXTAREA","SELECT"];
	for (i in f) {
		a = o.getElementsByTagName(f[i]);
		for (j=0;j<a.length;j++) {
			if (a[j].name)
				s[s.length] = a[j].name+"="+a[j].value;
			else
				if (a[j].id)
					s[s.length] = a[j].id+"="+a[j].value;
		}
	}
	return s.join("\n");
}

function SortArrByField(arr,fieldNum,sortDesc,isNumeric) {
	var tmp = arr.concat([]);
	if (isNumeric)
		tmp.sort(	function(a,b) {
						var q = a[fieldNum]=="" ? 0 : parseFloat(a[fieldNum]);
						var w = b[fieldNum]=="" ? 0 : parseFloat(b[fieldNum]);
						if (q<w) return -1 * sortDesc;
						if (q>w) return 1 * sortDesc;
						return 0;
					}
				);
	else
		tmp.sort(	function(a,b) {
						var q = a[fieldNum].toLowerCase();
						var w = b[fieldNum].toLowerCase();
						if (q<w) return -1 * sortDesc;
						if (q>w) return 1 * sortDesc;
						return 0;
					}
				);
	return tmp;
}

function ChangeColorTone(color, i) {
	var r = parseInt(color.substr(1,2),16);
	var g = parseInt(color.substr(3,2),16);
	var b = parseInt(color.substr(5,2),16);
	if ((i<0 && (r<-i || g<-i || b<-i)) || 
		(i>0 && (r+i>255 || g+i>255 || b+i>255))) return color;
	return "#"+(r+i).Hexify()+(g+i).Hexify()+(b+i).Hexify();
}

function setCol(s) {
	if (typeof(s)=="string" && s.substr(s.length-2,2)==" %")
		return "<FONT COLOR="+(s.substr(0,1)=="-" ? "RED":"GREEN")+">"+s+"</FONT>";
	else
		return (!isNaN(s) && !parseFloat(s) ? "&nbsp;" : s);
}

function setColComp(n,m) {
	if (isNaN(n) || isNaN(m) || !parseFloat(n)) return "&nbsp;";
	return "<FONT COLOR="+(parseFloat(n)<parseFloat(m)?"RED":parseFloat(n)==parseFloat(m)?"BLACK":"GREEN")+">"+n+"</FONT>";
}

function setColPosNeg(s) {
	return "<FONT COLOR="+(parseFloat(s)<0 ? "RED":"GREEN")+">"+s+"</FONT>";
}

function setMail(s) {
	return '<A HREF="mailto:'+s+'"><IMG SRC="../images/letter.gif" BORDER=0 ALT="'+s+'"></A>';
}

function SetEvent(o,eventName,handler) {
	if (o[eventName])
		o["_"+eventName] = o[eventName];
	o[eventName] = handler;	
}

function RollbackEvent(o,eventName) {
	if (o["_"+eventName]) {
		o[eventName] = o["_"+eventName];
	} else {
		o[eventName] = null;
	}
}

function DiveToAttrib(o,attrib) {
	while (o.tagName!="BODY") {
		if (typeof(o[attrib])!="undefined")
			return o;
		o = o.parentNode;
	}
	return null;
}

function SetEvent(o,eventName,handler) {
	if (o[eventName])
		o["_"+eventName] = o[eventName];
	o[eventName] = handler;
}

function RollbackEvent(o,eventName) {
	if (o["_"+eventName]) {
		o[eventName] = o["_"+eventName];
	} else {
		o[eventName] = null;
	}
}

/**********************************************/

var __s;
function buildArray(arr) {
	if (typeof(arr)=='object') {
		if (arr==null) return 0;
		__s+="[ ";
		for (var i=0; i<arr.length; i++) buildArray(arr[i]);
		__s=__s.substr(0,__s.length-1)+"],";
	} else {
		if (typeof(arr)=='undefined') {
			__s+=",";
		} else {
			if (isNaN(arr)) __s+='"'+arr.replace(/\"/g,"&#34;")+'"'+","; else __s+=arr+",";
		}
	}
}

function arrayToString(arr) {
	__s="";
	buildArray(arr);
	return(__s.substr(0,__s.length-1));
}
