/* Preload Images
================================================*/
var IMG_BLOCK_SCREEN=new Image();
IMG_BLOCK_SCREEN.src='/s/img/0.png';
IMG_BLOCK_SCREEN.width=IMG_BLOCK_SCREEN.height=1;
IMG_BLOCK_SCREEN.alt='';

var IMG_BLOCK_SCREEN_TRANSPARENT=new Image();
IMG_BLOCK_SCREEN_TRANSPARENT.src='/s/img/0.gif';
IMG_BLOCK_SCREEN_TRANSPARENT.width=IMG_BLOCK_SCREEN_TRANSPARENT.height=1;

var CLEAR_SIGN='clear';

/* Common
================================================*/
	function isset(val){
		return (val || val==0 || val=='' || val===false);
		}
	function valueInLimits(value,min,max){
		return Math.max(
				( isset(max)?Math.min(value,max):value ),
				min);
		}
	
	var clearNode={
		tag:'SPAN',
		className:'clear0'
		};

/* Browser detect
================================================*/
var BROWSER={
	isIE:((navigator.appVersion.indexOf("MSIE") != -1) ? true : false),
	isIE6:((document.all && !window.opera && !window.XMLHttpRequest) || (navigator.appVersion.indexOf("MSIE 6")!=-1)),
	isOpera:((navigator.userAgent.indexOf("Opera") != -1) ? true : false),
	isOpera95:((navigator.userAgent.indexOf("Opera") != -1) && window.scrollX==undefined),
	isFirefox:((navigator.userAgent.indexOf("Firefox") != -1) ? true : false),
	isGecko:!document.attachEvent && document.addEventListener
	};
var OPERATING_SYSTEM={
	isLinux:navigator && navigator.platform && navigator.platform.search('Linux')>=0
	};

/* Functions and types
====================================*/
	function $function(f,params){		 
		if (is_function(f)){
			var args = Array.prototype.slice.call(arguments);
			return f(args.slice(1))
			}
		return false;
		}
		
	/* Inheritance */
	Function.prototype.inheritsFrom = function(superClass) {
		var Inheritance = function(){};	
		Inheritance.prototype = superClass.prototype;	
		this.prototype = new Inheritance();	
		this.prototype.constructor = this;	
		this.superClass = superClass;
		this.prototype._parent=superClass.prototype;
		this.prototype._parentMethod=function(method){
			var args = Array.prototype.slice.call(arguments);			
			if (is_function(this._parent[method])){
				this._parent[method].call(this,args.slice(1));
				}
			};
		return this;
		};
	
	function is_function(func){
		return (func && typeof(func)=='function');
		}
	function is_object(o){
		return (typeof(o)=='object');
		}
	
	function is_array(o){		
		return (o!=null && typeof(o)=='object' && o.unshift!=undefined);
		}
	
	function is_string(o){
		return (isset(o) && (typeof(o)=='string' || is_function(o.charAt)));
		}
	
	function is_date(o){
		return (o && typeof(o)=='object' && is_function(o.getTime));
		}
		
	function method_exists(obj,m){
		return ( is_object(obj) && is_function((obj)[m]) );
		}
		
	function getFileName (value){
		value = value.replace(/^\s|\s$/g, "");
		if (/\.\w+$/.test(value)){
			var m = value.match(/([^\/\\]+)\.(\w+)$/);
			if (m){
				return m[1] + '.' + m[2]
				}
			else {
				return "(file)"
				}
			}
		else{
			var m = value.match(/([^\/\\]+)$/);
			if (m){
				return m[1]
				}
			else{
				return "(file)"
				}
			}
		}
	
	function selfBlur(){
		return this.blur();			
		}
	
	
		
	/* XML
	====================================*/
	function parseLineXML(xml){
		if (!xml) {
			return false;
			}
		var res=[],
			fc=xml.firstChild,
			fcA={};
		if (!fc) {
			return {};
			}
		if (fc.nodeType != 1) fc= fc.nextSibling;
		
		//Get fc attributes
		for (var a=0;a<fc.attributes.length;a++){
			var attr=fc.attributes[a];
			if (attr.nodeType!=2) {
				continue;
				}
			fcA[attr.nodeName]=attr.nodeValue;
			}

 	 	for (var i=0;i<fc.childNodes.length;i++){			
			var node=fc.childNodes[i];
			if (node.nodeType!=1){
				continue;
				}
			
			res[i]={value:node.firstChild?node.firstChild.data:"",data:{}};
			for (var a=0;a<node.attributes.length;a++){
				var attr=node.attributes[a];
				if (attr.nodeType!=2){
					continue;
					}
				res[i].data[attr.nodeName]=attr.nodeValue;
				}
			}
		return {head:fcA,body:res};
		}
		
		if (typeof DOMParser == "undefined") {
			   DOMParser = function () {return false;};			
			   DOMParser.prototype.parseFromString = function (str, contentType) {
				  if (typeof ActiveXObject != "undefined") {
						 var d = new ActiveXObject("MSXML.DomDocument");
						 d.loadXML(str);
						 return d;
					  } else if (typeof XMLHttpRequest != "undefined") {
						 var req = new XMLHttpRequest;
						 req.open("GET", "data:" + (contentType || "application/xml") +
										 ";charset=utf-8," + encodeURIComponent(str), false);
						 if (req.overrideMimeType) {
							req.overrideMimeType(contentType);
							}
						 req.send(null);
						 return req.responseXML;
						}
					return false;
					}
			}
	
	/* Set cursor positions in input elements
	====================================*/
		function moveCaretToStart(inputObject){		
			if (inputObject.createTextRange){
				 //IE
				var r = inputObject.createTextRange();
				r.collapse(true);
				r.select();
				}
			else if (inputObject.selectionStart){
				// Mozilla/Gecko
				inputObject.setSelectionRange(0,0);
				inputObject.focus();
				}
			}
			
		function moveCaretToEnd(inputObject){
			inputObject=$id(inputObject);
			if (!inputObject){
				return false;
				}
			if (inputObject.createTextRange){
				//IE
				var r = inputObject.createTextRange();
				r.collapse(false);
				r.select();
				}
			else if (inputObject.selectionStart){
				// Mozilla/Gecko
				var end = inputObject.value.length;
				inputObject.setSelectionRange(end,end);
				inputObject.focus();
				}
			}

