var userAgent = navigator.userAgent.toLowerCase();

// Figure out what browser is being used
var browser = {
	version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
	safari: /webkit/.test( userAgent ),
	opera: /opera/.test( userAgent ),
	msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
	mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
};

var keyCode = {up:38,down:40,left:37,right:39,esc:27,enter:13,pgUp:33,pgDown:34,home:36,end:35};

DOMReady = (function(ie){
 var d = document;
 return ie ? function(c){
   var n = d.firstChild,
    f = function(){
     try{
      c(n.doScroll('left'))
     }catch(e){
      setTimeout(f, 10)
     }
    }; f()
  } : 
  /webkit|safari|khtml/i.test(navigator.userAgent) ? function(c){
   var f = function(){
     /loaded|complete/.test(d.readyState) ? c() : setTimeout(f, 10)
    }; f()
  } : 
  function(c){
   d.addEventListener("DOMContentLoaded", c, false);
  }
})(/*@cc_on 1@*/);

function DOM(id){
	var element=null;
	if (!id) element=(browser.mozilla)?window:document;
	else if (typeof(id)=='object') element=id;
	else element=document.getElementById(id);
	
	if (!element) return null;
	element.listen= function(name, f, useCapture){
		var observer= function(e){
			e=op.event(e, name);
			if (!f(e)) e.stop();
		}
		if (name=='scroll'){
			//it's fucken scroll event:
			if ( element.addEventListener ){
				element.addEventListener( (browser.mozilla ? 'DOMMouseScroll' : 'mousewheel'), observer, false);
			}
			else{
				element.onmousewheel = observer;
			}
		}
		else {
			if (element.addEventListener) {
			  element.addEventListener(name, observer, useCapture);
			} else if (element.attachEvent) {
			  element.attachEvent('on' + name, observer);
			}
		}
	};
	//Поиск контейнера по тегу:
	element.parent= function(tagName){
		var n=element;
		while (n.tagName!=tagName){
			n= n.parentNode;
			if (!n) return null;
		}
		return n;
	}
	element.first= function(tagName, className){
		var list= element.getElementsByTagName(tagName);
		if (className){
			var re= new RegExp('\\b'+className+'\\b');
			for (i=0; i<list.length; i++) if (re.test(list[i].className)) return DOM(list[i]);
		}
		else if(list[0]){
			 DOM(list[0]);			
		}
		else return null;
	}
	
	element.hide= function(){
		element.style.display='none';
	}
	element.show= function(){
		element.style.display='block';
	}
	element.attachClass= function(className){
		var re= new RegExp('\\b'+className+'\\b');
		if (!re.test(element.className)){
			element.className+=' '+className;			
		}
	}
	element.detachClass= function(className){
		var re= new RegExp('\\b'+className+'\\b');	
		element.className=element.className.replace(re, '');
	}
	return element;
}

var op = {
	element: DOM,
	event: function(e, name){
		if (e= (e)?e:window.event){
			//Остановить событие:
			e.stop= function(){
				if (!e.preventDefault) {
					e.cancelBubble = true;
					e.returnValue = false;
				}
				else {
					e.preventDefault();
				}
			};
			
			if (!e.pageX&&!e.pageY){
			
				e.pageX=e.clientX;
				e.pageY=e.clientY;				
				if (document.body && typeof document.body.scrollTop != 'undefined') {
					e.pageX += document.body.scrollLeft;
					e.pageY += document.body.scrollTop;
				}
				if (document.body.parentNode && typeof document.body.parentNode.scrollTop != 'undefined') {
					e.pageX += document.body.parentNode.scrollLeft;
					e.pageY += document.body.parentNode.scrollTop;
				}
			}
			if (name=='scroll'){
				if (e&&e.detail) e.scrollDelta = -e.detail;
				else if (window.event.wheelDelta) e.scrollDelta = window.event.wheelDelta; 
			}
			//Целевой элемент события:
			return e;
		}		
		else return null;
	},
	//lock data:
	locked:[],
	lock: function(id){
		if (!id) return true;
		if (op.locked[id]) return false;
		op.locked[id]=true;
		return true;
	},
	locked: function(id){
		return (op.locked[id])?true:false;
	},
	free: function(id){
		if (id) op.locked[id]=false;
	},
	query: function(url, callback, POST){

		var xmlHttp = false;
		/*@cc_on @*/
		/*@if (@_jscript_version >= 5)
		try {
		  xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
		  try {
		    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
		  } catch (e2) {
		    xmlHttp = false;
		  }
		}
		@end @*/

		if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
		  xmlHttp = new XMLHttpRequest(); 
		}
		if (POST){
			xmlHttp.open("POST", url, true);
		}
		else {
			POST=null;
			xmlHttp.open("GET", url, true);
		}
		if (xmlHttp.overrideMimeType){			
			xmlHttp.overrideMimeType('text/xml');
		}		
		
		xmlHttp.onreadystatechange = function(){
			if (xmlHttp.readyState == 4) {				
				var result=xmlHttp.responseXML;
				if (result.documentElement){					
					result=result.documentElement;
				}
				else if (xmlHttp.responseStream) {					
					result.load(xmlHttp.responseStream);				
				}
				else result=null;				
				callback(result);
			}
		};
		xmlHttp.send(POST);
	},	
	select: function(path, element){
		if (!element) element=document.body;
		var t=element.getElementsByTagName(path)[0];
		if (t){		
			return (t.text)?t.text:t.textContent;
		}
		else return '';
	},
	animate: function(f, sleep, id){
		if (!op.lock(id)) return false;
		var timeout=null;
		timeout= setInterval(function(){
			if (!f()){
				op.free(id); 
				clearTimeout(timeout);
			}
		}, sleep);
		return true;
	},
	animateRange: function(f, callback, from, to, delta, timeout, id){		
		return op.animate(function(){
			if (from>to) from-=delta;			
			else from+=delta;		
			var ret;
			if (Math.abs(from-to)<delta){
				ret=false;
				from=to;
			}
			else ret=true;
			
			f(from);
			if (ret==true){
				if (callback) callback();
			}
			return ret;
		}, timeout, id);
	}
};