var Gecko	= !!window.controllers;
var IE		= window.document.all && !window.opera;

/* trim for string  */
if(IE){ String.prototype.trim = function(){	return this.replace(/(^\s*)|(\s*$)/g, "");}}
/* array indexOf */
if(!Array.prototype.indexOf) Array.prototype.indexOf = function(s){ for(var i=0,l=this.length;i<l;i++) if(this[i]==s) return i; return -1;};
Array.prototype.last = function(s){return this[this.length -1 ];};
/* get function name */
Function.prototype.name = function(code){
  if(code == null)  code = "" + this;
  code = code.substring(code.indexOf("function") + 8, code.indexOf("("));
  return code.trim();
};
/* getByClass(classname, object)
	alias of getElementsByClass
*/
var getByClass = function(classname, obj){
	if(typeof(obj) != "object") obj = document;
	if(document.getElementsByClassName == undefined) {
      var res = [];
      var elem = obj.getElementsByTagName("*");
      var l = elem.length;
      for (var i = 0; i < l; i++)  {
    	  if(elem[i].className){
    		  var elem1 = elem[i].className;
    		  elem1 = elem1.trim().split(/\s+/);
    		  l1 = elem1.length;
    		  for(var i1=0;i1<l1;i1++)  if(elem1[i1] == classname) res.push(elem[i]);
    	  }
      }
      return res;
	}
	return obj.getElementsByClassName(classname);
};
/* xOffset*/
var xOffset = function(){return (window.pageXOffset)?window.pageXOffset:(document.documentElement && document.documentElement.scrollLeft) || (document.body && document.body.scrollLeft);};
/* yOffset*/
var yOffset = function(){(window.pageYOffset)?window.pageYOffset:(document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop);};
/* innerWidth */
var windowInnerW = function(){return (window.innerWidth)?window.innerWidth:(document.documentElement && document.documentElement.clientWidth) || (document.body && document.body.clientWidth);};
/* innerHeight */
var windowInnerH = function(){return (window.innerHeight)?window.innerHeight:(document.documentElement && document.documentElement.clientHeight) || (document.body && document.body.clientHeight);};
/* outerWidth */
var windowOuterW = function(){
	if(window.outerWidth) return window.outerWidth;
	else{var el = document.documentElement || document.body,el1 = document.body;
		return parseInt(el.clientWidth) + parseInt(el.currentStyle.borderLeftWidth)+parseInt(el.currentStyle.borderRightWidth)+parseInt(el1.currentStyle.marginLeft)+parseInt(el1.currentStyle.marginRight);	}
};
/* outerHeight */
var windowOuterH = function(){
	if(window.outerHeight)	return window.outerHeight;
	else{var el = document.documentElement || document.body, el1 = document.body;
		return parseInt(el.clientHeight) + parseInt(el.currentStyle.borderTopWidth)+parseInt(el.currentStyle.borderBottomWidth)+parseInt(el1.currentStyle.marginTop)+parseInt(el1.currentStyle.marginBottom);	}
};
/* documentHeight */
var documentHeight = function(){return Math.max(document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight);};
/* documentWidth */
var documentWidth = function(){return Math.max(document.body.offsetWidth, document.documentElement.clientWidth, document.documentElement.scrollWidth);};
/* documentScrollTop */
var documentScrollTop = function(){return Math.max(document.body.scrollTop, document.documentElement.scrollTop, document.documentElement.scrollTop);};
/* documentScrollLeft */
var documentScrollLeft = function(){return Math.max(document.body.scrollLeft, document.documentElement.scrollLeft, document.documentElement.scrollLeft);};
/* screenX */
var windowX = function(){return (window.screenX)?window.screenX:window.screenLeft;};
/* screenY */
var windowY = function(){return (window.screenY)?window.screenY:window.screenTop;};
/* pageX for event */
var pageX = function(e){
	if(e.pageX)	return e.pageX;
	else{ var html = document.documentElement, body = document.body;
		return e.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0);	}
};
/* pageY for event */
var pageY = function(e){
	if(e.pageY)	return e.pageY;
	else{ var html = document.documentElement, body = document.body;
		return e.clientY + (html && html.scrollTop || body && body.scrollTop || 0) - (html.clientTop || 0);	}
};
/* search for parentNodes */
var findParent = function(childObj, param, param_val){
	var testObj = childObj;
	while(testObj.parentNode){
		if(param == 'class'){ if(hasClass(testObj, param_val)) return testObj;	}
		else if(param == 'nodeName') { if(testObj.nodeName == param_val) return testObj;	}
        else if(typeof param == 'object') {if(testObj === param) return testObj; }
		else{ if(testObj.parentNode && (testObj.getAttribute(param) == param_val)) return testObj;	}
		testObj = testObj.parentNode;    	
	}
	return false;
};
/* search for parentNodes experimental */
var findParent2 = function(childObj, param, param_val, p){
	var testObj = [], stop=false;
    testObj.push(childObj.parentNode);
	while(testObj.last().parentNode){
		if(param == 'class'){ if(hasClass(testObj.last(), param_val)) stop=true;	}
		else if(param == 'nodeName') { if(testObj.last().nodeName == param_val) stop=true;	}
        else if(typeof param == 'object') {if(testObj.last() === param) stop=true; }
		else{ if(testObj.last().parentNode && (testObj.last().getAttribute(param) == param_val)) stop=true;	}
        if(stop) return testObj;
        if(p.breakElementClass && hasClass(testObj.last(), p.breakElementClass)) return false;
        testObj.push(testObj.last().parentNode);
	}
	return false;
};
var classInSibling = function(start_el, className, direction){
	direction = (direction)?direction:1;
	var el = start_el;
	while(el = ((direction>0)?el.nextSibling:el.previousSibling))
		if(hasClass(el, className)) return el;
	return false;
}
/* addClass */
var addClass = function(el, cn){
        if(hasClass(el, cn)) return;
        el.className = ((el.className +" " + cn).trim());
};
/* removeClass */
var removeClass = function(el, cn){
	if(hasClass(el, cn)) el.className = el.className.replace(cn, "");
};
/* hasClass */
var hasClass = function(el, cn){
	if(el.className){
		var re = new RegExp("\\b"+cn+"\\b");
		return re.test(el.className);
	}
	return false;
};
/* addEvent */
var addEvent = function(obj, eventType, listener){
		if(obj.addEventListener != undefined)  obj.addEventListener(eventType, listener  , false);
		else obj.attachEvent("on"+eventType, listener );
		/* register */
		var ln = listener.name;
		var res = [];
		res['src'] = listener;
		res['currentTarget'] = obj;
		res['obj'] = this;
		res['function'] = ln;
		if(!window.listeners) window.listeners = new Array();
		if(!window.listeners[eventType]) window.listeners[eventType] = new Array();
		if(!window.listeners[eventType][ln]) window.listeners[eventType][ln] = new Array();		
		window.listeners[eventType][ln] = res;

};
/* removeEvent */
var removeEvent = function(obj, eventType, listener){
		if(!window.listeners[eventType]) return;
		delete(window.listeners[eventType][listener.name]);
		window.listeners[eventType][listener.name] = undefined;
		if(obj.removeEventListener != undefined) obj.removeEventListener(eventType, listener, false);
		else 	obj.detachEvent("on"+eventType,  listener);
};
/* alias createElement */
var _element = function(target, el, params, before){
    var new_el  = (el != 'textNode')?document.createElement(el):document.createTextNode(params['text']);
	if(params != undefined && el != 'textNode') for(var i in params) _set(new_el, i, params[i]);
	if(before) target.parentNode.insertBefore(new_el, target);
	else if(target.nodeName != '#document') new_el = target.appendChild(new_el);	
	return new_el;
};
/* set attribute 'place' to 'val' in 'where' element */
var _set = function(target, place, val){
	if(place == "text" || place == "txt") target.innerHTML = val;
	else if(place == "class") target.className = val;
	else if(place == "value") target.value = val;
	else if(place == "type") target.type = val;
	else target.setAttribute(place, val);
	return target;
};
Date.prototype.fromString = function(s){
	s = s.trim();
	var s_ = s.split(' '), time = false, dt = false, dd = new Date();;
	for(var i =0, l=s_.length;i<l;i++)	if(!time){ time = get_time(s_[i]); if(time) s_[i] = undefined;}
	for(var i =0, l=s_.length;i<l;i++)	 if(!dt && s_[i]) dt =  get_date(s_[i]);
	function get_time(a){
		var a_ = a.split(':');
		if(a_.length==1) return false;
		return {'h':parseInt(a_[0], 10), 'i':parseInt(a_[1], 10), 's':parseInt(a_[2], 10)};
	}
	function get_date(a){
		var sd = a.match(/\b[0-9]{1,4}\b/g), y, m,d;
		if(sd.length < 2) 	return false;
		m = sd[1];
		if(sd.length == 2){ y = d.format('%Y'); d = sd[0];}else{ if(sd[0]>31) d = sd[2], y=sd[0]; else d = sd[0], y=sd[2];}
		return {'y':parseInt(y, 10), 'm':parseInt(m, 10)-1, 'd':parseInt(d, 10)};
	}
	if(!dt){dt = {};dt['y'] = parseInt(dd.format('%Y'), 10); dt['m'] = parseInt(dd.format('%m'), 10); dt['d'] = parseInt(dd.format('%d'), 10);}
	if(dt['y'] < 100) dt['y'] += 2000;
	if(!time){time = {};time['h'] = 1; time['i'] = 1; time['s'] = 1;}
	var result = new Date(dt['y'],dt['m'],dt['d'],time['h'],time['i'],time['s']);	
	this.setTime(result.getTime());
	return result;
}
Date.prototype.dateAdd = function(t, v){
	var dt = this.format('%d %m %Y %H %i %s').split(' '), dt_ar = [];
	dt_ar['d'] = parseInt(dt[0],10), dt_ar['m'] = parseInt(dt[1],10)-1, dt_ar['y'] = parseInt(dt[2],10), dt_ar['h'] = parseInt(dt[3],10), dt_ar['i'] = parseInt(dt[4],10), dt_ar['s'] = parseInt(dt[5],10);
	dt_ar[t] += v;
	return new Date(dt_ar['y'],dt_ar['m'],dt_ar['d'],dt_ar['h'],dt_ar['i'],dt_ar['s']);	
}
/* Date.format(date, string_format)
 *  %d - day, %m - month number, %F - full month name, %M - short month name, %Y - full year, %y - last 2 digits, %H - hours, %i - minutes, %s - seconds
 */
