﻿var ver_dnvFW=1.4; //для сообщения о необходимости очистить кэш браузера. см. manage.js

var vbT=String.fromCharCode(9);
var vbV=String.fromCharCode(11);
var vbE=String.fromCharCode(13);
var vbEsc=String.fromCharCode(27);//для сигнализирования об ошибке
function $class() {return function() {this.initialize.apply(this, arguments)}};

var $onload_list=new Array();
function $onload(func){
//	if (window.addEventListener) window.addEventListener('load', func, false);
//		else 	
//		{
//			window.attachEvent("onload", func)
//		}
	if ($onload_list.length==0) {
		if (window.addEventListener) window.addEventListener('load', $onload_exec, false); else window.attachEvent("onload", $onload_exec);
	}
	$onload_list.push(func);
};
function $onload_exec(){
	while($onload_list.length>0) $onload_list.shift()();
	$onload_list=undefined;
}

String.prototype.startWith=function(s){return(this.substr(0,s.length)==s)};
String.prototype.endWith=function(s){return(this.slice(-s.length)==s)};
String.prototype.trim=function(){return this.replace(/(^\s+)|(\s+$)/g, '')};
//каждая первая буква слова - заглавная. учитываем .,-
String.prototype.properCase=function(){return this.toLowerCase().replace(/(^[a-zа-я])|([\s\.\,\-]{1}[a-zа-я])/g,function(w){return w.toUpperCase()})};
String.prototype.escape=function() {var p=document.createElement('div');p.appendChild(document.createTextNode(this));return p.innerHTML};

function trunc(str,length) {length = length || 30;return (str.length > length ?  str.slice(0, length - 3) +  '...' : str)};
function truncQ(str,length) {length = length || 30; return (str.length > length ?  str.slice(0, length - 5) +  "<img src='/_/q.gif' title=\"" + str + "\" style='vertical-align:bottom'/>": str)};
function padLeft(str,len,chr){if(str.constructor!=String) str+=''; return str.length>=len ? str : Array(len + 1 - str.length).join(chr)+str;}
//function padRight(str,len,chr){if(str.constructor!=String) str+=''; return str.length>=len ? str : str+Array(len + 1 - str.length).join(chr);}

//содержит ли строка только цифры
function $isInt(s, allowEmpty){return ((allowEmpty && s.length==0) || /^\d+$/.test(s))};


//поиск эл-та в массиве. они есть и в IE но более тормозные
Array.prototype.indexOf=function(v,startIndex,param){
	if(param)//ищем v в параметре объекта
		{for(var i=startIndex || 0;i<this.length;i++) if(this[i][param]==v) return i; return -1;}
	else
		{for(var i=startIndex || 0;i<this.length;i++) if(this[i]==v) return i; return -1;}
	};
Array.prototype.lastIndexOf=function(v,startIndex,param){
	if(param)//ищем v в параметре объекта
		{for(var i=startIndex || this.length-1;i>=0;i--) if(this[i][param]==v) return i; return -1;}
	else
		{for(var i=startIndex || this.length-1;i>=0;i--) if(this[i]==v) return i; return -1;}
	};

function $e(name){return document.getElementById(name)};
function $html(name,value){if(value==undefined) return document.getElementById(name).innerHTML;	else	document.getElementById(name).innerHTML=value};
function $v(name,value){if(value==undefined) return document.getElementById(name).value; else	document.getElementById(name).value=value	};
function $E(name){var obj=(typeof(name)=='object'?name:document.getElementById(name)); if (!obj) return undefined; else return $el(obj)};
function $Z(value){if (value=='0' || $N(value)==0) return ''; else return value; }//zero to nothing
function $N(n,round){
	if(!n) return 0; 
	n=Number(n); 
	if (n==0 || isNaN(n)) return 0; 
	if(round!=undefined)  {var t=Math.pow(10,round); n=Math.round(n*t)/t;}
	
	return n
};

