//~ DNtoolbox
//~ version 0.7.0 29.05.2011
//~ 3333223@gmail.com
//~ Author: Dmitriy Novikov
//~ http://dim.nov.ru




/*

Окна

*/

var w={};
/**
html - img, object, text
params{
	outElement - object|text
	elementClick - object|text
	windowClick - 1,0
	overlayClick - 1,0,none
	overlayOpacity - 0:100
	parentNode - object|text
	width
	height
	noClone - 1,0
	windowCSS - {}
	overlayCSS - {}
	position - "center","topleft","topright","botleft","botright","mouse",[x,y]
	indentX
	indentY
	}
events{
	onClose
	onOpen
	}

* 
(txt,{windowClick:0,overlayClick:'none'},'mouse')
**/



w.defaultWindowCSS = {
	display:"block",
	position:"fixed",
	color:"#333",
	background:"#ffe",
	border:"1px #333 solid"
}

w.defaultOverlayCSS = {
	backgroundColor:"#ffe",
	height:"100%",
	width:"100%",
	left:"0px",
	top:"0px",
	position:"fixed",
	progid:"DXImageTransform.Microsoft.Alpha(opacity:30)",
	opacity:"0.3"
}

w.zetIndex=0;

w.showImg=function(src,params,events){
	var i=crEl({name:"img",style:{display:"none"}})
	addEvent(i,"load",function(){
		i.style.display='block'
		w.show(i,params,events)
	})
	i.src=src
}
w.show=function(html,params,events){
	if (!params) var params={}
	var o
	var x=0,y=0
	var maxH=ce.ch-100;
	var maxW=ce.cw-100;
	var position = params.position?params.position:"center"
	var height=maxH+'px';
	var width=maxW+'px';
	
	var indentY = parseInt(params.indentY)>0 ? parseInt(params.indentX):0;
	var indentX = parseInt(params.indentX)>0 ? parseInt(params.indentX):0;
	
	var parentNode=params.parentNode?ge(params.parentNode):document.body
	
	o=html
	if (typeof(html)=="string"){
		o=crEl({name:"div",parent:parentNode,html:html});
	}else if (params.noClone){
		o.style.display='block'
		o.noClone=true
	}else if (html.tagName!="IMG"){ //костыль - для картинки создается еще одна картин
		var clone=o.cloneNode(true)
		clone.id=null
		clone.style.display='block'
		parentNode.appendChild(clone)
		clone.parent=o
		o=clone
	}
	if (typeof(html)=="object" && html.tagName=="IMG"){
		o=html
		var iw=parseInt(style(o,"width"))
		var ih=parseInt(style(o,"height"))
		
		if (ih/maxH > iw/maxW){
			o.style.height=Math.min(maxH,ih)+'px'
		}else{
			o.style.width=Math.min(maxW,iw)+'px'
		}
		o.style.padding="3px"

	}else{
		if (params.height) o.style.height=params.height+"px"
		if (params.width) o.style.width=params.width+"px"
		ce.element(o);
		o.style.width=o.w > maxW ? width:o.w
		o.style.height=o.h > maxH ? height:o.h
		o.style.overflow="auto"
	}
	
	if (params.overlayClick!="none"){
		o.over=w.createOverlay()
	}
	
	if (params.overlayClick==1 && o.over) o.over.onclick=function(){w.close(o)};
	if (params.windowClick) o.onclick=function(){w.close(o)};
	if (params.elementClick) ge(params.elementClick).onclick=function(){w.close(o)};
	if (params.outElement) ge(params.outElement).onmouseout=function(){w.close(o)};
	
	o.style.zIndex=w.zet()
	w.zetIndex+=10
	
	o.className="window"
	
	ce.element(o);
	ce.screen();
	
	if (!position || position=="center"){
		
		//if (style(document.body,"position")=="relative") o.style.left=(parseInt(style(document.body,"width"))-o.w)/2 + ce.scrLeft + indentX + "px"
		//else o.style.left=(Math.min(ce.cw,ce.sw)-o.w)/2 + ce.scrLeft + indentX + "px"
		
		o.style.marginLeft="-"+(o.w/2 + indentX) + "px"
		o.style.left="50%"
		
		o.style.marginTop="-"+(o.h/2 + indentY) + "px"
		//o.style.marginTop="-"+(style(o,'height')/2) + indentY + "px"
		o.style.top="50%"
	}else{
		if (typeof(position)!="string"){
			y=position[1]
			x=position[0]
		}else if(position=="mouse"){
			y=ce.my+ce.scrTop
			x=ce.mx+ce.scrLeft
		}else if(position=="topleft"){
			y=10
			x=10
		}else if(position=="topright"){
			y=10
			x=ce.sw-o.w-10
		}else if(position=="botleft"){
			y=ce.sh-o.h-10
			x=10
		}else if(position=="botright"){
			y=ce.sh-o.h-10
			x=ce.sw-o.w-10
		}
		
		var top=indentY+y

		var left=indentX+x

		o.style.top=+(top-ce.scrTop)+"px"
		o.style.left=+(left-ce.scrLeft)+"px";
	}
	
	if (!params.windowCSS) params.windowCSS=w.defaultWindowCSS
	for (var n in params.windowCSS){
		if (!params.windowCSS.hasOwnProperty(n)) continue
		o.style[n]=params.windowCSS[n]
	}
	if (!params.overlayCSS) params.overlayCSS=w.defaultOverlayCSS
	for (var n in params.overlayCSS){
		if (!params.overlayCSS.hasOwnProperty(n)) continue
		o.over.style[n]=params.overlayCSS[n]
	}

	
	//overlayOpacity
	if (o.over && typeof(params.overlayOpacity)=='number')
		opacity(o.over,params.overlayOpacity)
	
	if (events && events.onOpen) events.onOpen.call(o)
	if (events && events.onClose) o.onClose=events.onClose
}

