/**************************************************
**
** 	DOM
**
**************************************************/

function $(e){return document.getElementById(e)}
function $n(s){return document.getElementsByName(s)}
function $$(c,t,n){
	var l = [];
	var r = new RegExp('\\b('+(c||'')+')\\b');
	var e = (!t&&document.all || (n||document).getElementsByTagName(t||'*') );
	var el = e.length;
	for( var i = 0; i < el; i++ ) {
		if( e[i].tagName && ( !c || r.test( e[i].className ) ) ) {
			l.push( e[i] );
		}
	}
	return l;
}
function create(t,n,s){
	var e = document.createElement(t);
	if(n) switch(s){
		case 1:n.first(e);break;
		case 2:n.before(e);break;
		case 3:n.after(e);break;
		default:n.last(e);break;
	}
	return e;
}
function prev(n,c,t){
	while(n=n.previousSibling)
		if((!c&&!t)||(c&&c.className==c)||(t&&n.tagName==t))
			return n;
	return this;
}
function isClass(c,n){
	if(typeof n=='string') n = $(n);
	var p = new RegExp("(^|\\s)"+c+"(\\s|$)");
	return p.test(n.className);
}
function addClass(c,n){
	if(typeof n=='string') n = $(n);
	var p = new RegExp("(^|\\s+)"+c+"(\\s+|$)");
	if(n) n.className = n.className.replace(p,' ')+' '+c;
	return n;
}
function delClass(c,n){
	if(typeof n=='string') n = $(n);
	var p = new RegExp("(^|\\s+)"+c+"(\\s+|$)");
	if(n) n.className = n.className.replace(p,' ');
	return n;
}
function toggleClass(c,n){
	if(typeof n=='string') n = $(n);
	if(isClass(c,n)) delClass(c,n);
	else addClass(c,n);
	return n;
}
function attr(a,v,n){
	if(typeof n=='string') n = $(n);
	if(v) n.setAttribute(a,v);
	else return n.getAttribute(a);
	return n;
}

Element.prototype.$n = function(s){return $n(s);};
Element.prototype.$$ = function(c,t){return $$(c,t,this);};
Element.prototype.$p = function(c,t){var r=new RegExp('(^|\s)('+(c||'')+')(\s|$)');while(n=n.parentNode){if((c&&r.test(n.className))||(t&&n.tagName==t))return n;}}
Element.prototype.create = function(t,s){return create(t,this,s)}
Element.prototype.prev = function(c,t){return prev(this,c,t)}
Element.prototype.next = function(c,t){var n=this;while(n=n.nextSibling)if((!c&&!t)||(c&&c.className==c)||(t&&n.tagName==t))break;return this;}
Element.prototype.first = function(i){var p=this.parentNode;p.insertBefore(i,p.firstChild)}
Element.prototype.before = function(i){this.parentNode.insertBefore(i,this)}
Element.prototype.after = function(i){this.parentNode.insertAfter(i,this)}
Element.prototype.last = function(i){this.appendChild(i)}
Element.prototype.html = function(c){this.innerHTML=c;return this}
Element.prototype.isClass = function(c){return isClass(c,this)}
Element.prototype.addClass = function(c){return addClass(c,this)}
Element.prototype.delClass = function(c){return delClass(c,this)}
Element.prototype.toggleClass = function(c){return toggleClass(c,this)}
Element.prototype.attr = function(a,v){return attr(a,v,this)}

/**************************************************
**
** 	Arrays
**
**************************************************/

inArray = Array.prototype.indexOf ? function(v,a){return a.indexOf(v)!=-1} : function(v,a){for(var i in a){if(a[i]===v)return true;}return false;};

/**************************************************
**
** 	Misc
**
**************************************************/

// get/set cookie
// n - name
// v - value
// t - expire time
// d - domain
// p - path
// s - secure
function cookie(n,v,d,p,t,s){
	if(v){
		var a = [];
		a.push(n+'='+escape(v));
		a.push('expires='+new Date(new Date().getTime()+(t||1)*86400000).toGMTString());
		a.push('path='+(p||'/'));
		a.push('domain='+(d||document.domain));
		document.cookie = a.join(';')+(s?';secure':'');
	}else{
		var c = document.cookie;
		var b = c.indexOf(n+'=');
		if(b==-1) return '';
		var l = b+n.length+1;
		var e = c.indexOf(';',l);
		if(e==-1) e=c.length;
		return unescape(c.substring(l,e));
	}
}

// delete cookie
// n - name
// d - domain
// p - path
function dcookie(n,d,p){
	if(cookie(n)){
		document.cookie = n+'=;path='+(p||'/')+';domain='+(d||document.domain)+';expire=Thu, 01-Jan-1970 00:00:01 GMT';
	}
}

// add event
// o - object
// t - type
// f - function
function addEvent(o,t,f){
	if(o.addEventListener){
		o.addEventListener(t,f,false);
		EventCache.add(o,t,f);
	} else if(o.attachEvent){
		o["e"+t+f] = f;
		o[t+f] = function(){o['e'+t+f](window.event);}
		o.attachEvent('on'+t,o[t+f]);
		EventCache.add(o,t,f);
	} else o['on'+t] = o['e'+t+f];
}

