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

var SitePage = function(){};

/* jQuery's */
	(function($){
		if (!$){
			return false;
			}
		$.extend($.fn,{
			searchInClass:function(base){
				if (this.length && this[0]){
					var parts=(this.attr('class')||'').split(' ');
					for (var i=0;i<parts.length;i++){
						var part=parts[i];				
						if (part.search(base)==0){
							return part.substr(base.length);
							}
						}
					return '';
					}
				return '';
				},
			flash:function(settings){
				if (this.length){
					settings=$.extend({
						version:7,
						width:'100%',
						height:'100%',
						name:'flashmovie',
						wmode:'transparent',
						isWrite:false
						},settings);
					var flashvars=settings.params?$.serialize(settings.params,true):'';		
					if ( $.isFunction(settings.noFlash) && !FLASH_CHECKING.DetectFlashVer(settings.version) ){			
						settings.noFlash();
						return false;
						}
				
					var html=
						BROWSER.isIE?
						'<'+'object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 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+'"  id="'+settings.name+'" menu="false" allowscriptaccess="always" type="application/x-shockwave-flash" flashvars="'+flashvars+'"/>';
				
					settings._write && document.write(html);
					this.html(html);
					return this;	
					}
				return this;
				},
			placeCenter: function(offsetTop, offsetLeft){	
				if (this.length){
					var 
						$el = $(this[0]),
						winH = (window.opera) ? window.innerHeight : document.documentElement.clientHeight,
						winY = (document.all)?document.documentElement.scrollTop:window.pageYOffset,			
						elY = Math.max(0, winY, Math.round(winY + winH/2 - $el.height()/2)),
						winW = document.documentElement.offsetWidth,
						elX = Math.round(winW/2 - $el.width() / 2);
						if (BROWSER.isIE){
							elY -= 30;
							}
					this.css({
						position: 	'absolute',
						left:		Math.max(0, elX),
						top:		elY + ( offsetTop || 0 )
						});				
					}
				return this;
				}
			
			});
			
		$.extend($,{
			serialize:function(obj){
				if (!$.isPlainObject(obj)){
					return obj;
					}
				var 
					pr=[];
				$.each(obj,function(key){
					pr.push(key+'='+this);
					});
				return pr.join('&');
				},
			/**
			 *  Targeting flash objects 
			 */
			flashMovie:function(movieName) {
			    return BROWSER.isIE?window[movieName]:document[movieName];    	
				},
			/* Blockscreen */
			blockScreen: function(className){
				if ($('#blockscreen').size()){
					/* Already blocked */
					return false;
					}
				if (!$.blockScreen._usingBlockScreen){
					$(window).resize($.resizeBlockScreen);
					}
				$.blockScreen._usingBlockScreen = true; 
				var $bs = $('<div id="blockscreen" class="' + className + '" />');
				!BROWSER.isIE && $bs.fadeIn('slow');
				$bs.appendTo(document.body);
				$.resizeBlockScreen();
				},
			unblockScreen:function(){
				$('#blockscreen').remove();
				},
			resizeBlockScreen:function(){		
				var $bs = $('#blockscreen');
				if (!$bs.size()){
					/* Not blocked, nothing to resize */
					return false;
					}
				var 
					bodyWrapHeight = $('#body-wrap').height() || 0,
					addHeight=0,
					addWidth=0,
					$popup = $('.overlay-popup:visible').eq(0); 
				if ($popup.size()){
					var offset = $popup.offset();
					addHeight = offset.top + $popup.outerHeight();
					addWidth = offset.left + $popup.outerWidth() + 50;
					}
				$bs.css({
					height:Math.max(
						$(document.documentElement).height(),
						$(document.body).height(),
						bodyWrapHeight,
						$(window).height(),
						addHeight),
					width:Math.max(
						document.documentElement.clientWidth,
						document.body.clientWidth,
						addWidth)
					});
				return true;
				},
			imgSize: function(src,onready){
				var 
					size={width:0,height:0},
					img=new Image();
				img.onload=function(){
					size.width=this.width;
					size.height=this.height;
					$.isFunction(onready) && onready(size);
					return;
					}
				img.src=src;
				}
			});
		
		/* Messages */
		var MESSAGES={
			error:'Произошла ошибка. Пожалуйста, повторите попытку позже',
			accessDenied:'Недостаточно прав для выполнения операции',
			loading:'Загрузка...',
			dataStored:'Данные сохранены'
			}
		message=function(key){
			return MESSAGES[key]||'';
			}
		appendMessages=function(data){
			$.extend(MESSAGES,data)
			};		
			
		/* Status */
	$.status = function(msg) {	
		if (msg){
			$.status.msgTmp(msg);
			}
		return $.status;
		};
		
		(function(){
			
			var 
				self=$.status,
				_timer,
				resetTimer=function(){
					clearTimeout(_timer);
					_timer=undefined;
					};
					
			$.extend($.status,{
				settings:{
					delayOff:1000
					,align:'right'
					,topAttach:true
					,defaultProgressMsgId:'loading'
					,defaultErrorMsgId:'error'
					,containerCss:{
		//				position:'static'				
						}			
					,hiddenCss:{
						top:-1000
						}
					,visibleCss:{
						top:''
						}
					}
				,initialize:function(){
					if (self.isInitialized){
						return;
						}
					self.container=$('<div id="statusbar" />').css(self.settings.containerCss).css(self.settings.hiddenCss).appendTo(document.body);
					self.bindEvents();
					self.isInitialized=true;
					return self;
					}
				,bindEvents:function(){
					self.container.click(function(e){
						var target=$(e.target);
						if (target.is('a')){
							var action=searchInClass(target,'action-');
							if ($.isFunction(window[action])){
								window[action]();
								return false;
								}
							return true;
							}
						else{
							self.hide();
							}
						});
					return self;}
				,hide:function(){
					self.container.css(self.settings.hiddenCss);
					resetTimer(_timer);
					return self;
					}		
				,show:function(){
					self.container.css(self.settings.visibleCss);
					self.place();
					return self;
					}
				,place:function(){
					if (self.settings.align=='center'){
						self.container.css({left:'50%',marginLeft:-self.container.width()/2});
						}
					return self;
					}
				,msg:function(msg,cl){
					self.initialize();
					self.container.attr('class',cl||'').html('<strong>'+msg+'</strong>');
					self.show();
					return self;
					}
				,msgTmp:function(msg,cl){
					self.initialize();
					self.msg(msg,cl).show();
					resetTimer(_timer);
					_timer=setTimeout(function(){				
						_timer && self.hide();
						resetTimer();
						},self.settings.delayOff);
					return self;
					}
				,msgProgress:function(msg){
					self.initialize();
					resetTimer();
					self.msg(msg || message(self.settings.defaultProgressMsgId),'progress');
					return self;
					}
				,msgError:function(msg){
					self.initialize();
					resetTimer();
					self.msgTmp(msg || message(self.settings.defaultErrorMsgId),'error');
					return self;
					}
				,msgErrorSticky:function(msg){
					self.initialize();
					resetTimer();
					self.msg(msg||message(self.settings.defaultErrorMsgId),'error');
					return self;
					}
			});
		$(function(){
			self.initialize()
			})
		})();
	$.status.progress=function(msg){
		return $.status().msgProgress(msg);
		};
	$.status.error=function(msg){
		return $.status().msgError(msg);
		}
	$.status.stored=function(msg){
		return $.status().msgTmp(message('dataStored'));
		}
	$.status.errorSticky=function(msg){
		return $.status().msgErrorSticky(msg);
		}
		/*Request*/	
		$.request=function(data){	
			var 
				clientSuccess=data.success,
				clientError=data.error;
			
			data.success=function(res){
				$.status().hide();
				clientSuccess && clientSuccess(res);  
				};
			data.error=function(res){
				$.status().hide();
				if (clientError){
					clientError(res)
					}
				else if (res.status==403){
					$.status.error(message('accessDenied'));
					}
				else if (SitePage.isDebug() && data.dataType=='json'){
					var resJson={};
					try{
						eval('resJson='+res.responseText);
						$.status.errorSticky(resJson.errorMsg)
						}
					catch(e){
						$.status.errorSticky(res.responseText)
						};
					}
				else{
					$.status.error()
					}
				}
			!data.quite && $.status.progress();
			
			if (!data.data){
				data.data={};
				}
			if (!data.type || data.type.toLowerCase()=='get'){
				data.data.rnd=Math.round(Math.random()*10000);
				}
			if (!data.url){
				data.url=location.pathname;
				}
			data=$.extend({},{
				dataType:'json'
				,type:'POST'		
				},data);
			var resFormat=data.dataType=='script'?'js':data.dataType;
				if (!data.url){
					rdata.url='/'+trimStr(PAGE_URI,'/ ')+'.'+resFormat;
					}
				
				var urlParts=data.url.split('?');
				var urlBase=urlParts.shift();
				/* if (urlBase.substring(urlBase.length-(resFormat.length+1))!=('.'+resFormat)){
					urlBase+='.'+resFormat;
					} */
				if (!data.data.format){
					data.data.format = resFormat;
					}
				urlParts.unshift(urlBase);
				data.url=urlParts.join('?');
			$.ajax(data);	
			}
			
		/* Site base */
		;(function(){
			var self=SitePage;
			$.extend(self,{
				uri:trimStr(location.pathname,'/ '),
				refresh:function(){
					window.location.reload(false);
					},
				redirectUpLevel:function(){
					var p=self.uri.split('/');
					p.pop();
					self.redirect(p.join('/'));
					},
				redirect:function(page){
					if(!page) page="/";
					if (page.search(/^http\:\/\/{1}/i)<0){
						if (page.substr(0,1)!='/')
							page="/"+page;
						page=SITE_URL+page;
						}
					window.location=page;
					return false;
					},
				isDebug:function(){
					return !!window['gTestenv'];
					}
				});
			self.uriBase=self.uri.split('#').shift();
			})();
		})(window['jQuery']);