w.close=function(el){
	el=ge(el);
	while (el && el.className!="window"){
		el=el.parentNode
	}
	if (el.onClose) el.onClose.call(el)
	if (el && el.className=="window"){
		destroy(el.over)
		if (el.noClone){
			el.style.display="none"
		}else{
			if (el.parent) destroy(el.parent)
			destroy(el)
		}
	}
}

w.zet=function(){
	var n=0
	if (w.zetIndex==0){
		each(geTag("*"),function(){
			var zi=parseInt(style(this,"zIndex"))
			w.zetIndex=Math.max(w.zetIndex,isNaN(zi)?0:zi)
		})
	}
	return w.zetIndex;
}

w.createOverlay=function(){
	var ov=crEl({name:'div',className:'overlay'})
	ov.style.zIndex=""+parseInt(5+w.zet())
	w.zetIndex+=10
	
	addEvent(ov,"mousewheel",function(event){
		if (event.preventDefault) event.preventDefault();
		event.returnValue = false;
		blockEvent(event);
	})
	addEvent(ov,"DOMMouseScroll",function(event){
		if (event.preventDefault) event.preventDefault();
		event.returnValue = false;
		blockEvent(event);
	})
	return ov;
}

function opacity(el,value){
	el.style.opacity = (value/100)
	el.style.filter = "alpha(opacity="+value+")"
}


function geParentClass(el,name){
	el=el.parentNode
	while (el && el.className!=name){
		el=el.parentNode
	}
	
	if (el && el.className==name)
		return el
	return false;
}

function geParentTag(el,name){
	name=name.toLowerCase()
	el=el.parentNode
	while (el && el.tagName.toLowerCase()!=name){
		el=el.parentNode
	}
	if (el && el.tagName.toLowerCase()==name)
		return el
	return false;
}

/*

Парсинг переменной

*/
pr = function(O){
	var echo=typeof(O)+'<br/>';
	try{
		if (typeof(O) == 'string'){
			echo+=O;
		}else if (typeof(O)=='number'){
			echo+=O;
		}else if (typeof(O)=='object'){
			for (var key in O){
				echo+=key+": "+O[key]+"<br/>";
			}
		}else if (typeof(O)=='function'){
				for (var key in O){
					echo+=key+": "+O[key]+"<br/>";
				}
		}else{
			echo+=typeof(O);
		}
	}catch(err){
		echo+="Ошибка:"+err+"\n";
		echo+=O;
	}
	w.show(echo,{overlayClick:1});
}