//вычисляем число из строки учитывая математические символы и скобки
function $calc(n,round){
	if(!n) return 0; 
	try{
		n=Number(eval(n.replace(/[^\d\.\-\+\*\/\(\)\e]/g,'')));
		if(isNaN(n)) return 0;
	} catch(e){n=0;}
	if (n==0 || isNaN(n)) return 0; 
	if(round!=undefined)  {var t=Math.pow(10,round); n=Math.round(n*t)/t;}
	
	return n
};

function $show(el,isShow){
		if(el.constructor==String) el=document.getElementById(el);
		if(el) el.style.display=(isShow==undefined || isShow)? 'block':'none';
	}
function $hide(el){$show(el,false);}

function $reveal(el,isShow){
		if(el.constructor==String) el=document.getElementById(el);
		if(el) el.style.visibility=(isShow==undefined || isShow)? 'visible':'hidden';
	}
function $conceal(el){$reveal(el,false);}

/************** $el ***************/
function $el(tagName,H,innerHTML,ownerDoc){//создаем элемент с аттрибутами
	//tagName  может быть указан className после точки
	//ownerDoc - объект document в к-м будет создаваться данный таг, по дефолту document
	if (typeof(tagName)=='object')
		{
			e=tagName;//если объект, просто прилепим ему наши навороты
			if(e.is$el) try{return e;}finally{e=null;}
		}
	else
	{	var css, i=tagName.indexOf('.');
		
		if (i>=0) {css=tagName.substring(i+1); tagName=tagName.substring(0,i)};
		e= (ownerDoc || document).createElement(tagName);
		if (css) e.className=css;
		$attr(e,H);
		if(innerHTML) e.innerHTML=innerHTML;
	};
	e.is$el=true;
	for(i in $_el) e[i]=$_el[i];
	try{return e;}finally{e=null;}
};

var $_el={
	  is$el:true
	, html:function(html){if(html==null) return this.innerHTML;  this.innerHTML=html; return this;}
	, remove:function(){this.parentNode.removeChild(this)}
	, attr:function(H){ $attr(this,H); return this}
	, add:function(el){this.appendChild(el); return this}
	, write:function(html){this.insertAdjacentHTML('beforeEnd', html); return this}
	, addEl:function(tagName,H,innerHTML){this.appendChild($el(tagName,H,innerHTML)); return this}
	, event:function(evName,action){
			var a=(typeof(action)=='string'? function(){eval(action)}: action);
			if (this.addEventListener) 
				this.addEventListener(evName, a, false);
			else 
				this.attachEvent("on" + evName,a);
			return this;
			}
	, addFirst:function(el){this.insertBefore(el,this.firstChild)}//вставить первым
	, addBefore:function(el){this.parentNode.insertBefore(el,this)}//вставить перед эл-том
	, into:function(el,isFirst){//вставить этот элемент в другой
				if (!el) el=this.ownerDocument.body;//document.body;
				if (isFirst) 
					el.insertBefore(this,el.firstChild);
				else
					el.appendChild(this);
			}
	, css:function(H,value){
			if(H.constructor==Object)
				for (i in H) this.style[i]=H[i]; 
			else if(value==undefined) 
				this.addClass(H);//указываем имя класса
			else
				this.style[H]=value;//указываем стиль
			return this;
		}
	, setStyle:function(H){ for (i in H) this.style[i]=H[i]; return this}/*deprecated*/
	, Align:function(H){$align(this,H);return this;}
	, show:function(b){this.style.display=(typeof(b)=='undefined' || b==true?'block':'none'); return this;}
	, hide:function(){this.style.display='none'; return this;}
	, toggle:function(){this.style.display=this.style.display=='none'?'block':'none'; return this;}
	, reveal:function(b){this.style.visibility=(typeof(b)=='undefined' || b==true?'visible':'hidden'); return this;}
	, conceal:function(){this.style.visibility='hidden'; return this;}
	, hasClass:function(name){if(!this.className) return false; return (new RegExp("(^|\\s)" + name + "(\\s|$)")).test(this.className)}
	, addClass:function(name){if(!this.className) {this.className=name;return this}; if (!this.hasClass(name)) this.className+=' '+name; return this}
	, delClass:function(name){ if(!this.className) return this;
			this.className=this.className.replace(new RegExp("(^|\\s+)" + name + "(\\s+|$)"), ' ').trim();return this;
			if (this.className.length==0) this.className=undefined;
			}
};