/* 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),
	isOpera:((navigator.userAgent.indexOf("Opera") != -1) ? true : false),
	isFirefox:((navigator.userAgent.indexOf("Firefox") != -1) ? true : false),
	isGecko:!document.attachEvent && document.addEventListener
	};

/* Functions and types
====================================*/
	function $function(fName,params){
		var res=null
		if (fName){
			//var paramsStr=params?params.join(','):''
			//alert (params)
			//eval('res='+fName+'('+getArgList(params)+')')
			//alert('res='+fName+'('+params+')');
			eval('res='+fName+'(params)');
			}
		return res;
		}

	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 (typeof(o)=='string');
		}

	function is_numeric(o){
		return !isNaN(o);
		}
	function is_null(o){
		return o===null;
		}

	function is_date(o){
		return (o && typeof(o)=='object' && !!o.getTime());
		}

	function method_exists(obj,m){
		return ( is_object(obj) && is_function((obj)[m]) );
		}

		
if (window['jQuery']){
	jQuery.fn.searchInClass = function(base){
		if (this.length && this[0]){
			var parts=(this.attr('class')||'').split(' ');
			for (var i=0;i<parts.length;i++){
				var part=parts[i];				
				if (part.search(base)==0){
					return part.substr(base.length);
					}
				}
			return '';
			}
		return '';
		};
	jQuery(function(){
		/* Common body click event dispatcher */
		if (!document.body._bodyClickBounded) {
			$('*',document.body).live('mousedown',function(e){
				$(document.body).triggerHandler('anyClick',[$(e.target)]);
				});
			document.body._bodyClickBounded=true;
			}
		});
	}
		
