var row_count=0;
var classFix = (document.all)?"className":"class";
// ........................................................
// открыть урл в новом окне
	function openUrlInBlank(obj,wname,width,height){ 
		wName = (wname)?wname+"Window":"blankWindow";
		wWidth = (width)?width+4:600;
		wHeight = (height)?height+4:570;
		var oWindow = window.open(obj.href,wName, 'status=yes,scrollbars=yes,resizable=yes,width='+(wWidth)+',height='+(wHeight)+'');
		oWindow.focus();
		return false;
	}
// открыть урл в паренте
	function openUrlInParent(obj){ 
		if(self.opener) self.opener.location.href=obj.href;
		self.close();
		return false;
	}
// ........................................................
// Установка привязки битовых Checkboxов к Inputу
function setBitCheckboxesFor(inputName,checkboxesBitSize){
	var oInput,oBitCheckbox;
	if(oInput=document.getElementById(inputName)){
		oInput.checkboxesBitSize = checkboxesBitSize;
		var value = oInput.value*1;
		for(var i=0; i<checkboxesBitSize;i++){
			if(oBitCheckbox=document.getElementById(inputName+"_"+i)){
				oBitCheckbox.checked = ((value&(1<<i))>0);
				changeCheckbox(oBitCheckbox);
			}
		}
	}
}
// ........................................................
// Изменение состояния Checkboxа
function changeCheckbox(oCheckbox){
	var oInput;
	var names = oCheckbox.id.split("_");
	if(oInput=document.getElementById(names[0])){
		var value = oInput.value*1;
		oInput.value = (oCheckbox.checked)?value|(1<<names[1]):value-(value&(1<<names[1]));
		self.status = oInput.value;
	}
}
// ........................................................
// Установка значения Selectа
function setSelectValue(selectName,selectValue){
	var oSelect;
	var value = (selectValue)?selectValue:false;
	if(oSelect=document.getElementById(selectName)){
		if(value){
			for(var i=0; i<oSelect.options.length;i++){
				if(oSelect.options[i].value == value){
					oSelect.selectedIndex = i;
				}
			}
		}
	}
}
// ........................................................
// Привязать Check к Input
	function setCheckboxForInput(idCheck,idInput,quest){
		var oInput = (idInput.tagName=="INPUT")?idInput:document.getElementById(idInput);
		var oCheck = (idCheck.tagName=="INPUT")?idCheck:document.getElementById(idCheck);
		if(oCheck.checked && quest) oCheck.checked=confirm(quest);
		oInput.disabled = !oCheck.checked;
	}
// ........................................................
// Проверка введенных данных
	function checkInputValue(idInput,type){
		var oInput = document.getElementById(idInput);
		var iclass = oInput.className;
		var pos = iclass.indexOf("errorfield");
		switch(type){
			case 0: // положительное целое
				if(oInput.value != oInput.value*1 || !(oInput.value>=0)){
					alert("Ошибка заполнения:\nВведите положительное целое число!");
					oInput.value = 0;
					oInput.focus();
					return false;
				}else{
					oInput.value = Math.abs(Math.round(oInput.value));
					return true;
				}
			break;
			case 1: // email
				var re_mail = /^([\w\.\-_]+@[\w\.\-_]+)$/;
				if(oInput.value.match(re_mail)!=null){
					return true;
				}else{
					alert("Ошибка заполнения:\nНеверные символы в email адресе!\nРазрешено ввести только один адрес.");
					oInput.focus();
					return false;
				}
			break;
			case 2: // пароли
				var oReInput = document.getElementById("re"+idInput);
				if(oInput.value.length>=3 && oReInput.value==oInput.value){
					return true;
				}else{
					alert("Ошибка заполнения:\nВведенные пароли не совпадают!");
					oInput.value = ""; 
					oReInput.value = "";
					oInput.focus();
					return false;
				}
			break;
			default: // не пустое
				if(oInput.value.length>=3){
					return true;
				}else{
					alert("Ошибка заполнения:\nВведите текст!");
					oInput.focus();
					return false;
				}
			break;
		}
	}
