lastRes = null;
isIE = (navigator.userAgent.indexOf("MSIE")!=-1);
isOpera = (navigator.userAgent.indexOf("Opera")!=-1);
isFF = (navigator.userAgent.indexOf("Firefox")!=-1);

var Utils = {};

function $(elem) { return document.getElementById(elem); }
function $N(elem) { return document.getElementsByName(elem)[0]; }
function $NL(elem) { return document.getElementsByName(elem); }

function is_email(value) {
	if (value.match(/([a-z0-9_\.-]+)@([a-z0-9_\.-]+)\.([a-z]+)/i)) return true;
	else return false;
}

function is_url(value) {
	if (value.match(/http:\/\/([a-z0-9_\.-]+)\.([a-z]+)/i)) return true;
	else return false;
}

function set_home(obj) {
	if (isIE) {
		obj.style.behavior='url(#default#homepage)'; 
		obj.setHomePage(document.location);
	}
	else {
		alert('Эта функция доступна в Internet Explorer.');
	}
	return false;
}

function add_favorite(title) {
	if (isIE) {
		window.external.addFavorite('http://'+ location.hostname +'/', title); 
	}
	else {
		alert('Эта функция доступна в Internet Explorer, используйте CTRL-D');
	}
	return false;
}

Function.prototype.bind = function(object) {
  var __method = this;
  return function() {
    return __method.apply(object, arguments);
  }
};

// Incompatible with CKEditor
/*
Object.prototype.remove = function() {
	if (this.parentNode) this.parentNode.removeChild(this);
}
*/

Utils.window = function() {
	return {
		height: function() {
			var de = document.documentElement;
			return self.innerHeight || ( de && de.clientHeight ) || document.body.clientHeight;
		},
		width: function() {
			var de = document.documentElement;
			return self.innerWidth || ( de && de.clientWidth ) || document.body.clientWidth;
		},
		scrolltop: function() {
			var de = document.documentElement;
			return ( de && de.scrollTop ) || document.body.scrollTop;
		}
	}
}();



function CreateHintWindow() {
	var hintWindow = document.createElement('DIV');
	hintWindow.setAttribute('style', 'position: absolute; background: #FEFEFE; padding: 1px; display: none');
	hintWindow.setAttribute('id', 'hintWindow');
	
	hintWindow.innerHTML = '<div id="hintText" style="background: #FEFEFE; padding: 5px;' 
		+ 'border: 1px solid #CCCCCC; font: 12px Arial"></div>';
	document.body.appendChild(hintWindow);
}

function ShowHint(elem) {
	if (typeof elem == 'string') elem = $(elem);
	if (!elem) return;
	
	var hint_text = elem.getAttribute('hint');
	if (!hint_text) return;
	
	if (!$('hintWindow')) CreateHintWindow();
	
	var pos = getRealPos(elem);
	var maxLeft = Utils.window.width() - 255;
	if (pos.left > maxLeft) pos.left = pos.left - 250;
	
	$('hintWindow').style.left = pos.left + 'px';
	$('hintWindow').style.top = pos.top + elem.offsetHeight + 'px';
	$('hintWindow').style.width = '250px';
	
	$('hintText').innerHTML = hint_text;
	$('hintWindow').style.display = 'block';
}

function HideHint() {
	if (!$('hintWindow')) return;
	$('hintWindow').style.display = 'none';
}

function createCookie(name, value, days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}

function itemExists(value, source) {
	var sourceCA = source.split('_');
	for (var i=0; i<sourceCA.length; i++) {
		if (sourceCA[i] == value) return true; 
	}
	return false;
}

function toggle(elem, show) {
	if (typeof elem == 'string') elem = $(elem);
	if (show != undefined && show != null) elem.style.display = (show) ? 'block': 'none';
	else elem.style.display = (elem.style.display == 'block') ? 'none': 'block';
}

function getRealPos(elem) {
	var T = 0, L = 0, res = {top: 0, left: 0};  
	var obj = (elem.tagName)? elem: $(elem);  
	while(obj) {
	    L += obj.offsetLeft;
	    T += obj.offsetTop;
	    obj = obj.offsetParent;
	}
  
	res = {top: T, left: L};
  
	return res;
}