/* DOM functions
====================================*/
	function $id(el){	
		var res;
		if (!el) {
			return false;
			}
		res=null;
		if (typeof(el)!="object"){
			if (document.getElementById(el)) {
				res=document.getElementById(el);
				}
			}
		else if(el.length!=undefined && el.slideDown!=undefined){ /* check if el is jquery object */
			res=el[0];
			}
		else{
			res=el;
			}
		return res;
		}
	
	function $name(el){	
		if (!el) {
			return false;
			}
		var els=new Array();		
		if (typeof(el)!="object"){
			els=document.getElementsByName(el);
			}
		if (els.length!=0) {
			return els;
			}
		else {
			return null;
			}
		}
	
	
	function $tagname(tg,par,isTest){	
		if (!tg) {
			return false;
			}
		var 
			rawEls=[],
			els=new Array();
		par=$id(par);
		if (par && typeof(par)=="object") {
			els=par.getElementsByTagName(tg);
			}
		else {
			els=document.getElementsByTagName(tg);
			}		
		if (typeof els=='function'){
			rawEls=els;
			els=new Array();
			for (var i=0;i<rawEls.length;i++){
				els.push(rawEls[i]);
				}
			}
			
		if (els.length>1) {
			return els;
			}
		else {
			if (els.length==1){
				return els[0];
				}
			else {
				return [];
				}
			}
		}
	
	function $tag(tg,par){
		par=par?$id(par):document;
		
		var res=[];
		if (par){
			if (is_array(tg)){
				var num;
				for (var i=0;i<tg.length;i++){
					var tgres=$tag(tg[i],par);					
					if (tgres.length){
						for (var j=0;j<tgres.length;j++){
							res.push(tgres[j]);
							}
						}
					}
				}
			else if(is_string(tg)){
				res=par.getElementsByTagName(tg);
				}
			}		
		return res;
		}
		
	function $class(el,cl){
		el=$id(el);
		if (!el) {
			return false;
			}
		el.className=cl||'';
		return el;		
		}
		
	function $value(el,val){
		var res;
		el=$id(el);
		if (!el) {
			return '';
			}
		
		if (val && val!=CLEAR_SIGN){			
			el.value=val;
			}		
		else if (val=='' || val==CLEAR_SIGN){
			el.value='';
			}
		res=el.value?el.value:'';
		return res;		
		}
	function $clearValue(el){
		return $value(el,CLEAR_SIGN);
		}
	
	function $checked(el,val){
		el=$id(el);
		if (!el) {
			return false;
			}	
		if (isset(val)){			
			el.checked=val;
			}		
		return el.checked;
		}
		
	function $innerHTML(el,text){
		el=$id(el);
		if (!el){
			return false;
			}
		if (text && text!=CLEAR_SIGN){
			el.innerHTML=text;
			return true;
			}
		else if (text=='' || text==CLEAR_SIGN){
			el.innerHTML='';
			}
		else {
			return el.innerHTML;
			}		
		}
	
	function $clear(el){
		return $innerHTML(el,CLEAR_SIGN);
		}
	
	function $focus(el){
		el=$id(el);
		if (!el || !el.focus){
			return false;
			}
		return el.focus();
		}
	
	function $blur(el){
		el=$id(el);
		if (!el || !el.blur){
			return false;
			}
		return el.blur();
		}
	
	function $toggleDisable(el,isOn){
		el=$id(el);
		if (!el){
			return false;
			}
		toggleClass(el,isOn?1:0,['field-enabled','field-disabled']);
		return el.disabled=!!isOn;
		}
		
	function $disable(el){
		return $toggleDisable(el,true);
		}
		
	function $enable(el){
		return $toggleDisable(el,false);
		}
	
	function $displaying(el){
		el=$id(el);
		if (!el){
			return false;
			}
		return !!(el.offsetHeight);
		}
	
	function setChild(par,elID,elClass,elType,elContent,elParams){
		if (!par && !elID) return false;		
		var el=$id(elID);
		
		if (par && !el && elType){
			//need to create and append new child
			par=$id(par);		
			el=document.createElement(elType);
			el=par.appendChild(el);
			if (elID) el.id=elID;
			}
			
		if (!el) {
			return false;
			}		
		if (elClass) {
			el.className=elClass;
			}	
		if (elContent) {
			el.innerHTML=elContent;
			}
		if (elParams) {
			el=concatObjects(el,elParams);
			}		
		return el;
		}
		
	function unsetChild(el){		
		el=$id(el);
		if (!el) {
			return false;
			}
		if (el.parentNode){
			return el.parentNode.removeChild(el);
			}
		return false;
		}
		
	function searchInClass(el,base){
		el=$id(el);
		if (el && el.className){
			var parts=el.className.split(' ');
			for (var i=0;i<parts.length;i++){
				var part=parts[i];				
				if (part.search(base)==0){
					return part.substr(base.length);
					}
				}
			}
		return false;
		}
	
	function setChildExt(settings){
		var defaultSettings={
				parent:document.body,
				setType:'append',
				tag:'DIV',
				id:'',
				baseDocument:document
			};
		
		if (is_string(settings)){
			settings={className:settings};
			}
		settings=concatObjects(settings,defaultSettings);		
		var el=$id(settings.id);
		if (el){
			return el;
			}	
		var par=$id(settings.parent);
		
		/* Fix IE 'name' attribute bug */
		if (settings.name && BROWSER.isIE){
			el=settings.baseDocument.createElement('<'+settings.tag+' name="'+settings.name+'">');
			}
		else{
			el=settings.baseDocument.createElement(settings.tag);
			if (settings.name){
				el.name=settings.name;
				}
			}
		
		if (!el) {
			return false;
			}
			
			
		if (settings.id){
			el.id=settings.id;
			}
		
		if (settings.type){
			el.type=settings.type;
			}
		if (isset(settings.value)){
			el.value=settings.value;
			}
		if (settings.className){
			el.className=settings.className;
			}
		if (settings.content){
			el.innerHTML=settings.content;
			}
		if (isset(settings.title)){
			el.title=settings.title;
			}
		if (settings.params && is_object(settings.params) ){
			//el=concatObjects(el,settings.params);		
			for (var i in settings.params){				
				el[i]=settings.params[i];				
				}
			}
		if (settings.style && is_object(settings.style)){
			setStyle(el,settings.style);
			}
		if (settings.onclick && is_function(settings.onclick)){
			el.onclick=settings.onclick;
			}
		/* qOnclick - set 'onclick' listener to queue */
		if (settings.qOnclick && is_function(settings.qOnclick)){
			EVENTS.append(el,'onclick',settings.qOnclick);
			}
		
		if (settings.onfocus && is_function(settings.onfocus)){			
			el.onfocus=settings.onfocus;
			}
		if (settings.onmouseover && is_function(settings.onmouseover)){
			el.onmouseover=settings.onmouseover;
			}
		if (settings.onmouseout && is_function(settings.onmouseout)){
			el.onmouseout=settings.onmouseout;
			}
		
		switch(settings.setType){
			case 'insertBefore':
				el=par.parentNode.insertBefore(el,par);
				break;
			case 'append':
				el=par.appendChild(el);
				break;
			}
		if (settings.child && is_object(settings.child)){
			setChildExt(
				concatObjects(
					settings.child,
					{
						parent:el
						}
					)
				);
			}
		
		if (settings.children && is_object(settings.children)){
			for (var i in settings.children){
				var child=settings.children[i];
				if (!is_object(child)){
					continue;
					}
				setChildExt(
					concatObjects(
						child,
						{
							parent:el
							}
						)
					);				
				}			
			}
		if (isset(settings.checked)){
			el.checked=settings.checked;
			}
		if (isset(settings.selected)){
			el.selected=settings.selected;
			}
		if (isset(settings.disabled)){
			el.disabled=settings.disabled;
			}
		
		if (settings.handlerFunction && is_function(settings.handlerFunction)){
			settings.handlerFunction(el);
			}
		
		return el;
		}
	
	function setChildren(el,children){
		el=$id(el);
		if (!el){
			el=document.body;
			}
		if (!is_object(children)){
			return false;
			}
		for (var i=0;i<children.length;i++){
			var cData=children[i];
			if (is_string(cData)){				
				cData={className:cData};				
				}
			el=setChildExt(
				rConcatObjects(cData,{parent:el})
				);
			}
		return el;
		}
		
	function setStyle(el,style){
		el=$id(el);
		if (!el || !style || !el.style || typeof style!='object'){
			return false;
			}
		var needPx=['top','left','width','height'];
		for (var property in style){
			var value=style[property];
			try{
				if (typeof value!='object' && typeof value!='function'){
					el.style[property]=value+( (in_array(needPx,property) && !isNaN(value) )?'px':'');					
					}
				}
			catch (e){
				document.writeln('error '+el+': '+property+'='+value);
				}
			}
		return true;
		}


