function $(id){
	return document.getElementById(id);
}
function addStyleProperties(cssStr){
	var head = document.getElementsByTagName('head')[0];
	var styleSheets = head.getElementsByTagName('style');
	var styleSheet = null;
	if (styleSheets.length){
		styleSheet = styleSheets[styleSheets.length-1];
	} else {
		styleSheet = document.createElement("style");
		styleSheet.setAttribute("type", "text/css");
		head.appendChild(styleSheet);
	}
	if(styleSheet.styleSheet){
		styleSheet.styleSheet.cssText = cssStr;
	} else {
		styleSheet.appendChild(document.createTextNode(cssStr));
	}
}
function switchClass( objNode, strCurrClass, strNewClass ) {
	if ( matchClass( objNode, strNewClass ) ) replaceClass( objNode, strCurrClass, strNewClass ); else replaceClass( objNode, strNewClass, strCurrClass );
}
function removeClass( objNode, strCurrClass ) {
	replaceClass( objNode, '', strCurrClass );
}
function addClass( objNode, strNewClass ) {
	replaceClass( objNode, strNewClass, '' );
}
function replaceClass( objNode, strNewClass, strCurrClass ) {
	var strOldClass = strNewClass;
	if ( strCurrClass && strCurrClass.length ){
		strCurrClass = strCurrClass.replace( /\s+(\S)/g, '|$1' );
		if ( strOldClass.length ) strOldClass += '|';
		strOldClass += strCurrClass;
	}
	objNode.className = objNode.className.replace( new RegExp('(^|\\s+)(' + strOldClass + ')($|\\s+)', 'g'), '$1' );
	objNode.className += ( (objNode.className.length)? ' ' : '' ) + strNewClass;
}
function matchClass( objNode, strCurrClass ) {
	return ( objNode && objNode.className.length && objNode.className.match( new RegExp('(^|\\s+)(' + strCurrClass + ')($|\\s+)') ) );
}
function getAncestorByClassName( oCurrentElement, sClassName, sTagName ) {
	var oCurrent = oCurrentElement.parentNode;
	while ( oCurrent.parentNode ) {
		if ( matchClass( oCurrent, sClassName ) && ( !sTagName || oCurrent.tagName.toLowerCase() == sTagName.toLowerCase() ) ) return oCurrent;
		oCurrent = oCurrent.parentNode;
	}
}
function getElementsByClassName(objParentNode, strNodeName, strClassName){
	var nodes = objParentNode.getElementsByTagName(strNodeName);
	if(!strClassName){
		return nodes;
	}
	var nodesWithClassName = [];
	for(var i=0; i<nodes.length; i++){
		if(matchClass( nodes[i], strClassName )){
			nodesWithClassName[nodesWithClassName.length] = nodes[i];
		}
	}
	return nodesWithClassName;
}
function getParentByClassName(element, className){
	var currentElement = element;
	while(currentElement.parentNode && !matchClass(currentElement.parentNode, className)){
		currentElement = currentElement.parentNode;
		if (currentElement.tagName.toLowerCase() == 'body') {
			return null;
			break;
		}
	}
	return currentElement.parentNode;
}
function getParentByTagName(element, tagName){
	var currentElement = element;
	while(currentElement.parentNode && currentElement.parentNode.tagName.toLowerCase() != tagName){
		currentElement = currentElement.parentNode;
		if (currentElement.tagName.toLowerCase() == 'body') {
			return null;
			break;
		}
	}
	return currentElement.parentNode;
}
function getElementsByClassNameFirstLevel(objParentNode, strNodeName, strClassName){
	var nodes = objParentNode.getElementsByTagName(strNodeName);
	if(!strClassName){
		nodesFirstLevel = [];
		for(var i=0; i<nodes.length; i++){
			if(nodes[i].parentNode.parentNode == objParentNode){
				nodesFirstLevel.push(nodes[i]);
			}	
		}
		return nodesFirstLevel;	
	}
	var nodesWithClassNameFirstLevel = [];
	for(var i=0; i<nodes.length; i++){
		if(matchClass(nodes[i], strClassName) && nodes[i].parentNode.parentNode == objParentNode){
			nodesWithClassNameFirstLevel.push(nodes[i]);
		}	
	}
	return nodesWithClassNameFirstLevel;
}
function ajaxLoad(url, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction) {
	if (window.XMLHttpRequest) {
		var ajaxObject = new XMLHttpRequest();
		ajaxObject.onreadystatechange = function(){
			ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction);
		};
		ajaxObject.open("GET", url, true);
		ajaxObject.send(null);
	} else if (window.ActiveXObject) {
		var ajaxObject = new ActiveXObject("Microsoft.XMLHTTP");
		if (ajaxObject) {
			ajaxObject.onreadystatechange = function(){
				ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction);
			};
			ajaxObject.open("GET", url, true);
			ajaxObject.send();
		}
	}
}

function ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction){
	if (ajaxObject.readyState == 4) {
		if (ajaxObject.status == 200) {
			ajaxCallBackFunction.call(callObject, ajaxObject, params);
		} else {
			if(ajaxCallBackErrorFunction){
				ajaxCallBackErrorFunction.call(callObject, ajaxObject);	
			} else {
				alert("There was a problem retrieving the XML data:\n" + ajaxObject.statusText);
			}
		}
	}
}
/*
 initHoverFades: function() {
163 //$('#navigation .bg').css('opacity', 0);
164 $(self.c.navItems).hover(function() {
165 self.fadeNavIn.apply(this)
166 },
167 function() {
168 var el = this;
169 setTimeout(function() {
170 if (!el.open) self.fadeNavOut.apply(el)
171 },
172 10)
173 })
174 },
175 fadeNavIn: function() {
176 $('.bg', this).stop().animate({
177 'opacity': 1
178 },
179 self.c.navSpeed)
180 },
181 fadeNavOut: function() {
182 $('.bg', this).stop().animate({
183 'opacity': 0
184 },
185 self.c.navSpeed)
186 },
*/
function ajaxLoadPost(url, data, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction) {
	var ajaxObject = null;
	
	if (window.XMLHttpRequest) {
		ajaxObject = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		var ajaxObject = new ActiveXObject("Microsoft.XMLHTTP");
	}
	if(ajaxObject){
		ajaxObject.onreadystatechange = function(){
			ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction);
		}
		ajaxObject.open("POST", url, true);
		ajaxObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		ajaxObject.setRequestHeader("Content-length", data.length);
		ajaxObject.setRequestHeader("Connection", "close");
		ajaxObject.send(data);
	}
}
function addEvent(oElement,	sEventType,	fEventFunc,	bCapture) {
		if(oElement.addEventListener) {
			oElement.addEventListener(
				sEventType,
				fEventFunc,
				bCapture? true : false
				);
		}
		else if(oElement.attachEvent) {
			oElement.attachEvent(
				'on' + sEventType,
				fEventFunc
				);
		}
}
var es = {
	userid: 0,
	lf: {
		html: {
			form: null,
			login: null,
			pass: null,
			complete: null,
			datas: null
		},
		classNames: {
			fieldHolder: 'FieldHolder',
			dataField: 'data',
			errorField: 'error',
			checkedField: 'checked',
			errorBox: 'ErrorMsg'
		},
		responseXmlNodes: {
			errorNode: 'error',
			messageNode: 'message'
		},
		loginTimer : null,
		Init : function(formId){
			es.lf.html.form = $(formId);
			es.lf.html.login = $('login');
			es.lf.html.pass = $('password');
			es.lf.html.complete = $('LoginComplete');
			es.lf.html.datas = getElementsByClassName(es.lf.html.form, '*', es.lf.classNames.dataField);
			es.lf.html.login.focus();
		},
		checkFormComplition: function(){
			var formIsComplited = true; 
			for (var i=0, datas=es.lf.html.datas, length=datas.length; i<length; i++){
				var errorNode = es.lf.getErrorNodeByField(datas[i]);
				errorNodeParent = getParentByClassName(datas[i], es.lf.classNames.fieldHolder);
				if (datas[i].value == '' || (errorNodeParent && matchClass(errorNodeParent, es.lf.classNames.errorField)) || (datas[i].getAttribute('type') == 'checkbox' && !datas[i].checked)){
					formIsComplited = false;
					break;
				}
			}
			return formIsComplited;
		},
		getErrorNodeByField: function(field){
			var errorParent = getParentByClassName(field, es.lf.classNames.fieldHolder);
			if(errorParent){
				var errorNodes = getElementsByClassName(errorParent, '*', es.lf.classNames.errorBox);
				if(errorNodes.length){
					return errorNodes[0];
				} else {
					return null;
				}
			}
		},
		complete: function(){
			if(es.lf.html.complete){
				es.lf.html.form.style.display = 'none';
				es.lf.html.complete.style.display = 'block';
			} else {
				alert('ok');
				//window.location.href = "/";
			}
		},
		checkField: {
			code : function (e, codeField) {
				if (codeField.value != '') {
					es.lf.markField.checked(getParentByClassName(codeField,'field_holder'));
				} else if (codeField.value == '') {
					es.lf.markField.clear(getParentByClassName(codeField,'field_holder'));
				}
			},
			login: function (e, loginField, action){
					if(!e) e = window.event;
					switch (e.type){
						case 'keyup':
							if(loginField.value.match(/[^a-z0-9\-]+/i)){
								es.lf.markField.error(loginField.form, 1, 'Вы ввели недопустимый символ');
								return;
							} else if(loginField.value.length < 3){
								var errorNodeParent = getParentByClassName(loginField, es.lf.classNames.fieldHolder);
								es.lf.markField.clear(errorNodeParent);
								return;	
							} else {
								clearTimeout(es.lf.loginTimer);
								es.lf.loginTimer = setTimeout(function(){es.lf.server.checkData(loginField,'checkLogin4Login')}, 500);
								return;
							}
							break;
						case 'keydown':
							clearTimeout(es.lf.loginTimer);
							break;
						case 'blur':
							if(loginField.value.match(/[^a-z0-9_]+/i)){
								es.lf.markField.error(loginField.form, 1, 'Вы ввели недопустимый символ');
								return;
							} else if(loginField.value.length < 3){
								if(loginField.value.length == 0){
									var errorNodeParent = getParentByClassName(loginField, es.lf.classNames.fieldHolder);
									es.lf.markField.clear(errorNodeParent);
									return;									
								}
								var errorNodeParent = getParentByClassName(loginField, es.lf.classNames.fieldHolder);
								es.lf.markField.error(loginField.form, 1, 'Вы ввели недостаточно символов');
								return;	
							} else {
								es.lf.loginTimer = setTimeout(function(){es.lf.server.checkData(loginField,'checkLogin4Login')}, 1);
								return;
							}
							break;
					}
			}
		},
		submitButton: {
				show: function(){
					$('LoginButton').disabled = false;
				},
				hide: function(){
				//	$('LoginButton').disabled = true;
				}
		},
		markField: {
			// Очищаем поле от любых отметок
			clear: function(errorNodeParent){
					if(errorNodeParent){
						removeClass(errorNodeParent, es.lf.classNames.errorField);
						removeClass(errorNodeParent, es.lf.classNames.checkedField);
					}
					//dalert('hide');
					if(!es.lf.checkFormComplition()) es.lf.submitButton.hide();
			},

			// Отмечаем поле как прошедшее проверку
			checked: function(errorNodeParent){
					if(errorNodeParent){
						removeClass(errorNodeParent, es.lf.classNames.errorField);
						addClass(errorNodeParent, es.lf.classNames.checkedField);
					}
					//dalert('show');
					if(es.lf.checkFormComplition()) es.lf.submitButton.show();
			},

			// Отмечаем поле как ошибочное и выводим сообщение об ошибке
			error: function(form, errorCode, errorMessage) {
					// каждому коду ошибки соотвествует свой нод, с классом вида error_errorCode
					var errorNodes = getElementsByClassName(form, '*', 'error_' + errorCode);
					
					if(errorNodes.length){
						var errorNode = errorNodes[0];
						var errorNodeParent = getParentByClassName(errorNode, es.lf.classNames.fieldHolder);
						if(errorNodeParent){
							removeClass(errorNodeParent, es.lf.classNames.checkedField);
							addClass(errorNodeParent, es.lf.classNames.errorField);
							errorNode.innerHTML = errorMessage;
						}
					}
					//dalert('hide');
					if(!es.lf.checkFormComplition()) es.lf.submitButton.hide();
			}
		},
		server: {
			// Пересылка всех полей формы (action=register)
			sendData: function (form, action){
					form['action'].value = action; // указатель действия для сервера
					
					// Проверка на заполненность всех полей и на их валидность
					if(!es.lf.checkFormComplition(form)) {
						es.lf.showAllEmptyFields(form);
						return false;
					}


					var url = (window.baseURL || '') + "/ajax/login";
					var data = "";

					for (var i=0,  datas=es.lf.html.datas, length=datas.length; i<length; i++){
						var type = datas[i].getAttribute('type');
						var param = datas[i].getAttribute('name');
						var value = datas[i].value;

						if(type == 'checkbox'){
							value = datas[i].checked ? true : false;
						} else {
							value = datas[i].value;
						}

						data += (i!=0 ? '&' : '') + param + '=' + value;
					}

					//ajaxLoadPost(url, data, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction);
					ajaxLoadPost(url, data, es.lf.server.sendDataOnload, window, form);
					return false;
			},


			// Чтение ответа сервера на пересылку  всех данных формы и обработка выданных ошибок
			sendDataOnload: function (ajaxObj, form){
					if(ajaxObj && ajaxObj.responseXML && ajaxObj.responseXML.firstChild){
						var xml = ajaxObj.responseXML;
						var errors = xml.getElementsByTagName(es.lf.responseXmlNodes.errorNode);
						var messages = xml.getElementsByTagName(es.lf.responseXmlNodes.messageNode);
						if(errors && errors.length){
							for(var i=0; i<errors.length; i++){
								if(errors[i].firstChild && errors[i].firstChild.nodeType == 3){
									var errorCode = errors[i].getAttribute('code');
									var errorMessage = errors[i].firstChild.data;
									es.lf.markField.error(form, errorCode, errorMessage);
								}
							}
							window.scrollTo(0, 0);
						}
						if(messages && messages.length && messages[0].firstChild && messages[0].firstChild.nodeType == 3 && messages[0].firstChild.data == 'ok') {
							es.lf.complete();
						}
					}
			},


			// Пересылка полей формы (первое поле массива - текущее)
			checkData: function (fields, action){
					
					var url = (window.baseURL || '') + "/ajax/login";
					var data = "";
					var field;
					
					if (fields.length && fields.length > 1) {
						field = fields[0];
						
						for (var i = 0; i < fields.length; i++) {
							var type = fields[i].getAttribute('type');
							var param = fields[i].getAttribute('name');
							var value;

							if(type == 'checkbox'){
								value = fields[i].checked ? true : false;
							} else {
								value = fields[i].value;
							}

							data += (i!=0 ? '&' : '') + param + '=' + value;
						}
						
					} else {
						field = fields.length ? fields[0] : fields;
						var param = field.getAttribute('name');
						var value = field.value;
						data = param + '=' + value;
					}
					
					data += "&action=" + action;
					var fieldParent = getParentByClassName(field, 'field');
					if(fieldParent) addClass(fieldParent, 'loading');
					
					ajaxLoadPost(url, data, es.lf.server.checkDataOnload, window, field);
			},
			
			// Чтение ответа сервера на пересылку конкретного поля формы и обработка выданных ошибок
			checkDataOnload: function (ajaxObj, field){
					var fieldParent = getParentByClassName(field, 'field');
					
					if(fieldParent) removeClass(fieldParent, 'loading');

					if(ajaxObj && ajaxObj.responseXML && ajaxObj.responseXML.firstChild){

						var xml = ajaxObj.responseXML;
						var errors = xml.getElementsByTagName(es.lf.responseXmlNodes.errorNode);
						
						if(errors.length == 0){ // если ошибок не обнаружено
							var errorNodeParent = getParentByClassName(field, es.lf.classNames.fieldHolder);
							if(errorNodeParent){
								es.lf.markField.checked(errorNodeParent);
							}
							return;
						}
						
						for(var i=0; i<errors.length; i++){
						
						if(errors[i].firstChild && errors[i].firstChild.nodeType == 3){
								
								var errorCode = errors[i].getAttribute('code');
								var errorMessage = errors[i].firstChild.data; // Берем тескт ошибки от сервера
								
								es.lf.markField.error(field.form, errorCode, errorMessage);
							}
						}
					}
			}
		}
	},
	rf: {
		html: {
			form: null,
			pass1: null,
			pass2: null,
			complete: null,
			datas: null,
			rbut: null
		},
		classNames: {
			fieldHolder: 'FieldHolder',
			dataField: 'data',
			errorField: 'error',
			checkedField: 'checked',
			errorBox: 'ErrorMsg'
		},
		responseXmlNodes: {
			errorNode: 'error',
			messageNode: 'message'
		},
		Init : function(formId){
			es.rf.html.form = $(formId);
			es.rf.html.pass1 = $('password');
			es.rf.html.pass2 = $('password1');
			es.rf.html.login = $('login');
			es.rf.html.email = $('email');
			es.rf.html.complete = $('RegisterComplete');
			es.rf.html.rbut = $('RegisterButton');
			es.rf.submitButton.hide();
			es.rf.html.datas = getElementsByClassName(es.rf.html.form, '*', es.rf.classNames.dataField);
		},
		checkFormComplition: function(){
			var formIsComplited = true; 

			for (var i=0, datas=es.rf.html.datas, length=datas.length; i<length; i++){

				var errorNode = es.rf.getErrorNodeByField(datas[i]);
				errorNodeParent = getParentByClassName(datas[i], es.rf.classNames.fieldHolder);

				if (datas[i].value == '' || (errorNodeParent && matchClass(errorNodeParent, es.rf.classNames.errorField)) || (datas[i].getAttribute('type') == 'checkbox' && !datas[i].checked)){
					formIsComplited = false;
					break;
				}
			}
			return formIsComplited;
		},
		getErrorNodeByField: function(field){
			var errorParent = getParentByClassName(field, es.rf.classNames.fieldHolder);
			if(errorParent){
				var errorNodes = getElementsByClassName(errorParent, '*', es.rf.classNames.errorBox);
				if(errorNodes.length){
					return errorNodes[0];
				} else {
					return null;
				}
			}
		},
		complete: function(){
			if(es.rf.html.complete){
				es.rf.html.form.style.display = 'none';
				es.rf.html.complete.style.display = 'block';
			} else {
				window.location.href = "/";
			}
		},

	checkField: {
			code : function (e, codeField) {
				if (codeField.value != '') {
					es.rf.markField.checked(getParentByClassName(codeField,'field_holder'));
				} else if (codeField.value == '') {
					es.rf.markField.clear(getParentByClassName(codeField,'field_holder'));
				}
			},
			login: function (e, loginField, action){
					if(!e) e = window.event;
					switch (e.type){
						case 'keyup':
							if(loginField.value.match(/[^a-z0-9\-]+/i)){
								es.rf.markField.error(loginField.form, 1, 'Вы ввели недопустимый символ');
								return;
							} else if(loginField.value.length < 3){
								var errorNodeParent = getParentByClassName(loginField, es.rf.classNames.fieldHolder);
								es.rf.markField.clear(errorNodeParent);
								return;	
							} else {
								clearTimeout(es.rf.loginTimer);
								es.rf.loginTimer = setTimeout(function(){es.rf.server.checkData(loginField,'checkLogin')}, 500);
								return;
							}
							break;
						case 'keydown':
							clearTimeout(es.rf.loginTimer);
							break;
						case 'blur':
							if(loginField.value.match(/[^a-z0-9_]+/i)){
								es.rf.markField.error(loginField.form, 1, 'Вы ввели недопустимый символ');
								return;
							} else if(loginField.value.length < 3){
								if(loginField.value.length == 0){
									var errorNodeParent = getParentByClassName(loginField, es.rf.classNames.fieldHolder);
									es.rf.markField.clear(errorNodeParent);
									return;									
								}
								var errorNodeParent = getParentByClassName(loginField, es.rf.classNames.fieldHolder);
								es.rf.markField.error(loginField.form, 1, 'Вы ввели недостаточно символов');
								return;	
							} else {
								es.rf.loginTimer = setTimeout(function(){es.rf.server.checkData(loginField,'checkLogin')}, 1);
								return;
							}
							break;
					}
			},
			loginRecover: function (e, loginField, action){
					if(!e) e = window.event;
					switch (e.type){
						case 'keyup':
							if(loginField.value.match(/[^a-z0-9_]+/i)){
								es.rf.markField.error(loginField.form, 1, 'Вы ввели недопустимый символ');
								return;
							} else if(loginField.value.length < 3){
								var errorNodeParent = getParentByClassName(loginField, es.rf.classNames.fieldHolder);
								es.rf.markField.clear(errorNodeParent);
								return;	
							} else {
								clearTimeout(es.rf.loginTimer);
								es.rf.loginTimer = setTimeout(function(){es.rf.server.checkData(loginField,'checkLoginRecover')}, 500);
								return;
							}
							break;
						case 'keydown':
							clearTimeout(es.rf.loginTimer);
							break;
						case 'blur':
							if(loginField.value.match(/[^a-z0-9_]+/i)){
								es.rf.markField.error(loginField.form, 1, 'Вы ввели недопустимый символ');
								return;
							} else if(loginField.value.length < 3){
								if(loginField.value.length == 0){
									var errorNodeParent = getParentByClassName(loginField, es.rf.classNames.fieldHolder);
									es.rf.markField.clear(errorNodeParent);
									return;									
								}
								var errorNodeParent = getParentByClassName(loginField, es.rf.classNames.fieldHolder);
								es.rf.markField.error(loginField.form, 1, 'Вы ввели недостаточно символов');
								return;	
							} else {
								es.rf.loginTimer = setTimeout(function(){es.rf.server.checkData(loginField,'checkLoginRecover')}, 1);
								return;
							}
							break;
					}
			},
			email: function (e, emailField){
					if(!e) e = window.event;
					switch (e.type){
						case 'keyup':
							if(emailField.value.match(/[^a-z0-9\_\.\-\@]+/i)){
								es.rf.markField.error(emailField.form, 2, 'Вы ввели недопустимый символ');
								return;
							} else if(!emailField.value.match(/^[a-z0-9][a-z0-9_.-]*@[a-z0-9_.-]+\.[a-z]{2,7}$/i)){
								var errorNodeParent = getParentByClassName(emailField, es.rf.classNames.fieldHolder);
								es.rf.markField.clear(errorNodeParent);
								return;
							} else {
								clearTimeout(es.rf.emailTimer);
								es.rf.emailTimer = setTimeout(function(){es.rf.server.checkData(emailField,'checkEmail')}, 500);
								//var errorNodeParent = getParentByClassName(emailField, es.rf.classNames.fieldHolder);
								//es.rf.markField.checked(errorNodeParent);
								return;
							}
							break;
						case 'keydown':
							clearTimeout(es.rf.emailTimer);
							break;
						case 'blur':
							if(emailField.value == ''){
								var errorNodeParent = getParentByClassName(emailField, es.rf.classNames.fieldHolder);
								es.rf.markField.clear(errorNodeParent);
								return;
							} else if(emailField.value.match(/[^a-z0-9\_\.\-\@]+/i)){
								es.rf.markField.error(emailField.form, 2, 'Вы ввели недопустимый символ');
								return;
							} else if(!emailField.value.match(/^[a-z0-9][a-z0-9_.-]*@[a-z0-9_.-]+\.[a-z]{2,7}$/i)){
								es.rf.markField.error(emailField.form, 2, 'Вы ввели недопустимый email');
								return;
							} else {
								es.rf.server.checkData(emailField,'checkEmail');
								//var errorNodeParent = getParentByClassName(emailField, es.rf.classNames.fieldHolder);
								//es.rf.markField.checked(errorNodeParent);
							}
							break;
					}
			},
			emailRecover: function (e, emailField){
					if(!e) e = window.event;
					switch (e.type){
						case 'keyup':
							if(emailField.value.match(/[^a-z0-9\_\.\-\@]+/i)){
								es.rf.markField.error(emailField.form, 2, 'Вы ввели недопустимый символ');
								return;
							} else if(!emailField.value.match(/^[a-z0-9][a-z0-9_.-]*@[a-z0-9_.-]+\.[a-z]{2,7}$/i)){
								var errorNodeParent = getParentByClassName(emailField, es.rf.classNames.fieldHolder);
								es.rf.markField.clear(errorNodeParent);
								return;
							} else {
								clearTimeout(es.rf.emailTimer);
								es.rf.emailTimer = setTimeout(function(){es.rf.server.checkData([emailField,es.rf.html.login],'checkEmailRecover')}, 500);
								//var errorNodeParent = getParentByClassName(emailField, es.rf.classNames.fieldHolder);
								//es.rf.markField.checked(errorNodeParent);
								return;
							}
							break;
						case 'keydown':
							clearTimeout(es.rf.emailTimer);
							break;
						case 'blur':
							if(emailField.value == ''){
								var errorNodeParent = getParentByClassName(emailField, es.rf.classNames.fieldHolder);
								es.rf.markField.clear(errorNodeParent);
								return;
							} else if(emailField.value.match(/[^a-z0-9\_\.\-\@]+/i)){
								es.rf.markField.error(emailField.form, 2, 'Вы ввели недопустимый символ');
								return;
							} else if(!emailField.value.match(/^[a-z0-9][a-z0-9_.-]*@[a-z0-9_.-]+\.[a-z]{2,7}$/i)){
								es.rf.markField.error(emailField.form, 2, 'Вы ввели недопустимый email');
								return;

							} else { // проверка существования значения поля в базе сервера
								es.rf.server.checkData([emailField,es.rf.html.login],'checkEmailRecover');
								//var errorNodeParent = getParentByClassName(emailField, es.rf.classNames.fieldHolder);
								//es.rf.markField.checked(errorNodeParent);
							}
							break;
					}
			},



		//	Проверка поля с паролем
			password: function(e, passField){
					if(!e) e = window.event;

					var pass1Parent = getParentByClassName(es.rf.html.pass1, es.rf.classNames.fieldHolder);
					var pass2Parent = getParentByClassName(es.rf.html.pass2, es.rf.classNames.fieldHolder);

					switch(passField){
						case es.rf.html.pass1: // если вводили пароль 1
							if(es.rf.html.pass1.value.length > 5){ // если длина пароля уже достаточна

								 // если уже вводили пароль 2
								if(es.rf.html.pass2.value.length > 0 && es.rf.html.pass1.value != es.rf.html.pass2.value){ // и значения не совпадают
									es.rf.markField.error(passField.form, 6 , 'Пароли не совпадают');
								} else if(es.rf.html.pass2.value.length > 0 && es.rf.html.pass1.value == es.rf.html.pass2.value){ // и значения совпадают
									es.rf.markField.checked(pass2Parent);
								}

								// открываем поле пароля 2
								if(pass2Parent){
									removeClass(pass2Parent, 'disabled');
									es.rf.markField.checked(pass1Parent);
								}
								es.rf.html.pass2.disabled = false;


							} else {  // если длина пароля недостаточна
								switch(e.type){
									case 'blur':
										if(es.rf.html.pass1.value.length){
											es.rf.markField.error(passField.form, 7 , 'Пароль слишком короткий');
										} else {
											es.rf.markField.clear(pass1Parent);
										}
										break;
									case 'keyup':
										es.rf.markField.clear(pass1Parent);
										break;
								}
								// скрываем поле пароля 2
								es.rf.html.pass2.disabled = true;
								if(pass2Parent){
									addClass(pass2Parent, 'disabled');
								}
							}
							break;

						case es.rf.html.pass2: // если вводили пароль 2

							switch(e.type){
								case 'blur':
									if(es.rf.html.pass2.value.length == 0){ // если ничего не введено
										es.rf.markField.clear(pass2Parent);
									} else if(es.rf.html.pass1.value != es.rf.html.pass2.value){  // если пароли не совпадают
										es.rf.markField.error(passField.form, 6 , 'Пароли не совпадают');
									} else { // все в порядке
										es.rf.markField.checked(pass2Parent);
									}
									break;
								case 'keyup':
									if(es.rf.html.pass2.value.length >= es.rf.html.pass1.value.length && es.rf.html.pass1.value != es.rf.html.pass2.value){ // если ввели весь пароль 2
										es.rf.markField.error(passField.form, 6 , 'Пароли не совпадают');
									} else if (es.rf.html.pass2.value.length < es.rf.html.pass1.value.length) { // если пока не успели ввести весь пароль 2
										es.rf.markField.clear(pass2Parent);
									} else { // все в порядке
										es.rf.markField.checked(pass2Parent);
									}
									break;
							}
							break;
					}
			},
			captcha: function (e, field){
					if(!e) e = window.event;
					var errorNodeParent = getParentByClassName(field, es.rf.classNames.fieldHolder);
					switch(e.type){
						case 'blur':
							if (field.value.length == 0){
								es.rf.markField.clear(errorNodeParent);
							} else if(field.value.length != 6) {
								es.rf.markField.error(field.form, 4, 'Вы ввели неверное число букв');
							} else {
								es.rf.markField.checked(errorNodeParent);
							}
							break;
						case 'keyup':
							if(field.value.length > 6){
								es.rf.markField.error(field.form, 4, 'Вы ввели неверное число букв');
							} else if (field.value.length == 6){
								es.rf.markField.checked(errorNodeParent);
							} else {
								es.rf.markField.clear(errorNodeParent);
							}
							break;
					}
			}
	},
	server: {
			// Пересылка всех полей формы (action=register)
			sendData: function (form, action){
					form['action'].value = action; // указатель действия для сервера
					
					// Проверка на заполненность всех полей и на их валидность
					if(!es.rf.checkFormComplition(form)) {
						es.rf.showAllEmptyFields(form);
						return false;
					}


					var url = (window.baseURL || '') + "/ajax/register";
					var data = "";

					for (var i=0,  datas=es.rf.html.datas, length=datas.length; i<length; i++){
						var type = datas[i].getAttribute('type');
						var param = datas[i].getAttribute('name');
						var value = datas[i].value;

						if(type == 'checkbox'){
							value = datas[i].checked ? true : false;
						} else {
							value = datas[i].value;
						}

						data += (i!=0 ? '&' : '') + param + '=' + value;
					}

					//ajaxLoadPost(url, data, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction);
					ajaxLoadPost(url, data, es.rf.server.sendDataOnload, window, form);
					return false;
			},


			// Чтение ответа сервера на пересылку  всех данных формы и обработка выданных ошибок
			sendDataOnload: function (ajaxObj, form){
					if(ajaxObj && ajaxObj.responseXML && ajaxObj.responseXML.firstChild){
						var xml = ajaxObj.responseXML;
						var errors = xml.getElementsByTagName(es.rf.responseXmlNodes.errorNode);
						var messages = xml.getElementsByTagName(es.rf.responseXmlNodes.messageNode);
						if(errors && errors.length){
							for(var i=0; i<errors.length; i++){
								if(errors[i].firstChild && errors[i].firstChild.nodeType == 3){
									var errorCode = errors[i].getAttribute('code');
									var errorMessage = errors[i].firstChild.data;
									es.rf.markField.error(form, errorCode, errorMessage);
								}
							}
							window.scrollTo(0, 0);
						}
						if(messages && messages.length && messages[0].firstChild && messages[0].firstChild.nodeType == 3 && messages[0].firstChild.data == 'ok') {
							es.rf.complete();
						}
					}
			},


			// Пересылка полей формы (первое поле массива - текущее)
			checkData: function (fields, action){
					
					var url = (window.baseURL || '') + "/ajax/register";
					var data = "";
					var field;
					
					if (fields.length && fields.length > 1) {
						field = fields[0];
						
						for (var i = 0; i < fields.length; i++) {
							var type = fields[i].getAttribute('type');
							var param = fields[i].getAttribute('name');
							var value;

							if(type == 'checkbox'){
								value = fields[i].checked ? true : false;
							} else {
								value = fields[i].value;
							}

							data += (i!=0 ? '&' : '') + param + '=' + value;
						}
						
					} else {
						field = fields.length ? fields[0] : fields;
						var param = field.getAttribute('name');
						var value = field.value;
						data = param + '=' + value;
					}
					
					data += "&action=" + action;
					var fieldParent = getParentByClassName(field, 'field');
					if(fieldParent) addClass(fieldParent, 'loading');
					
					ajaxLoadPost(url, data, es.rf.server.checkDataOnload, window, field);
			},
			
			// Чтение ответа сервера на пересылку конкретного поля формы и обработка выданных ошибок
			checkDataOnload: function (ajaxObj, field){
					var fieldParent = getParentByClassName(field, 'field');
					
					if(fieldParent) removeClass(fieldParent, 'loading');

					if(ajaxObj && ajaxObj.responseXML && ajaxObj.responseXML.firstChild){

						var xml = ajaxObj.responseXML;
						var errors = xml.getElementsByTagName(es.rf.responseXmlNodes.errorNode);
						
						if(errors.length == 0){ // если ошибок не обнаружено
							var errorNodeParent = getParentByClassName(field, es.rf.classNames.fieldHolder);
							if(errorNodeParent){
								es.rf.markField.checked(errorNodeParent);
							}
							return;
						}
						
						for(var i=0; i<errors.length; i++){
						
						if(errors[i].firstChild && errors[i].firstChild.nodeType == 3){
								
								var errorCode = errors[i].getAttribute('code');
								var errorMessage = errors[i].firstChild.data; // Берем тескт ошибки от сервера
								
								es.rf.markField.error(field.form, errorCode, errorMessage);
							}
						}

					}
			}
	},
	loginTimer : null,
	emailTimer : null,
	submitButton: {
			show: function(){
				$('RegisterButton').disabled = false;
				//removeClass($('RegisterButton'), 'disabled');
			},
			hide: function(){
				$('RegisterButton').disabled = true;
				//addClass($('RegisterButton'), 'disabled');
			}
	},
	markField: {
			// Очищаем поле от любых отметок
			clear: function(errorNodeParent){
					if(errorNodeParent){
						removeClass(errorNodeParent, es.rf.classNames.errorField);
						removeClass(errorNodeParent, es.rf.classNames.checkedField);
					}
					//dalert('hide');
					if(!es.rf.checkFormComplition()) es.rf.submitButton.hide();
			},

			// Отмечаем поле как прошедшее проверку
			checked: function(errorNodeParent){
					if(errorNodeParent){
						removeClass(errorNodeParent, es.rf.classNames.errorField);
						addClass(errorNodeParent, es.rf.classNames.checkedField);
					}
					//dalert('show');
					if(es.rf.checkFormComplition()) es.rf.submitButton.show();
			},

			// Отмечаем поле как ошибочное и выводим сообщение об ошибке
			error: function(form, errorCode, errorMessage) {
					// каждому коду ошибки соотвествует свой нод, с классом вида error_errorCode
					var errorNodes = getElementsByClassName(form, '*', 'error_' + errorCode);
					
					if(errorNodes.length){
						var errorNode = errorNodes[0];
						var errorNodeParent = getParentByClassName(errorNode, es.rf.classNames.fieldHolder);
						if(errorNodeParent){
							removeClass(errorNodeParent, es.rf.classNames.checkedField);
							addClass(errorNodeParent, es.rf.classNames.errorField);
							errorNode.innerHTML = errorMessage;
						}
					}
					//dalert('hide');
					if(!es.rf.checkFormComplition()) es.rf.submitButton.hide();
			}
	}
	},
	rt : {
		Send: function(value){
			var url  = (window.baseURL || '') + "/ajax/rating";
			var data = 'value=' + value;
			if(es.userid > 0){
			ajaxLoadPost(url, data, es.rt.Resp, window, null);
			}else{
			alert('Вам необходимо зарегистрироваться или войти');
			}
		},
		Resp: function(ajaxObj, form){
			if(ajaxObj && ajaxObj.responseXML && ajaxObj.responseXML.firstChild){
				var xml = ajaxObj.responseXML;
				var errors = xml.getElementsByTagName(es.rf.responseXmlNodes.errorNode);
				var messages = xml.getElementsByTagName(es.rf.responseXmlNodes.messageNode);
				var rating = xml.getElementsByTagName('rating');
				if(rating){
					var elRValue = $('RValue');
					var elRCount = $('RCount');
					if(elRValue && elRCount){
						elRValue.style.width = rating[0].getAttribute('value')+'%';
						var c = rating[0].getAttribute('count');
						var d = c.substring(c.length, c.length - 1);
						if(d == 1){
							elRCount.innerHTML = rating[0].getAttribute('count')+' голос';
						}else{
							if(d < 5){
								elRCount.innerHTML = rating[0].getAttribute('count')+' голоса';
							}else{
								elRCount.innerHTML = rating[0].getAttribute('count')+' голосов';
							}
						}
					}
				}
			}
		}
	},
	cm : {
		Send: function(){
			if(es.userid > 0){
			var url  = (window.baseURL || '') + "/ajax/comment";
			var data = 'ParentId=' + $('ReplyId').value + '&Comment=' + $('Comment').value;
				if($('Comment').value != ''){
			$('CommentSub').disabled = true;
			ajaxLoadPost(url, data, es.cm.Resp, window, null);
				}
			}
		},
		Resp: function(ajaxObj, form){
					if(ajaxObj && ajaxObj.responseXML && ajaxObj.responseXML.firstChild){
						var xml = ajaxObj.responseXML;
						var errors = xml.getElementsByTagName(es.rf.responseXmlNodes.errorNode);
						var messages = xml.getElementsByTagName(es.rf.responseXmlNodes.messageNode);
						var n = xml.getElementsByTagName('n');
						if(errors && errors.length){
							for(var i=0; i<errors.length; i++){
								if(errors[i].firstChild && errors[i].firstChild.nodeType == 3){
									var errorCode = errors[i].getAttribute('code');
									var errorMessage = errors[i].firstChild.data;
									es.rf.markField.error(form, errorCode, errorMessage);
								}
							}
							window.scrollTo(0, 0);
						}
						if(n && n.length && n[0].firstChild){
							var ToId   = n[0].getAttribute('id');
							var Action = n[0].getAttribute('action');
							var node   = n[0].firstChild;
							if(Action == 'appendChild'){
								//$(ToId).appendChild(node);
							}
						}
						if(messages && messages.length && messages[0].firstChild && messages[0].firstChild.nodeType == 3 && messages[0].firstChild.data == 'ok') {
							location.href = location.href;
						}
					}
		},
		Init: function(){
		},
		ReplyThis: function(el, Id){
			if(el.innerHTML == 'Ответить'){
				el.innerHTML = 'Показать все';
				var nodes = $('Comments').getElementsByTagName('li');
				for(var i=0; i<nodes.length; i++){
					if(nodes[i].id != 'Comment' + Id){
				nodes[i].style.display = 'none';
					}
				}
				var currentElement = $('Comment' + Id);
				while(currentElement.parentNode){
					if(currentElement.tagName.toLowerCase() == 'li'){
					currentElement.style.display = '';
					}
					currentElement = currentElement.parentNode;
					if (currentElement.tagName.toLowerCase() == 'body') {
						break;
					}
				}
				$('ReplyId').value=Id;
			}else{
				el.innerHTML = 'Ответить';
				var nodes = $('Comments').getElementsByTagName('li');
				for(var i=0; i<nodes.length; i++){
					if(nodes[i].id != 'Comment' + Id){
				nodes[i].style.display = '';
					}
				}
				$('ReplyId').value='';
			}
		}
	},
	Init: function(){
		var UserCheck = ajaxLoad('/ajax/?action=checkUser', es.CheckUser, window, '', es.CheckUser);
		/*
		var GalleryNodes = getElementsByClassName(document.body, 'div', 'PicCon');
		for(var g=0; g<GalleryNodes.length; g++){
			CurGallery = GalleryNodes[g];
			var PhotoNodes = getElementsByClassName(CurGallery, 'div', 'Pic');
			for(var p=0; p<PhotoNodes.length; p++){
				var PhotoWidth = PhotoNodes['p'].offsetWidth;
				var CountPhoto = Math.ceiling(CurGallery.offsetWidth / PhotoWidth);
				alert(CountPhoto);
			}
		}
		*/
	},
	CheckUser: function(ajaxObj){
		if(ajaxObj && ajaxObj.responseXML && ajaxObj.responseXML.firstChild){
			var xml = ajaxObj.responseXML;
			var errors = xml.getElementsByTagName('error');
			var messages = xml.getElementsByTagName('message');
			if(errors && errors.length){
				for(var i=0; i<errors.length; i++){
					//if(errors[i].firstChild && errors[i].firstChild.nodeType == 3){
					//var errorCode = errors[i].getAttribute('code');
					//var errorMessage = errors[i].firstChild.data;
					//}
				}
			var nodes = getElementsByClassName(document, 'div', 'Hide4User');
				if(nodes){
					for(var i=0; i<nodes.length; i++){
					nodes[i].style.display = '';
					}
				}
			}else{
			var nodes = getElementsByClassName(document, 'div', 'Show4User');
			var user  = xml.getElementsByTagName('user');
				if(user){
			var elm   = $('UserInfo');
			es.userid = user[0].getAttribute('id');
			if(user[0].getAttribute('avatar') != ''){
			elm.innerHTML = '<img src="/u/a/'+user[0].getAttribute('avatar')+'" style="margin-right: 20px" align="left"/><span>Вы вошли как: <a href="/users/'+user[0].getAttribute('login')+'/">'+user[0].getAttribute('login')+'</a></span><br/><a href="/my/">Мой профиль</a> | <a href="/?logout">Выйти</a>';
			} else {
			elm.innerHTML = '<img src="/images/ea.gif" style="margin-right: 20px" align="left"/><span>Вы вошли как: <a href="/users/'+user[0].getAttribute('login')+'/">'+user[0].getAttribute('login')+'</a></span><br/><a href="/my/">Мой профиль</a> | <a href="/?logout">Выйти</a>';
			}
				}
				if(nodes){
					for(var i=0; i<nodes.length; i++){
					nodes[i].style.display = '';
					}
				}
			}
		}
	}
};

var oldonload = window.onload;
if (typeof window.onload != 'function'){
    window.onload = es.Init;
}else{
	window.onload = function(){
	oldonload();
	es.Init();
	}
}
