wlModal=window.wlModal||{options:{divContentId:"wlMdlCntnt"}}
//wlModal.options.divContentId="wlMdlCntnt";
wlModal.options={
	// КОСТАНТЫ, которые НЕЛЬЯ менять
	tagParamNameTextOk : "wlModalTxt", // наименование создаваемого wlModalbox-ного атрибута
	tagParamNameConfirm : "wlModalCnfrm", // наименование создаваемого wlModalbox-ного атрибута
	tagParamNameAjax : "wlModalAjax", // наименование создаваемого wlModalbox-ного атрибута
	tagParamNameOptions : "wlModalOptions", // Имя аттрибута с дополнительными опциями
	divId : "wlModal", // наименование создаваемого скрытого слоя для wlModalbox
	//divContentId : "wlMdlCntnt", // наименование слоя для контента в wlModalbox
	bodyOpacity : 0.4, // Прозрачность маскировки body
	maskColor : '#000', // Цвет максировки body
	// КОСТАНТЫ, которые НЕЛЬЯ менять - END
	//
	//
	// Далее идут параметры, МОЖНО можно менять
	isAdmin : false, // помогает AJAX-скрипту распознать, что он работает в админке
	//phpPath : 'ajax.php',	// путь к испольняющему файлу
	phpPath : '/call/wlAjax.php',	// путь к испольняющему файлу
	phpPathSendInclude : 'call/wlModalVariables.php',	// путь к подключаемому файлу
	needCaching : true, // кешировать данные или нет
	funcNameCallBack : 'wlModal.onCallback',	// Очень важная штука, так как для каждого Ajax-овского wlModalbox-а 
											// может быть своя обратная фунция, в зависмости от того, что в нем делается
											// сюда передается только название функции
											// а в неё приходи объект result (который создается в wlModalbox.php)
	shadowY : 10, //Смещение тени окна по y
	shadowX : 10, //Смещение тени окна по x
	maxWidth : 450, // максимальная ширина wlModalbox-а в пикселах; 0 если авто
	maxHeight : 0, // максимальная высота wlModalbox-а в пикселах; 0 если авто
	minWidth : 50, // минимальная ширина wlModalbox-а в пикселах; 0 если авто
	minHeight : 100, // минимальная высота wlModalbox-а в пикселах; 0 если авто
	tags : [], // Список обрабатываемых тэгов, если пусто то все
	//template : '<table class="head"><tr><td width="16px">{img}</td><td align="center" width="0">{title}</td><td width="16px" align="right"><a href="#" onclick="wlModal.cancelBut();return false;">X</a></td></tr><tr><td colspan="3" id="'+divContentId+'" class="content">{content}</td></tr><tr><td colspan="3" class="buttons">{buttons}</td></tr></table>',
	//template : '<div class="head"><div><span>{img}</span><span>{title}</span><span><a href="#" onclick="wlModal.cancelBut();return false;">X</a></span></div><div id="'+divContentId+'" class="content">{content}</div><div class="buttons">{buttons}</div></div>',
	//template : '<table><tr class="header"><td class="title">{title}</td><td class="close"><a href="#" onclick="wlModal.cancelBut();return false;">X</a></td></tr><tr><td colspan="2" id="'+divContentId+'" class="content">{content}</td></tr><tr><td colspan="2" class="buttons">{buttons}</td></tr></table>',
	//template : '<div class="header"><div class="title">{title}</div><div class="close"><a href="#" onclick="wlModal.cancelBut();return false;">&nbsp;</a></div></div><div id="'+divContentId+'" class="content">{content}</div><div class="buttons">{buttons}</div>',
	//template : '<div class="header"><div class="title">{title} ( <a href="#" onclick="wlModal.cancelBut();return false;">Close</a> )</div></div><div id="wlMdlCntnt" class="content">{content}</div><div class="buttons">{buttons}</div>',
	template : '<div class="header"><div class="title">{title} ( <a href="#" onclick="wlModal.cancelBut();return false;">Close</a> )</div></div><div id="'+(this.divContentId)+'" class="content">{content}</div><div class="buttons">{buttons}</div>',
											// Шаблон содержимого блока пока идет загрузка ajax
	classPrefix : 'wlModal.', // Имя класса
	//ico : 'wlModalBg.png', // Иконка окна по-умолчанию
	title : 'Modal Window', // Заголовок окна по-умолчанию
	processors : {},
	buttons : {}
};
//Менять только если нужно добавить поддержку еще одного стиля окна
with(wlModal.options){
	processors[tagParamNameTextOk]=classPrefix+'alertBox';
	processors[tagParamNameConfirm]=classPrefix+'confirmBox';
	processors[tagParamNameAjax]=classPrefix+'ajaxBox';
//То же самое, но, для кнопок
	buttons[tagParamNameTextOk]={
		'Ок':classPrefix+'okBut'
	};
	buttons[tagParamNameConfirm]={
		'Да':classPrefix+'okBut',
		'Нет':classPrefix+'notBut',
		'Отмена':classPrefix+'cancelBut'
	};
	buttons[tagParamNameAjax]={
		//'Ок':classPrefix+'ajaxClose',
		//'Отмена':classPrefix+'cancelBut'
	};
}

