var KHEYGET = {
	objCache: new Array(),
	dom: (document.getElementById)? true : false,
	nn4: (document.layers)? true : false,
	
    init: function(func){
        this.addEvent(window,'load',func);
		window.$$ = function() {return new KHEYGET.$$(arguments);}
		window.$id = KHEYGET.$id;
		window.getByClass = KHEYGET.getByClass;
		window.timer = KHEYGET.timer;
    },
	
	$id: function(id) {
		return (KHEYGET.objCache[id]) ? KHEYGET.objCache[id] : KHEYGET.objCache[id] = (KHEYGET.dom) ? document.getElementById(id) : document.all[id];
	},
	
	$$: function(els) {
		this.elements = [];
		for (var i=0; i<els.length; i++) {
			var element = els[i];
			if (typeof element == 'string') {element = $id(element);}
			this.elements.push(element);
		}
		return this;
	},
	
	getDimensions: function(element) {
		element = $id(element);
		var display = '';
		if (display != 'none' && display != null) // Safari bug
		return {width: element.offsetWidth, height: element.offsetHeight};
	    // All *Width and *Height properties give 0 on elements with display none,
	    // so enable the element temporarily
		var els = element.style;
		var originalVisibility = els.visibility;
		var originalPosition = els.position;
		var originalDisplay = els.display;
		els.visibility = 'hidden';
		els.position = 'absolute';
		els.display = 'block';
		var originalWidth = element.clientWidth;
		var originalHeight = element.clientHeight;
		els.display = originalDisplay;
		els.position = originalPosition;
		els.visibility = originalVisibility;
		return {width: originalWidth, height: originalHeight};
	},
	
	getPosition: function(element) {
		var left = 0;
		var top = 0;
		if (KHEYGET.nn4) {
			left = document.layers[element].pageY;
			top = document.layers[element].pageX;
		}
		else {
			element = $id(element);
			left = element.offsetLeft;
			top = element.offsetTop;
			for (var parent = element.offsetParent; parent; parent = parent.offsetParent) {
				left += parent.offsetLeft - parent.scrollLeft;
				top += parent.offsetTop - parent.scrollTop;
			}
		}
		return {left: left, top: top};
	},
	
	getStyle: function(element, style) {
		element = $id(element);
	   /*if (['float','cssFloat'].include(style))
	   style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat');*/
		style = KHEYGET.camelize(style);
		var value = element.style[style];
		if (!value) {
			if (document.defaultView && document.defaultView.getComputedStyle) {
				var css = document.defaultView.getComputedStyle(element, null);
				value = css ? css[style] : null;
			} else if (element.currentStyle) {value = element.currentStyle[style];}
		}
		if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none'))
		value = element['offset'+style.capitalize()] + 'px';
		//if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
		//if (Element.getStyle(element, 'position') == 'static') value = 'auto';
		if(style == 'opacity') {
			if(value) return parseFloat(value);
			if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
			if(value[1]) return parseFloat(value[1]) / 100;
			return 1.0;
		}
		return value == 'auto' ? null : value;
	},
	
	camelize: function(that) {
		var that = that;
		var parts = that.split('-'), len = parts.length;
		if (len == 1) return parts[0];
		var camelized = this.charAt(0) == '-' ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) : parts[0];
		for (var i = 1; i < len; i++)
			camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
		return camelized;
	},
  
	getByClass: function(className, tag, elm){
		var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
		var tag = tag || "*";
		var elm = elm || document;
		var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
		var returnElements = [];
		var current;
		var length = elements.length;
		for(var i=0; i<length; i++){
			current = elements[i];
			if(testClass.test(current.className)){
				returnElements.push(current);
			}	
		}
		return returnElements;
	},
	
	getWindow: function() {
		var w = 0, h = 0;
		if( typeof( window.innerWidth ) == 'number' ) {
		    //Non-IE
			w = window.innerWidth;
	   		h = window.innerHeight;
		} else if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
	    	//IE 6+ in 'standards compliant mode'
			w = document.documentElement.clientWidth;
			h = document.documentElement.clientHeight;
		} else if(document.body && (document.body.clientWidth || document.body.clientHeight)) {
			//IE 4 compatible
			w = document.body.clientWidth;
			h = document.body.clientHeight;
		}
		return (w + ';' + h);
	},
	
	setHTML: function(element, toValue) {
		if (typeof(element.innerHTML) != 'undefined')
			element.innerHTML = toValue;
		else {
			var range = document.createRange();
			range.selectNodeContents(element);
			range.deleteContents();
			element.appendChild(range.createContextualFragment(toValue));
		}
	},
	

	/* CORE EVENT START */
	addEvent: function(element, type, handler) {
		if (element.addEventListener) {
			element.addEventListener(type, handler, false);
		} else {
			if (!handler.$$guid) handler.$$guid = this.guid++;
			if (!element.events) element.events = {};
			var handlers = element.events[type];
			if (!handlers) {
				handlers = element.events[type] = {};
				if (element["on" + type]) {handlers[0] = element["on" + type];}
			}
		handlers[handler.$$guid] = handler;
		element["on" + type] = this.handleEvent;
		}
	},
	removeEvent: function(element, type, handler) {
		if (element.removeEventListener) {
			element.removeEventListener(type, handler, false);
		}
		else {
			if (element.events && element.events[type]) {
				delete element.events[type][handler.$$guid];
			}
		}
	},
	handleEvent: function(event) {
		var returnValue = true;
		event = event || KHEYGET.fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
		var handlers = this.events[event.type];
		for (var i in handlers) {
			this.$$handleEvent = handlers[i];
			if (this.$$handleEvent(event) === false) {
			returnValue = false;
			}
		}
	return returnValue;
	},
	fixEvent: function(event) {
		event.preventDefault = this.preventDefault;
		event.stopPropagation = this.stopPropagation;
		return event;
	},
	preventDefault: function() {this.returnValue = false;},
	stopPropagation: function() {this.cancelBubble = true;},
	guid: 1,
	/* CORE EVENT STOP */
	
	/* CORE TIMER START */
	timer: function (interval, callback) {
		var interval = interval || 100;
		if (!callback)
			return false;
		_timer = function (interval, callback) {
			this.stop = function () {
				clearInterval(self.id);
			};
			this.internalCallback = function () {
				callback(self);
			};
			this.reset = function (val) {
				if (self.id)
					clearInterval(self.id);
				var val = val || 100;
				this.id = setInterval(this.internalCallback, val);
			};
			this.interval = interval;
			this.id = setInterval(this.internalCallback, this.interval);
			var self = this;
		};
		return new _timer(interval, callback);
	 },
	/* CORE TIMER STOP */
	
	
	/* CORE CACHE START */
	CACHE: {
		items: new Object(),
		set: function(key, value){
			if (value instanceof Array) {
				this.items[key] = [];
				for(var i in value){
					var tag = value[i][0];
					var text = value[i][1];
					this.items[key][tag]=text;
				}
			}
			else {
				this.items[key] = value;
			}
		/* ��������� ������� ������� for(var i in this.items[key]) {alert(i);//alert(i+':'+hash['c980'][i]);}*/
		},
		get: function(key) {
			var value = '';
			if (this.items[key]) {
				value = this.items[key];
			}
			return value;
		},
		del: function(key) {
			delete(this.items[key]);
			return (!this.items[key])? 1:0;
		}
	}
	/* CORE CACHE STOP */
};


