
function getEl(id) {
	if (typeof(id) == 'string') return document.getElementById(id);
	else return id; 
}

function showEl(element)
{
	getEl(element).style.display = 'block';
}

function hideEl(element)
{
	getEl(element).style.display = 'none';
}

function styleEl(element) {
	return getEl(element).style;
}

function setVis(element,i) {
	i = i ? '' : 'hidden';
	return styleEl(element).visibility = i;
}

function setInputFormat(fields) {
	for (var i in fields) {
	  document.data[fields[i]].onkeyup = inputFormat;
	  document.data[fields[i]].onkeydown = inputDigitFilter;
	}
}

function inputDigitFilter(e) {
	var keyCode = document.all ? event.keyCode : e.keyCode;
	if (48 <= keyCode && keyCode <= 57 || 96 <= keyCode && keyCode <= 105 || keyCode == 8 || keyCode == 46 || keyCode == 37 || keyCode == 39 || keyCode == 9 || keyCode == 13)
	  return true;
	else
	  return false;
}

function getSelectValues(element) {
    if (!element.options) return "";
    var selectedOptions = [];
    for (var i = 0; i < element.options.length; i++) if (element.options[i].selected) selectedOptions.push(element.options[i].value);
    return selectedOptions.join(",");
}



function inputFormat(e) {
  	var keyCode = document.all ? event.keyCode : e.keyCode;
  	if (48 <= keyCode && keyCode <= 57 || 96 <= keyCode && keyCode <= 105 || keyCode == 8 || keyCode == 46) {
	  var src = document.all ? event.srcElement : e.target;
	  var sp = getInputPosition(src);
	  var v = src.value;
	  var ss = v.match(/\s/g);
	  ss = ss ? ss.length : 0;
	  v = v.replace(/\s/g, "").split('').reverse().join('');
	  v = v.replace(/(.{3})/g, "$1 ").split('').reverse().join('');
	  v = v.replace(/^\s/, "");
	  var se = v.match(/\s/g);
	  se = se ? se.length : 0;
	  sp = sp + se - ss;
	  src.value = v;
	  setInputPosition(src,sp);
	}
}

function getInputPosition(input) {
	if (document.selection) {
		input.focus();
		var sel = document.selection.createRange();
		sel.moveStart ('character', -input.value.length);
		return sel.text.length;
	}
	else
		return input.selectionStart;
}
 
function setInputPosition(input, pos) {
	if (input.createTextRange) {
		var range = input.createTextRange();
		range.collapse(true);
		range.moveEnd('character', pos);
		range.moveStart('character', pos);
		range.select();
	}
	else {
		input.focus();
		input.setSelectionRange(pos,pos);
	}
}

function setClassName(id, cl) {
	getEl(id).className = cl;
}

function getCookie(name) {
	var prefix = name + "=";
	var cookieStartIndex = document.cookie.indexOf(prefix);
	if (cookieStartIndex == -1) return null;
	var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length);
	if (cookieEndIndex == -1) cookieEndIndex = document.cookie.length;
	return unescape(document.cookie.substring(cookieStartIndex + prefix.length, cookieEndIndex));
}

function setCookie(name, value, expires, path, domain) {
  
	var defaultDate = "Mon, 31 Dec 2100 23:59:59";
	
	document.cookie = name +"=" + escape(value) +
			"; expires=" + (expires ? expires.toGMTString() : defaultDate) +
			"; path=" + (path ? path : "/") +
			"; domain=" + (domain ? domain : "");
}


function setStyle(obj,data) {
	if (typeof(obj) == 'string') obj = getEl(obj);
	for (var i in data) {
		obj.style[i] = data[i];	
	}
}

function setOpacity(obj, opacity) {
	if (typeof(obj) == 'string') obj = getEl(obj);
	if (document.all) {
		opacity = opacity*100;
		obj.style.filter="progid:DXImageTransform.Microsoft.Alpha(opacity="+opacity+")";
	}
	else obj.style.opacity = opacity;
}

function getOpacity(obj) {
	var opacity;
	if (typeof(obj) == 'string') obj = getEl(obj);
	if (document.all) {
		opacity = obj.style.filter;
		opacity = opacity.match(/=(\d*)/)[1]/100;
	}
	else opacity = obj.style.opacity;
	return opacity;
}