/* AJAX and Forms
====================================*/
	function doScript(scriptSRC,params){
		var newScript = document.createElement("SCRIPT"), paramsString="";
		//	if (!params) var params={};

		if (!params.from) params.from="js";
		if (!params.resultwrapper) params.resultwrapper="js";
		for (p in params) {paramsString+=paramsString?"&"+p+"="+params[p]:"?"+p+"="+params[p]}
		scriptSRC+=paramsString;
		//alert (scriptSRC); return;
		newScript.type="text/javascript";
		newScript.src=scriptSRC;
		//document.write (scriptSRC); return;
		document.body.appendChild(newScript);
		}

	function putAndSendForm(fAction,fMethod,fData,fFiles){
		var f=setChild(document.body,null,null,"form"),i;
		if (fAction) f.action=fAction;
		if (fMethod) f.method=fMethod;
		for (var iName in fData)
		{
			i=setChild(f,null,null,"input")
			//i.setProperty("type","hidden");
			i.name=iName
			i.value=fData[iName]
		}

		if (fFiles)
		{
			for (var fName in fFiles)
			{
				var ff=fFiles[fName], newff=f.appendChild(ff);
				// for (var pr in ff) newff[pr]=ff[pr]
				newff.value=ff.value;

				//alert(i.value);
			}
			i=setChild(f,null,null,"input")
			i.name="MAX_FILE_SIZE"
			i.value=30000
			f.enctype="multipart/form-data";
		}


		f.submit();
		}
	function submitForm(f){
		alert('0');
		document.forms[0].submit();
		}
	function getRadioValue(el){
		var res=null
		el=$name(el);
		if (!el) {
			//alert (el)
			return "";
			}
		for (var i=0; i<el.length; i++){
			var iEl=el[i];
			if (iEl.checked) {
				res=iEl.value;
				break;
				}
			}
		return res;
		}

	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){ 
			/* Checking 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;
		if (!par || !is_string(tg)){
			return;
			}
		return par.getElementsByTagName(tg);
		}

	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){
			var prev=el.innerHTML;
			el.innerHTML='';
			return prev;
			}
		else {
			return el.innerHTML;
			}
		}
		
		/* Alias for innerHTML */
		function $content(el,text){
			return $innerHTML(el,text);
			}

	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']);
		//alert(el.id+' '+!!isOn);
		return el.disabled=!!isOn;
		}

	function $disable(el){
		return $toggleDisable(el,true);
		}

	function $enable(el){
		return $toggleDisable(el,false);
		}

	function $disabled(el){
		el=$id(el);
		if (!el){
			return false;
			}
		return !!el.disabled;
		}

	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;
			}
		if (settings.onmousedown && is_function(settings.onmousedown)){
			el.onmousedown=settings.onmousedown;
			}

		switch(settings.setType){
			case 'insertBefore':
				el=par.parentNode.insertBefore(el,par);
				break;
			case 'append':
				el=par.appendChild(el);
				break;
			case 'prepend':
				el=par.childNodes[0].parentNode.insertBefore(el,par.childNodes[0]);
				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;
		}

	function getElementByTagAndClass(par,elTag,elClass){
		if (!par || !elTag) return false;

		par=$id(par);

		var el,elNum,els=new Array(),res=null;
		els=par.getElementsByTagName(elTag);

		if (els.length>0){
			for (elNum in els){
				el=els[elNum];
				//if (el.className && el.className==elClass)
				if (el && el.className && in_array(el.className.split(" "),elClass)){
					res=el;
					}
			}
		}

		return res;
		}

	function getElementsByTagAndClass(par,elTag,elClass){
		if (!par || !elTag) return false;
		par=$id(par);
		var
			el,
			elNum,
			els=new Array(),
			res=new Array();
		els=par.getElementsByTagName(elTag);
		if (els.length>0){
			for (var elNum=0; elNum<els.length; elNum++){
				el=els[elNum];
				if (!el){
					continue;
					}
				if (el.className && in_array(el.className.split(" "),elClass))
				//if (el.className && el.className==elClass)
				res.push(el);
				}
			}
		return res;
		}
	function getElementByTagAndProperty(par,elTag,property,propertyValue){
		if (!par || !elTag){
			return false;
			}
		par=$id(par);
		var
			el,
			elNum,
			els=new Array(),
			res=null;
		els=par.getElementsByTagName(elTag);
		if (els.length>0){
			for (elNum in els) {
				el=els[elNum];
				//if (el.className && el.className==elClass)
				if (el[property] && el[property]==propertyValue){
					res=el;
					}
				}
			}
		return res
		}

		
	/** 
	 * Single blink over given container
	 * @param {jQuery} $cnt
	 */
	$.fn.blinkOver = function(params){
		var 
			/** @type {jQuery} */
			$cnt;
		params = $.extend(true, {
			css: {
				position:'absolute',
				zIndex: 	10,
				left:		0, top:		0, right:		0, bottom:		0,
				background:	'#E2E2E1',
				opacity:		0.9
				},
			speed: 500
			}, params);
		for (var i = 0, l = this.length; i < l; i++) {
			$cnt = $(this[i]).css('position','relative');
			$('<div/>').appendTo($cnt).css(params.css).fadeOut(params.speed,function(){
					$(this).css('background', '');
					$cnt.css('position', '');
					});	
			}
		return this;
		}