// Array support for the push method in IE 5
/*
if(typeof Array.prototype.push != "function"){
	Array.prototype.push = ArrayPush;
	function ArrayPush(value){
		this[this.length] = value;
	}
}
*/


if(typeof Array.prototype.push != "function") {
	function array_push() {
		for(var i=0;i<arguments.length;i++){
			this[this.length]=arguments[i]
		};
		return this.length;
	}
	Array.prototype.push = array_push;
}


if (!Function.prototype.call) {
	Function.prototype.call = function () {
		var self = arguments[0];
		self._this_func = this;
		var args = new Array();
		for (var i=1; i < arguments.length; i++) {args[args.length] = 'arguments[' + i + ']';}
		var ret = eval('self._this_func(' + args.join(',') + ')');
		self._this_func = null;
		return ret;
	};
}

KHEYGET.$$.prototype = {
	each: function(fn) {
		for ( var i = 0, len = this.elements.length; i<len; ++i ) {
			fn.call(this, this.elements[i]);
		}
	return this;
	},
	
	empty: function() {
		while ( this.firstChild )
			this.removeChild( this.firstChild );
	},
	setStyle: function(prop, val) {
		this.each(function(el) {
			el.style[prop] = val;
		});
		return this;
	},
	addClass: function(className) {
		this.each(function(el) {
			el.className += '' +className;
		});
		return this;
	},
	css: function(o) {
		var that = this;
		this.each(function(el) {
			for (var prop in o) {
				that.setStyle(prop, o[prop]);
			}
		});
	return this;
	}
};

