/**
 * Подсказка с содержимым элемента


DN.showHint = function(el,topCorrect){
	if (!el.innerHTML) return;
	var div = crEl({name:'div',id:'DNhint',style:DN.hintStyle,html:el.innerHTML});
	
	var dWidth=Math.min(400,DN.elWidth(div));
	div.style.width=dWidth+'px';
	
	var dHeight=Math.min(200,DN.elHeight(div));
	div.style.height=dHeight+'px';
	
	var elPos=DN.elPosition(el);
	var dLeft=elPos.x-Math.max(0,elPos.x+dWidth-DN.clientWidth())-10;
	if (elPos.y-dHeight-DN.scrollTop()-topCorrect<0){
		var dTop=elPos.y+DN.elHeight(el)+topCorrect;
	}else{
		var dTop=elPos.y-dHeight-topCorrect;
	}
	div.style.top=dTop+'px';
	div.style.left=dLeft+'px';

	div.onclick=function(){
		destroy("DNhint");
	}
}
 **/


/*
 * System
 */

//Создание элемента
function crEl(options,callback){
	var e = document.createElement(options.name);
	if (options.before){
		options.before.parentNode.insertBefore(e,options.before);
	
	}else if (options.after){
		options.after.parentNode.insertBefore(e,geNext(options.after));
		
	}else{
		options.parent=!options.parent?document.body:options.parent;
		if (options.prepend)
			options.parent.insertBefore(e,options.parent.firstChild);
		else
			options.parent.appendChild(e);
	}
	if (options.id) e.id=options.id;
	if (options.className) e.className=options.className;
	if (options.html) e.innerHTML= options.html;
	if (options.txt) e.innerText= options.txt;
	if (options.style){
		for (name in options.style){
			e.style[name]=options.style[name];
		}
	}
	if (options.attr){
		for (name in options.attr){
			e.setAttribute(name,options.attr[name])
		}
	}
	if (callback) callback.call(e)
	else return e;
}
//Получение элемента
function ge(id){
	if (typeof(id)=="object") return id;
	return document.getElementById(id);
}
//Получение элементов по тэгу
function geTag(name,parent,onlyFirstChilds){
	parent=parent||document;
	if (onlyFirstChilds){
		var tmpels=parent.childNodes
		var els=new Array();
		for(var n in tmpels){
			var el=tmpels[n]
			if (el.tagName && el.tagName.toUpperCase()==name.toUpperCase()) els.push(el)
		}
	}else{
		els=parent.getElementsByTagName(name.toUpperCase());
	}
	return els;
}
//Получение элементов по классу
function geClass(name,parent){
	var els=new Array(),tmp;
	parent=parent||document;
	if (parent.getElementsByClassName) {
		els=parent.getElementsByClassName(name);
	}else{
		tmp=geTag("*",parent);
		for (var i=0;i<tmp.length;i++){
			if (name==tmp[i].className){
				els.push(tmp[i]);
			}
		}
	}
	return els;
}
//Получение первого потомка
function geFirstCh(el){
	if (el.firstElementChild!="undefined")
		return el.firstElementChild
	var els=el.childNodes;
	for (var i=0;i<els.length;i++){
		if (els[i].nodeType==1)
			return els[i]
	}
	return null;
}
//Получение последнего потомка
function geLastCh(el){
	if (el.lastElementChild)
		return el.lastElementChild
	var els=el.childNodes;
	for (var i=els.length-1;i>=0;i--){
		if (els[i].nodeType==1)
			return els[i]
	}
	return null;
}
//Получение следующего элемента
function geNext(el){
	if (el.nextElementSibling)
		return el.nextElementSibling
	var els=el.parentNode.childNodes;
	var fl=false;
	for (var i=0;i<els.length;i++){
		if (fl==true && els[i].nodeType==1)
			return els[i];
		if (els[i]==el)
			fl=true;
	}
	return null;
}
//Получение предыдущего элемента
function gePrev(el){
	if (el.previousElementSibling)
		return el.previousElementSibling
	var els=el.parentNode.childNodes;
	var prevEl=null;
	for (var i=0;i<els.length;i++){
		if (els[i]==el)
			return prevEl;
		if (els[i].nodeType==1)
			prevEl=els[i]
	}
	return null;
}