function getObjectWidth(elem) {
	if (typeof elem == 'string') elem = $(elem);
	elem.style.visibility = 'hidden';
	var old = elem.style.display;
	
	elem.style.display = 'block';
	var w = elem.offsetWidth;
	elem.style.display = old;
	elem.style.visibility = 'visible';
	
	return w;
}

function filterKey(e, type) {
	var keynum, charnum;
	if (window.event) { // IE
	  keynum = e.keyCode;
	  charnum = e.keyCode;
	}
	else { // Netscape/Firefox/Opera
	  charnum = e.which;
	  keynum = e.keyCode;
	}

	//alert(charnum);
	if (charnum == 0) return true;
	if (type == 'int') {
		return (charnum == 8||charnum >= 48&&charnum <= 57);
	}
	if (type == 'double') {
		return (charnum == 8||charnum == 44||charnum == 46||(charnum >= 48&&charnum <= 57));
	}
}

function ShowModal(url) {
	Modalbox.show(url, {title: '', morph2center: true, transitions: false, afterLoad: function() {
		maskInputs();
		setSelectValues();
		setCheckboxValues();
	}});
}

function CloseModal() {
	Modalbox.hide();
}

function validate(frm) {
	if (typeof before_validate == 'function') { if (!before_validate()) return false; }
	
	var form = frm.tagName ? frm : $(frm);
	for (var i=0; i<form.elements.length; i++) {
		var item = form.elements[i];
		if (item.getAttribute('required') == 'true') {
			var hint = item.getAttribute('hint');
			if (item.value == '' || item.value == hint) {
				alert('Не заполнено поле \"'+item.getAttribute('desc')+'\". ');
				item.focus();
				return false;
			}
		}
	}
	return true;
}

function bind_event(element, name, observer, capture) {
	if (typeof element == 'string') {
    element = document.getElementById(element);
  }
  if (element.addEventListener) {
    element.addEventListener(name, observer, capture);
  } else if (element.attachEvent) {
    element.attachEvent('on' + name, observer);
  }
}

function stop_bind(element, name, observer, capture) {
	if (typeof element == 'string') {
    element = document.getElementById(element);
  }
  if (element.removeEventListener) {
  	element.removeEventListener(name, observer, capture);
  }
  else if (element.detachEvent) {
  	element.detachEvent('on' + name, observer);
  }
}

function getParams(objName) {
	var params = '';
	for (var i=0; i<objName.childNodes.length; i++) {
		params += getParams(objName.childNodes[i]);
	}
	
	if (objName.name && (objName.tagName == 'INPUT' && objName.type != 'checkbox' || objName.tagName == 'TEXTAREA' 
		|| objName.tagName == 'SELECT')) params += '&' + objName.name + '=' + objName.value;	
	
	if (objName.name && (objName.tagName == 'INPUT' && objName.type == 'checkbox')) {
		params += '&' + objName.name + '=';	
		params += objName.checked ? objName.value : 0;
	}
	
	return params;
}

function parseBody(response) {
	var tmp = response.split('[##]');	
	
	return ({retCode: tmp[0], body: tmp[1]});
}

function makePostRequest(frm_name, callback, withoutJSON) {
	if (!$(frm_name)) return false;
	
	var params = getParams($(frm_name));
	var url = $(frm_name).getAttribute('action');
	
	new Ajax.Request(url, {
		method: 'post',
		postBody: params,
		onSuccess: function (transport) { 
			var ret = transport.responseText;
			if (withoutJSON) {
				if (callback) callback(ret);
				return;
			}
			ret = ret.evalJSON();
			if (ret.statusCode == 'OK') {
				if (callback) callback(ret);
			}
			else {
				// Alert Error
				alert(ret.message);
			}
		}
	});
}