/* Positioning and view
====================================*/
	function $where(block){
		block=$id(block);
		var theBlock=$id(block),
		blockLeft = 0,
		blockTop = 0;
		if (!theBlock){
			return false;
			}
		while(block) {
			blockLeft += block.offsetLeft;
			blockTop += block.offsetTop;
			block = block.offsetParent;
		}
		return {
			left:blockLeft, 
			top:blockTop,
			right:blockLeft+theBlock.offsetWidth,
			bottom:blockTop+theBlock.offsetHeight
			};
		}
		/* Alias for getWhereIs */
		function getWhereIs(block){
			return $where(block);
			}
		
	function getWhereIsEvent(e){
		if (e.pageX){		
			return {left:e.pageX, top:e.pageY};
			}
		return {
			left:e.clientX + document.body.parentElement.scrollLeft,
			top:e.clientY + document.body.parentElement.scrollTop
			};
		}
	
	function placeUnderCursor (el, x, y){
		el=$id(el);
		if (!el){
			return false;
			}
		el.style.position = 'absolute';
		el.style.left = (x - el.offsetWidth + 10) + 'px';
		el.style.top = (y - 5) + 'px';
		}	
	
	function setPosition(el,pos){
		el=$id(el);
		if (!el) {
			return false;
			}		
		if (pos.left!=null){
			el.style.left=pos.left+"px";
			}
		if (pos.top!=null){
			el.style.top=pos.top+"px";
			}		
		return false
		}	
	
	function putInScreenCenter(el,elSize){	
		el=$id(el);
		if (!el){
			return false;
			}
		el.style.position='absolute';
		var 
			winH1 = BROWSER.isOpera? window.innerHeight:document.documentElement.clientHeight,
			winH=document.body.clientHeight,			
			winY=document.body.scrollTop || document.documentElement.scrollTop || 0,
			elY=Math.round(winY+winH/2-el.clientHeight/2),
			winW=document.documentElement.offsetWidth,
			elX=Math.round(winW/2-el.offsetWidth/2);			
			if (BROWSER.isIE) {
				elY-=30
				};		
			elY=Math.max(10,elY);
			setPosition(el,{left:elX,top:elY})
		}	
		
	function toggleClass(el,state,states){
		states=states?states:['hidden','showed'];
		el=$id(el);
		if (!el){
			return false;
			}
		var searchTmpl='/'+states[0]+'/',
			newState=(state==null)?((el.className.search(states[0])>-1)?1:0):state,
			currState=(newState==0)?1:0;
		if (el.className!=null && el.className.search(states[currState])>-1){
			el.className=el.className.replace(states[currState], states[newState]);
			}
		else {
			if (el.className!=null && el.className.search(states[newState])<0){
				el.className+=" "+states[newState];
				}
			}
		return newState;
		}	
	
	function getOverClone(el){
		el=$id(el);
		if (!el){
			return false;
			}	
		var 
			desc=$desc(el),
			clone=setChildExt(
				{
					style:{
						position:'absolute',
						top:desc.top,
						left:desc.left,
						zIndex:2000,
						width:desc.width,
						height:desc.height
						},
					className:'cloneNode'
					}
				);
		return clone;
		}
	
	function $desc(el){
		el=$id(el);
		if (!el){
			return false;
			}
		var desc={
			width:$(el).width(),
			height:$(el).height(),
			tag:el.nodeName
			/* style:el.style */
			};
		desc=concatObjects(desc,getWhereIs(el));
		return desc;
		}
	
	function $alpha(el,opacity){
		el=$id(el);
		if (!el){
			return false;
			}
		if (!isset(opacity)){
			opacity=1;
			}
		if (typeof el.style.filter!="undefined"){
			if (opacity<=1 && opacity>0){
				opacity*=100;
				}
			el.style.filter="alpha(opacity="+opacity+")";
			}
		else{
			el.style.opacity=opacity;
			}
		return opacity;
		}
	
	/* Drag
	=================================================*/
	
	var DraggingItem = new Object();
	
	function startDrag (event, _this, _targetBlock, settings){
		DraggingItem.This = $id(_this);
		DraggingItem.Target = $id(_targetBlock);		
		if (!DraggingItem.This || !DraggingItem.Target){
			alert('error dragging '+DraggingItem.Target);
			return false;
			}
		DraggingItem.TargetXY=getWhereIs(DraggingItem.Target);
		
		var defaultSettings={
			minLeft:1,
			minTop:1
			};
		DraggingItem.settings=concatObjects(settings,defaultSettings);
		if (isset(DraggingItem.settings.maxXDelta)){
			var startTargetLeft=Number(DraggingItem.Target.style.left.slice(0,-2));
			if (!isNaN(startTargetLeft)){
				DraggingItem.settings.minLeft=startTargetLeft-DraggingItem.settings.maxXDelta;
				DraggingItem.settings.maxLeft=startTargetLeft+DraggingItem.settings.maxXDelta;
				}
			else{
				DraggingItem.settings.minLeft=DraggingItem.TargetXY.left-DraggingItem.settings.maxXDelta;
				DraggingItem.settings.maxLeft=DraggingItem.TargetXY.left+DraggingItem.settings.maxXDelta;
				}
			}
		if (isset(DraggingItem.settings.maxYDelta)){
			var startTargetTop=Number(DraggingItem.Target.style.top.slice(0,-2));
			if (!isNaN(startTargetTop)){
				DraggingItem.settings.minTop=startTargetTop-DraggingItem.settings.maxYDelta;
				DraggingItem.settings.maxTop=startTargetTop+DraggingItem.settings.maxYDelta;
				}
			else{
				DraggingItem.settings.minTop=DraggingItem.TargetXY.top-DraggingItem.settings.maxYDelta;
				DraggingItem.settings.maxTop=DraggingItem.TargetXY.left+DraggingItem.settings.maxYDelta;
				}
			}
	
		var position = new Object();
		if (BROWSER.isIE || BROWSER.isOpera95){			
			position.x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
			position.y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
			}
		else if (BROWSER.isGecko || BROWSER.isOpera){			
			position.x = event.clientX + window.scrollX;
			position.y = event.clientY + window.scrollY;
			}
	
		DraggingItem.cursorStartX = position.x;
		DraggingItem.cursorStartY = position.y;
		
		DraggingItem.StartLeft = parseInt (DraggingItem.Target.style.left);
		DraggingItem.StartTop = parseInt (DraggingItem.Target.style.top);
	
		
		if (isNaN (DraggingItem.StartLeft)) {DraggingItem.StartLeft = DraggingItem.TargetXY.left }
		if (isNaN (DraggingItem.StartTop)) DraggingItem.StartTop = DraggingItem.TargetXY.top;
		if (BROWSER.isIE){
			document.attachEvent ("onmousemove", ProceedDrag);
			document.attachEvent ("onmouseup", StopDrag);
			window.event.cancelBubble = true;
			window.event.returnValue = false;
			}
		else if (BROWSER.isGecko || BROWSER.isOpera){
			document.addEventListener ("mousemove", ProceedDrag, true);
			document.addEventListener ("mouseup", StopDrag, true);
			event.preventDefault();
			}
		}
		
		/*Alias for startDrag*/
		function $drag(event, _this, _targetBlock, settings){
			startDrag(event, _this, _targetBlock, settings);
			}
	
	function ProceedDrag (event){
		var position = new Object();	
		if (BROWSER.isIE || BROWSER.isOpera95) {
			position.x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
			position.y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
			}
		else if (BROWSER.isGecko || BROWSER.isOpera){	
			position.x = event.clientX + window.scrollX;
			position.y = event.clientY + window.scrollY;
			}	
	

		var nextX = DraggingItem.StartLeft + position.x - DraggingItem.cursorStartX;
		nextX=valueInLimits(nextX,DraggingItem.settings.minLeft,DraggingItem.settings.maxLeft);
		
		DraggingItem.Target.style.left = nextX + "px";
	
		var nextY = DraggingItem.StartTop  + position.y - DraggingItem.cursorStartY;
		nextY=valueInLimits(nextY,DraggingItem.settings.minTop,DraggingItem.settings.maxTop);
		
		DraggingItem.Target.style.top = nextY + "px";
	
		if (BROWSER.isIE){
			window.event.cancelBubble = true;
			window.event.returnValue = false;
			}
		if (BROWSER.isGecko || BROWSER.isOpera95) {
			event.preventDefault();
			}
		
		if (DraggingItem.settings.onmove && is_function(DraggingItem.settings.onmove)) {
			DraggingItem.settings.onmove(DraggingItem.Target,nextX,nextY);
			}		
		}
	
	function StopDrag (event){
		if (BROWSER.isIE){
			document.detachEvent ("onmousemove", ProceedDrag);
			document.detachEvent ("onmouseup", StopDrag);
			}
		if (BROWSER.isGecko || BROWSER.isOpera){
			document.removeEventListener ("mousemove", ProceedDrag, true);
			document.removeEventListener ("mouseup", StopDrag, true);
			}
	
		if (DraggingItem.settings.oncomplete && is_function(DraggingItem.settings.oncomplete)) {
			DraggingItem.settings.oncomplete(DraggingItem.Target);
			}
		}

