var w = window;
var d  = w.document;

var _vars = new Object();
_vars.loads = 0;
_vars.buffers = new Object();
_vars.buffertimeout = 5000;
_vars.ondomload = new Array();
_vars.DOMLOADED = false;
_vars.DOMWATCHED = false;

var _load_form_working = false;
var _load_form_callback = undefined;
var _load_form_container = undefined;

//
// Function load form by uri to container
//
function _load_form(uri, container, callback){
	if( _load_form_working == true ){
		return;
	}

    var cont = d.getElementById(container);
	_load_form_working = true;
	_load_form_callback = callback;
    _load_form_container = cont;
	_load_part(
		cont,
		uri, 
		_import_form);

//	    cont.innerHTML = '<i>Загрузка данных...</i>';
//	    frames["buffer"].location.href = uri;
}

//
// Function put form from buffer to container and calling callback function
//
function _import_form(){
	dst = _load_form_container;

	var tdoc = _get_frame_document(_import_form.arguments[0][0]);

	if( d.importNode ){
		// non IE importing
		dst.innerHTML = '';
		dst.appendChild(d.importNode(tdoc.getElementById("export").childNodes[0],true));
	}
	else{
		// ie importing, outerHTML including form tags
		dst.innerHTML = tdoc.getElementById("export").innerHTML;
	}

	_remove_buffer(_import_form.arguments[0][0]);
	if(typeof(_load_form_callback) != 'undefined' ){
		_load_form_callback(_import_form.arguments);
	}
	_load_form_working = false;
	_load_form_callback = undefined;

}



function _clear_container(object){
	object.innerHTML = '';
}

//
// Function cloning selection, creating new object
//
function _get_select(src, name){

	var sel;

	if( src.children ){
		//
		// Supports children collection
		//
		sel = d.createElement('select');

		var children = src.children;

		res = '';
		for( var i=0; i < children.length; i++ ){
			if( children[i].children.length > 0 ){
				// suppose it's an optiongroup
				var ogrp = d.createElement('optgroup');
				ogrp.label = children[i].label;
				var subch = children[i].children;
				for(j = 0; j< subch.length; j++ ){
					var opt = d.createElement('option');
					opt.value = subch[j].value;
					opt.appendChild(d.createTextNode(subch[j].innerHTML));
					ogrp.appendChild(opt);
				}
				sel.appendChild(ogrp);
			}
			else{
				// it's an option
				var opt = d.createElement('option');
				opt.value = children[i].value;
				opt.appendChild(d.createTextNode(children[i].innerHTML));
				sel.appendChild(opt);
			}
		}
	}
	else{
		// 
		// It's ff alright 
		//
		sel = src.cloneNode(true);
	}

	if(name != undefined ){
		sel.name = name;
		sel.id = name+'_';
	}

	return(sel);
}

//
// Function cloning text input
//
function _get_text(src, name){
	var text = d.createElement("input");
	text.size = src.size;
	text.maxLength = src.maxLength;
	if(name != undefined ){
		text.name = name;
		text.id = name+'_';
	}       
	return(text);
}

//
// Function cloning textarea input
//
function _get_textarea(src, name){
	var text = d.createElement("textarea");
	text.cols = src.cols;
	text.rows = src.rows;
	if(name != undefined ){
		text.name = name;
		text.id = name+'_';
	}       
	return(text);
}

//
// Function load part to buffer
//

function _load_part( target, uri, callback ){
	var _buffernum = _vars.loads;
	_vars.loads++;
	var _buffername = 'buffer'+_buffernum;
	var _buffer = new Object;
	_buffer.callback = callback;
	_buffer.target = target;

	var buf = d.createElement('iframe');
	buf.name = _buffername;
	buf.id = buf.name+'_';
	buf.src = uri;
	buf.style.height = 0;
	buf.style.width = 0;
	buf.style.display = 'none';
	buf.style.visibility = 'hidden';
	_buffer.buffer = d.body.appendChild(buf);

	_vars.buffers[buf.id] = new Object();
	_vars.buffers[buf.id] = _buffer;

	target.innerHTML = 'Загрузка данных...';
}