/*************** $sel *****************/

function $sel(obj){//ф-ции для <Select>
	if (typeof(obj)=='string') 
		{
			obj=document.getElementById(obj);
			if(!obj) return;//нет такого контрола
		}
	if(obj.is$sel) return obj;
	for(var i in $_sel) obj[i]=$_sel[i];
	return obj;
};
var $_sel={
	 is$sel:true
	, text:function(value){
 			//если value не указан, возвращаем выделенный текст, иначе ищем указанное значение и возвращаем текст
			if (undef(value))
				{if (this.selectedIndex<0) return;
				return this.options[this.selectedIndex].text;
				}
			var s=this.options;
			for(var i=0;i<s.length;i++) if(s[i].value==value) return s[i].text;
		}
	, selected:function(){return this.options[this.selectedIndex]}//выделенный Option
	, selectText:function(text,elseIndex){//ищем текст и выделяем
			//elseIndex - номер строки если value не найден. по умолчанию -1
			var s=this.options;
			for(var i=0;i< s.length;i++) if (s[i].text==text) {s[i].selected=true;return s[i];}
			this.selectedIndex=Def(elseIndex,-1);
			}
	, select:function(value,elseIndex){//ищем значение и выделяем
			this.value=value;
			if (this.selectedIndex<0 && def(elseIndex)) this.selectedIndex=elseIndex;
			}
	, add:function(text,value,isSelect){	var o=new Option(text,value); 
			this.options[this.options.length]=o; 
			if (isSelect) o.selected=true;
			try{return o;}finally{o=null;}
		}
	, clear: function(){this.options.length=0;}
};

/***************** $tbl ****************/

function $tbl(obj,H){
	if(undef(obj)) 
		obj=document.createElement('table');
	else 
		{if (typeof(obj)=='string') 
			{
				obj=document.getElementById(obj);
				if(!obj) return null;
			}
		if(obj.is$tbl) return obj;
		}
	for(var i in $_tbl) obj[i]=$_tbl[i];
	$attr(obj,H);
	try{return obj;}finally{obj=null;}
};
//не привязанный к таблице TR