KHEYGET.AJAX = {
	XMLHttp: null,
	callback: null,
	response: null,
	contentType: 'application/x-www-form-urlencoded',
	type: 'xml',
	
	init: function (){
		if(!this.XMLHttp){
			if(typeof XMLHttpRequest != "undefined"){
				this.XMLHttp = new XMLHttpRequest();
			}
			else if(typeof window.ActiveXObject != "undefined"){
				try {
					this.XMLHttp = new ActiveXObject("Msxml2.XMLHTTP.4.0");
				}
				catch(e){
					try {
						this.XMLHttp = new ActiveXObject("MSXML2.XMLHTTP");
					}
					catch(e){
						try {
							this.XMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
						}
						catch(e){
							this.XMLHttp = null;
						}
					}
				}
			}
		}
		return this.XMLHttp;
	},

	bind: function(url, request, func, type){
		var p_id = request.replace(/[id=]+/g, "");
		var data = KHEYGET.CACHE.get(p_id);
		if (!data) {
			this.get(url, request, func, type);
		}
		else {
			func(p_id);
		}
	},
	
	get: function (url, request, callback, type){
		var rand = Math.floor(Math.random()*1000000);
		url += ((url.indexOf("?") > -1) ? "&" : "?") + request;
		url += ((url.indexOf("?") > -1) ? "&" : "?") + rand;
		if(this.init()){
			if(typeof callback != "undefined"){
				this.callback = callback;
			}
			this.typeResp = this.type;
			this.request = request.replace(/[id=]+/g, "");
			// This line needed to properly control the onreadystatechange event for Firefox
			this.XMLHttp.onreadystatechange = function (){};
			this.XMLHttp.abort();
			this.XMLHttp.open("GET", url, true);
			this.XMLHttp.setRequestHeader("Content-Type", this.contentType);
			this.XMLHttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
			this.XMLHttp.onreadystatechange = this.contentReady;
			this.XMLHttp.send(null);
		}
	},
	
	contentReady: function (){
		var AJAXObj = KHEYGET.AJAX;
		if(AJAXObj.XMLHttp && AJAXObj.XMLHttp.readyState == 4){
			var typeData = (AJAXObj.typeResp.indexOf("xml") >= 0)? AJAXObj.XMLHttp.responseXML : AJAXObj.XMLHttp.responseText;
			AJAXObj.response = typeData;
			if(AJAXObj.callback && typeof AJAXObj.callback == "function"){
				var arr = AJAXObj.parseXML(AJAXObj.response);
				KHEYGET.CACHE.set(AJAXObj.request, arr);
				AJAXObj.callback(AJAXObj.request);
				/*
				KHEYGET.timer(100, function(timer){
					timer.stop();
				});
				*/
			}
		}
	},
	
	clearXmlHttp: function(){
		this.response = "";
		if(this.XMLHttp){
			this.XMLHttp.onreadystatechange = function(){};
			if(typeof this.XMLHttp.abort == "function"){this.XMLHttp.abort();}
			this.XMLHttp = null;
		}
	},
	
	/* ���������� ������ ���:����� xml */
	parseXML: function(xml) {
		var num = 0;
		var arr = new Array();
		if (xml) {
			var all = xml.documentElement;
			var root = all.childNodes;
			for (var i=0; i<root.length; i++) {
				if(root[i].nodeType == 1) {
					var tag = root[i].tagName;
					var text = root[i].firstChild.data;
					arr[num] = new Array();
					arr[num].push(tag, text);
					num++;
				}
			}
		}
		return (arr);
	},
	/* ���������� ����� ����������� ���� AJAXObj.xmlText(AJAXObj.response, 'text'); */
	xmlText: function(xml, node) {
		var text = '';
		if (xml) {
			var all = xml.documentElement;
			var nod = all.getElementsByTagName(node);
  			for (var i=0; i<nod.length; i++) {
    			text += nod.item(i).firstChild.data;
			}
		}
		return text;
	}
};


setOpacity = function(box, value) {
  if (navigator.userAgent.indexOf("Firefox") != -1) {
    if (value == 100) { value = 99.999; }
  }
  box.style.filter = "alpha(opacity=" + value + ")"; // IE/Win
  box.style.KhtmlOpacity = (value / 100);            // Safari 1.1 or lower, Konqueror
  box.style.MozOpacity = (value / 100);              // Older Mozilla+Firefox
  box.style.opacity = (value / 100);                 // Safari 1.2, Firefox+Mozilla
}