var siteForms = {
	init : function() {
		var elements_arr = jQuery('label.required input');
		for (var i = 0; elements_arr.length > i; i++) {
			var element = elements_arr[i];
			element.onchange = siteForms.errors.show(element, i);
		}
	},
	check : function(form, num) {
		var elements_arr = jQuery('label.required input', form);
		for (var i = 0; elements_arr.length > i; i++) {
			if (!siteForms.errors.check(elements_arr[i], num)) return false;
		}
	},
	data : {
		save : function(form) {
			if (!form) return false;
			if (!form.id) {
				alert("You should set id attribute in form tag to save or restore it.");
				return false;
			}
			var cookieData = new Array;
			for (var i = 0; i < form.elements.length; i++) {
				var input = form.elements[i];
				if (input.name) {
					var inputName = input.name.replace(/([)\\])/g, "\\$1");
					switch (input.type) {
						case "password": {
							break;
						}
						case "text":
						case "textarea": {
							cookieData.push({type: 'T', name: inputName, value: input.value});
							break;
						}
						case "checkbox":
						case "radio": {
							cookieData.push({type: 'C', name: input.id, value: (input.checked ? 1 : 0)});
							break;
						}
						case "select-multiple":
						case "select-one": {
							cookieData.push({type: 'S', name: inputName, value: input.selectedIndex});
							break;
						}
					}
				}
			}
			var str = "";
			for (var i = 0; i < cookieData.length; i++) {
				var elementData = cookieData[i];
				var value = new String(elementData.value);
				var inputName = new String(elementData.name);
				if (!inputName || !value) continue;
				str += elementData.type + "," + inputName.length + "," + inputName + "," + value.length + "," + value;
			}
			document.cookie = "frm" + form.id + "=" + escape(str.replace(/([|\\])/g, "\\$1"));
			return true;
		},
		restore : function() {
			var cookie = new String(unescape(document.cookie));
			var posStart, posEnd;
			var forms = document.getElementsByTagName('form');
			for (var i = 0; i < forms.length; i++) {
				if (forms[i].id) {
					var cookieName = "frm" + forms[i].id + "=";
					if ((posStart = cookie.indexOf(cookieName)) == -1) continue;
					else var form = forms[i];
				}
				else continue;
			}
			if (!cookieName || !form) return false;
			if ((posEnd = cookie.indexOf(";", posStart)) == -1) posEnd = cookie.length;
			var data = cookie.substring(posStart + cookieName.length, posEnd);
			var pos = 0, cookieData = new Array;
			while (pos < data.length) {
				var inputName;
				var type = data.substring(pos, pos + 1);
				pos += 2;
				var length = parseInt(data.substring(pos, data.indexOf(",", pos)));
				pos = data.indexOf(",", pos) + 1;
				var inputName = data.substring(pos, pos + length);
				pos += length + 1;
				var length = parseInt(data.substring(pos, data.indexOf(",", pos)));
				if (length == 0) {
					pos += 2;
					continue;
				}
				else pos = data.indexOf(",", pos) + 1;
				var value = data.substring(pos, pos + length);
				pos += length;
				cookieData.push({type: type, name: inputName, value: value});
			}
			for (var i = 0; i < cookieData.length; i++) {
				var elementData = cookieData[i];
				if (elementData.type && elementData.name) {
					switch(elementData.type) {
						case "P": {
							break;
						}
						case "T": {
							form.elements[elementData.name].value = elementData.value;
							break;
						}
						case "C": {
							document.getElementById(elementData.name).checked = (elementData.value == 1) ? true : false;
							break;
						}
						case "S": {
							form.elements[elementData.name].selectedIndex = elementData.value;
							break;
						}
					}
				}
			}
		}
	},
	errors : {
		show : function(element, num) {
			return (function(){siteForms.check(element.form, num);});
		},
		check : function(element, num) {
			var _err, empty_err = "Поле обязательно для заполнения.";
			//var callback = function(transport){return (siteForms.errors.write(transport.responseText, element));};
			switch (element.name) {
				case "login": {
					switch (element.value.length) {
						case 0: _err = empty_err;
						break;
						case 1:
						case 2:
							_err = "Слишком короткий логин. Логин должен состоять не менее, чем из 3х символов.";
						break;
						default: {
							if (element.value.length > 40) _err = "Слишком большой логин. Логин должен состоять не более, чем из 40 символов.";
							if (typeof num != 'undefined') ;//checkUserLogin callback
						}
						break;
					}
				}
				break;
				case "password": {
					switch (element.value.length) {
						case 0: _err = empty_err;
						break;
						case 1:
						case 2:
							_err = "Слишком короткий пароль. Пароль должен состоять не менее, чем из 3х символов.";
						break;
						default: {
							if (element.form.elements['login'].value == element.value) {
								_err = "Пароль не должен совпадать с логином.";
							}
						}
						break;
					}
				}
				break;
				case "password_confirm": {
					if (element.value.length == 0) _err = empty_err;
					else if (element.form.elements['password'].value !== element.value) {
						_err = "Пароли должны совпадать.";
					}
				}
				break;
				case "email": {
					if (element.value.length == 0) _err = empty_err;
					else if (!element.value.match(/.+@.+\..+/)) _err = "Некорректный e-mail.";
					else if (typeof num != 'undefined') ;//checkUserEmail callback
				}
				break;
				default:
					if (element.value.length == 0) _err = empty_err;
					if (element.name.match(/^.*e.*mail.*$/)) if (!element.value.match(/.+@.+\..+/)) _err = "Некорректный e-mail.";
				break;
			}
			return (siteForms.errors.write(_err, element));
		},
		write : function(_err, element) {
			var cont = element.parentNode.parentNode;
			var old_err = jQuery('div.formErr', cont).remove();
			if (_err) {
				element.focus();
				var err_block = document.createElement('div');
				err_block.className = "formErr";
				err_block.style.margin = "0 15px";
				err_block.innerHTML = _err;
				cont.style.background = '#ff9999';
				cont.appendChild(err_block);
				return false;
			}
			else {
				cont.style.background = 'none';
				return true;
			}
		}
	}
};

jQuery(document).ready(function() {
	siteForms.data.restore();
	siteForms.init();
});