//
// Importing loaded part
//
function _import_part(){
	var _bufferid = _import_part.arguments[0];
    var buffer = _vars.buffers[_bufferid];
    if( buffer == undefined ){
    	window.alert('callback buffer undefined, while importing part '+_import_part.arguments[0]);
    }
	else if( typeof(buffer.callback) != 'undefined' ){
		buffer.callback(_import_part.arguments, buffer.target );
	}
}

//
// Removing buffer by name
//
function _remove_buffer(id){
	if( typeof(_vars.buffers[id]) != undefined ){
		setTimeout(function(){
			d.body.removeChild(_vars.buffers[id].buffer);
			_vars.buffers[id] = undefined;
			}, 
			_vars.buffertimeout );
	}
}

// 
// Debugging object
//
function _debug_object(obj){
	var res = '';
	for( ch in obj ){
		res = res + ch+ ' = ' + obj[ch] + '\n';
	}
	window.alert(res);
}

//
// Getting frame documents by frame id
//
function _get_frame_document(frameid){
    var oIframe = d.getElementById(frameid);
	var oDoc = (oIframe.contentWindow || oIframe.contentDocument);
  	if (oDoc.document) oDoc = oDoc.document;
	return(oDoc);
}

//
// Making delete link
//
function _del_link(code, text){
	var dellink = d.createElement('a');
	dellink.href = code;
	if( !text ){
		text = '(удалить)';
	}
	dellink.appendChild(d.createTextNode(text));
	return(dellink);
}	

//
// Making a row
//
function _make_row( label, data, labelid ){
	var tr = d.createElement('tr');
	var td = d.createElement('th');
	td.className = 'rowtitle';
	
	if( labelid == undefined ){
		labelid = data.id;
	}

	if( labelid != undefined ){
		var labelobj = d.createElement('label');
		labelobj.htmlFor = labelid;
		labelobj.appendChild(label);
		td.appendChild(labelobj);
	}
	else{
		td.appendChild(label);
	}
	tr.appendChild(td);

	td = d.createElement('td');
	td.appendChild(data);
	tr.appendChild(td);

	return(tr);
}

//
// making row with text label
// 
function _make_row_text(text, data, labelid){
	return(
		_make_row(
			d.createTextNode(text),
			data,
			labelid));
}

//
// Making div object with name and id
//
function _make_div(name,id){
	if(id == undefined ){
		id = name+'_';
	}
	var div = d.createElement('DIV');
	div.name = name;
	div.id = id;
	return(div);
}

//
// Setting object value by object id
//
function _set_val(id, val){
	d.getElementById(id).value = val;
}

//
// Show or hide second object if first one is checked or -1
//
function _showhide(key, cont, vismode ){
	var ko = d.getElementById(key);
	var kc = d.getElementById(cont);
	
	var sh = false;
	if( typeof(ko.checked) == 'undefined' ){
		// possible select
		if( ko.value == -1 ){
			sh = true;
		}
		else{
			sh = false;
		}
	}
	else{
		// checkbox allright
		if( ko.checked == true ){
			sh = true;
		}
		else{
			sh = false;
		}
	}
	
	if( sh == true ){
		//show container
		_showitem(cont, vismode);
	}
	else{
		// hide container
		_hideitem(cont);
	}
}

//
// Function shows item by id
//
function _showitem(id, vismode){
	var kc = d.getElementById(id);
	kc.style.visibility = 'visible';
	kc.style.display = vismode || 'block';
}

//
// Function hides item by id
//
function _hideitem(id){
	var kc = d.getElementById(id);
	kc.style.visibility = 'hidden';
	kc.style.display = 'none';
}

//
// Function onDomload
//
function _ondomload(func){
	if( _vars.DOMWATCHED == false ){
		$('document').ready(function(){
			_init();
			});
		_vars.DOMWATCHED = true;
	}
    $('document').ready(func);

}

//
// Oninit function, call all inits
//
function _init(){
	_setevent(d, 'mousemove', _mousecapture, false);
	// Temporary variables to hold mouse x-y pos.s
	_vars.tempX = 0;
	_vars.tempY = 0;

	//
	// Reading tabs params from url
	//
   	_parse_urlvars(
   		);

//	window.alert(_vars.DOMLOADED);
	_vars.DOMLOADED = true;

	var func;
	while( func = _vars.ondomload.shift() ){
		func();
	}
};