function maskInputs() {
	for (var i=0; i<document.getElementsByTagName('input').length; i++) {
		var elem = document.getElementsByTagName('input')[i];
		
		if (elem.getAttribute('default') == 'true') elem.focus();
		
		var mask = elem.getAttribute('mask');
		var hint = elem.getAttribute('hint');
		if (mask) {
			//bind_event(elem, 'keypress', onMaskPress.bind(elem), false);
			elem.onkeypress = onMaskPress.bind(elem);
		}
		if (hint) {
			elem.value = !elem.value ? hint : elem.value;
			elem.onfocus = onHintFocus.bind(elem);
			elem.onblur = onHintBlur.bind(elem);
		}
	}
}

function onHintFocus(elem) {
	var hint = this.getAttribute('hint');
	if (!this.value || this.value == hint) {
		this.value = '';
	}
}

function onHintBlur() {
	var hint = this.getAttribute('hint');
	if (!this.value) {
		this.value = hint;
	}
}

function onMaskPress(evt) {
	var mask = this.getAttribute('mask');
	mask = mask.split('-');
	
	var keyNum, charNum;
	if (window.event) { // IE
	  keyNum = evt.keyCode;
	  charNum = evt.keyCode;
	}
	else { // Netscape/Firefox/Opera
	  charNum = evt.which;
	  keyNum = evt.keyCode;
	}	
	key = keyNum ? keyNum : charNum;
	//alert(key);
	
	var flag = false;
	for (var i=0; i<mask.length; i++) {
		if (mask[i] == 'num') {
			flag = flag || (key == 9 || key == 8 || key >= 48&&key<=57);
		}
		if (mask[i] == 'dot') {
			flag = flag || (key == 9 || key == 44 || key == 46);
		}
		if (mask[i] == 'seg') {
			flag = flag || (key == 9 || key == 60 || key == 61 || key == 62);
		}
		if (mask[i] == 'seg_first') {
			var innerFlag = (key == 9 || key == 60 || key == 61 || key == 62);
			innerFlag	= innerFlag && (this.value == ''); 
		
			flag = flag || innerFlag;
		}
	}
	//alert(key);
	return flag;
}

function setSelectValues() {
	var list = document.getElementsByTagName('select');
	var i;
	
	for (i = 0; i < list.length; i++) {
		var elem = list[i];
		
		var selValue = elem.getAttribute('metavalue');
		if (selValue) {
			for (var j = 0; j< elem.options.length; j++) {
				var option = elem.options[j];
				if (option.value == selValue) {
					option.selected = true;
					break;
				}
			}
		}
	}
}

function setCheckboxValues() {
	var list = document.getElementsByTagName('input');
	var i;
	
	for (i = 0; i < list.length; i++) {
		var elem = list[i];
		
		var metaValue = elem.getAttribute('metavalue');
		if (metaValue == 1 && elem.type == 'checkbox') {
			elem.checked = true;
		}
	}
}

function setRadioValues() {
	var list = document.getElementsByTagName('input');
	var i;
	
	for (i = 0; i < list.length; i++) {
		var elem = list[i];
		
		var metaValue = elem.getAttribute('metavalue');
		if (metaValue == elem.value && elem.type == 'radio') {
			elem.checked = true;
		}
	}
}

Utils.Request = function() {
	return {
		send: function(url, options) {
			if (!options) options = {};
			
			var x = window.XMLHttpRequest ? new XMLHttpRequest(): new ActiveXObject('Microsoft.XMLHTTP');
			x.onreadystatechange = function() {
				if (x.readyState == 4 && x.status == 200) {
					if (options.onSuccess) options.onSuccess(x.responseText);
				}
			};
			x.open('get', url, 1); 
			x.send(null)
		}
	}
}();

var InitiateComplete = false;
var TimerHandle = null;

function initiate_values() {
	maskInputs();
	setSelectValues();
	setCheckboxValues();
	setRadioValues();
	
	InitiateComplete = true;
}

function ExecuteAfterInit(func) {
	if (InitiateComplete) {
		clearInterval(TimerHandle);
		this(); 
	}
	else {
		if (!TimerHandle) TimerHandle = setInterval(ExecuteAfterInit.bind(func), 100);
	}
}

if (window.addEventListener) {
	window.addEventListener('load', initiate_values, false);
}
else if (window.attachEvent) {
	window.attachEvent('onload', initiate_values);
}