// ........................................................
// Конвертор языков
	function checkNumberChecked(checkBox,number){
		var oInputs = document.getElementsByTagName("input");
		var j=0;
		for(var i=0;i<oInputs.length;i++){
			if(oInputs[i].type=="checkbox" && oInputs[i].checked)	j++;
		}
		if(checkBox===false && j==0){
			alert("Ошибка заполнения:\nДолжна быть выбрана хотя бы одна группа!");
			return false;
		}else if((j>number && number!=-1) && checkBox.checked){
			checkBox.checked=false;
			alert("Превышен лимит:\nВы можете выбрать не более "+number+" групп!\nДля выбора нового раздела необходимо снять выбор предыдущего раздела.");
			return false;
		}
		return true;
	}
// ........................................................
// послать форму
	function submitFormWithAction(idForm,action){
		var oForm = document.getElementById(idForm);
		oForm.setAttribute("action",oForm.getAttribute("action")+"?a="+action);
		oForm.submit();
	}
// ........................................................
// показать подсказку
	var openedDiv = false;
	var hideTO = false; 
	function showDayEvent(idDay){
		var oDiv = document.getElementById(idDay);
		if(openedDiv){
			openedDiv.setAttribute(classFix,"dayEvent");
			openedDiv=false;
		}
		if(oDiv){
			if(hideTO) clearTimeout(hideTO);
			oDiv.setAttribute(classFix,"dayEvent visible");
			oDiv.style.marginLeft = - oDiv.offsetWidth;
			openedDiv=oDiv;
			hideTO = setTimeout("showDayEvent('')",3000);
		}
		return false;
	}


//===========================================
//  Подсветка поиска
//===========================================
function searchWithinNode(node, te, len){
//===========================================
	var pos, skip, spannode, middlebit, endbit, middleclone;
	skip=0;
	if( node.nodeType==3 ){
		pos=node.data.toUpperCase().indexOf(te);
		if(pos>=0){
			spannode=document.createElement("SPAN");
			spannode.style.backgroundColor="#E93E24";
			spannode.style.color="white";
			middlebit=node.splitText(pos);
			endbit=middlebit.splitText(len);
			middleclone=middlebit.cloneNode(true);
			spannode.appendChild(middleclone);
			middlebit.parentNode.replaceChild(spannode,middlebit);
			skip=1;
		}
	}else if( node.nodeType==1&& node.childNodes && node.tagName.toUpperCase()!="SCRIPT" && node.tagName.toUpperCase!="STYLE"){
		for (var child=0; child < node.childNodes.length; ++child){
			child=child+searchWithinNode(node.childNodes[child], te, len);
		}
	}
	return skip;
}
// Выпадающее меню
var oMenuOpen = null; 
function eMenuMouseOver(oEl){
	oEl = $(oEl.parentNode);
	if(oEl.hasClass("hover")){
		oEl.removeClass("hover");
	}else{
		oEl.addClass("hover");
	}
	return ($("ul",oEl).length)?false:true;
}