function getCenteredPosition(obj) {
	if (typeof(obj) == 'string') obj = getEl(obj);	
	var top, left;
	var h = window.innerHeight ? window.innerHeight : (document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.offsetHeight); 
	var w = window.innerWidth ? window.innerWidth : (document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.offsetWidth);
	var st = document.body.scrollTop ? document.body.scrollTop : document.documentElement.scrollTop;
	var sl = document.body.scrollLeft ? document.body.scrollLeft : document.documentElement.scrollLeft;
	top = (h - obj.style.height.match(/\d+/))/2 + st + 'px';
	left = (w - obj.style.width.match(/\d+/))/2 + sl + 'px';
      
	return {left:left, top:top};
}

var hintData = {};
function showHint(data) {

	if (getEl('hint')) hideHint();
	
	hintData.afterHint = data.afterHint;
    
	var params = {height:'150px',width:'250px',backgroundColor:'#EBEBEB','zIndex':100000, display: ''};
	for (var i in params) {
		params[i] = data[i] || params[i];
	}
	var div = document.createElement("div");
	div.id = 'hint';
	div.style.position = 'absolute';
	setOpacity(div, 1);
	setStyle(div, params);
	var coord = getCenteredPosition(div);
	setStyle(div, {top:coord.top,left:coord.left});
	
	var border = document.createElement("div");
	border.id = div.id + '_border';
	var borderParams = {};
	borderParams.opacity = 0.5;
	borderParams.color = '#606060';
	if (params.display == 'none' || data.noBorder) border.style.display = 'none';
	setOpacity(border, borderParams.opacity);
	var borderHeight = data.border || 25 + params.height.match(/\d+/)/1 + 'px';
	var borderWidth = data.border || 25 + params.width.match(/\d+/)/1 + 'px';
	setStyle(border, {height:borderHeight,width:borderWidth,position:'absolute',zIndex:params['zIndex']-1,'backgroundColor': borderParams.color});
	var coord = getCenteredPosition(border);
	setStyle(border, {top:coord.top,left:coord.left});
	
	var content = '';
	content += "<table height=100% width=100%>";
	content += "<tr "+ (data.valign ? "valign="+data.valign : "") +"><td align=center>" + data.content + "</td>";
	if (data.ok) {
	  var okFunc = data.ok == 1 ? 'hideHint(1)' : data.ok;
	  content += "<tr valign=top><td align=center valign=bottom><input class=send type=button value='Ok' onclick='"+ okFunc +"'></td>";
	  document.body.onkeypress =
		function (e) {
		  var keyCode = document.all ? event.keyCode : e.keyCode;
		  var ctrlKey = document.all ? event.ctrlKey : e.ctrlKey;
		  if (keyCode == 13 && ctrlKey && getEl('hint')) hideHint();
		}
	}
	else if (data.confirm) {
	  
	  if (!/;$/.test(data.confirm)) data.confirm += ';';
	  if (!/;$/.test(data.cancel)) data.cancel += ';';
	  var isYes = data.confirm + "hideHint(1)";
	  var isNo = data.cancel + "hideHint(1)";
	  content += "<tr><td align=center valign=bottom><input class=send type=button value='Да' onclick=\""+ isYes +"\"><input class=send type=button value='Нет' onclick='"+ isNo +"'></td>";
	  
	  document.body.onkeypress =
		function (e) {
		  var keyCode = document.all ? event.keyCode : e.keyCode;
		  var ctrlKey = document.all ? event.ctrlKey : e.ctrlKey;
		  if (keyCode == 13 && ctrlKey && getEl('hint')) eval(isYes);
		  else if (keyCode == 27 && getEl('hint')) eval(isNo);
		}	
	}
	content += "</table>";
	
	var html_div = document.createElement("div");
	var header_height = 15;
	var html_height = data.closeButton ? params.height.split('px')[0] - header_height + 'px' : params.height;
	setStyle(html_div, {height: html_height, width:params.width});
	if (data.overflow)  html_div.style.overflow = data.overflow;
		
	if (data.closeButton) {
	  var header_div = document.createElement("div");
	  header_div.className = 'close';
	  setStyle(header_div, {position:'relative',width:params.width,height:header_height+'px'});	  
	  header_div.innerHTML = "<A href='javascript:hideHint(1)' title='закрыть' style='float:right;'></A>";
	  div.appendChild(header_div);
	}

	html_div.innerHTML = content;
	
	div.appendChild(html_div);
	document.body.appendChild(div);	
	document.body.appendChild(border);
		
	if (data.fade && data.fade != '0') hintData.timer = setTimeout("hintData.interval = setInterval(fadeHint, 25)", 1500);
}