//Уничтожение элемента
function destroy(ob) {
	if (typeof(ob)=="string")
		ob = ge(ob);
	if (ob)
	if (ob.parentNode)
		ob.parentNode.removeChild(ob)
}

//Отложенное выполнение функций
var fnBuffer=new Array();
function ready(fn){
	if (document.readyState=="complete"){
		clearInterval(_timer);
		for (var f in fnBuffer){
			if (!fnBuffer.hasOwnProperty(f)) continue
			fnBuffer[f].call(document);
		}
		if (fn && typeof(fn)=='function') fn.call(document);
		fnBuffer=new Array();
	}else if (typeof(fn)=='function'){
		fnBuffer.push(fn);
	}
}
var _timer=setInterval(ready,5);

//Назначение обработчиков событий
function addEvent(obj, name, fn, capture){
	var fnc = fn;
	if (obj.addEventListener) {
		obj.addEventListener(name,fnc,capture?true:false);
	}else if (obj.attachEvent){
		fnc = function() {fn(window.event);}
		obj.attachEvent("on" + name, fnc);
	}else{
		obj["on"+name]=fn;
	}
	return{
		obj: obj,
		name: name,
		fn: fnc
	};
}
function remEvent(o){
	var obj = o.obj;
	if (obj.removeEventListener){
		obj.removeEventListener(o.name, o.fn, false);
	}else if (instance.detachEvent){
		obj.detachEvent("on" + o.name, o.fn);
	}else{
		obj["on"+name]=null;
	}
}

function addCookie(name,value,daysExpires){
	var expires = new Date();
	var expiryDate = "";
	expires.setTime(expires.getTime() + daysExpires * 24 * 60 * 60 * 1000);
	expiryDate = expires.toGMTString();
	document.cookie = name+'='+value+'; expires='+expiryDate+'; path=/';
}
function getCookie(name){
	var cookie = " " + document.cookie;
	var search = " " + name + "=";
	var setStr = null;
	var offset = 0;
	var end = 0;
	if (cookie.length > 0) {
		offset = cookie.indexOf(search);
		if (offset != -1) {
			offset += search.length;
			end = cookie.indexOf(";", offset)
			if (end == -1) {
				end = cookie.length;
			}
			setStr = unescape(cookie.substring(offset, end));
		}
	}
	return(setStr);
}



//~ AJAX