var $_tbl={
	is$tbl:true
	, clear:function(from,to){//очищаем таблицу от строк
			from=from || 0; if(undef(to)) to=this.rows.length-1;
			for(var i=from;i<=to;i++){this.deleteRow(from)}
		}
	, head:function(html,H){
		var c=document.createElement("caption");
		c.innerHTML=html;
		$attr(c,H);
		this.appendChild(c);
		return this;
	}
	, tbody: function(H,index)
	{
		if(index!=undefined && index>=this.childNodes.length) index=undefined;
		if(H && H.tagName=='TBODY')
		{//это вставка существующего TBODY
			if(index==undefined) 
				this.appendChild(H);
			else
				this.insertBefore(H,this.childNodes[index])	;
			return;
		}
		var tb=$tbl(document.createElement("TBODY"),H);
		this.appendChild(tb);
		return tb;
	}
	, tr:function(H,index){//H - аттрибуты или объект TR: css-ClassName
			var tr;
			if(index!=undefined && index>=this.childNodes.length) index=undefined;
			if(this.childNodes==undefined) 
				tr=document.createElement("TR");//не привязанный к таблице
			else
			{
				if(H && H.tagName=='TR')
				{//это вставка существующего TR
					if(index==undefined) 
						this.appendChild(H)
					else
						this.insertBefore(H,this.childNodes[index])	;
					return;
				}
				//tr=this.insertRow(index);
				tr=index!=undefined?this.insertRow(index):this.insertRow();//передавать undefined в insertRow нельзя
			}
			if(H) {
				if(H.constructor==String)
					tr.className=H;
				else
				{
					if (H.css) {tr.className=H.css; delete H.css;}
					for(var i in H) {tr[i]=H[i];}
				}
			}
			tr.td=$_tblTD;
			tr.th=$_tblTH;
			//Следующие возвращают сам объект td
			tr.TD=$_tbl_TD;
			tr.TH=$_tbl_TH;
			try{return tr;}finally{tr=null;}
		}
	, colgroup: function(){//array of Hash
			var c=document.createElement('colgroup');
			for(var i=0; i<arguments.length;i++)
			{
				var p=document.createElement('col');
				$attr(p,arguments[i]);
				c.appendChild(p);
			}
			this.appendChild(c);
			c=t=p=null;
			return this;
		}
	, col: function(iSpan, H){//если span не число, то это H
			if(iSpan && iSpan.constructor==Object) {H=iSpan; iSpan=null;}
			var c=document.createElement('col');
			if(iSpan) c.span=iSpan;
			
			if(H)  
			this.appendChild(c);
			c=null;
			return this;
		}
};
//возвращаем объект $tbl.tr
function $_tblTH(html,H){$_tblTD(html,H,this, true); return this}
function $_tblTD(html,H, tr, isTH){//H - {атрибуты}, если строка тогда ClassName 
		var c=document.createElement(isTH?'th':'td');
		//if(html) c.innerHTML=html; 
		if(html) 
		{
			if (html.constructor==Object)
				c.appendChild(html);//добавляем элемент
			else
				c.insertAdjacentHTML('beforeEnd',html);
		}
		$attr(c,H);
		(tr || this).appendChild(c);
		c=null;
		return this;
};
//возвращаем TD
function $_tbl_TH(html,H){return $_tbl_TD(html,H,this, true);}
function $_tbl_TD(html,H, tr, isTH){//H - {атрибуты}, если строка тогда ClassName 
		var c=document.createElement(isTH?'th':'td');
		//if(html) c.innerHTML=html; 
		if(html) 
		{
			if (html.constructor==Object)
				c.appendChild(html);//добавляем элемент
			else
				c.insertAdjacentHTML('beforeEnd',html);
		}
		$attr(c,H);
		(tr || this).appendChild(c);
		return c;
};

function $attr(obj,H){//H -если строка то имя стиля. H.css- имя стиля. H.style - список стилей(строка или hash)
		if(!H) return;
		if (H.constructor==String) {obj.className=H; return;}
		if (H.css) {obj.className=H.css; delete H.css;}
		if (H.html) {obj.innerHTML=H.html; delete H.html;}
		if(H.style) //перемещаем стили
		{
			if(H.style.constructor==String)
			{
				var k=H.style.split(';');
				for(var j=0;j<k.length;j++)
					{
					if(k[j].length==0) continue;
					var k2=k[j].split(':');
					obj.style[k2[0].trim()]=k2[1].trim();
					}
			}
			else
				for(var i in H.style) obj.style[i]=H.style[i];
			delete H.style;
		}
		
		for(var i in H)  obj.setAttribute(i,H[i]);
	}
/**************************************/
//подменяем значение иконки на (src | 0.gif)
//если же src=false, или был режим ожидания - то восстанавливаем
//если же это контейнер, напр. div. то вставляем ожидание src | circle.gif
function $wait(obj,src,alt){
	if(obj.constructor== String) obj=document.getElementById(obj);
	if(src && src.charAt(0)=='#') src ="/_scr/ajax/" + src.substring(1) + '.gif';
	
	if(obj.tagName!='IMG')
		//это контейнер
		obj.innerHTML="<center style='cursor:wait'><img src='" + (src || "/_scr/ajax/0.gif") + "'</center>";
	else
	{//это картинка
		if(obj.$imgSrc)
		{//восстанавливаем иконку
			obj.src=obj.$imgSrc; obj.$imgSrc=null;
			if(obj.$imgAlt) {obj.alt=obj.$imgAlt; obj.$imgAlt=null;}
		}
		else if(src!=false)
		{//подменяем иконку
			obj.$imgSrc=obj.src; obj.src=(src || "/_scr/ajax/0.gif") ;
			if(alt) {obj.$imgAlt=obj.alt; obj.alt=alt;}
		}
	}
	obj=null;
}

function This(e){//кроссбраузерный srcElement. e - event
	if(!e) return event.srcElement; 
	if(e.target) return e.target; else return e.srcElement;
};