/* Array functions
====================================*/
	function in_array(arr,el){
		var res=0;
		for (var n in arr){
			if (el==arr[n]) {
				res++;
				}
			}
		return res;
		}
	
	function getArgList(params){
		var argList='';
		for (var paramName in params){
			argList+=argList?',':'';
			argList+='"'+params[paramName]+'"';
			}			
		return argList;
		}
		
	function setArray(el){
		if (typeof el=="object"){
			if (el.length!=undefined){
				return el;
				}
			else{
				var arr=[];
				for (var i in el){
					arr.push(el[i]);
					}
				return arr;
				}
			}
		else{
			return [el];
			}
		}
		
	function isArraysEqual(arr1,arr2){
		if (!isset(arr1.length) || !isset(arr2.length) || arr1.length!=arr2.length){
			return false;
			}
		for (var i=0;i<arr1.length;i++){
			if (arr1[i]!=arr2[i]){
				return false;
				}
			}
		return true;
		}
		
/* Object functions
====================================*/
	function concatObjects(obj1,obj2,isRecursive){
		var res={};
		for (var pName in obj1){
			res[pName]=obj1[pName];
			}
		for (var pName in obj2){
			if (isRecursive && is_object(obj2[pName]) && is_object(res[pName])){
				res[pName]=concatObjects(res[pName],obj2[pName]);
				}
			else if (!isset(res[pName])){
				res[pName]=obj2[pName];
				}
			}
		return res;
		}
		
	/* alias for recursive case of concatObjects */
	function rConcatObjects(obj1,obj2){
		return concatObjects(obj1,obj2,'recursive');
		}
		
	function duplicateObject(o){
		var c = new Object();	
		for (var e in o){
			c[e] = o[e];
			}
		return c;
		}

	function removeFromObject(c, b) {
		var d = {};
		for (var a in c) {
			if (a != b) {
				d[a] = c[a];
				}
			}
		return d
	}

		