function displayHint(data) {
  styleEl('hint').display = data == 'no' ? 'none' : '';
  styleEl('hint_border').display = data == 'no' ? 'none' : '';
}

function fadeHint() {
    var id1 = 'hint';
    var id2 = 'hint_border';
    
    if (getOpacity(id1) == 0.7) hintData.pSelector = 1;
    if (getOpacity(id2) <= 0.01) hintData.pSelector = 0;
    if (getOpacity(id1) <= 0.01) hideHint(1);
    else {
	setOpacity(id1, getOpacity(id1)-0.01);
	if(hintData.pSelector) setOpacity(id2, getOpacity(id2)-0.01);
    }
}

function hideHint(doAfter) {
    if (getEl('hint')) {
      clearInterval(hintData.interval);
      clearTimeout(hintData.timer);
      document.body.removeChild(getEl('hint'));
      document.body.removeChild(getEl('hint_border'));
      if (doAfter && hintData.afterHint) eval(hintData.afterHint);
    }
}

function getWindowParams() {
    var h = window.innerHeight ? window.innerHeight : (document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.offsetHeight);
    var w = window.innerWidth ? window.innerWidth : (document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.offsetWidth);
    var st = document.body.scrollTop ? document.body.scrollTop : document.documentElement.scrollTop;
    var sl = document.body.scrollLeft ? document.body.scrollLeft : document.documentElement.scrollLeft;
    return {width:w,height:h,scrollTop:st,scrollLeft:sl};
}

// возвращает позицию элемента
function getElPosition(elem) {
  var offsetEl = (typeof(elem) == 'string') ? getEl(elem) : elem;
  var offsetLeft = 0;
  var offsetTop = 0;
  
  while(offsetEl) {
    offsetLeft += offsetEl.offsetLeft;
    offsetTop += offsetEl.offsetTop;
    offsetEl = offsetEl.offsetParent;
  }
  
  if (navigator.userAgent.indexOf("Mac") != -1 && typeof document.body.leftMargin != "undefined") {
    offsetLeft += document.body.leftMargin;
    offsetTop += document.body.topMargin;
  }
    
  return {left:offsetLeft , top:offsetTop}
}

// возвращает хэш параметров стиля
function getElStyle(elem, data) {
    if (typeof(elem) == 'string') elem = getEl(elem);
    
    var props = {};
    var fields = [];
    if (typeof(data) == 'string') fields.push(data);
    else fields = data;
    for (var name in fields) {
      name = fields[name];
      if (name) {
	if (elem.style[name])
		props[name] =  elem.style[name];
 
	// W3C
	else if (document.defaultView && document.defaultView.getComputedStyle) {
		var mod_name = name.replace(/([A-Z])/g,"-$1");
		mod_name = mod_name.toLowerCase();
    
		var s = document.defaultView.getComputedStyle(elem,"");
		props[name] =  s && s.getPropertyValue(mod_name);
	}
	
	// IE
	else if (elem.currentStyle) {
		props[name] = elem.currentStyle[name];
	}
	
	else
		props[name] = null;
      }
    }

    return props;
}