/* Positioning and view
====================================*/
	function getWhereIs(block){
		block=$id(block);
		if (!block){
			return false;
			}
		var
			theBlock=block,
			blockLeft = 0,
			blockTop = 0;

		while(block) {
			blockLeft += block.offsetLeft;
			blockTop += block.offsetTop;
			block = block.offsetParent;
		}
		return {
			left:blockLeft,
			top:blockTop,
			right:blockLeft+theBlock.offsetWidth,
			bottom:blockTop+theBlock.offsetHeight
			};
		}

	function getWhereIsEvent(e){
		if (e.pageX){
			return {x:e.pageX, y:e.pageY};
			}
		else{

			}
		return {x:e.clientX + document.body.parentElement.scrollLeft, y: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,setX){
		el=$id(el);
		if (!el){
			return false;
			}
		el.style.position='absolute';
		var winH = (window.opera)? window.innerHeight:document.documentElement.clientHeight,
			winY=(document.all)?document.documentElement.scrollTop:window.pageYOffset,
			elY=Math.round(winY+winH/2-el.clientHeight/2),
			winW=document.documentElement.offsetWidth,
			elX=setX?Math.round(winW/2-el.offsetWidth/2):null;
			//alert (winW)
			if (document.all) elY-=30;
			setPosition(el,{left:elX,top:elY})
		}

	function switchElementVisibility(el,state){
		var states=new Array('hidden','showed'),
			newState,
			currState=0
		//alert (el+" '"+$id(el).className+"' state="+state)
		el=$id(el)

		if (el.className.search(states[0])>-1)
			currState=0
		else if (el.className.search(states[1])>-1)
			currState=1
		newState=(state==null)?((currState==0)?1:0):state

		strTempl='/'+states[currState]+'/'

		if (el.className.search(states[currState])>-1)
			el.className=el.className.replace(states[currState], states[newState])
		else
			el.className+=" "+states[newState]

		return newState
		}

	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,
						width:desc.width,
						height:desc.height
						},
					className:'cloneNode'
					}
				);
		return clone;

		}

	function $desc(el){
		el=$id(el);
		if (!el){
			return false;
			}
		var desc={
			width:el.offsetWidth,
			height:el.offsetHeight,
			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;
		}


	/* Dragging */
		
	/** 
	 * Allows drag-n-drop
	 * @type {Function} 
	 */	
	var $drag;
	(function(){
		var DraggingItem = {};
		function startDrag (event, _this, _targetBlock, settings){
			DraggingItem.This = $id(_this);
			DraggingItem.Target = $id(_targetBlock);		
			if (!DraggingItem.This || !DraggingItem.Target){
				throw new Error('error dragging '+DraggingItem.Target);
				return false;
				}
			DraggingItem.TargetXY=getWhereIs(DraggingItem.Target);
			
			var defaultSettings={
				minLeft:1,
				minTop:1
				};
			DraggingItem.settings=concatObjects(settings,defaultSettings);
			if (DraggingItem.settings.onbegin) {
				DraggingItem.settings.onbegin(DraggingItem.Target);
				}
			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.Target.style.position = 'absolute';
			
			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();
				}
			}
			
		function ProceedDrag (event){
			var 
				nextX, nextY,
				x, y;
			if (BROWSER.isIE || BROWSER.isOpera95) {
				x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
				y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
				}
			else if (BROWSER.isGecko || BROWSER.isOpera){	
				x = event.clientX + window.scrollX;
				y = event.clientY + window.scrollY;
				}	
		
			nextX = DraggingItem.StartLeft + x - DraggingItem.cursorStartX;
			nextX = valueInLimits(nextX, DraggingItem.settings.minLeft, DraggingItem.settings.maxLeft);
			
			DraggingItem.Target.style.left = nextX + 'px';
		
			nextY = DraggingItem.StartTop  + 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);
				}
			}
		/*Public alias for startDrag*/
			$drag = function(event, _this, _targetBlock, settings){
				startDrag(event, _this, _targetBlock, settings);
				}
				
		/* jQuery drag-n-drop plugin */
			if (window['jQuery']){
				(function($){
					var 
						trackAreaClass = 'dragging-over',
						trackAreaOffsetDataKey = '_dragTrackingOffset',
						/** 
						 * Checks if given areas under draging elem 
						 * placed in [left,top] point
						 */
						trackArea = function(/* Object */ta, left, top){
							var res;
							ta.area && $.each(ta.area, function(){
								var
									$a = $(this),
									offset = $a.data(trackAreaOffsetDataKey) || $a.offset(),
									targetOffset = {
										left:		0,
										top:		0,
										leftFactor: 0,
										topFactor:	0
										},
									_res = (
										left 	>= offset.left && 
										top 	>= offset.top &&
										left 	<= (offset.right || (offset.right = offset.left + $a.outerWidth())) &&
										top 	<= (offset.bottom || (offset.bottom = offset.top + $a.outerHeight()))
										);
								if (_res){
									targetOffset = {
										left:		left - offset.left,
										top:		top - offset.top
										};
									targetOffset.leftFactor = targetOffset.left / (offset.right - offset.left);
									targetOffset.topFactor = targetOffset.top / (offset.bottom - offset.top);
									}
//								$a.data(trackAreaOffsetDataKey, offset);
								$a.toggleClass(trackAreaClass, _res);
								if (res !== false){
									/* Total result is true only if all areas is under draging object */
									res = _res;
									}
								ta.handler && ta.handler($a, _res, targetOffset);
								});
							return res;
							},
						/** 
						 * Deletes cached data used when tracked areas while dragging
						 * Also delete over-dragging class from areas
						 */
						clearTrackAreaCache = function(ta){
							ta.area && $.each(ta.area, function(){
								$(this)
									.data(trackAreaOffsetDataKey, null)
									.removeClass(trackAreaClass);
								})	
							};
					$.fn.allowDrag = function(/* Object */_data){
						var
							data = {
								useClone:	false,
								trackAreas: []
								},
							/** @type {jQuery} */
							$target,
							/** @type {jQuery} */
							$clone,
							/** @type {jQuery} */
							$dragger,
							/** @type {String} */
							draggerPath,
							/** @type {Function} */
							_clientMove,
							/** @type {Function} */
							_clientComplete,
							/** @type {Object} */
							_completeData,
							
							targetWidth,
							targetHeight,
							targetRight,
							targetBottom,
							
							/** 
							 * Areas for placing on tracking 
							 * Array for inner using
							 * @type {Object{}}
							 */
							trackAreas = [],
							/** @type {jQuery} */
							_trAr,
							obj = {
								setTrackAreas: function(areas, append){
									!append && (trackAreas = []);
									for (var i = 0, l = areas.length; i < l; i++) {
										if ($.isFunction(areas[i])){
											trackAreas.push({
												area: 		_trAr,
												handler:	areas[i]
												});
											_trAr = undefined;
											}
										else{
											if (!_trAr){
												_trAr = $(areas[i]);
												}
											else{
												_trAr = _trAr.add($(areas[i]));
												}
											}
										}
									if (_trAr){
										trackAreas.push({
											area: 		_trAr
											});
										}
									}
								};
						this.data('_dragControl', obj);
						
						_data && $.extend(data, _data);
						
						/* Transform tracking areas to required inner form */
						if (data.trackAreas.length){
							obj.setTrackAreas(data.trackAreas);
							}
						if (typeof(data.dragger) == 'object'){
							$dragger = $(data.dragger);
							}
						else if (typeof(data.dragger) == 'string'){
							draggerPath = data.dragger;
							}
							
						for (var i = 0, l = this.length; i < l; i++) {
							$target = $(this[i]);
							if (draggerPath){
								$dragger = $(draggerPath, $target);
								}
							else{
								$dragger = is_object(data.dragger) ? $(data.dragger): $target;
								}
							$dragger.css({
								cursor: 'move'});
							if (data.useClone){
								_clientComplete = data.oncomplete;
								_clientMove = data.onmove;
								$dragger.mousedown(function(/* Event */e){
									targetWidth = $target.width();
									targetHeight = $target.height();
									$clone = $target.clone()
										.addClass('dragging-clone')				
										.css({
											position:	'absolute',
											zIndex:		10010
											})
										.css($target.offset())
										.width(targetWidth)
										.height(targetHeight)
										.appendTo(document.body);
									data.oncomplete = function(){
										$(document.body).removeClass('dragging-process');
										_completeData = $clone.offset();
										$clone.remove();
										_clientComplete && _clientComplete($target, _completeData);
										if (trackAreas.length){
											for (var i = 0, l = trackAreas.length; i < l; i++) {
												clearTrackAreaCache(trackAreas[i]);
												}
											}
										}
									data.onmove = function(target, left, top){
//										console.time('onmove');
										targetRight = left + targetWidth;
										targetBottom = top + targetHeight;
										if (trackAreas.length){
											
											for (var i = 0, l = trackAreas.length; i < l; i++) {
												trackArea(
													trackAreas[i], 
													(left + targetRight) * 0.5, 
													(top + targetBottom) * 0.5
													);
												}
											}
										_clientMove && _clientMove.apply(this, arguments);
//										console.timeEnd('onmove');
										}
									$(document.body).addClass('dragging-process');
									startDrag(e, $target, $clone, data);
									});
								}
							else{
								$target.mousedown(function(/* Event */e){
									startDrag(e, $dragger || $target, $target, data);
									});
								}
							}
						return this;
						};
					})(jQuery);
				}
		})();


	/* Slide
	================================================*/
	function slideDown(el,settings){
		return slide(el,'down',settings);
		}
	function slideUp(el,settings){
		return slide(el,'up',settings);
		}

	function slide(el, direction, settings){

		/* Initialize */
		el=$id(el);
		if (!el || el._sliding){
			return false;
			}
		var defaultSettings={
			speed:5,
			acceleration:0
			}
		if (settings && !is_object(settings)){
			settings={speed:settings};
			}
		settings=concatObjects(settings,defaultSettings);

		var
			DIRECTION_DOWN='down',
			DIRECTION_UP='up',
			DIRECTION_LEFT='left',
			DIRECTION_RIGHT='right',
			pos,
			trueHeight,
			timeStep=10,
			steps=Math.ceil(100/settings.speed),
			heightStep,
			interval,
			wrapper,
			core,
			currentHeight=1,
			alignFactor=1;
		if (direction==DIRECTION_UP){
			setStyle(el,{display:'block'});
			currentHeight=el.offsetHeight;
			alignFactor=-1;
			}
		else if (direction==DIRECTION_DOWN){
			currentHeight=0;
			}

		/* Sliding proccess */
		var sliding=function(){
			if (
					(alignFactor>0 && (
						currentHeight>=trueHeight
						|| Math.abs(trueHeight-currentHeight)<(trueHeight*0.01)
						)
					) || (alignFactor<0 && currentHeight<=0)
					){
				stopSlide();
				}
			currentHeight+=heightStep;
			setStyle(
				wrapper,
				{
					height:currentHeight
					}
				);

			}


		/* Start slide */
		var startSlide=function(){
			el._sliding=true;
			//el.innerHTML='<div id="sliding_wrapper"><div>'+el.innerHTML+'</div></div>';
			//alert(el.innerHTML);


			wrapper=setChildExt(
				{
					parent:el,
					content:$clear(el),
					style:{
						overflow:'hidden',
						position:'relative',
						height:currentHeight
						}
					}
				),
			core=setChildExt(
				{
					parent:wrapper,
					content:$clear(wrapper),
					style:{
						position:'absolute',
						bottom:0
						}
					}
				);
			setStyle(el,{display:'block'});
			trueHeight=core.offsetHeight;
			heightStep=alignFactor * Math.ceil(trueHeight*settings.speed/1000),
			interval=setInterval(
				sliding,
				timeStep
				);

			}


		/* Stop slide */
		var stopSlide=function(){
			if (direction==DIRECTION_UP){
				setStyle(el,{display:'none'});
				}
			$innerHTML(el,$innerHTML(core));
			clearInterval(interval);
			interval=null;
			if (is_function(settings.oncomplete)){
				settings.oncomplete(el);
				}
			el._sliding=false;
			return true;
			}

		startSlide();
		}