/* Debugging
====================================*/	
	function testObject(obj,isWrite,noAlert,level){
		var o="",
			sprt=isWrite?"<br/>":"\n";
		if (!level){
			level=0;
			}
		var spacer='';
		var maxIterations=256;
		for (var i=0;i<level;i++){
			spacer+='  ';
			}
		if (level>256){
			return '..too much iterations';
			}
		if (!is_string(obj) && is_object(obj)){			
			var num=0;
			for (var p in obj){
				if (++num>maxIterations){
					return '..too much iterations';
					}
				var subObj=obj[p];
				var type=typeof(subObj);
				if (subObj==null){
					type='Null';
					}
				else if (subObj.charAt || subObj==''){
					type='String';	
					}
				else if (subObj.pop){
					type='Array';
					}				
				else if (!isNaN(Number(subObj))){
					type='Number';	
					}
				if (is_function(subObj)){
					continue;
					}
				o+=sprt+spacer+p+'['+type+']: ';				
				if (is_object(subObj)){
					o+=testObject(subObj,false,true,level+1);
					}
				else{
					o+=subObj;
					}
				}
			}
		else{
			o+=spacer+obj;
			}
		if (isWrite){
			document.write(o);
			}
		else {
			if (!noAlert){
				alert (o);
				}
			}
		return o;
		}
		
	function dumpObject(obj,isWrite,noAlert){
		var o="",
			sprt=isWrite?"<br/>":"\n";
		for (var p in obj){
			var subObj=obj[p];
			o+=p+"=>"+subObj+sprt;
			}
		if (isWrite){
			document.write(o);
			}
		else {
			if (!noAlert){
				alert (o);
				}
			}
		return o;
		}	
	

/* EVENTS	
====================================*/
	function MXX_EVENTS(){
		this.Elements=[];
		this.Events=[];
		this.eventObj=this;
		this.append=function(el,evnt,func,weight){
			el=$id(el);
			if (!el) {
				return;
				}
			if (!in_array(this.Elements,el)){				
				el.eventObj=this;				
				el['elNum']=this.Elements.push(el)-1;
				this.Events[el['elNum']]={};				
				}			
			var evnts=setArray(evnt);			
			for (var e=0;e<evnts.length;e++){
				var cEvnt=evnts[e];
				if (!this.Events[el['elNum']][cEvnt]){
					this.Events[el['elNum']][cEvnt]=[];
					}
				var funcs=setArray(func);
				this.Events[el['elNum']][cEvnt]=this.Events[el['elNum']][cEvnt].concat(funcs);				
				if (!this["router_"+cEvnt]){
					eval('this["router_'+cEvnt+'"]=function(eArg){this.eventObj.router(this,"'+cEvnt+'",eArg); };');
					}
				eval('el["'+cEvnt+'"]=this["router_'+cEvnt+'"];');
				}			
			};
			
		this.router=function(el,evnt,eArg){		
			var elData=el.eventObj.Events[el['elNum']];			
			if (!elData || 	!elData[evnt]) {
				return;
				}
			for (var e=0;e<elData[evnt].length;e++){
				if (elData[evnt][e] && typeof(elData[evnt][e]=="function")){					
					elData[evnt][e].call(el,eArg);
					}
				}
			};		
		}
		
	var EVENTS=new MXX_EVENTS();
	
	function getKeyPressed(e){
		var KEYCODES=new Array();
			KEYCODES[9]="TAB";
			KEYCODES[13]="ENTER";
			KEYCODES[27]="ESC";
			KEYCODES[35]="END";
			KEYCODES[36]="HOME";
			KEYCODES[37]="ARROWLEFT";
			KEYCODES[38]="ARROWUP";
			KEYCODES[39]="ARROWRIGHT";
			KEYCODES[40]="ARROWDOWN";		
			
		var intKey=-1,
			targetField;
		if (window.event){
			intKey=event.keyCode;
			targetField=event.srcElement;
			}
		else{
			intKey=e.which;
			targetField=e.target;
			}
		var res=(KEYCODES[intKey])?KEYCODES[intKey]:intKey;
		return res;
		}
	
	function stopEventBubble(e,stopDefault){	
		if (!e) {
			var e = window.event;
			}
		if (!e){
			return;
			}		
		e.cancelBubble = true;
		if (e.stopPropagation) {
			e.stopPropagation();
			}
		if (stopDefault){
			preventDefaultEvent(e);
			}		
		}
		
	function preventDefaultEvent(e){
		if (!e) {
			var e = window.event;
			}
		if (!e){
			return;
			}
		if (e.preventDefault){
			e.preventDefault();
			}
		else if (window.event){
			window.event.returnValue = false;
			}
		}
	
	function toStopEventBubble(el){
		return EVENTS.append(el,'onclick',stopEventBubble);
		}
	
	function arrestEvent(e){
		if (!e){
			var e = window.event;
			}
		if (!e){
			return;
			}
		if (!window.eventArrested){
			window.eventArrested=[this];
			}
		else{
			window.eventArrested.push(this);
			}		
		}
		
	function toArrestEvent(el,els){
		el=$id(el);
		
		if (!el){
			return false;
			}
		/* Blocks to kill */
		if (!el._toArrestEventElements){
			el._toArrestEventElements=[];
			}		
		if (els){
			if (!els.length){
				el._toArrestEventElements.push(els);
				}
			else{				
				el._toArrestEventElements=el._toArrestEventElements.concat(els);
				}
			}		 
		return EVENTS.append(el,'onclick',arrestEvent);
		}

		
		