//получаем путь к данному скрипту
function ScriptPath(Src, ownerDoc){//Src - папка и имя скрипта
	Src=Src.toLowerCase();
	var L=Src.length;
	var d=(ownerDoc || document).scripts;
	for (i=0;i<d.length;i++) 
		if(d[i].src.substring(d[i].src.length-L).toLowerCase()==Src) {
			Src=d[i].src;
			d=null;
			L=Src.lastIndexOf('/');
			if (L<0) return ''; else return Src.substr(0,L+1);
			};
	d=null;
	return null;
};

function $nbsp(v){return (v==undefined || v==null || (v.constructor==String && v.length==0)? '&nbsp':v);}
function undef(obj){return (obj==undefined)};
function def(obj,value){return (obj!=undefined)};
//is it prototype? 
function undefP(obj){return (obj==undefined || obj.constructor!=Object)};
function defP(obj){return (obj!=undefined && obj.constructor==Object)};
function DefP(obj,value){return ((obj==undefined || obj.constructor!=Object)?(value?value:{}):obj)};

function Def(obj,value){return (obj==undefined?value:obj)};

function DefN(obj,value){return (obj==undefined || obj==null?value:obj)};
function Def$(obj,item,value){if (obj!=undefined) return Def(obj[item],value); else return value};//проверяет если объект obj, и его свойство item, если да то возвращает, иначе value
function DEF(obj,item,value){//если параметр item не существует, устанавливаем
	if (obj==undefined) {obj={item:value}; return;}
	if(obj[item]==undefined) obj[item]=value;
};

//тоже что и DEF но для групповой инициализации. P-{name:defValue, ...}
function DEF_init$(obj,P){for(var i in P) if(obj[i]==undefined) obj[i]=P[i]}; //если obj уже объявлено. 

function DEF_init(obj,P){//возвращаем измененный объект. obj может быть не объявлено
	if (obj==undefined || obj.constructor!=Object) obj={};
	for(var i in P) if(obj[i]==undefined) obj[i]=P[i];
	try{return obj;} finally{obj=null;}
};

function f_Dollars(v){v=Number(v); if (isNaN(v)) return '$0.00';
	v = v.toString().replace(/\$|\,/g,'');
	dv = parseFloat(v);
	if(dv==0) return '$0.00';
	b = (dv == (dv = Math.abs(dv)));	dv = Math.floor(dv*100+0.50000000001);iC = dv%100;	sC = iC.toString();dv = Math.floor(dv/100).toString();if(iC<10)	sC = "0" + sC;	for (var i = 0; i < Math.floor((dv.length-(1+i))/3); i++)
	dv = dv.substring(0,dv.length-(4*i+3))+' '/*delimeter*/ + dv.substring(dv.length-(4*i+3));	
			return ('$' + ((b)?'':'-') +  dv + '.' + sC);
};
function f_DollarsN(v,isNBSP){v=Number(v); if (isNaN(v) || v==0) return isNBSP?'&nbsp;':'';
	v = v.toString().replace(/\$|\,/g,'');	
	dv = parseFloat(v);
	if(dv==0) return isNBSP?'&nbsp;':'';
	b = (dv == (dv = Math.abs(dv)));	dv = Math.floor(dv*100+0.50000000001);iC = dv%100;	sC = iC.toString();dv = Math.floor(dv/100).toString();if(iC<10)	sC = "0" + sC;	for (var i = 0; i < Math.floor((dv.length-(1+i))/3); i++)
	dv = dv.substring(0,dv.length-(4*i+3))+' '/*delimeter*/ + dv.substring(dv.length-(4*i+3));	
	return ('$' + ((b)?'':'-') +  dv + '.' + sC);
};

function f_Num2(d){
	d=(Math.round(d*100)/100).toString();
	if (d.charAt(d.length-2)=='.') 
		d+='0';
	else if(d.charAt(d.length-3)!='.')
		d+='.00';
	return d;
}