//
// Load vars; loading ';' separated vars as var:value; 
//
function _parse_urlvars(){
	var result = {};

	var url = d.location.href;
    if( url.indexOf('#') > -1 ){
    	var str = url.substring( url.indexOf('#')+1);
		var pairs = str.split(';');
		for( var i = 0; i < pairs.length; i++ ){
			var vars = pairs[i].split(':');
			result[vars.shift()] = vars;
		}
	}
	_vars.urlvars = result;
}

//
// Seturlvars by key and values array
//
function _set_urlvar(key, values){
	var uv = _vars.urlvars;

    if( typeof(values) == 'object' ){
		uv[key] = values;
	}
	else{
		uv[key] = new Array(values);
	}

	var rest = new Array();

	for( var prop in uv ){
		//
		// Joining properties
		//
		rest.push(prop+':'+uv[prop].join(':'));
	}
    var reststr = rest.join(';');

    var url = d.location.href;
    if( url.indexOf('#') > -1 ){
    	// if there is #
    	url = url.substring(0, url.indexOf('#'));
	}
	d.location.href = url+'#'+reststr;
}

//
// Function sets event listener
//
function _setevent( obj, ev, fun, flag){
	if(obj.addEventListener){
		_vars.IE = false;
		obj.addEventListener( ev, fun, flag);
	}
	else if( obj.attachEvent ){
		_vars.IE = true;
		obj.attachEvent('on'+ev, fun, flag);
	}
}

//
// Function shows hint in div with unque id
//
function _showhint(id, text){
	if( _vars.DOMLOADED == true ){
		var hint = _make_div(id, id);
		hint.className = 'hint';
		var s = hint.style;
		s.top = _vars.tempY+20 + 'px';
		s.left = _vars.tempX + 'px';

		hint.innerHTML = text;

		d.body.appendChild(hint);
	}
}

//
// function removes object from dom by id
//
function _remove_object(id){
	var obj = d.getElementById(id);
	if( obj ){
		obj.parentNode.removeChild(obj);
	}
}

//
// Functions destroy hint divs
//
function _hidehint(id){
	_remove_object(id);
}


// Main function to retrieve mouse x-y pos.s

function _mousecapture(e){

//	_debug_object(e);
/*	if( e.pageX == undefined ){
		window.alert('PageX undefined');
	}*/
	if (e.pageX == undefined ) { 
		_vars.tempX = e.x  + (d.documentElement.scrollLeft ?
			d.documentElement.scrollLeft :
			d.body.scrollLeft);
	    _vars.tempY = e.y + (d.documentElement.scrollTop ?
			d.documentElement.scrollTop :
			d.body.scrollTop);
	} else {  // grab the x-y pos.s if browser is NS
		_vars.tempX = e.pageX;
		_vars.tempY = e.pageY;
	}  
	// catch possible negative values in NS4
	if (_vars.tempX < 0){_vars.tempX = 0}
	if (_vars.tempY < 0){_vars.tempY = 0}  

	return true
}

//
// Function applying hash to template, hash is object
//
function _ah(tpl, hash){
	for( var prop in hash ){
		var intIndexOfMatch = 0;
		while( intIndexOfMatch != -1){
			// Relace out the current instance.
			tpl = tpl.replace( "{_"+prop+"_}", hash[prop] )
 

			// Get the index of any next matching substring.
			intIndexOfMatch = tpl.indexOf( "{_"+prop+"_}" );
		}
	}
	return( tpl );
}
 
//
// Function populating list using template
//
function _ahlist(tpl, hashes){
	var res = '';
	for( var i = 0; i < hashes.length; i++ ){
		// need to add some kinda row number and parity
		var point = hashes[i];
		point.__row = i;
		point.__par = i % 2;

		res += _ah(tpl, point);
	}
	return(res);
}

//
// Function toggle object visibility
//
function _toggle(id, mode){
	var o = d.getElementById(id);
	var s = o.style;
	if( s ){
		if( s.visibility == 'visible' || s.visibility != 'hidden' ){
			// need to hide object
			_hideitem(id);
		}
		else{
			_showitem(id, mode);
		}
	}
}