/* 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") && el.length!=null)
			return el
		else
			return [el]
		}

/* Object functions
====================================*/
	
	/** 
	 * Handler for get / set operation with inner storage
	 */
	function storage(storage, data, value){
		if (data != undefined){
			if (typeof data == 'object'){
				/* Extending data by given object */
				$.extend(storage, data);
				}
			else if (value == undefined){
				/* Returning data value by given key */
				return storage[data];
				}
			else{
				/* Seting data value by given key  */
				storage[data] = value;
				}
			}
		/* If nothing given returning all storage hash */
		return storage;
		};
	
	
	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 cloneObject(obj1){
		var res={};
		for (var pName in obj1){
			res[pName]=obj1[pName];
			}
		return res;
		}

	function duplicateObject(obj){
		if (is_date(obj)){
			return obj;
			}
		var res = is_array(obj) ? [] : {};
		for (var i in obj){
			if (is_object(obj[i])){
				res[i] = duplicateObject(obj[i]);
				}
			else{
				res[i] = obj[i];
				}			
			}
		return res;
		}
		
	function removeFromObject(obj, key){
		var _obj={};
		for (var i in obj){
			if (i != key){
				_obj[i] = obj[i];
				}
			}
		return _obj;
		}	
		
/* Debugging
====================================*/
	function testObject(obj,isWrite,noAlert){
		var o="",
			sprt=isWrite?"<br/>":"\n";
		if (is_object(obj)){
			for (var p in obj){
				var subObj=obj[p];
				if (is_object(subObj)){
					subObj=testObject(subObj,null,true);
					}
				else {
					//alert("type of subObj is "+typeof subObj);
					}
				o+=p+"=>"+subObj+sprt
				}
			}
		else{
			o+=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){
			try{
				if (el === window && evnt == 'onload' && window['jQuery']){
					/* Using jQuery document.ready for archaic window.onload events */
					jQuery(document).ready(func);
					return false;
					}
				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']]={};
					}
				//alert(el+' '+in_array(this.Elements,el)+' '+el['elNum']+' '+window.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+'"]');
					}
				} catch (e){}
			}
		this.router=function(el,evnt,eArg){
			//alert('clicked by '+el['elNum']);
			var elData=el.eventObj.Events[el['elNum']]
			//FIXME
			/* if (!elData) {
				alert (el+" "+evnt)
					return;
				} */
			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);
					}
				else {
					}
				}
			//return false;//?
			}

		}
	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);
			}
		/* if (this.toArrestEventElements){
			e.arrested=e.arrested.concat(this.toArrestEventElements);
			alert(this.toArrestEventElements.length);
			} */
		}

	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