function f_Phone(v,isNBSP){//10-значный USPhone допускается ext
	if (!v) return isNBSP?'&nbsp;':'';
	if(v.constructor==String)
		 v=v.replace(/[^\d]/g,'');
	else
		v=v.toString();
	if (!v || v=='0') return isNBSP?'&nbsp;':'';
	
	if (v.length<10) {v=('__________').substr(10-v.length)+v}
	var s= '('+v.substr(0,3)+') '+v.substr(3,3)+'-'+v.substr(6,4);
	if(v.length>10) s+=' ex '+v.substring(10);
	return s;
};


function getRadioValue(rObj){
  for (var i=0; i < rObj.length; i++)  if (rObj[i].checked) return rObj[i].value;
  return null;
};

function $query(Name){// получаем QueryString. если нет такого ключа, возвращаем undefined
	var s=location.href;
	var i1=s.indexOf('?'); if (i1<0) return;
	if (!Name) return s.substring(i1+1);
	s=s.toLowerCase();	Name=Name.toLowerCase();
	var i=s.indexOf('?'+Name+'=',i1); if (i<0) i=s.indexOf('&'+Name+'=',i1); if (i<0) return;
	i+=Name.length+2;
	i1=s.indexOf('&',i);
	if (i1<0) return unescape(location.href.substring(i)); else return unescape(location.href.substring(i,i1));
};

//удаляем эл-т по индексу. H - объект типа JSON compact
function jsonDel(H,ind){
		var h;
		if(H.content) {H.rows--; h=H.content;} else h=H;
		for(i in h) h[i].splice(ind,1);
		h=null;
};

function $H_Q(h){//значение в querystring. если hash разделяем \f, \b
	if(h.constructor!=Object)  return h;
	var s=''; 
	for(var i in h) s+='\f'+i+'\b'+h[i];
	if (s.length>0) s=s.substring(1);
	return s;
}

//замер времени производительности
var $time={
	 a:undefined
	, maxD:undefined
	, start: function(descr){this.a=new Array(); this.step(descr || 'Start');}
	, step:function(description){
		if(!this.a) this.clear();
		description=description || ('Step '+this.a.length);
		var endTime=new Date();
		var r=new Array();

		if (this.a.length>0){
			r['time']=(endTime-this.a[this.a.length-1]['rawtime']);
			r['desc']=description;
			r['rawtime']=endTime;
			if (typeof console != "undefined") 
			console.debug(r['desc']+' : %s ', r['time']); //for mozilla firebug
			this.a.push(r);//[arrTime.length+1]=recStep;
			if(this.maxD<description.length) this.maxD=description.length;
		}
		else{
			r['time']=0;
			r['desc']=description;
			r['rawtime']=endTime;
			this.maxD=description.length;
			this.a.push(r);
		}
	},
	finish: function(descr){this.step(descr || 'Finish');
		
		var strOut='',totalTime=0,d,s;
		var tab=String.fromCharCode(9);
		for(var i=0;i<this.a.length;i++){
			totalTime+=this.a[i]['time'];
			d=this.a[i]['desc'];
			s=(new Array(Math.floor((this.maxD-d.length)/7)+1)).join(tab)+tab;
			strOut+="\n"+d+s+' : '+this.a[i]['time']+tab+'t: '+totalTime;
			}
		strOut+="\n"+'-------------------------\nTotal: '+totalTime+' ms';
		alert(strOut);	
	}
};
$time.end=$time.finish;

function $loadScript(path,ownerDoc){
	var doc=(ownerDoc || document);
	var script=doc.createElement('script'); 
	script.type = 'text/javascript'; 
	script.src = path; 
	doc.getElementsByTagName('head')[0].appendChild(script); 
}