Date.prototype.format = function(str_to_return, l){
	var calendar_language = (l)?l:"ru";
	var calendar_languages = ["en", "ru", "uk"];
	var calendar_month_names = [];
		calendar_month_names["en"] = ["January", "February", "March", "April", "May", "Juny", "July", "August", "September", "October", "November", "December"];
		calendar_month_names["ru"] = ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"];
		calendar_month_names["uk"] = ["Січень","Лютий","Березень","Квітень","Травень", "Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"];
	var calendar_days = [];
		calendar_days["en"] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
		calendar_days["ru"] = ["Вс", "Пн","Вт","Ср","Чт","Пт","Сб"];
		calendar_days["uk"] = ["Нд", "Пн","Вт","Ср","Чт","Пт","Сб"];
	var calendar_days2 = [];		
		calendar_days2["en"] = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];	
		calendar_days2["ru"] = ["Вс", "Пн","Вт","Ср","Чт","Пт","Сб"];
		calendar_days2["uk"] = ["Нд", "Пн","Вт","Ср","Чт","Пт","Сб"];		
	if(!this.getDate()) return;
	var d=this.getDate().toString(), w=this.getDay(), D=calendar_days[calendar_language][w], D2=calendar_days2[calendar_language][w],m=this.getMonth(), M, F, F1, y, Y=this.getFullYear().toString(), H=this.getHours(), i=this.getMinutes(), s=this.getSeconds();
	H = (H<10)?"0"+H.toString():H.toString();
	F = calendar_month_names[calendar_language][parseInt(m)];
	if(calendar_language == 'ru') F1 = ((m == 2 || m == 7)?F+'а':F.substr(0, F.length - 1)+'я');
	else F1=F;
	M = F.substr(0, 3);	
	m = (m==12)?1:m+1;
	m = (m<10)?"0"+m.toString():m.toString();
	d = (d<10)?"0"+d.toString():d.toString();
	i = (i<10)?"0"+i.toString():i.toString();
	s = (s<10)?"0"+s.toString():s.toString();
	y = Y.substr(Y.length-2, 2);
	str_to_return = rpls("%d", d, str_to_return);
	str_to_return = rpls("%m", m, str_to_return);	
	str_to_return = rpls("%M", M, str_to_return);
	str_to_return = rpls("%F1", F1, str_to_return);
	str_to_return = rpls("%F", F, str_to_return);
	str_to_return = rpls("%Y", Y, str_to_return);
	str_to_return = rpls("%y", y, str_to_return);
	str_to_return = rpls("%H", H, str_to_return);
	str_to_return = rpls("%i", i, str_to_return);
	str_to_return = rpls("%s", s, str_to_return);
	str_to_return = rpls("%w", w, str_to_return);
	str_to_return = rpls("%D2", D2, str_to_return);	
	str_to_return = rpls("%D", D, str_to_return);
	return str_to_return;
	function rpls(srch, new_v, str){
		if (str.indexOf(srch) > -1) str = str.replace(srch, new_v);
		return str;
	}
};
/**
* Returns the week number for this date. dowOffset is the day of week the week
* "starts" on for your locale - it can be from 0 to 6. If dowOffset is 1 (Monday),
* the week returned is the ISO 8601 week number.
* @param int dowOffset
* @return int
*/
Date.prototype.getWeek = function () {
	var newYear = new Date(this.getFullYear(),0,1);
	var day = newYear.getDay() - 1; //the day of week the year begins on
	day = (day >= 0 ? day : day + 7);
	var daynum = Math.floor((this.getTime() - newYear.getTime() -
			(this.getTimezoneOffset()-newYear.getTimezoneOffset())*60000)/86400000) + 1;
	var weeknum;
	//if the year starts before the middle of a week
	if(day < 4) {
		weeknum = Math.floor((daynum+day-1)/7) + 1;
		if(weeknum > 52) {
			nYear = new Date(this.getFullYear() + 1,0,1);
			nday = nYear.getDay() - 1;
			nday = nday >= 0 ? nday : nday + 7;
			/*if the next year starts before the middle of
				the week, it is week #1 of that year*/
			weeknum = nday < 4 ? 1 : 53;
			}
	}else {
		weeknum = Math.floor((daynum+day-1)/7);
	}
	return weeknum;
};
/* open address end get response */
var xopen = function(address, f, xmlResponse){
	var xmlhttp=(window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");
	xmlhttp.onreadystatechange = function(){ 
		if(xmlhttp.readyState==4 && xmlhttp.status==200) {
			xmlhttp.response = (xmlResponse)?xmlhttp.responseXML:xmlhttp.responseText, f(xmlhttp.response); 
			
		};
	}
			
			
	xmlhttp.open("GET",address+((address.indexOf("?")==-1)?"?rand="+Math.random():"&rand="+Math.random()),false);
	xmlhttp.send();
};
/* send data to server and get response */
var xsend = function(address, data, f, xmlResponse){
	var xmlhttp=(window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");
	if(f) xmlhttp.onreadystatechange = function(){ if(xmlhttp.readyState==4 && xmlhttp.status==200) xmlhttp.response = (xmlResponse)?xmlhttp.responseXML:xmlhttp.responseText, f(xmlhttp.response); };		
	xmlhttp.open("POST",address+((address.indexOf('?')==-1)?'?':'&')+"rand="+Math.random(), true);
	xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	xmlhttp.send(data);
};
/* setResizable (el, parameters) 29/06/2011 Grigoriy Gorbunov
el - DOM element.
parameters - Object
Description: set resizeable mode for "el" element. 
                    Right and bottom sides resizing by width and height changing
                    Top and left sides changes top&height and left&width parameters of element. So position of "el" must be absolute or fixed;
 Note: if you will use setMovable() function, you've use setResizeable() first.
*/
var setResizable = function(el, p){ 
(function(el,p){
    var x, y, x1, y1, mx, my, w,h, resizeId,el_t,el_l, lmode, rmode, tmode, bmode;
    var minWidth = (p && p.minWidth !== undefined)?parseInt(p.minWidth):"10";
    var minHeight = (p && p.minHeight)?parseInt(p.minHeight):"10";
	var leftLimit = (p && p.leftLimit)?parseInt(p.leftLimit):"0";
	var rightLimit = (p && p.rightLimit)?parseInt(p.rightLimit):"100000000";
	var topLimit = (p && p.topLimit)?parseInt(p.topLimit):"0";
	var bottomLimit = (p && p.bottomLimit)?parseInt(p.bottomLimit):"100000000";
    var borderRange = (p && p.borderRange)?p.borderRange:10;
	var onMove = (p && p.onMove)?p.onMove:false;
	var step = (p && p.step)?p.step:1;
	var g = function(e){
       if(!lmode&&!tmode&&!rmode&&!bmode) return;
			 if (e.preventDefault) e.preventDefault()	;    else e.returnValue = false; 
			g1();
		    el["resizeable"] = true;           
            e = e||window.event;
            x1 = e.clientX; y1 = e.clientY; mx = e.clientX; my = e.clientY; w = el.offsetWidth - 2*el.clientLeft; h = el.offsetHeight - 2*el.clientTop; el_t = el.offsetTop; el_l = el.offsetLeft;
			var m = function(){
				resizeId = setTimeout(function(){ m(); }, 10); 
				if(rmode){
					var v1 = w-mx+x1;                           /* width for right-border mode */
					v1 = Math.round(v1/step)*step+1;
					var v6 = el_l-mx+x1;                       /* left  for right-border mode*/
					v6 = Math.round(v6/step)*step+1;				
					if(v1 < minWidth) v1 = minWidth;					
				}
				if(bmode){
					var v2 = h-my+y1;                           /* height for bottom-border mode */
					v2 = Math.round(v2/step)*step;
					var v4 = el_t-my+y1;                      /* top  for bottom-border mode */
					v4 = Math.round(v4/step)*step; 		
					if(v2 < minHeight) v2 = minHeight;					
				}
				if(tmode){
					var v4 = el_t-my+y1;                      /* top  for bottom-border mode */
					v4 = Math.round(v4/step)*step; 		
					var v3 = h+el_t - v4;                       /* height for top-border mode */
					v3 = Math.round(v3/step)*step;
					if(v3 < minHeight) v3 = minHeight;					
				}
				if(lmode){
					var v6 = el_l-mx+x1;                       /* left  for right-border mode*/
					v6 = Math.round(v6/step)*step;				
					var v5 = w + el_l - v6;                     /* width for left-border mode */
					v5 = Math.round(v5/step)*step;
					if(v5 < minWidth) v5 = minWidth;					
				}
				if(rmode && (el_l + v1 - borderRange/2<=el.parentNode.offsetWidth) && (el_l + v1<=rightLimit)){ el.style.width=v1+"px";}
				if(bmode && (el_t + v2 - borderRange/2<=el.parentNode.offsetHeight) && (el_t + v2<=bottomLimit)) el.style.height=v2+"px"; 
				if(tmode && v4>=0 && topLimit <=v4 && v3>=0 && v3+v4<=el.parentNode.offsetHeight && v4<el_t+h) {el.style.top = v4+"px";el.style.height=v3+"px";} 
				if(lmode && v6>=0 && leftLimit<=v6 && v5>=0 && v5+v6<=el.parentNode.offsetWidth && v6<el_l+w ) {el.style.left = v6 + "px"; el.style.width=v5 +"px";}
 				if(onMove) onMove({'top':el.offsetTop, 'left':el.offsetLeft, 'width':el.offsetWidth, 'height':el.offsetHeight});				
			};
            addEvent(document.body, "mousemove", inspectMouse);
            resizeId = setTimeout(function(){ m(); }, 1); 
   }
    addEvent(el, 'dragstart', function(){return false;})
	addEvent(el, "mousedown", g);
    var g1 = function(){if(true){selectableDocument();clearInterval(resizeId); removeEvent(document, 'mousemove', inspectMouse); resizeId=undefined;} }
    addEvent(document.body,"mouseup", g1);
    var inspectMouse = function(e){e=e||window.event; x1=e.clientX; y1=e.clientY;}
    var spectBorders = function(e){
         if(resizeId) return;
        	 e = e || window.event; x = e.clientX; y = e.clientY;                
         	lmode = false, rmode = false, tmode = false, bmode = false;  
         	var pe = posElement(el);
			if((!p || (p && !p.freezeLeft)) && (x - pe.left < borderRange)) lmode =true; 
			if((!p || (p && !p.freezeRight)) && (pe.left + el.offsetWidth + el.clientLeft - x < borderRange)) rmode = true;
			if((!p || (p && !p.freezeTop)) && (y - pe.top < borderRange)) tmode =true; 
			if((!p || (p && !p.freezeBottom)) &&(pe.top + el.offsetHeight + el.clientTop - y < borderRange)) bmode = true;       
			if(!p || !p.disableCursorStyle){
	           el.style.cursor = "default"; if(lmode) el.style.cursor = "w-resize"; if(rmode) el.style.cursor = "e-resize"; if(tmode) el.style.cursor = "n-resize"; if(bmode) el.style.cursor = "s-resize";
	            if(lmode&&tmode)el.style.cursor = "nw-resize"; 
				if(rmode&&tmode)el.style.cursor = "ne-resize";
	            if(lmode&&bmode)el.style.cursor = "sw-resize"; 
				if(rmode&&bmode)el.style.cursor = "se-resize";
			}

    }
    addEvent(el, "mousemove", spectBorders);
    el.clearResizable = function(){
        removeEvent(el, "mousedown", g);
        removeEvent(document.body,"mouseup", g1);
        removeEvent(el, "mousemove", spectBorders);
    };
})(el,p);
};
var unsetResizable = function(el){
    if(el.clearResizable) el.clearResizable();
}
/* setMovable(el[, a])  29/06/2011 Grigoriy Gorbunov
el - DOM element which will be moveable
a -  DOM element - anchor to move "el"
Description:  "el" element can be moved by mouse dragging. If parameter "a" skipped - "el" will be used as anchor also.
                        Element moving is working by setting left and top position. Then "el" must have absolute or fixed position.
Note: if you will use setResizeable() function, you've use setResizeable() first.
*/
var setMovable = function(el,a, p){
	if(!a) a = el;
	(function(el,a,p){
	    var x, y, mx, my, moveId,el_t,el_l, g1, g, im;
		g1 = function(e){
			if(el.resizable) return;
            e = e || window.event;
			var t = e.target || e.srcElement;
            if(t.nodeName && (t.nodeName == 'INPUT' || t.nodeName == 'SELECT' || t.nodeName == 'TEXTAREA')) return;
            x = e.clientX;y = e.clientY; mx = e.clientX; my = e.clientY; el_t = el.offsetTop; el_l = el.offsetLeft;
            unselectableDocument();
            if(p&&p.overLayers) csp("#overFrameLayer, #overDocumentLayer").del(), _element(el, "div", {"id":"overFrameLayer"}), el.parentNode.insertBefore(_element(document.body, "div", {"id":"overDocumentLayer"}), el);
            addEvent(document, "mousemove", im);
            moveId = setInterval(function(){
                if(!el) clearInterval(moveId);
                var tt = el_t-my+y;
                if(tt < 0) tt = 0;
                if(tt + el.offsetHeight > el.parentNode.offsetHeight && el.parentNode.offsetHeight!=0) tt = el.parentNode.offsetHeight - el.offsetHeight;
                l = el_l-mx+x;
                if(l < 0) l = 0;
                if(l + el.offsetWidth > el.parentNode.offsetWidth && el.parentNode.offsetWidth!=0) l = el.parentNode.offsetWidth - el.offsetWidth;
                if(!(p && p.fixVertical))  el.style.top = tt +"px";
                if(!(p && p.fixHorizontal)) el.style.left = l + "px";
                if(p && p.onScroll) p.onScroll({'top':tt, 'left':l});
            } , 10);
	   };
	   	addEvent(a, "mousedown", g1);
		g = function(){
            if(moveId){
                /*getEls("#overFrameLayer, #overDocumentLayer").del();*/
                selectableDocument();
                clearInterval(moveId);
                if(document.removeEventListener) document.removeEventListener("mousemove", im, false);
                else document.detachEvent("onmousemove", im); moveId=undefined;
                if(p && p.onDrop) p.onDrop(el);
            }
        }
		addEvent(document, "mouseup", g);
                (function(el,a,g1,g){
                    el.clearMovable = function(){
                        removeEvent(a, "mousedown", g1);
                        removeEvent(document, "mouseup", g);
                    }
                })(el,a,g1,g)
	   im = function(e){e=e||window.event; x=e.clientX; y=e.clientY;};
	})(el,a,p);
};
var unsetMovable = function(el){
    if(el.clearMovable) el.clearMovable();
};
/* try to allow select document  */
var selectableDocument = function(){
	createCSSClass('html *, body *', '-webkit-user-select: user;-khtml-user-select: user;-moz-user-select: user;-o-user-select: user;user-select: user;');
	if(document.all) document.body.onselectstart=function(){};
	removeEvent(document,'click', function unselecableDocumentWatcher(){

	});
};
/* try to deny select document  */
var unselectableDocument = function(){
	createCSSClass('html *, body *', '-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-o-user-select: none;user-select: none;');
	if(document.all) document.body.onselectstart=function(){return false;};
	addEvent(document,'click', function unselecableDocumentWatcher(){
		var sel = {};
	    if (window.getSelection) { sel = window.getSelection(); }   // Mozilla
	    else if (document.selection) { sel = document.selection.createRange();  }// IE
	    if (sel.rangeCount) {sel.removeAllRanges(); return;}    // Mozilla
	    if (sel.text > '') {document.selection.empty(); return;}    // IE
	});
//	else addClass(document.body, "unselectable");
};
/* drag and drop upload 
 *
 * USAGE: var n = new csp_ddupload(document.getElementById('recycle', {'url':'upload.php'}));
 * vars:
 * 	rcl: DOM element
 *  p: Object - parameters
 * parameters:
 *   url: string
 *   clearBeforeDrop: bool -  clear thumbsContainer content before inserting dropped items
 *   onDrop: function - run after dropping
 *   iconAction: function
 *   onBeforeDrop: function - run before dropping
 *   showThumbs:bool - show or no thumbs in thumbsContainer, default = false
 *   thumbsContainer:DOM element for dropped elements thumbs. Id undefined and showThumbs==true - will used rcl
 *   fileMask:string, default * 
 *   insertImageTag: bool - insert img thumbs
 * 
 */
var csp_ddupload = function(rcl ,p){
	this.prototype = this;
	this.rcl = rcl;
	this.url = p.url;
	this.clearBeforeDrop = (p && p.clearBeforeDrop)?p.clearBeforeDrop:false;
	this.onBeforeDrop = (p && p.onBeforeDrop)?p.onBeforeDrop:false;
	this.onDrop = (p && p.onDrop)?p.onDrop:false;
	this.onFileUploaded = (p && p.onFileUploaded)?p.onFileUploaded:false;
	this.fileMask = (p && p.fileMask)?p.fileMask:"*";
	this.showThumbs = (p && p.showThumbs)?p.showThumbs:false;
	this.thumbsContainer = (p && p.thumbsContainer)?p.thumbsContainer:false;
	this.showProgress = (p && p.showProgress)?p.showProgress:false;
	if(!this.thumbsContainer && this.showThumbs) this.thumbsContainer = this.rcl;
	this.insertImageTag = (p && p.insertImageTag)?p.insertImageTag:false;
	this.prototype.init = function () {
		(function(o){
			var f = function(e){
				if(e.stopPropagation){ e.stopPropagation(); e.preventDefault();	}else{ e.returnValue = false;e.cancelBubble = true;	}
				if(o.clearBeforeDrop && o.thumbsContainer) o.thumbsContainer.innerHTML = '';
				if(o.onBeforeDrop) o.onBeforeDrop();				
			};
			addEvent(o.rcl, "dragenter", function(e){ e = e||window.event; f(e);});
			addEvent(o.rcl, "dragover", function(e){ e = e||window.event; if(e.stopPropagation()){e.stopPropagation(); e.preventDefault();}else{e.returnValue = false;e.cancelBubble = true;}});
			addEvent(o.rcl, "drop", function(e){ e = e||window.event; if(o.onDrop) o.onDrop(); o.getFiles(e); });
		})(this);
	};
	this.prototype.sendFiles = function (file, index) {
		var xhr = new XMLHttpRequest(),
		fileUpload = xhr.upload;
		if(this.onFileUploaded){(function(xhr, f){xhr.onreadystatechange = function(){ if(xhr.readyState==4 && xhr.status==200) xhr.response = (xhr.responseXML)?xhr.responseXML:xhr.responseText, f(xhr.response); };})(xhr, this.onFileUploaded);}
		this.url +=(this.url.indexOf("?") == -1)?"?fileName="+file.fileName:"&fileName="+file.fileName;
		r  = csp(".csp_systemMessage")[0];
		fileUpload.log = r;
		xhr.open("POST", this.url);		
		if(this.showProgress){
			var pgs;
			(function(o,x, file){
				var pgs = _element(o.showProgress, "div", {"text":file.fileName});				
				x.upload.onprogress = function(w){ pgs.innerHTML = file.fileName + " : " + o.getProgress(w) + "%"; };
				x.onloadend = function(w) { pgs.innerHTML = file.fileName + " : 100%";	};			
			})(this,xhr, file);
		}
		xhr.overrideMimeType('text/plain; charset=x-user-defined-binary');
		xhr.sendAsBinary(file.getAsBinary());
	};
	this.prototype.getProgress = function(e){
		if (e.lengthComputable) return Math.round((e.loaded * 100) / e.total);
	};
	this.prototype.getFiles = function (e) {
		var dt = e.dataTransfer, fl = dt.files, cnt = fl.length, d;
		e.stopPropagation();
		e.preventDefault();
		for (var i = 0; i < cnt; i++) {
			if(this.thumbsContainer && this.showThumbs){
				if(this.insertImageTag){
					t1 = document.createElement("img");
					t1.src = fl[i].getAsDataURL();
					this.thumbsContainer.appendChild(t1);
				}else	this.thumbsContainer.innerHTML += fl[i].fileName;
			}
			this.sendFiles(fl.item(i), i);
		}
	};
	this.init();
};
/* convert string variable to xml document */
var str2xml = function(s){
	if (window.ActiveXObject){ var doc=new ActiveXObject("Microsoft.XMLDOM"); doc.async="false"; doc.loadXML(s);}
	else{ var parser=new DOMParser(); var doc=parser.parseFromString(s,"text/xml"); }
	return doc;
};
/* write to firebug console */
var echo = function(s){
	if(console === undefined || s === undefined || console.log === undefined) return;
	console.log(s); 
};
/* check for event e for pressed [n]-keyCode, c-controlKey, s-shiftKey */
var isKey = function(e,n,c,s){
	e=e||window.event;
	if(((e.keyCode == n)||(e.charCode == n))&&(e.ctrlKey === c) && (e.shiftKey === s)) return true;
	else return false;
}
/* offset element position */
var posElement = function(elem){
    if (elem.getBoundingClientRect) return getOffsetRect(elem);
    else return getOffsetSum(elem);
};
var getOffsetSum = function(elem) {
    var top=0, left=0
    while(elem) { top += parseInt(elem.offsetTop); left += parseInt(elem.offsetLeft); elem = elem.offsetParent; }
    return {top: top, left: left};
};
var getOffsetRect = function(elem){
    var box = elem.getBoundingClientRect();
    var body = document.body;
    var docElem = document.documentElement;
    var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
    var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;
    var clientTop = docElem.clientTop || body.clientTop || 0;
    var clientLeft = docElem.clientLeft || body.clientLeft || 0;
    var top  = box.top +  scrollTop - clientTop;
    var left = box.left + scrollLeft - clientLeft; 
    return { top: Math.round(top), left: Math.round(left)}; 
};
var createCSSClass = function(selector, style){
     if(!document.styleSheets) return;
     if(document.getElementsByTagName("head").length == 0) return;
     var stylesheet, mediaType;
     if(document.styleSheets.length > 0) {
          for(i = 0; i<document.styleSheets.length; i++) {
                if(document.styleSheets[i].disabled) continue;
                var media = document.styleSheets[i].media;
                mediaType = typeof media;
               if((mediaType == "string")&&(media == "" || media.indexOf("screen") != -1)) styleSheet = document.styleSheets[i];
               else if((mediaType == "object")&&(media.mediaText == "" || media.mediaText.indexOf("screen") != -1)) styleSheet = document.styleSheets[i];
               if(typeof styleSheet != "undefined") break;
          }
    }
     if(typeof styleSheet == "undefined"){ // if no style sheet is found
          var styleSheetElement = document.createElement("style");
          styleSheetElement.type = "text/css";
          document.getElementsByTagName("head")[0].appendChild(styleSheetElement);
          for(i = 0; i<document.styleSheets.length; i++) {
               if(document.styleSheets[i].disabled) continue;
               styleSheet = document.styleSheets[i];
          }
          var media = styleSheet.media;
          mediaType = typeof media;
     }
     if(mediaType == "string") { // IE
            for(i = 0, l=styleSheet.rules.length;i<l;i++)
			if(styleSheet.rules[i].selectorText && styleSheet.rules[i].selectorText.toLowerCase() == selector.toLowerCase()) { styleSheet.rules[i].style.cssText = style; return; }
            styleSheet.addRule(selector,style);
     }else if(mediaType == "object"){
            for(i = 0;i<styleSheet.cssRules.length;i++)
			if(styleSheet.cssRules[i].selectorText && styleSheet.cssRules[i].selectorText.toLowerCase() == selector.toLowerCase()){styleSheet.cssRules[i].style.cssText = style;  return; }
            styleSheet.insertRule(selector + "{" + style + "}", styleSheet.cssRules.length);
     }
}
/* forms */
var csp_hints = function(el, address){
	this.prototype = this;
	if(el) this.prototype.el = el; else {echo("target element isn't defined"); return;}
	this.prototype.container;
	this.prototype.address = address;
	this.prototype.init = function(){
		this.draw();
		(function(o){var getHints = function(){xopen(o.address+o.el.value, function(x){eval("x="+x+";");o.hitsList(x);});};	addEvent(o.el, "keypress", function(){setTimeout(function(){getHints();},1);});	})(this);
	};
	this.prototype.draw = function(){
		var pos = posElement(this.el);
		this.container = _element(this.el.ownerDocument.body, "div");
		this.container.style.position="absolute";
		this.container.style.left = pos.left+"px";
		this.container.style.top = pos.top+this.el.offsetHeight + "px";
		this.container.style.width = this.el.offsetWidth + "px";
		this.container.style.height = "200px";
		this.container.style.overflowY = "auto";
		this.container.lst = _element(this.container, "div");
	};
	this.prototype.hitsList = function(x){
		this.container.lst.innerHTML = "";
		for(var i=0, l=x.length;i<l;i++) _element(this.container.lst, "div", {"text":x[i]});
		echo(x);
	};
	if(this.init) this.init();
};
/* is_array */
var is_array = function(v){	return (v instanceof Array )};
var getCssName = function(n){ var i, n1 = n.split("-"), res = n1[0]; for(i=1;i<n1.length;i++) res += n1[i].charAt(0).toUpperCase() + n1[i].substr(1);	return res;	};
/* csp selectors */
var getEls = function(s,place){ return new cspsObject(s, place);};
var cspsObject = function(s,p){
	this.prototype = this;
	this.prototype.elements = [];
	var add = function(el,o){
		if(el[0] === null) return;
            if(el) o.elements = o.elements.concat(el);
        };
	var init = function(s,p,o){
		if(s.indexOf(",") == -1){
			if(s.indexOf(" ") == -1) add(els(s, p),o);
			else{ var i = s.indexOf(" "); add(els(s.substr(i+1),els(s.substr(0,i),p)),o);}
		}else{
			var i = s.indexOf(",");
			add(getEls(s.substr(0,i),p).elements,o);
			add(getEls(s.substr(i+1),p).elements,o);
		}
	};
	var els = function(s,p){
		var res = [];
		if(is_array(p)){for(var i=0, l=p.length;i<l;i++) res = res.concat(getEls(s, p[i]).elements); return res; }
		switch(s.substr(0,1)){
		case "#": res.push(document.getElementById(s.substr(1))); break;
		case ".": res = getByClass(s.substr(1),p);	break;
		default:
			if(s.indexOf(".") == -1) res = p.getElementsByTagName(s);
			else{ var ii = s.split("."), r = els(ii[0], p);
				for(var i=0,l=r.length;i<l;i++) if(hasClass(r[i],ii[1])) res.push(r[i]); }
			break;
		}
		var res1 = Array();
		for(var i=0, l=res.length;i<l;i++) res1[i] = res[i];
		return res1;
		//return Array.prototype.slice.call(res,0); errors in IE
	};
	if(s && init) init(s.trim(),(p)?p:document.body||document, this);
};
var clearElement = function(el){ while(el.childNodes && el.childNodes[0]) delElement(el.childNodes[0]);}
var delElement = function(el){if(el && el.parentNode && el.parentNode.removeChild) el.parentNode.removeChild(el);};
var cssElement = function(el, n, v){n = getCssName(n); el.style[n] = v;};
var animateElement = function(el,sn,d,e,s, cbf){ //el, css parameter, duration, end value, start value, callbackFunction
	(function(el, sn, d, e, s){
		var t = (String(e).indexOf("px")!=-1)?"px":((String(e).indexOf("%")!=-1)?"%":""), s=parseInt(s), e=parseInt(e), cp = s, num_steps = d*100, st = (e-s)/num_steps;
		var g = function(){	setTimeout(	function(){	cp = cp+st;	cssElement(el, sn,cp+t); if((e>s&&cp<e)||(s>e&&cp>e)) g(); else if(cbf)cbf();},5);};
		g();
	})(el, sn,d,e,s);
};
var setPosition = function(el, x, y){el.style.top = x;el.style.left = y;};
var flyTo = function(el, x, y, d, rounded){ //element to move, x, y, duration seconds, count of repeat("forever" nonstop)
	d = (d)?d:3;
	var pel = posElement(el);
	if(x.indexOf("+")!=-1) x = pel.left + parseInt(x) + "px";
	if(x.indexOf("-")!=-1) x = pel.left - parseInt(x) + "px";
	if(y.indexOf("+")!=-1) y = pel.top + parseInt(y) + "px";
	if(y.indexOf("-")!=-1) y = pel.top - parseInt(y) + "px";
	var a = function(){	(function(){flyTo(el, pel.left+"px", pel.top+"px", d, ((rounded == "forever")?rounded:rounded-1));})(el,pel,rounded);};
	var cx, cy;
	if(parseInt(x) != pel.top) cx = a; else if(parseInt(y) != pel.left) cy = a;
	animateElement(el,"top", d, y, pel.top+"px", cy); animateElement(el,"left", d, x, pel.left+"px", cx);
};

cspsObject.prototype.html = function(s){this.each(function(x){x.innerHTML = s; evalScripts(x);}); return this;};
//this.each(function(x){}); return this;
cspsObject.prototype.append = function(s){this.each(function(x){x.appendChild(s);}); return this;for(var i=0,l=this.elements.length;i<l;i++) this.elements[i].appendChild(s); return this;};
cspsObject.prototype.replace = function(s){this.clear();this.append(s); return this;};
cspsObject.prototype.value = function(s){this.each(function(x){x.value = s;}); 	return this;};
cspsObject.prototype.attr = function(n,v){this.each(function(x){x.setAttribute(n,v);}); return this; };
cspsObject.prototype.removeAttr = function(n){this.each(function(x){x.removeAttribute(n);}); return this;};
cspsObject.prototype.del = function(n){this.each(function(x){delElement(x);}); return this;};
cspsObject.prototype.clear = function(n){this.each(function(x){(x.value)?x.value='':x.innerHTML='';}); return this;};
cspsObject.prototype.css = function(n, v){this.each(function(x){cssElement(x,n,v);}); return this;};
cspsObject.prototype.hide = function(n,v){this.css("display", "none"); return this;};
cspsObject.prototype.show = function(n,v){this.css("display", "block"); return this;};
cspsObject.prototype.animate = function(sn,d,e,s){ //css parameter, duration, end value, start value
	(function(o, sn, d, e, s){
		var t = (String(e).indexOf("px")!=-1)?"px":((String(e).indexOf("%")!=-1)?"%":""), s=parseInt(s), e=parseInt(e), cp = s, num_steps = d*100, st = (e-s)/num_steps;
		var g = function(){	setTimeout(	function(){	cp = cp+st;	o.css(sn,cp+t); if((e>s&&cp<e)||(s>e&&cp>e)) g();},5);};
		g();
	})(this, sn,d,e,s);
	return this;
};
cspsObject.prototype.addClass = function(n){this.each(function(x){addClass(x,n);}); return this;};
cspsObject.prototype.removeClass = function(n){this.each(function(x){removeClass(x,n);}); return this;};
cspsObject.prototype.load = function(a, p){
    (function(o, a, p){
        xopen(a, function(x){
            for(var i=0,l=o.elements.length;i<l;i++){
                o.elements[i].innerHTML = x;
                evalScripts(o.elements[i]);
                if(p && p.onSuccess) p.onSuccess(o.elements[i]);
            }
        });
    })(this, a, p);
    return this;
};
cspsObject.prototype.each = function(f){for(var i=0, l=this.elements.length;i<l;i++)  if(this.elements[i]) f(this.elements[i]);};
var serializeForm = function(formElm, array_result){
	var els = getEls('input, select, textarea', formElm).elements, res = [], a, i, l;
	for(i=0, l=els.length;i<l;i++){
		a = els[i].getAttribute('type');
		if((!a) || (a && ((a != 'checkbox' && a != 'radio')||els[i].checked))){
			if(array_result)	res[els[i].name] = els[i].value
			else res.push(els[i].name+'='+els[i].value);
		}
			
	}
	if(array_result) return res;
	else return res.join('&');
};
/* COOKIES FUNCTIONS */
function setCookie(c_name,value,exdays){
    var exdate=new Date();
    exdate.setDate(exdate.getDate() + exdays);
    var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
    document.cookie=c_name + "=" + c_value;
};
function getCookie(c_name){
    var i,x,y,ARRcookies=document.cookie.split(";");
    for (i=0;i<ARRcookies.length;i++){
        x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
        y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
        x=x.replace(/^\s+|\s+$/g,"");
        if (x==c_name)
            return unescape(y);
  }
};
var evalScripts = function(x){
  var els = getEls('script', x).elements;
  for(var i in els) eval(els[i].innerHTML);
};
var indexOfElement = function(el){
    var p = el.parentNode;
    for(var i=0, l=p.childNodes.length;i<l;i++) if(el === p.childNodes[i]) return i;
};
if (!window.getComputedStyle) {
	window.getComputedStyle = function(el, pseudo) {
		this.el = el;
		this.getPropertyValue = function(prop) {
			var re = /(\-([a-z]){1})/g;
			if (prop == 'float') prop = 'styleFloat';
			if (re.test(prop)) { 
					prop = prop.replace(re, function () {	return arguments[2].toUpperCase(); });	}
			        return el.currentStyle[prop] ? el.currentStyle[prop] : null;
			}
		    return this;
	}
}
/** cloneCss
 *  do copy of src listed styles to target
 */
var cloneCss = function(src, target, css_list){
	var c = window.getComputedStyle(src, '');
	for(var i =0, l = css_list.length;i<l;i++) target.style[getCssName(css_list[i])] = c.getPropertyValue(css_list[i]);
}
/**  computedStyle */
var cmpStyle = function(src, n){
	var c = window.getComputedStyle(src, ''), t;
	if(t = c.getPropertyValue(n)) return t;
}
/** getEvent
 */
var getEvent = function(e, c){
	e  =  e || window.event;
	var type = e.type;
	var target = e.target || e.srcElement;
	if(window.listeners && window.listeners[type] &&  window.listeners[type][c]){
		var currentTarget = window.listeners[type][c]['currentTarget'];
		var obj = window.listeners[type][c]['obj'];
	}else{
		var currentTarget = e.target;
		var obj = this;
	}
	var keyCode = e.keyCode || e.charCode;
	var preventDefault = 123;
	var preventDefault = function(){ 
		if(e.preventDefault)
			e.preventDefault();
		else
			e.returnValue = false;
	}
	return {'src':e, 'obj':obj, 'target':target, 'currentTarget':currentTarget, 'keyCode': keyCode, 'preventDefault':preventDefault};
}
/** console for IE
 */
if(!window.console){window.console = function(){	var echo = function(s){alert(s);}	}}
/** parseIntX
 *   модифицированный parseInt. Работает с любыми аргументами. Вытаскивает все числовые значения
 *   если аргумент не указан - возвращается 0.
 */ 
var parseIntX = function(s){
	if(s===undefined) s ='';
	s = '' + s;
	//var a = s.match(/\d+/); 
	var a = s.match(/[\d.]+/);
	if(a && a[0] !== undefined) return parseInt(a[0],10);
	else return 0;
}
/** parseFloatX
 *   модифицированный parseInt. Работает с любыми аргументами. Вытаскивает все числовые значения
 *   если аргумент не указан - возвращается 0.
 */ 
var parseFloatX = function(s){
	if(s===undefined) s ='';
	var a = s.match(/[\d.]+/);
	if(a && a[0] !== undefined) return parseFloat(a[0],10);
	else return 0;
}

var copyArray = function(ar){
	var res = [];
	for(var i in ar)
		if(typeof ar[i] !== 'function')
			res[i] = (is_array(ar[i]))?copyArray(ar[i]):ar[i];
	return res;
}