=================================================*/

	EVENTS.append(
		window,
		'onload',
		function(){
			preloadAjaxProgress();
			}
		);

	function blockScreen(){
		if ($id('blockscreen')){
			return false;
			}
		var bs=setChildExt(
			{
				id:'blockscreen'
				}
			);
		bs.overImg=bs.appendChild(IMG_BLOCK_SCREEN);
		bs.style.position='absolute';
		bs.style.top=0;
		bs.style.left=0;
		setPosition(bs,{left:0,top:0});
		/* bs.style.width='100%';
		bs.style.height='100%';	 */
		bs.style.zIndex=10000;
		resizeBlockScreen();

		}
	function unblockScreen(){
		if (!$id('blockscreen')) {
			return false;
			}
		unsetChild('blockscreen');
		//setStyle(document.body,{overflow:'auto'});
		}
	function resizeBlockScreen(){
		var bs=$id('blockscreen');
		if (!bs || !bs.overImg){

			return false;
			}
		//setStyle(document.body,{overflow:'hidden'});
		var sizes={
			height:Math.max(document.documentElement.clientHeight,document.body.clientHeight,(TriDorogiPage.getMainWrapContainer()).clientHeight,700),
			width:Math.max(document.documentElement.clientWidth,document.body.clientWidth,(TriDorogiPage.getMainWrapContainer()).clientWidth,1000)
			};
		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',
				isWrite:true
			};
	
		
		settings=concatObjects(settings,defaultSettings);
		if (settings.params && settings.src) {
			settings.src+='?'+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" /><'+'/object>'
			:'<'+'embed src="'+settings.src+'" quality="high" wmode="'+settings.wmode+'" width="'+settings.width+'" height="'+settings.height+'" name="'+settings.name+'"  id="'+settings.name+'" menu="false" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspace="http://www.macromedia.com/go/getflashplayer"/>';
	
		if (settings.isWrite) {
			document.write(html);
			}
		return html;	
		}
		
		/*Alias for buildFlashExt*/
		function $flash(settings){
			return buildFlashExt(settings);
			}
	
	/*Returns link to flash object */	
	function $flashMovie(name){
		return BROWSER.isIE?window[name]:document[name];
		}