function AiSearch(field, form, name, url, data) {

   var self = this;
   data = data || {};
      
   this.selected = 0;
   this.stored = '';
   this.shift = 0;
   this.over = 0;
   this.isTab = 0;
   this.action = field;
   this.field = document.forms[form][field];
   this.form = form;
   this.name = name;
   this.url = url;
   this.maxHeight = data.maxHeight || 150;
       
   this.search_info = function (keyCode) {

       if (keyCode == 40) {
	 var lines = getEl(this.name).getElementsByTagName('TD');
	 var len = lines.length;
	 if (this.selected) {
	   lines[this.selected-1].style.background = '';
	   getEl(this.name).scrollTop = getEl(this.name).scrollTop + this.shift;
	 }
	 else this.stored = this.field.value;
	 if (this.selected == len) {
	   this.selected = 0;
	   this.field.value = this.stored;
	   getEl(this.name).scrollTop = 0;
	 }
	 else {
	   this.selected ++;
	   lines[this.selected-1].style.background = 'yellow'; 
	   this.field.value = lines[this.selected-1].innerHTML.replace(/<\/?b>/g,"");
	 }
	 
	 return 0;
       }
       else if (keyCode == 38) {
	 var lines = getEl(this.name).getElementsByTagName('TD');
	 var len = lines.length;
	 
	 if (this.selected) lines[this.selected-1].style.background = '';
	 else this.stored = this.field.value;
	 if (this.selected == 1) {
	   this.selected = 0;
	   this.field.value = this.stored;
	   getEl(this.name).scrollTop = 0;
	 }
	 else {
	   if (this.selected == 0) {
	     this.selected = len;
	     getEl(this.name).scrollTop = this.shift * len;
	   }
	   else {
	     this.selected --;
	     getEl(this.name).scrollTop = getEl(this.name).scrollTop - this.shift;
	   }
	   lines[this.selected-1].style.background = 'yellow'; 
	   this.field.value = lines[this.selected-1].innerHTML.replace(/<\/?b>/g,"");
	 }
	 
	 return 0;
       }
       else if (keyCode == 27) {
	if (this.selected) this.field.value = this.stored;
        this.hide_ai_search();
	
	return 0;
       }

       if (!this.field.value) {
	 this.hide_ai_search();
       }
       else if (this.field.value != this.stored) {
	 this.hide_ai_search();
	 this.init_ai_search();
	 this.stored = this.field.value;
	 BGSubmit({form:this.form, reply:this.name, url:this.url, params:'action='+this.action+'&ai_name='+this.name+'&max_height='+this.maxHeight+'&fsize='+this.fontSize+'&shift='+this.shift});
       }
   }
   
   this.init_ai_search = function () {
     var div = document.createElement("div");
     div.id = this.name;
     var pos = getElPosition(this.field);
     var st = getElStyle(this.field, ['width','height','paddingBottom','marginBottom','paddingTop','marginTop','marginRight','paddingRight','fontSize']);  
     var re = /p[xt]/;
     for (var i in st) st[i] = re.test(st[i]) ? st[i].split(re)[0]/1 : 0;     	      	  
     var top = pos.top + st.height - 2*st.marginBottom + 4 + 'px';  
     var left = pos.left + 'px';
     var width = st.width - 2*st.marginRight - 2*st.paddingRight + 3 + 'px';
     this.fontSize = st.fontSize;
     this.shift = this.fontSize + 4;
     setStyle(div, {top:top, left:left, position: 'absolute', overflow: 'auto', background: 'white', padding: '2px'});
     setStyle(div, {width:width, border:'1px solid', display:'none'});
     
     document.body.appendChild(div);
   }
   
   this.hide_ai_search = function () {
     if (getEl(this.name)) document.body.removeChild(getEl(this.name));
     this.selected = 0;
     this.stored = '';
     this.over = 0;
     this.isTab = 0;
   }
   
   this.blur = function () {
     if (this.selected) this.field.value = this.stored;
     if (!this.over || this.isTab) this.hide_ai_search();
   }
   
   this.set_input = function (val) {
     this.field.value = val;
     this.hide_ai_search();
   }

   this.field.onkeyup = function (e) {
     var keyCode = document.all ? event.keyCode : e.keyCode;
     self.search_info.call(self, keyCode);
   }
   
   this.field.onkeydown = function (e) {
     var keyCode = document.all ? event.keyCode : e.keyCode;
     if (keyCode == 9) {
      self.stored = self.field.value;
      self.isTab = 1;
     }
   }
   
   this.field.onfocus = function () { self.search_info.call(self); }
   
   this.field.onblur = function () { self.blur.call(self); }

}


function showBodyShadow() {
	
	var params = {top:0,left:0,'zIndex':2, position:'absolute', background:'black'};

	var div = document.createElement('div');
	div.id = 'bodyShadow';
	setOpacity(div, 0);
	var h = document.height ? document.height : document.body.scrollHeight;
	var w = document.width ? document.width : document.body.scrollWidth;
	div.style.width = w+'px';
	div.style.height = h+'px';
	
	setStyle(div, params);
	
	document.body.appendChild(div);
}

function hideBodyShadow(id) {
	id = id || 'bodyShadow';
	document.body.removeChild(getEl(id));
}

function getMouseXY (evt) {
  var IE = document.all ? true : false;
  var tempX,tempY;
  if (IE) {
    tempX = evt.clientX + document.body.scrollLeft
    tempY = evt.clientY + document.body.scrollTop
  } else {
    tempX = evt.pageX
    tempY = evt.pageY
  }
  if (tempX < 0) tempX = 0;
  if (tempY < 0) tempY = 0;

  return {x:tempX, y:tempY};
}