/* Block screen
=================================================*/

	function blockScreen(fade,img){
		if (isScreenBlocked()){
			return false;
			}		
		var bs=setChildExt(
			{
				id:'blockscreen',
				className:'iepng'
				}
			);
		if (!img){
			img=IMG_BLOCK_SCREEN;
			}
		setStyle(
			bs,
			{
				position:'absolute',
				top:0,
				left:0,
				background:'url('+img.src+')'
				}
			);
		bs.style.zIndex=10000;		
		resizeBlockScreen();
		if (fade && jQuery){
			jQuery(bs).hide().fadeIn('slow');			
			}
		}
		
	function blockScreenTransparent(){
		blockScreen(false,IMG_BLOCK_SCREEN_TRANSPARENT)
		}
		
	function unblockScreen(){
		if (!isScreenBlocked()) {
			return false;
			}
		unsetChild('blockscreen');
		}
		
	function isScreenBlocked(){
		return !!$id('blockscreen');
		}
		
	function resizeBlockScreen(){		
		var bs=$id('blockscreen');
		if (!bs){				
			return false;
			}
		//setStyle(document.body,{overflow:'hidden'});
		var bodyWrapHeight=$id('body-wrap')?$id('body-wrap').clientHeight:0;
		var sizes={
			height:Math.max(document.documentElement.clientHeight,document.body.clientHeight,bodyWrapHeight),
			width:Math.max(document.documentElement.clientWidth,document.body.clientWidth)
			};
		setStyle(bs,sizes);
		//setStyle(bs.overImg,sizes);		
		/* bs.overImg.style.height=height;
		bs.overImg.style.width=width; */
		
		return true;
		}
		
	EVENTS.append(window,'onresize',resizeBlockScreen);
	
	function preloadAjaxProgress(){
		if ($id('pageAjaxLoading')){
			return false;
			}
		return setChildExt(
			{
				className:'ajax-loading passive',
				id:'pageAjaxLoading',
				content:'<span>Загрузка</span>'
				}
			);
		}
	
	function showAjaxProgress(){
		blockScreen();
		return activateAjaxProgress();
		}
		
	function stopShowAjaxProgress(){
		unblockScreen();
		return disActivateAjaxProgress();
		}
		
	function activateAjaxProgress(){
		toggleClass('pageAjaxLoading',1,['passive','active']);
		putInScreenCenter('pageAjaxLoading');
		}
		
	function disActivateAjaxProgress(){
		toggleClass('pageAjaxLoading',0,['passive','active']);
		}
		
/* Flash
================================================*/
	function paramString(params){
		if (typeof params!='object'){
			return params;
			}
		var paramsStr='';
		for (var paramName in params){
				paramsStr+=paramsStr?'&amp;':'';
				paramsStr+=paramName+'='+params[paramName];
			}			
		return paramsStr;
		}
		
	function parseParamString(str){
		var params={};
		var parts=str.split('?').pop().split('&');
		for(var i=0; i<parts.length; i++){
			var part=parts[i].split('=');
			params[part[0]]=part[1];
			}
		return params;
		}
		
	function buildFlashExt(settings){
		var defaultSettings={
					version:7,
					width:'100%',
					height:'100%',
					name:'flashmovie',
					wmode:'transparent',
					_write:false
				};	
		
		settings=concatObjects(settings,defaultSettings);
		var flashvars=settings.params?paramString(settings.params):'';
		if ( is_function(settings.noFlash) && !FLASH_CHECKING.DetectFlashVer(settings.version) ){			
			settings.noFlash();
			return false;
			}
		var html=
			BROWSER.isIE?			
			'<'+'object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http:\/\/download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version='+settings.version+',0,0,0" width="'+settings.width+'" height="'+settings.height+'" id="'+settings.name+'"><'+'param name="movie" value="'+settings.src+'"><'+'param name="wmode" value="'+settings.wmode+'" /><'+'param name="quality" value="high"><'+'param name="allowScriptAccess" value="always" /><param name="menu" value="false" /><param name="FlashVars" value="'+flashvars+'" /><'+'/object>'
			:'<'+'embed src="'+settings.src+'" quality="high" wmode="'+settings.wmode+'" width="'+settings.width+'" height="'+settings.height+'" name="'+settings.name+'" menu="false" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspace="http:\/\/www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" />';
	
		if (settings._write) {
			document.write(html);
			}
		return html;	
		}
		/* Alias for 'BuildFlashExt' */
		function $flash(settings){
			return buildFlashExt(settings);
			}

/* Targeting flash objects */
function flashMovie(movieName) {
    return BROWSER.isIE?window[movieName]:document[movieName];    	
	}
	
function runFlashMethod(movie,method){
	var flash=flashMovie(movie);
	}
		
		
		