/*
	Валидатор форм
*/
var FormValidators = {};
function FormValidator(oForm){
	if(FormValidators[oForm.id]){
		return FormValidators[oForm.id];
	}else{
		FormValidators[oForm.id] = this;
	}
	var fieldsValid = false;
	var waitValidationCount = 0;
	var oForm = oForm;
	// ....
	this.submit = function(result){
		waitValidationCount--;
		fieldsValid = fieldsValid && result;
		if(fieldsValid && waitValidationCount==0){
			oForm.submit();	
		}
	}
	// ....
	this.alert = function(str,needClear){
		return ;
		str = str || "";
		if($("#pageAlert")){
			if(needClear) $("#pageAlert").html("");
			$("#pageAlert").append("<li>"+str+"</li>");
			$("#pageAlert").show();
		}
	}
	// ....
	this.mark = function(oElement,isError,errString){
		var errNodeName = oElement.attr("name")+"-error-node";
		var errNode = $("#"+errNodeName);
		if(isError){
			if(errNode[0]){
				errNode.show();
				errNode.html("&mdash; "+errString);
			}else{
				oElement.after("<div id='"+errNodeName+"' class='error'>&mdash; "+errString+"</div>");
			}
		}else{
			if(errNode) errNode.hide();
		}
	}
	// ....
	this.check = function(){
		var result = true;
		var alertString = [];
		var requiredGroups = {};
		// сброс
		waitValidationCount++;
		fieldsValid = true;
		this.alert("",true);
		// пробег по элементам формы
		hElements = $("input,textarea,select",$(oForm));
		for(var i=0;i<hElements.length;i++){
			var oElement = $(hElements[i]);
			this.mark(oElement,false);
			var required = oElement.attr("required");
			var isGroup = (required && required*1!=required);
			var isCorrectly = true;
			if(isGroup){
				if(requiredGroups[required]){
					requiredGroups[required][0].push(oElement.attr("title"));
					requiredGroups[required][1].push(oElement);
					requiredGroups[required][2]++;
				}else{
					requiredGroups[required] = [[oElement.attr("title")],[oElement],1];
				}
			}
			if(required){ 
				if(oElement.attr("like")){
					var oLikeElement = $("#"+oElement.attr("like"));
					if(oLikeElement && oLikeElement.val()!=oElement.val()){
						this.alert("«"+oElement.title+"» не совпадает с «"+oLikeElement.attr("title")+"»");
						this.mark(oElement,true,"значение поля не совпадает с «"+oLikeElement.attr("title")+"»");
						result = false;
						isCorrectly = false;
					}
				}else if(oElement.attr("regexp")){
					var rExp = new RegExp(oElement.attr("regexp"),"m");
					if(!rExp.test(oElement.val())){
						if(isGroup){
							requiredGroups[required][2]--;
						}
						if(!isGroup || oElement.val().length>0){
							this.alert("Не верно заполнено «"+oElement.attr("title")+"»");
							this.mark(oElement,true,"поле не верно заполнено");
							result = false;
							isCorrectly = false;
						}
					}
				}else{
					if(oElement.attr("type")=="checkbox"){
						if(!oElement.attr("checked")){
							if(isGroup){
								requiredGroups[required][2]--;
							}else{
								alert(""+oElement.title+"");
								this.mark(oElement,true);
								result = false;
								isCorrectly = false;
							}
						}
					}else if(!(/\S/).test(oElement.val())){
						if(isGroup){
							requiredGroups[required][2]--;
						}else{
							if(oElement[0].nodeName=="SELECT"){
								this.alert("Не выбрано значение «"+oElement.attr("title")+"»");
								this.mark(oElement,true,"выберите значение");
							}else{
								this.alert("Не заполнено «"+oElement.attr("title")+"»");
								this.mark(oElement,true,"заполните поле");
							}
							result = false;
							isCorrectly = false;
						}
					}
				}
			}else if(oElement.attr("regexp")){
				var rExp = new RegExp(oElement.attr("regexp"),"m");
				if(oElement.val().length!=0 && !rExp.test(oElement.val())){
					this.alert("Не верно заполнено «"+oElement.attr("title")+"»");
					this.mark(oElement,true,"поле не верно заполнено");
					result = false;
				}
			}
			if(isCorrectly && oElement.val().length>0 && oElement.attr("oncheck")){
				try{
					waitValidationCount++;
					var checkFunc = eval(oElement.attr("oncheck"));
						checkFunc(oElement.val(),this,oElement);
				}catch(e){
					alert(e);
				}
			}
		}
		for(var name in requiredGroups){
			if(requiredGroups[name][2]==0){
				for(var i=0;i<requiredGroups[name][1].length;i++){
					this.mark(requiredGroups[name][1][i],true);
				}
				this.alert("Хотя бы одно из полей «"+requiredGroups[name][0].join("»,«")+"» должно быть заполнено");		
				result = false;
			}
		}
		//this.submit(result);
		return result;
	}
}

// Browser detection
var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari",
			versionSearch: "Version"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			   string: navigator.userAgent,
			   subString: "iPhone",
			   identity: "iPhone/iPod"
	    },
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();