wlModal.$=function(id){return document.getElementById(id);};

wlModal.on=function(){
	if (window.addEventListener) 	return function(el,type,func){el.addEventListener(type,func, false);}
	else if (window.attachEvent) 	return function(el,type,func){el.attachEvent('on'+type,func);}
	else 							return function(el,type,func){el['on'+type]=func};
}();

wlModal.cancel=function(){
	if (window.removeEventListener)	return function(el,type,func){el.removeEventListener(type,func, false);}
	else if (window.detachEvent) 	return function(el,type,func){el.detachEvent('on'+type,func);}
	else 							return function(el,type,func){el['on'+type]=''};
}();

wlModal.mainDiv=document.createElement('div');
wlModal.shadowDiv=document.createElement('div');
wlModal.maskDiv=document.createElement('div');
//Состояние окна:
//-1 - окно видимо
// 0 - окно закрыто и была нажата кнопка ок
// 1 - окно закрыто и была нажата кнопка нет
// 2 - окно закрыто и была нажата кнопка отмена
wlModal.state=0;
//Внешний обработчик для событий изминения состояния modalbox
wlModal.handleFunc=null;

wlModal.init=function(){
	with(wlModal){
		
		document.body.appendChild(maskDiv);
		document.body.appendChild(shadowDiv);
		with(maskDiv.style){
			visibility=shadowDiv.style.visibility='hidden';
			position=shadowDiv.style.position='absolute';
			top=0;
			left=0;
			backgroundColor=shadowDiv.style.backgroundColor=wlModal.options['maskColor'];
		}
		setOpac(maskDiv,wlModal.options['bodyOpacity']);
		maskDiv.innerHTML='<!--[if lte IE 6.5]><iframe width=100% height=100% style="background:'+wlModal.options['maskColor']+';filter:mask();"></iframe><![endif]-->';
		
		mainDiv.setAttribute('id',options.divId);
		mainDiv.style.position='absolute';
		document.body.appendChild(mainDiv);
		
		var enabledTags=options['tags'];
		if(enabledTags.length>0){
			for(var i=0;i<enabledTags.length;i++) processCollection(document.getElementsByTagName(enabledTags[i]));
		}else 
			processCollection(document.all||document.getElementsByTagName('*'));
	}
}

wlModal.processCollection=function(col){
	function gV(el,attr,def){
		var val=null;
		if(attr&&attr!='') val=el.getAttribute(attr);
		if(val==null) val=def;
		return val;
	}
	for(var i=0;i<col.length;i++){
		var el=col[i];
		var window_type=null;
		var buts=null;
		var attr_data=null;
		var found=null;
		for(var j in wlModal.options.processors){
			if (typeof(j)!='string'||Object.prototype[j]) continue;
			var t=el.getAttribute(j);
			if(t!=null&&t!='') {
				attr_data=t;
				found=j;
			}
		}
		if(found!=null) {
			with(wlModal.options){
				window_type=processors[found];
				
				var opts=gV(el,tagParamNameOptions,'{}');
				
				opts=wlModal.getOptions(wlModal.getJSON(opts));
				buts=opts['buttons'][found];
				
			}
			wlModal.listen(el,buts,window_type,attr_data,opts);
		}
	}
}

wlModal.setOpac=function(el, nOpacity){
	function _gOP(){
		if (typeof document.body.style.opacity == 'string') return 'opacity';
		else if (typeof document.body.style.MozOpacity == 'string') return 'MozOpacity';
		else if (typeof document.body.style.KhtmlOpacity == 'string') return 'KhtmlOpacity';
		else if (document.body.filters && navigator.appVersion.match(/MSIE ([\d.]+);/)[1]>=5.5) return 'filter';
		return false; 
	};
	var opacityProp = _gOP();
	if (!el || !opacityProp) return;
	if (opacityProp=="filter"){
		nOpacity *= 100;
		var oAlpha = el.filters['DXImageTransform.Microsoft.alpha'] || el.filters.alpha;
		if (oAlpha) oAlpha.opacity = nOpacity;
		else el.style.filter += "progid:DXImageTransform.Microsoft.Alpha(opacity="+nOpacity+")"; 
	}
	else el.style[opacityProp] = nOpacity;
}