/* Flash Checking
=================================================*/
var FLASH_CHECKING={
	isIE:(navigator.appVersion.indexOf("MSIE") != -1) ? true : false,
	isWin:(navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false,
	isOpera:(navigator.userAgent.indexOf("Opera") != -1) ? true : false,
	ControlVersion:function(){
		var version;
		var axo;
		var e;
	
		// NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry
	
		try {
			// version will be set for 7.X or greater players
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
			version = axo.GetVariable("$version");
		} catch (e) {
		}
	
		if (!version)
		{
			try {
				// version will be set for 6.X players only
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
				
				// installed player is some revision of 6.0
				// GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
				// so we have to be careful. 
				
				// default to the first public version
				version = "WIN 6,0,21,0";
	
				// throws if AllowScripAccess does not exist (introduced in 6.0r47)		
				axo.AllowScriptAccess = "always";
	
				// safe to call for 6.0r47 or greater
				version = axo.GetVariable("$version");
	
			} catch (e) {
			}
		}
	
		if (!version)
		{
			try {
				// version will be set for 4.X or 5.X player
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
				version = axo.GetVariable("$version");
			} catch (e) {
			}
		}
	
		if (!version)
		{
			try {
				// version will be set for 3.X player
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
				version = "WIN 3,0,18,0";
			} catch (e) {
			}
		}
	
		if (!version)
		{
			try {
				// version will be set for 2.X player
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
				version = "WIN 2,0,0,11";
			} catch (e) {
				version = -1;
			}
		}
		
		return version;
		},
	GetSwfVer:function(){
		// NS/Opera version >= 3 check for Flash plugin in plugin array
		var flashVer = -1;
		
		if (navigator.plugins != null && navigator.plugins.length > 0) {
			if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
				var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
				var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
				var descArray = flashDescription.split(" ");
				var tempArrayMajor = descArray[2].split(".");			
				var versionMajor = tempArrayMajor[0];
				var versionMinor = tempArrayMajor[1];
				var versionRevision = descArray[3];
				if (versionRevision == "") {
					versionRevision = descArray[4];
					}
				if (versionRevision[0] == "d") {
					versionRevision = versionRevision.substring(1);
					}
				else if (versionRevision[0] == "r") {
					versionRevision = versionRevision.substring(1);
					if (versionRevision.indexOf("d") > 0) {
						versionRevision = versionRevision.substring(0, versionRevision.indexOf("d"));
						}
					}
				var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
				}
			}
		// MSN/WebTV 2.6 supports Flash 4
		else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) {
			flashVer = 4;
			}
		// WebTV 2.5 supports Flash 3
		else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) {
			flashVer = 3;
			}
		// older WebTV supports Flash 2
		else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) {
			flashVer = 2;
			}
		else if ( this.isIE && this.isWin && !this.isOpera ) {
			flashVer = this.ControlVersion();
			}	
		return flashVer;
		},
	 DetectFlashVer:function(reqMajorVer, reqMinorVer, reqRevision){
		versionStr = this.GetSwfVer();
		if (versionStr == -1 ) {
			return false;
			}
		else if (versionStr != 0) {
			if(this.isIE && this.isWin && !this.isOpera) {
				// Given "WIN 2,0,0,11"
				tempArray         = versionStr.split(" "); 	// ["WIN", "2,0,0,11"]
				tempString        = tempArray[1];			// "2,0,0,11"
				versionArray      = tempString.split(",");	// ['2', '0', '0', '11']
				}
			else {
				versionArray      = versionStr.split(".");
				}
			var versionMajor      = versionArray[0];
			var versionMinor      = versionArray[1];
			var versionRevision   = versionArray[2];
	
			// is the major.revision >= requested major.revision AND the minor version >= requested minor

			if (versionMajor >= parseFloat(reqMajorVer)) {
				return true;
				}
			else if (versionMajor == parseFloat(reqMajorVer)) {
				if (versionMinor > parseFloat(reqMinorVer)){
					return true;
					}
				else if (versionMinor == parseFloat(reqMinorVer)) {
					if (versionRevision >= parseFloat(reqRevision)){
						return true;
						}
					}
				}
			return false;
			}
		}
	};
	
	
function array_rand(arr){
	var l=arr.length;
	var ind=( Math.round (Math.random()*(l-1)) ).between(0,l-1);
	return arr[ind];
	}
	
/* Popup
================================================*/
	function popUp (settings){
		var defaultSettings={
			url:'',
			width:350,
			height:600
			};
		settings=concatObjects(settings,defaultSettings);
		
		if (settings.width){
			settings.width+=20;
			}
		if (settings.height){
			settings.height+=20;
			}
		if (settings.content){
			settings.url='';
			}
		POPUP_WIN = window.open(settings.url,'POPUP_WINDOW','menubar=no,directories=no,location=no,resizable=yes,scrollbars=no, toolbar=no, '+(settings.width?'width='+settings.width:'') +','+(settings.height?'height='+settings.height:''));
		if (settings.content){
			if (!POPUP_WIN.document.body) {
				settings.content='<body>'+settings.content+'</body>';
				}
			POPUP_WIN.document.open();
			POPUP_WIN.document.write(
	
				'<head><title>Полное изображение</title>'
				+'<style type="text/css">A{cursor:pointer;}</style>'
				+'</head>'
				+settings.content
				);
			POPUP_WIN.document.title='Полное изображение';
			POPUP_WIN.document.close();
			}
		return false;
		}


/* Templates */

	function _tmpl(tmpl, ns) {
		if (!tmpl){
			return '';
			}
		var fn = function(w, g) {
			g = g.split("|");
			var cnt = _prop(ns,g[0]);/* ns[g[0]]; */
			for(var i=1; i < g.length; i++){
				cnt = eval(g[i])(cnt);
				}
			return isset(cnt)?cnt:'';
			};
		return tmpl.replace(/\%\(([A-Za-z0-9_|.]+)\)/g, fn);
		}
		
	function _prop(obj,prop){
		var parts=prop.split('.');		
		if (parts.length){
			var res=obj;
			for(var i=0;i<parts.length;i++){
				if (res==undefined){
					return undefined;
					}
				res=res[parts[i]];
				}
			return res;
			}
		else{
			return obj[prop];
			}
		}
	function urlOutput(url){
		if (url){			
			return '<a href="'+(url.search(/^http\:\/\/{1}/)>=0?url:"http:\/\/"+url)+'">'+url+'</a>';
			}
		}
	function urlOutputBlank(url){
		if (url){			
			return '<a href="'+(url.search(/^http\:\/\/{1}/)>=0?url:"http:/\/"+url)+'" target="_blank">'+url+'</a>';
			}
		}
	
