var initFunctions = [];

function getElement(name){
	if (document.layers)
		return eval('document.layers[\''+name+'\']');
	else
		return eval('document.getElementById(\''+name+'\')');
}


function addEvtListener(element, event, listener, bubble){
	if (!bubble) bubble = false;
	if (window.addEventListener)
		element.addEventListener(event, listener, bubble);
	else if (window.attachEvent)
		element.attachEvent('on'+event, listener, bubble);
}

function evtStop(e){
  if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}

function serializeData(data) {
	var type = typeof(data)
	var val;
	switch (type) {
		case 'undefined':
			val = 'N';	break;
		case 'boolean':
			val = 'b:' + (data ? '1' : '0');		break;
		case 'number':
			val = (Math.round(data) == data ? 'i' : 'd') + ':' + data;			break;
		case 'string':
			xdata = encodeURIComponent(data);
			val = 's:' + xdata.length + ':"' + xdata + '"';	break;
		case 'object':
			if (data==null)	{
				val = 'N;';
			}
			else{
				if (data.constructor.toString().indexOf("Array") == -1) return '';
				val = 'a';
				var count = 0;
				var aSer = '';
				var okey;
				for (var c = 0; c<data.length; c++) 
					aSer += serializeData(c) +	serializeData(data[c]);
				val += ":" + data.length + ":{" + aSer + "}";
			}
			break;
	}
	if (type != 'object') val += ';';
		return val;
}

function unserializeData(data) {
	function ParseResult(idata, length){
		this.data	=idata;
		this.len	=length;
	}
	function parseSerialized(string){
		var data = string.substring(2);
		switch (string.charAt(0)) {
			case 'N': return new ParseResult(null,2);
			case 'b':
			case 'i':
			case 'd':
				var dlen = data.indexOf(';');
				return new ParseResult(parseInt(data.substring(0,dlen)), dlen+3); // x:*;
			case 's':
				var sstart = data.indexOf(':');
				var strLen = parseInt(data.substring(0,sstart));
				return new ParseResult(decodeURI(data.substring(sstart+2, sstart+strLen+2)) ,6+sstart+strLen); // s:*:"*"; = 6
			case 'a':
				var astart = data.indexOf(':');
				var arrLen = parseInt(data.substring(0,astart));
				data = data.substring(astart+2); // :{
				var c, olen = 0;
				var index, value;
				var ret = new Array();
				for (c = 0; c < arrLen; c++){
					index = parseSerialized(data);
					data = data.substring(index.len);
					value = parseSerialized(data);
					data = data.substring(value.len);
					ret[index.data] = value.data;
					olen += index.len + value.len;
				}
				return new ParseResult(ret,olen+astart+5); //a:*:{}
			default:
				alert('Unserialize error:\n'+string);
				return '';
		}
	}
	return parseSerialized(data).data;
} 

function regOnLoad(fnc){
	initFunctions.push(fnc);
}

function emptyElement(element){
	while (element.childNodes[0]) 
		element.removeChild(element.childNodes[0]);
}

function genSelect(value, caption){
	var opt = document.createElement('option');
	opt.value = value;
	opt.appendChild(document.createTextNode(caption));
	return opt;
}

function onLoad(){
	for (f in initFunctions)
		initFunctions[f]();
}

function swapVals(el1, el2){
	var tmp = el1.value;
	el1.value = el2.value;
	el2.value = tmp;
}

function addCell(row, text, tdclass){
	var cell = document.createElement('td');
	cell.appendChild(document.createTextNode(text));
	if (tdclass != null)
		cell.className = tdclass;
	row.appendChild(cell);
}

function getFormField(formname, fieldname){
	for(var i = 0; i < document.forms.length; i++ ) {
		if (document.forms[i].name != formname)
			continue;
		for(var j = 0; j < document.forms[i].elements.length; j++ ){
			if(document.forms[i].elements[j].name == fieldname) 
				return document.forms[i].elements[j];
		}
	}
	return null;
}

function intLimit(num, nmin, nmax){
	return num < nmin ? nmin : num > nmax ? nmax : num; 
}

/* DBG */
function dbgObject(obj, parent) {
	var msg = '';
	parentName = parent ? parent+'.' : '';
	for (var property in obj) {
		var val = '[!]';
		try { val = obj[property]; } catch (e){}
		msg +=  parentName +  property +'='+ val + '\n\r';
		if (typeof val == "object")
			msg += dbgObject(obj[property], parentName + property);
	}
	return msg;
}

function setVis(element, state){
	var el = getElement(element);
	if (el)	el.style.display = state;
}

function confirmAction(question, action){
	if (confirm(question))
		document.location = unescape(action);
}

function dbg(text, id){
	if (!id) id = 0;
	var tgt = getElement('dbg'+id);
	if (!tgt)
		return;
	if ((id == 0) && tgt.childNodes[0]) text = tgt.childNodes[0].data +'\n\r'+ text;
	while (tgt.childNodes[0]) 
		tgt.removeChild(tgt.childNodes[0]);
	tgt.appendChild(document.createTextNode(text));

}