// event cache object
var EventCache = function(){
	var l = [];
	return {
		l : l,
		// add to cache
		// n - node
		// e - event name
		// h - handler
		add : function(n,e,h){
			l.push(arguments);
		},
		// clear cache
		flush : function(){
			var it;
			for(var i=l.length-1; i>=0; i=i-1){
				it = l[i];
				if(it[0].removeEventListener)
					it[0].removeEventListener(it[1],it[2],it[3]);
				if(it[1].substring(0, 2)!='on')
					it[1] = 'on'+it[1];
				if(it[0].detachEvent)
					it[0].detachEvent(it[1],it[2]);
				it[0][it[1]] = null;
			};
		}
	};
}();
addEvent(window,'unload',EventCache.flush);

// add load event
// f - function
function addLoadEvent(f){
	var o = window.onload;
	window.onload = o?function(){o(null);f();}:f;
}

// fix event
// e - event
function fixEvent(e){
	e = e||window.event;
	e = e.target||e.srcElement;
	return e;
}

// fix height
function fixHeight(){
	var e = $$('fixHeight');
	for(i in e) {e[i].style.height='1px';}
	for(i in e){
		var h = e[i].offsetHeight-e[i].clientHeight;
		e[i].style.height = parseInt(e[i].parentNode.clientHeight,0)-h+'px';
	}
}
addLoadEvent(fixHeight);

/**************************************************
**
** 	Ajax
**
**************************************************/

var _ajaxObject = null;
var _ajaxQueriesList = [];
var _ajaxQueryTime = 15000;
var _ajaxCheckInterval = 50;
var _ajaxTimeCounter = 0;
var _ajaxTimerId = null;

// ajax request
// u - url
// m - method
// p - parameters
// h - handler
// i - indicator layer
function request(u,m,p,h,i){
	var d = !_ajaxQueriesList.length;
	_ajaxQueriesList.push([u,m,p,h,(i||document.body)]);
	if(d)_ajaxStart();
}

// create ajax object
function _ajaxGetObject(){
	var o;
	try{o = new ActiveXObject('Msxml2.XMLHTTP');}
	catch(e){
		try{o = new ActiveXObject('Microsoft.XMLHTTP');}
		catch(E){o = false;}
	}
	if(!o && typeof XMLHttpRequest!='undefined') o = new XMLHttpRequest();
	_ajaxObject = o;
}

// start ajax process
function _ajaxStart(){
	if(!_ajaxObject)_ajaxGetObject();
	if(_ajaxObject){
		var q = _ajaxQueriesList[0];
		_ajaxIndicator(1);
		var u = q[0]+(q[0].indexOf('?')==-1?'?':'&')+'mode=xml&rand='+Math.random();
		_ajaxObject.open(q[1],u,true);
		if(q[1]=='POST')
			_ajaxObject.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		_ajaxObject.send(q[2]);
		_ajaxTimeCounter = 0;
		_ajaxTimerId = setTimeout(_ajaxHandler,_ajaxCheckInterval);
	}
}

// ajax handler
function _ajaxHandler(){
	clearTimeout(_ajaxTimerId);
	var rs = _ajaxObject.readyState;
	var s = _ajaxObject.status;
	var q = _ajaxQueriesList[0];
	if(rs==4&&s==200){
		_ajaxStop(0,rs,s);
		if(_ajaxQueriesList.length) _ajaxStart();
	}else{
		_ajaxTimeCounter += _ajaxCheckInterval;
		if(_ajaxTimeCounter >= _ajaxQueryTime) _ajaxStop(1,rs,s);
		else _ajaxTimerId = setTimeout(_ajaxHandler,_ajaxCheckInterval);
	}
}

// stop process
function _ajaxStop(e,rs,s){
	var r = _ajaxObject.responseText;
	var p = _ajaxResponse(r);
	_ajaxIndicator(0);
	eval(q[3]+'('+r+','+p+','+e+','+rs+','+s+')');
	_ajaxQueriesList.shift();
}
// get ajax response after convert from json format
// r - response text
function _ajaxResponse(r){
	try{return r?eval('('+r+')'):[];}
	catch(e){}
	return [];
}

// toggle ajax indicator
// s - stat
function _ajaxIndicator(s){
	var q = _ajaxQueriesList[0];
	if(!$('ajaxIndicator')){
		var t = crtElement('TABLE').attr('cellspacing','0').attr('id','ajaxIndicator').crtElement('TBODY').crtElement('TR');
		t.insLast(crtElement('TD').attr('class','ajaxIndicatorLeft'));
		t.insLast(crtElement('TD').attr('class','ajaxIndicatorRight'));
		q[4].insLast(t);
	}
	$('ajaxIndicator').style.display = s?'':'none';
}

/**************************************************
**
**    Form
**
**************************************************/

// parse form
// f - form
function parseForm(f){
	var p = [];
	var e = f.getElementsByTagName('*');
	for(var i in e){
		var n = v = '';
		if(e[i].tagName=='INPUT'||e[i].tagName=='SELECT'){
			if(e[i].type=='radio'){
				if(e[i].form[e[i].name].value==e[i].value){
					n = e[i].name;
					v = e[i].value;
				}
			}else{
				n = e[i].name;
				v = e[i].type=='checkbox'?(e[i].checked?1:0):e[i].value;
			}
		}else if(e[i].tagName=='TEXTAREA'){
			n = e[i].name;
			v = e[i].value;
		}
		if(n)p.push(n+'='+encodeURIComponent(v));
	}
	return p;
}