//для использования фильтра поиска
var $filter={
	  tblID:'tblSearch'
	, resTblID: 'tblRes'
	, resDivID: 'dvRes'
	, url: 'ajax_res.aspx'
	, curQ:null
	, lastQ: null
	, onRaise:null //перед запросом, напр. после выбора страницы
	, callback:null //вызывается после поиска: передает true если есть рез-ты
	, popupObj: null // для $filter.chr(.., true) - какой объект закрывать
	, asgList:[]
	, init: function(h){
			//h.asg список autoSuggest полей через запятую (и без s в конце). если поле начинается с !, то при $filter.go игнорируется. ручная обработка
			h=h || {};
			$inp.form($filter.tblID);
			if (h.asg)//autosuggest
			{	
				var s=h.asg.replace(/\s+/g,'').split(',');
				for(var i=0;i<s.length;i++)
					{
						var t=s[i];
						var capsName=t.charAt(0).toUpperCase()+t.substring(1);
						if(t.charAt(0)=='!') s=s.substring(1); else $filter.asgList.push([$e('flt'+capsName), capsName]);
						AutoSuggest(t+'s',$e('flt'+capsName),{width:280});
					}
				delete h.asg
			}
			for(var i in h) $filter[i]=h[i];
		}
	, clear: function(isAll){ //очищаем поля фильтра
		isAll=(isAll && isAll.constructor==Boolean)?true:false;
		$$('#'+$filter.tblID+' input[type="text"]').each(function(o){
			if(!isAll && o.getAttribute('skip')) return;
			o.value=''; if (o.$inp) $inp.clear(o)
		});
		$$('#'+$filter.tblID+' select').each(function(o){
			if(!isAll && o.getAttribute('skip')) return;
			o.selectedIndex=0
		});
		//очищаем дату
		
		try{
			if(isAll || !dFrom.inp.getAttribute('skip'))
			{
				dFrom.reset();
				dTo.reset();
			}
		}catch(e){;};		
		
		return false;
	}
	, go:function(q) {
		q=q || '';
		if(q.constructor==Object)
		{
			var s='';
			for(var v in q) s+="&"+v+"="+escape(q[v]);
			q=s;
		}
		for(var i=0;i<$filter.asgList.length;i++)
		{
			var t=$filter.asgList[i];
			if(testAutoSuggest(t[0])) q+="&" + t[1] + "ID="+t[0].valueID;
		}

		$filter.curQ=(q.length>0?q+"&mpP=":"mpP=");
		if (q.length>0 && q.charAt(0)=='&') q=q.substring(1);
		$filter.open(q);
	}
	//поиск по первой букве
	, chr: function(c,isClosePop){
		if(!c) return;
		if(isClosePop) $filter.popupObj.close();
		if(typeof(c)=='object')
			{
				$filter.go('v='+c.Name.charAt(0))
			}
			else	
				$filter.go('v='+c)
	}
	, open: function(q){
		if(! $filter.resDivID) {location.href=$filter.url+'?'+q; return;}
		if($filter.onRaise) $filter.onRaise(q);
		$filter.lastQ=q;
		ajaX({
			url:$filter.url, 
			q:q, 
			target:$filter.resDivID,
			targetPic:'#circle',
			on:$filter.fOpen
			});	
	}
  , fOpen: function(){
		var t=document.getElementById($filter.resTblID);
		if (t) gridA(t);
		if($filter.callback)  $filter.callback(t!=undefined);
	  }
  , reload: function(){ //перегрузить учитывая текущую страницу
		$filter.open($filter.lastQ);  
	}
  , pg: function(i){
		$filter.open($filter.curQ+i);
	}
}