/* Popup
================================================*/
	function popUp (settings){
		var defaultSettings={
			url:'',
			width:500,
			height:500
			};
		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;
		}

/* iPopup
================================================*/
var ACTIVE_IPOPUP;

	function iPopup(settings){
		this.settings={};
		this.defaultSettings={
			title:'Сообщение',
			html:''
			};

		this.__construct=function(settings){
			this.settings=concatObjects(settings,this.defaultSettings);
			blockScreen();
			this.build();
			ACTIVE_IPOPUP=this;
			}

		this.onOKHandler=function(){
			if (this.settings.onOK && typeof this.settings.onOK=='function'){
				if (!this.settings.onOK.call(this)){
					return false;
					}
				}
			this.kill();
			}
		this.onCancelHandler=function(){
			if (this.settings.onCancel && typeof this.settings.onCancel=='function'){
				this.settings.onCancel.call(this);
				}
			this.kill();
			}
		this.onBuildHandler=function(){
			if (this.settings.onBuild && typeof this.settings.onBuild=='function'){

				this.settings.onBuild.call(this);
				}
			}
		this.build=function(){
			var html=this.getFullHTML();
			this.block=setChildExt(
				{
					id:'iPopup',
					content:html,
					style:{
						zIndex:101
						},
					className:'iPopup'
					}
				);

			if (!this.block){
				return false;
				}
			$id('iPopupButtonOK').iPopup=$id('iPopupButtonCancel').iPopup=this;
			EVENTS.append(
				'iPopupButtonOK',
				'onclick',
				function(){
					this.iPopup.onOKHandler.call(this.iPopup);
					}
				);

			EVENTS.append(
				'iPopupButtonCancel',
				'onclick',
				function(){
					this.iPopup.onCancelHandler.call(this.iPopup);
					}
				);
			//getElementsByTagAndClass(this.block,'DIV','iPopup-title')[0].onmousedown=startDrag(null,this,this.block)
			/* EVENTS.append(
				getElementsByTagAndClass(this.block,'DIV','iPopup-title')[0],
				'onmousedown',
				function(){
					startDrag(null,this,this.block)
					}
				); */

			//
			putInScreenCenter(this.block,true);
			this.onBuildHandler();

			}
		this.getFullHTML=function(){
			var html=
				'<div class="iPopup-wrap">'
					+'<div class="iPopup-title" onmousedown="startDrag(event,this,\'iPopup\')">'
						+'<h3>'+this.settings.title+'</h3>'
					+'</div>'
					+'<div class="iPopup-content">'
						+this.settings.html
					+'</div>'
					+'<div class="iPopup-floor">'
						+'<button id="iPopupButtonOK">OK</button>'
						+'<button id="iPopupButtonCancel">Cancel</button>'
					+'</div>'
				+'</div>'
				;

			return html;
			}
		this.kill=function(){
			unsetChild(this.block);
			unblockScreen();
			};
		this.disableButtons=function(state){
			if (state!=false){
				state=true;
				}
			var btn;
			if (btn=$id('iPopupButtonOK')){
				btn.disabled=state;
				}
			if (btn=$id('iPopupButtonCancel')){
				btn.disabled=state;
				}
			}
		this.focusBtnOK=function(){
			if (btn=$id('iPopupButtonOK')){
				btn.focus();
				}
			}
		this.focusBtnCancel=function(){
			if (btn=$id('iPopupButtonCancel')){
				btn.focus();
				}
			}
		this.__construct(settings);
		}


/* STRING functions
====================================*/
	
	function trimStr(str, charlist) {
		charlist = !charlist 
			? ' \\s\\xA0' 
			: charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');
		return str.replace(
			new RegExp('^[' + charlist + ']+|['+charlist+']+$', 'g'), 
			'');
		}
		
		
	function NtoBR(strToClear){
		strToClear=strToClear.replace(/\n/,'<br>');
		return strToClear;
		}

	function BRtoN(strToClear){
		strToClear=strToClear.replace(/<br\s*\/?>/i,'\n');
		return strToClear;
		}

	function getPopped(str,delimiter){
		if (!delimiter){
			delimiter='_';
			}
		var parts=str.split(delimiter);
		parts.pop();
		return parts.join(delimiter);
		}
		
	function timeStr(time,devider){
		if (!isset(devider)){
			devider=':';
			}
		return String(time.h).setDigits()+devider+String(time.m).setDigits()+devider+String(time.s).setDigits()
		}
	
	function isEmail(str){
		var pt=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i;
		return str?pt.test(str):false;
		}
		
	function htmlspecialchars(str){
		return str ? String(str).htmlspecialchars() : '';
		}
		
	String.prototype.htmlspecialchars = function(){
		var s=String(this);
		s=s.replace(/\&(?:.{6})?/g,function(p,v1,v2){
			if (/^\&(nbsp|amp|laquo|raquo|quot);/.test(p)){
				return p;
				}
			return '&amp;'+p.substr(1);
			});
		s=s.replace_multiply(
			[
			 ["<",'&lt;'],
			 [">",'&gt;'],
			 ["\"",'&quot;'],
			 ["«",'&laquo;'],
			 ["»",'&raquo;']
			 ]
			);
		return 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\;/,'—']
			 ]
			);
		}
	String.prototype.replace_multiply=function(data){
		var s=this;
		for (var i in data){
			var d=data[i];
			if (!d || !d[0] || !d[1]){
				continue;
				}

			s=s.replace(d[0],d[1]);
			}

		return s;
		}
	String.prototype.nl2br=function(){
		return NtoBR(this);
		}

	String.prototype.trim=function(maxLength,atEnd){
		var str=this;
		if (str.length<=maxLength){
			return str;
			}
		var
			parts=str.split(' '),
			currStr='';
		for (var i=0;i<parts.length;i++){
			if ((currStr.length+parts[i].length)>=maxLength){
				break;
				}
			else{
				currStr+=' '+parts[i];
				}
			}
		return currStr+(atEnd?atEnd:'...');
		}

	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.dateGetReadableDiff=function(dtDiff){
		if (this.isNullDate()){
			return;
			}
		var dt=new Date();
		var diff=dt.getFromDT(this).diff(dtDiff);
		return timeStr(diff);
		}
	
	String.prototype.dateReadableSimpleStr=function(){
		if (this.isNullDate()){
			return;
			}
		var dt=(new Date()).getFromDT(this);
		if (is_date(dt) ){
			return dt.getReadableSimple();
			}
		else{
			return '';
			}
		}

	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