/* STRING functions
====================================*/
	function NtoBR(str){
		var tmpl=new RegExp(/\r?\n/i);
		while(str.search(tmpl)>=0){
			str=str.replace(tmpl,'<br>');
			}
		return str;
		}
	
	function BRtoN(strToClear){		
		strToClear=strToClear.replace(/<br\s*\/?>/i,'\n');				
		return strToClear;
		}
	
	function trimStr(str, charlist) {
		charlist=(!charlist ? ' \\s\\xA0' : charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1'));
		return str.replace(new RegExp('^[' + charlist + ']+|['+charlist+']+$', 'g'), '');
		}	
	
	function getNumeralEnding(num,type){
			var db={
				'hours':{
					'_default':'часов',
					1:'час',
					2:'часа',
					3:'часа',
					4:'часа'
					},
				'days':{
					'_default':'дней',
					1:'день',
					2:'дня',
					3:'дня',
					4:'дня'
					},
				'pix':{
					'_default':'картинок',
					1:'картинка',
					2:'картинки',
					3:'картинки',
					4:'картинки'
					}
				};
			var endings=type._default?type:db[type];
			if (!endings._default){
				return '';
				}
			var 
				rm=num%10,
				strEnding=endings['_default'];
			if (isset(endings[rm])){
				strEnding=endings[rm];
				}
			if (num%100>=11 && num%100<=14){
				strEnding=endings['_default'];
				}
			return strEnding;			
		}
		
	function getPopped(str,delimiter){
		if (!delimiter){
			delimiter='_';			
			}
		var parts=str.split(delimiter);
		parts.pop();
		return parts.join(delimiter);		
		}
		
	String.prototype.trim=function(){
		return this.replace(/^[\s]/i,'').replace(/[\s]+$/,'');
		};
	String.prototype.popped=function(delimiter){
		if (!delimiter){
			delimiter='_';			
			}
		var parts=this.split(delimiter);
		parts.pop();
		return parts.join(delimiter);
		};	
	String.prototype.firstCharUpper=function(){
		return this.substr(0,1).toUpperCase()+this.substr(1)
		};
	String.prototype.isNullDate=function(){
		return (this=="0000-00-00 00:00:00");
		};
	String.prototype.html_entity_decode=function(){
		return this.replace_multiply(
			[
			 [/\&nbsp\;/,' '],
			 [/\&mdash\;/,'—']
			 ]
			);
		};
	
	function htmlspecialchars(str){
		return str.htmlspecialchars();
		}
	String.prototype.htmlspecialchars=function(){
		return this.replace_multiply(
			[
			 [/\</,'&lt;'],
			 [/\>/,'&gt;'],
			 [/\"/,'&quot;'],
			 [/«/,'&laquo;'],
			 [/«/,'&raquo;']
			 ]
			);
		//"
		};
	String.prototype.replace_multiply=function(data){
		var s=this;
		for (var i in data){
			var d=data[i];
			if (!d || !isset(d[0]) || !isset(d[1])){
				continue;
				}
			while(s.search(d[0])>=0){
				s=s.replace(d[0],d[1]);	
				}
			}		
		return s;
		};
		
	String.prototype.nl2br=function(){
		return NtoBR(this);
		};
		
	String.prototype.rmnl=function(){
		var tmpl=new RegExp(/\r?\n/i);
		return this.replace_multiply(
			[
			 [/\r?\n/i,''],
			 [/\t/,'']
			 ]
			);
		};
	
	String.prototype.dateStr=function(){
		if (this.isNullDate()){
			return;
			}
		var dt=new Date();			
		return dt.getFromDT(this).getReadable();
		};
		
	String.prototype.dateStrFull=function(){
		if (this.isNullDate()){
			return;
			}
		var dt=new Date();			
		return dt.getFromDT(this).getReadableFull();
		};
	String.prototype.dateReadableSimpleStr=function(){
		if (this.isNullDate()){
			return;
			}
		var dt=new Date();			
		return dt.getFromDT(this).getReadableSimple();
		};
	
	String.prototype.dateGetHoursFromDt=function(){		
		if (this.isNullDate()){
			return;
			}
		var dt=new Date();			
		return String(dt.getFromDT(this).getHours()).setDigits();
		};
	String.prototype.dateGetMinutesFromDt=function(){
		if (this.isNullDate()){
			return;
			}
		var dt=new Date();		
		return String(dt.getFromDT(this).getMinutes()).setDigits();
		};
	
	String.prototype.dateFromDt=function(){
		if (this.isNullDate()){
			return;
			}
		return (new Date()).getFromDT(this);
		};
	

	
	String.prototype.isTime=function(){
		return (this.search(/^\d{1,2}\:\d{1,2}(\:\d{1,2})?$/)>=0);
		};
	String.prototype.parseTime=function(){
		if (!this.isTime()){
			return {};
			}
		var d=this.split(':');		
		return {'h':Number(d[0]),'m':Number(d[1]),'s':Number(d[2])};
		};
	
	
	String.prototype.setDigits=function(num){
		if (!num){
			num=2;
			}
		if (this.length<num){
			var 
				bibb='',
				bibbLength=num-this.length;
			for (var i=0;i<bibbLength;i++){
				bibb+='0';
				}
			return bibb+this;
			}
		return this;
		};
	String.prototype.twoDigits=function(){
		if (this.length<2){
			return '0'+this;
			}
		return this;
		};
	
	
/* Number prototypes
================================================*/
	function b2kb(b){
		return Math.round((Number(b)/1024));
		}
	Number.prototype.setDigits=function(num){
		return (String(this)).setDigits(num);
		};
		
	Number.prototype.between=function(a,b){
		return ( Math.min ( Math.max(this,Math.min(a,b)), Math.max(a,b)) );		
		};

/* Date prototypes
====================================*/
	var MONTHS=new Array("января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря");
	
	