//при пустой текстовой строке и отсутствии текста вставляет альт. текст
//вызывать в onLoad но перед установкой на него фокуса. возвращает объект как $el()
var $inp={
	set: function(txtObj, altText, altStyle){
		//aCtrl -список контролов контролов или имен. 
		//altText - альтернативный текст
		//altStyle - стиль альт. надписи в виде{}
		var el=$E(txtObj);
		el.$inp=true;
		var d=$el('span'
			,{style:'position:absolute;display:none;padding:2px 0px 0px 7px;z-index:1;'
				+(altStyle || 'fontStyle:italic;color:gray;')
				, onclick:$inp.focusD}
			, altText || txtObj.hint
			);
		el.addBefore(d);
		
		el.event('focus', $inp.focus).event('blur', $inp.blur).event('change', $inp.blur);
		el.inpBlur=$inp.inpBlur;
		el.inpBlur();
		el=null;
	}
	//список объектов: obj0,obj1   или [obj0,hint0], [obj1,hint1]...
	, Set: function(){
		for(var i=0;i<arguments.length;i++) 
			if(arguments[i].constructor==Array)
				$inp.set(arguments[i][0],arguments[i][1]); 
			else
				$inp.set(arguments[i]); 
	}
	//ищем в детях эл-та все input с тагом hint
	, form: function(frm){
			if(frm.constructor==String) frm=document.getElementById(frm);
			var a=frm.getElementsByTagName("INPUT");
			for(var i=0;i<a.length;i++) if(a[i].hint!=null)  $inp.set(a[i]); 	
		}
	, focusD: function(){this.nextSibling.focus();}
	, focus: function(ev){var o=This(ev); if (o.value.length==0) o.previousSibling.style.display='none';}
	, blur: function(ev){var o=This(ev); o.previousSibling.style.display=(o.value.length==0?'block':'none');}
	//если фокус уже был потерян то input.blur() не вызовет $inp.blur, для этого спец ф-ция
	, inpBlur: function(){this.previousSibling.style.display=(this.value.length==0?'block':'none');}
	, clear: function(obj){obj.value=''; obj.previousSibling.style.display='block';}
}

//выравниваем объект, если он зашкаливает за экран
function $align(obj,h){//h{x,y,width,height, frame,skipX, skipY, dX,dY, show, event} - не обязательные
	//skipX,Y используется, если top/left не указаны явно, а полученны относительно
	//event - event, чтоб выровнять относительно мыши
	h=h || {};
	if(!h.frame) h.frame=document.body;

	if(h.event){
			h.x=h.event.x+h.frame.scrollLeft;
			h.y=h.event.y+h.frame.scrollTop;
	}
	var bHid=(obj.offsetWidth==0 && !h.width) || (obj.offsetHeight==0 && !h.height);//чтоб получить ширину и высоту, нужно отобразить объект
	var bVis=obj.style.visibility!='hidden';
	if(bHid) {obj.style.visibility='hidden'; obj.style.display='block';}
	
		if(h.width==undefined) h.width=obj.offsetWidth;
		if(h.height==undefined) h.height=obj.offsetHeight;
	if(h.show)
	{	obj.style.display='block';
		bVis=true;
	}
	else if(bHid) 
		obj.style.display='none';
	if(bVis) obj.style.visibility='visible';
	
	if(!h.skipX)
	{
		var scrollDX=20;//document.body.offsetHeight<document.body.scrollHeight?20:0;
		if(h.x==undefined) h.x=obj.offsetLeft;
		if(h.x<h.frame.scrollLeft) h.x=h.frame.scrollLeft;
		if(h.dX) h.x+=h.dX;
		if(h.x+h.width>h.frame.offsetWidth+h.frame.scrollLeft) h.x=h.frame.offsetWidth+h.frame.scrollLeft-h.width-scrollDX;//-18 под вертикальный скрол
		obj.style.left=h.x;
	}
	if(!h.skipY)
	{
		var scrollDY=20;//document.body.offsetWidth<document.body.scrollWidth?20:0;
		if(h.y==undefined) h.y=obj.offsetTop;
		if(h.y+h.height>h.frame.offsetHeight+h.frame.scrollTop) h.y=h.frame.offsetHeight+h.frame.scrollTop-h.height-scrollDY;
		if(h.dY) h.y+=h.dY;
		if(h.y<h.frame.scrollTop) h.y=h.frame.scrollTop;
		obj.style.top=h.y;
	}
}

function $hasClass(o,name){if(!o.className) return false; return (new RegExp("(^|\\s)" + name + "(\\s|$)")).test(o.className)}
function $addClass(o,name){if(!o.className) o.className=name; else if (!$hasClass(o,name)) o.className+=' '+name;}
function $delClass(o,name){ if(!o.className) return;
			o.className=o.className.replace(new RegExp("(^|\\s+)" + name + "(\\s+|$)"), ' ').trim();return;
			if (o.className.length==0) o.className=undefined;
			}

//нажали enter или вызвали из другой процедуры
function $enter(){	return (event.keyCode==0 || event.keyCode==13)}