================================================*/
	Number.prototype.setDigits=function(num){
		return (String(this)).setDigits(num);
		}

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

	Date.prototype.getReadable=function(){
		var d=this.getDate(),
		m=MONTHS[this.getMonth()],
		y=this.getFullYear(),
		o=d+'&nbsp;'+m+'&nbsp;'+y+'&nbsp;г.';
		return o;
		}

	Date.prototype.getReadableFull=function(){
		var d=this.getDate(),
		m=MONTHS[this.getMonth()],
		y=this.getFullYear(),
		h=this.getHours().setDigits(),
		i=this.getMinutes().setDigits(),
		o=d+'&nbsp;'+m+'&nbsp;'+y+'&nbsp;г. в '+h+':'+i;
		return o;
		}

	Date.prototype.getReadableSimple=function(){
		var d=this.getDate().toString(),
			m=(this.getMonth()+1).toString(),
			y=this.getFullYear().toString()
		if (d.length<2) d="0"+d;
		if (m.length<2) m="0"+m;
		var o=d+'.'+m+'.'+y;
		return o;
		}

	Date.prototype.toDT=function(){
		var d=this.getDate().toString(),
			m=(this.getMonth()+1).toString(),
			Y=this.getFullYear().toString(),
			H=this.getHours().toString(),
			i=this.getMinutes().toString(),
			s=this.getSeconds().toString();

		if (d.length<2) d="0"+d;
		if (m.length<2) m="0"+m;

		return Y.setDigits(4)+'-'+m.setDigits(2)+'-'+d.setDigits(2)+' '+H.setDigits(2)+':'+i.setDigits(2)+':'+s.setDigits(2);
		}

	Date.prototype.getTimeStamp=function(){
		var d=this.getDate(),
		m=this.getMonth()+1,
		y=this.getFullYear();
		if (d<10) d="0"+d;
		if (m<10) m="0"+m;
		return ""+y+m+d+"000000";
		}

	Date.prototype.getFromTimeStamp=function(ts){
		ts=ts+"";
		var y=parseInt(ts.substr(0,4)),
		m=parseInt(ts.substr(4,2))-1,
		d=parseInt(ts.substr(6,2));

		this.setFullYear(y);
		this.setMonth(m);
		this.setDate(d);
		this.setHours(0);
		this.setMinutes(0);
		this.setSeconds(0);
		return true;
		}

	Date.prototype.getFromDT=function(dt){
		dt=dt+"";
		var y=parseInt(dt.substr(0,4)),
		m=dt.substr(5,2)-1,
		d=dt.substr(8,2),
		h=dt.substr(11,2),
		i=dt.substr(14,2),
		s=dt.substr(17,2);

		this.setFullYear(y);
		this.setMonth(m);
		this.setDate(d);
		this.setHours(h);
		this.setMinutes(i);
		this.setSeconds(s);
		return this;
		}


	Date.prototype.offsetDaysFromDate=function(dt,days){
		var nd=new Date();
		this.setMonth(dt.getMonth());
		this.setFullYear(dt.getFullYear());
		this.setHours(dt.getHours());
		this.setMinutes(dt.getMinutes());
		this.setSeconds(dt.getSeconds());
		this.setDate(dt.getDate()+days);
		return this;
		}

	Date.prototype.nullHms=function(){
		this.setHours(0);
		this.setMinutes(0);
		this.setSeconds(0);
		return this;
		}

	Date.prototype.equal=function(dt){
		if (!is_date(dt)){
			return false;
			}
		return(
			this.getFullYear()==dt.getFullYear() &&
			this.getMonth()==dt.getMonth() &&
			this.getDate()==dt.getDate()
			);
		}
	Date.prototype.duplicate=function(){
		var dt=new Date();
		dt.setFullYear(this.getFullYear());
		dt.setMonth(this.getMonth());
		dt.setDate(this.getDate());
		dt.setHours(this.getHours());
		dt.setMinutes(this.getMinutes());
		dt.setSeconds(this.getSeconds());
		return dt;
		}
		
	Date.prototype.diff=function(dt){
		if (!dt){
			dt=new Date();			
			}
		var ds=Math.round((this.getTime()-dt.getTime())/1000);		
		var diff={
			h:0,
			m:0,
			s:0
			}
		ds-=(diff.h=Math.floor(ds/3600))*3600;
		ds-=(diff.m=Math.floor(ds/60))*60;
		diff.s=Math.floor(ds);
		
		return diff;
		}