wlModal.maskBody=function(){
	var brW=(document.compatMode=='CSS1Compat' && !window.opera)?document.documentElement.clientWidth:document.body.clientWidth;
	var brH=(document.compatMode=='CSS1Compat' && !window.opera)?document.documentElement.clientHeight:document.body.clientHeight;
	var bounds=wlModal.getViewRect();
	if(brW<(bounds['w']+bounds['x1'])) brW=bounds['w']+bounds['x1'];
	if(brH<(bounds['h']+bounds['y1'])) brH=bounds['h']+bounds['y1'];
	with(wlModal.maskDiv.style){
		visibility='visible';
		width=brW+'px';
		height=brH+'px';
	}
}

wlModal.unMaskBody=function(){
	wlModal.maskDiv.style.visibility='hidden';
}

wlModal.getButtons=function(but_obj){
	var val='';
	for(var i in but_obj){
		if(Object.prototype[i]) continue;
		val+='<input type="button" value="'+i+'" onclick="'+but_obj[i]+'();">';
	}
	return val;
}

wlModal.getOptions=function(tOpt){
	var opt={};
	for(var key in wlModal.options){
		if(Object.prototype[key]) continue;
		if(tOpt[key]!=null) opt[key]=tOpt[key];
		else opt[key]=wlModal.options[key];
	}
	return opt;
}

wlModal.getViewRect=function(){
	var canvas=document.getElementsByTagName(document.compatMode && document.compatMode == "CSS1Compat" ? "HTML" : "BODY")[0];
	var rect={};
	rect['x1']=canvas.clientWidth ? canvas.scrollLeft : window.pageXOffset;
	rect['y1']=window.innerHeight ? window.pageYOffset : canvas.scrollTop;
	rect['w']=(canvas.clientWidth ? canvas.clientWidth : window.innerWidth);
	rect['h']=(window.innerHeight ? window.innerHeight: canvas.clientHeight);
	return rect;
}