var ajax={};
ajax.canBlock=false;
ajax.ajaxBlock=false;
ajax.sended=0;
ajax.response=function(text){
	//alert(text);
}
ajax.overlay=false;
ajax.delBlock=function(){
	if (!ajax.canBlock) return;
	if (ajax.sended>0) return;
	destroy(ajax.overlay);
	ajax.overlay=false;
	try{
		remEvent(ajax.ajaxBlock.fn)
		destroy(ajax.ajaxBlock);
	}catch(e){}
	ajax.ajaxBlock=null;
}
ajax.addBlock=function(){
	if (!ajax.canBlock) return;
	if (ajax.sended>1) return;
	if (!ajax.ajaxBlock){
		ajax.ajaxBlock=crEl({
			name:"img",
			style:{position:"fixed",display:'none'}
		})
		ajax.ajaxBlock.src='/css/loading1.gif';
		ajax.ajaxBlock.fn=addEvent(document,"mousemove",function(){dnd.moveOfMouse(ajax.ajaxBlock)})
	}
	ajax.overlay=w.createOverlay(10);
}
ajax.post=function(r_path, r_args, r_handler){
	ajax.request("post", r_path, r_args, r_handler)
}
ajax.get=function(r_path, r_args, r_handler){
	ajax.request("get", r_path, r_args, r_handler)
}
ajax.json=function(r_path, r_args, r_handler){
	var s=crEl({name:"script",parent:document.head||geTag("head")[0]})
	if (r_handler){
		addEvent(s,"load",r_handler)
		s.onreadystatechange = function(){r_handler()}
	}
	s.src=r_path+"?"+r_args
}
ajax.request=function (r_method, r_path, r_args, r_handler){
	var r
	//if (ajax.canAbort && ajax.r) ajax.r.abort()
	if (window.XMLHttpRequest){ 
		r = new XMLHttpRequest()
	}else if (window.ActiveXObject){ 
		try {
			r = new ActiveXObject('Msxml2.XMLHTTP')
		} catch (e){}
		try {
			r = new ActiveXObject('Microsoft.XMLHTTP')
		} catch (e){}
	}
	if (!r) return;

	try {
		if (r_method.toLowerCase() == "get" && r_args.length > 0){
			r_path += "?" + r_args
		}
		r.open(r_method, r_path, true)
	} catch(e) {alert(1)}
	
	r.onreadystatechange = function(){
		try {
			if (r.readyState == 4){
				ajax.sended--;
				if (ajax.sended==0)
					setTimeout(function(){ajax.delBlock()},500);
				if (r.status == 200){
					if (!r_handler)	ajax.response(r.responseText);
					r_handler(r.responseText);
				}else if(r.status>0){
					alert("Произошла ошибка "+r.status+"\n("+r.statusText+").");
				}
			}else{
				setTimeout(function(){ajax.delBlock()},15000);
			}
		} catch(e){
			//alert(e)
		}
	}
	
	try {
		r.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8");
		r.setRequestHeader("X-Requested-With", "XMLHttpRequest");
		if (r_method.toLowerCase() == "post"){
			r.send(r_args);
		}else{
			r.send(null);
		}
		ajax.sended++;
		ajax.addBlock();
	} catch(e){alert(3)}
}




//Данные окружения мышь, экран, элемент
var ce={};
ce.movingEl=false
ce.state=false
ce.action=false
ce.scrTop=0
ce.scrLeft=0;

function blockEvent(event){
	event = event || window.event;
	if(event.stopPropagation) event.stopPropagation();
	else event.cancelBubble = true;
	if(event.preventDefault) event.preventDefault();
	else event.returnValue = false;
}


ce.cursor=function(e){
	if (!e) e=window.event;
	if (e.pageX || e.pageY){
		ce.mx = e.pageX;
		ce.my = e.pageY;
	}else if (e.clientX || e.clientY){
		ce.mx = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
		ce.my = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;
	}
}
ce.screen=function(){
	ce.scrTop=self.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop);
	ce.scrLeft=self.pageXOffset || (document.documentElement && document.documentElement.scrollLeft) || (document.body && document.body.scrollLeft);
	ce.sw=document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientWidth:document.body.clientWidth;
	ce.sh=document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientHeight:document.body.clientHeight;
	ce.ch=document.documentElement.clientHeight?document.documentElement.clientHeight:document.body.clientHeight;
	ce.cw=document.documentElement.clientWidth?document.documentElement.clientWidth:document.body.clientWidth;
}
ce.element=function(e){
	//if (!e) return;
	
	var display=style(e,"display")
	var changeE=false
	if (display=="none"){
		var position=style(e,"position")
		var visibility=style(e,"visibility")
		changeE=true
		e.style.visibility="hidden"
		e.style.position="absolute"
		e.style.display="block"
	}
	
	var ex = 0
	var ey = 0
	var el = e
	var txt=""
	while(el){
		ex += !el.offsetLeft?0:el.offsetLeft
		ey += !el.offsetTop?0:el.offsetTop
		txt+=typeof(el.offsetTop)+"\n"+el+"\n"
		el = el.offsetParent
	}
	//alert(ey)
	e.w=e.offsetWidth
	e.h=e.offsetHeight
	e.left=ex
	e.top=ey
	
	if (changeE){
		e.style.visibility=visibility
		e.style.position=position
		e.style.display=display
	}
	
}

//Запрет выделение документа при перемещении мыши с зажатой кнопкой
ce.selectOff=function(e){
	if (typeof e.onselectstart!='undefined'){
		e.onselectstart = function() {return false};
	}
}
ce.selectOn=function(e){
	if (typeof e.onselectstart!='undefined'){
		e.onselectstart = null;
	}
}
ce.resetSelection=function(){
	if (window.getSelection)
		window.getSelection().removeAllRanges();
	else if (document.selection && document.selection.clear)
		document.selection.clear();
}


ce.onMouseMove=function(e){
	ce.cursor(e);
	if (typeof(dnd)!='undefined')
		dnd.getCursor();
}
ce.onMouseUp=function(){
	if (typeof(dnd)!='undefined')
		dnd.onMouseUp();
	return true;
}
ce.onMouseDown=function(){
	if (typeof(dnd)!='undefined')
		dnd.onMouseDown();
	return true;
}

function trim(str){
	str = str.replace(/^s+/, '');
	for (var i = str.length - 1; i >= 0; i--){
		if (/S/.test(str.charAt(i))) {
			str = str.substring(0, i + 1);break;
		}
	}
	return str;
}

//test
function each(obj, fn){
	for (var i=0; i < obj.length; i++) {
		fn.call(obj[i]);
	}
}

//test
function copyObj(from,to){
	var o = to || {};
	for (var i in from){
		o[i] = from[i]
	}
	return o;
}


function style(el,name,value){
	if (el.nodeType!=1) return false
	if (value){
		el.style[name]=value;
		return
	}
	var computedStyle = el.currentStyle || window.getComputedStyle(el, null);
	if (computedStyle)
		return computedStyle[name]
	else
		return el.style[name]
}


function ani(element,params,duration,callback){
	if (element.ani) return;
	element.ani=true
	var start = new Date().getTime();
	setTimeout(function() {
		var now = (new Date().getTime()) - start;
		var progress = now / duration;
		
		for (var n in params){
			if (!params.hasOwnProperty(n)) continue
			var to = params[n].to
			var from = params[n].from
			var param = params[n].param
			var unit = params[n].unit
			var result = (to - from) * Math.pow(progress, 4) + from;
			result=parseInt(from < to ? Math.min(result,to) : Math.max(result,to))
			element.style[param] = result + (unit?unit:"px");
		}
		
		if (progress < 1){
			setTimeout(arguments.callee, 10);
		}else{
			element.ani=false
			if (callback) callback.call(element)
		}
	}, 10);
}


function aniOpacity(element,from,to,duration,callback){
	if (element.aniO)
		return
	element.aniO=true
	

	var start = new Date().getTime();
	setTimeout(function() {
		
		var now = (new Date().getTime()) - start;
		var progress = now / duration;
		var result = (to - from) * Math.pow(progress, 4) + from;
		result=parseInt(from < to ? Math.min(result,to) : Math.max(result,to))
		opacity(element,result)
		
		if (progress < 1){
			setTimeout(arguments.callee, 10);
		}else{
			element.aniO=false
			if (callback) callback.call(element)
		}
	}, 10);
}


// UTF-8 encode / decode by Johan Sundstr?m
function encode_utf8( s )
{
	if (/msie/i.test(navigator.userAgent)) return s;
	return unescape( encodeURIComponent( s ) );
}


function decode_utf8( s )
{
	if (/msie/i.test(navigator.userAgent)) return s;
	return decodeURIComponent( escape( s ) );
}



ready(function(){
	//addEvent(document,"mousemove",function(e){ce.onMouseMove(e)})
	//addEvent(document,"mouseup",function(){ce.onMouseUp()})
	//addEvent(document,"mousedown",function(){ce.onMouseDown()})
	//addEvent(document,"scroll",function(){ce.screen()})
	//addEvent(document,"resize",function(){ce.screen()})
	
	
	document.onmousemove = function(e){ce.onMouseMove(e)};
	document.onmouseup = function(){ce.onMouseUp()};
	document.onmousedown = function(){ce.onMouseDown()};
	window.onresize = function(){ce.screen()};
	window.onscroll = function(){ce.screen()};
	ce.screen();
	


	//w.show(ge("main"));
	//w.show("estsetet");
	//pr(i)
})