wlModal.getJSON=function(str){
	var params={};
	if(!/^{/.test(str)) {
		t=str.split(':');
		params[t[0]]=t[1];
	}else {
		try{
			eval('params='+str);
		}catch(e){
			alert('Неверно составлен JSON массив для ajax, обратитесь к разработчику');
			return;
		}
	}
	return params;
}

wlModal.rePos=function(opt){
	var bounds=wlModal.getViewRect();
	var minW=opt['minWidth'];
	var maxW=(opt['maxWidth']&&opt['maxWidth']!=0)?opt['maxWidth']:100000;
	var minH=opt['minHeight'];
	var maxH=(opt['maxHeight']&&opt['maxHeight']!=0)?opt['maxHeight']:100000;
	
	with(wlModal.mainDiv.style){
		top=0;
		left=0;
		width='auto';
		height='auto';
		var W=wlModal.mainDiv.offsetWidth;
		if(W<minW) W=minW;
		if(W>maxW) W=maxW;
		width=W+'px';
		var H=wlModal.mainDiv.clientHeight;
		if(H<minH) H=minH;
		if(H>maxH) H=maxH;
		height=H+'px';
	
		var x=(bounds['w']+2*bounds['x1']-W)/2;
		var y=(bounds['h']+2*bounds['y1']-H)/2;
	
		if(x<0) x=0;
		if(y<0) y=0;
		
		top=y+'px';
		left=x+'px';
	}
	with(wlModal.shadowDiv.style){
		width=W+'px';
		height=H+'px';
		
		top=y+opt['shadowY']+'px';
		left=x+opt['shadowX']+'px';
//		zIndex=254;
		visibility='visible';
	}
	//wlModal.mainDiv.style.zIndex='255';
}

wlModal.onEsc=function(event){
	with(wlModal){
		var keyCode=event.keyCode||event.which;
		switch(keyCode){
			case 27:
				close(2);
				cancel(document,'keypress',onEsc);
				if(event.preventDefault) event.preventDefault();
				return false;
				break;
//			case 13:
//				close(0);
//				cancel(document,'keypress',wlModal.onEsc);
//				break;
		}
	}
}

wlModal.listen=function(el,buttons,contentFunc,argFunc,opts){
	wlModal.on(el,'click',function(event){
		var t=wlModal.onCallback;
		eval('wlModal.handleFunc='+opts['funcNameCallBack']);
//		alert(opts['funcNameCallBack']);
//		alert(t);
		//alert(wlModal.onCallback);
		wlModal.on(document,'keypress',wlModal.onEsc);
		wlModal.state=-1;
		var cont='';
		eval('cont='+contentFunc+'(argFunc,opts);');
		wlModal.buttons=wlModal.getButtons(buttons);
		var tpl_vars={
			//'img':(opts['ico']!='')?'<img src="'+opts['ico']+'">':'',
			'title':opts['title'],
			'content':cont,
			'buttons':wlModal.buttons
		};
		wlModal.mainDiv.style.visibility='visible';
		wlModal.mainDiv.innerHTML=wlModal.parseTemplate(tpl_vars,opts);
		wlModal.rePos(opts);
		wlModal.maskBody();
		
		if(event.preventDefault) event.preventDefault();
		return false;
	});
}

wlModal.parseTemplate=function(tpl_vals,opts){
	var tpl=opts['template'];
	for(var i in tpl_vals)
		if(!Object.prototype[i]) tpl=tpl.replace(new RegExp('{'+i+'}','g'),tpl_vals[i]);
	return tpl;
}

wlModal.setContent=function(v){
	//alert('v= '+v);
	//document.getElementById('wlMdlCntnt').innerHTML = v;
	document.getElementById(wlModal.options.divContentId).innerHTML = v;
}

wlModal.ajaxBox=function(arg,opts){
	var objAjaxResult = $('ajresult');
	var loadStr='<span style="color:#f00">Загрузка</span>';
	wlModal.curAJAX=arg;
	JsHttpRequest.query(
		opts['phpPath'],
		wlModal.getJSON(arg),
		function(result,error){
			if (error!=undefined && error!='') { // Write error to the debug div
				if (objAjaxResult!=undefined) {
					//if (ajParams.windowtop) scrollToObj(objAjaxResult);
					scrollToObj(objAjaxResult);
					objAjaxResult.className = 'ajresulterror';
					objAjaxResult.innerHTML = error;
				} else {
					alert('Не найден слой для вывода отчета/ошибок\n------------------------------\n'+error+'\n------------------------------');
				}
			}
			if(wlModal.curAJAX!=arg||wlModal.state!=-1) return;
			loadStr=result['modal'];
			wlModal.result=result;
			wlModal.error=error;
				//alert('');
			var tpl_vars={
				//'img':(opts['ico']!='')?'<img src="'+opts['ico']+'">':'',
				'title':opts['title'],
				'content':loadStr,
				'buttons':wlModal.buttons
			};
			wlModal.mainDiv.innerHTML=wlModal.parseTemplate(tpl_vars,opts);
			wlModal.rePos(opts);
		},
		!opts['needCaching']
	);
	return loadStr;
};

wlModal.confirmBox=wlModal.alertBox=function(arg,opts){return arg;};

wlModal.close=function(st){
	with(wlModal){
		if(!st) st=0;
		unMaskBody();
		mainDiv.style.visibility='hidden';
		shadowDiv.style.visibility='hidden';
		state=st;
	}
}

wlModal.okBut=function(){
	wlModal.close();
	if(wlModal.handleFunc){
		//alert('');
		wlModal.handleFunc(0);
		wlModal.handleFunc=null;
	}
}

wlModal.notBut=function(){
	wlModal.close(1);
	if(wlModal.handleFunc){
		wlModal.handleFunc(1);
		wlModal.handleFunc=null;
	}
}

wlModal.cancelBut=function(){wlModal.close(2);}

wlModal.onCallback=function(arg1,arg2){
	//alert();
	if(arg1!=null) alert('arg1='+arg1);
	if(arg2!=null) alert('arg2='+arg2);
}

wlModal.ajaxSend=function(pw,objForm){
	//alert('pw= '+pw+', objForm= '+objForm+', wlModal.options.phpPathSendInclude= '+wlModal.options.phpPathSendInclude);
	if (pw!=undefined && objForm!=undefined && wlModal.options.phpPathSendInclude!=undefined) {
		//var ajData = {'pw':pw,'action':'edit','id':idArr};
		var ajData = {'pw':pw,'action':'edit'};
		ajData['fv'] = objForm;
		var ajParams = {'callback':'wlModal.ajaxSendCallback','include':wlModal.options.phpPathSendInclude};
		//var ajParams = {'callback':'ajModalBoxSendCallback','backendPath':'/call/wlModalBox.php?pw='+pw+'&action=edit&include=wlModalBox'}; // ,'include':'wlModalBox'
		wlAjax(ajData,ajParams);
	}
}

wlModal.ajaxSendCallback=function(result){
	//alert('result= '+result);
	if (wlModal!=undefined && result!=undefined) {
		wlModal.cancelBut();
		window.location.reload();
	}
}

wlModal.ajaxClose=function(){
	wlModal.close();
	if(wlModal.handleFunc) {
		wlModal.handleFunc(wlModal.result,wlModal.error);
		wlModal.result={};
		wlModal.error={};
		wlModal.handleFunc=null;
	}
}

wlModal.on(window,'load',wlModal.init);
