var FormValidator=function(obj,printErrorExternal){this.FORM=null;this.printErrorExternal=printErrorExternal;this.LANG="rus";this.NEEDSUBMIT=true;this.RESULT=null;this.TEMPLATE=null;this.ERROR_TARGET='html';this.ERRORS=[];this.ERROR_TYPES={EMPTY:0,MAXLEN:1,MINLEN:2,INVALID:3,ATLEAST:4,INSET:5,PWD:6,BAD_DAY:7,BAD_MONTH:8,BAD_YEAR:9,BETWEEN:10,LESS:11,MAXSIZE:12,MINSIZE:13,BEETWEENSIZE:14,SIZE:15,SIZENUMBER:16,BETWEENSEL:17,RADIOCHECKED:18};this.ERROR_MSG_TEMPLATES={rus:null,eng:null};this.ERROR_MSG_TEMPLATES.rus=['Поле не может быть пустым','Значение поля должно быть меньше --fieldLen--','Значение поля должно быть больше --fieldLen--','Поле заполнено некорректно','Количество выбранных значений в разделе должно быть больше --fieldLen--','Количество выбранных значений в разделе должно быть --fieldLen--','Значения полей должны совпадать','В поле значение дня установлено неверно','В поле значение месяца установлено неверно','В поле значение года установлено неверно','Значение поля должно находится в пределах --fieldLen--','Количество выбранных значений в разделе должно быть меньше --fieldLen--','Количество символов в поле не может превышать --fieldLen--','Количество символов в поле должно превышать --fieldLen--','Количество символов в поле должно находится в пределах --fieldLen--','Количество символов в поле должно быть ровно --fieldLen--','Значение поля должно быть --fieldLen--','Количество выбранных значений в разделе должно находится в пределах --fieldLen--','Хотя бы одно значение в группе переключателей должно быть выбрано'];if(obj){if(obj.nodeName&&obj.nodeName.toUpperCase()=='FORM'){this.FORM=obj}else if(obj.form){this.FORM=obj.form}else if(typeof(obj)=="string"||typeof(obj)=="number"){this.FORM=document.forms[obj]}if(!this.FORM){return false}}try{if(window.event){window.event.returnValue=false}else{this.FORM.onsubmit=function(e){return false}}}catch(e){}this.processSettings('LANG');this.processSettings('NEEDSUBMIT');this.processSettings('RESULT');this.processSettings('ERROR_TARGET');this.processSettings('TEMPLATE');for(var i=0;i<this.FORM.elements.length;i++){var elem=this.FORM.elements[i];var attr=this.getAttributeByName(elem,'FORMAT');if(attr){this.validate(elem,new FormItemFormatParser(attr))}}if(this.ERRORS.length>0){if(this.RESULT||this.ERROR_TARGET=='html'){this.clearPreviousErrrors();this.printErrors()}else{alert(this.getMessage())}}else if(this.NEEDSUBMIT){this.clearPreviousErrrors();this.FORM.submit()}};FormValidator.prototype.clearPreviousErrrors=function(){for(var i=0;i<this.FORM.elements.length;i++){var elem=this.FORM.elements[i];var attr=this.getAttributeByName(elem,'FORMAT');if(attr){try{document.getElementById(elem.name+this.RESULT).innerHTML='';if(document.getElementById(elem.name+this.RESULT+'Holder')){if(document.getElementById(elem.name+this.RESULT+'Holder').style.display=='block'){document.getElementById(elem.name+this.RESULT+'Holder').style.display='none'}}}catch(e){continue}}}};FormValidator.prototype.getMessage=function(){var message='';for(var i=0;i<this.ERRORS.length;i++){message+=this.ERRORS[i].getMessage()}return message};FormValidator.prototype.printErrors=function(){if(this.printErrorExternal){this.printErrorExternal.call(this,this.ERRORS)}else{for(var i=0;i<this.ERRORS.length;i++){var error=this.ERRORS[i];error.print()}}};FormValidator.prototype.processSettings=function(name){var attr=this.getAttributeByName(this.FORM,name);if(attr){this[name]=attr}};FormValidator.prototype.validate=function(element,format){if(format.linked){var stat=document.getElementById(format.linkin);if(!stat||!stat.checked)return false}var check=false;switch(element.type.toUpperCase()){case'RADIO':if(countChecked.call(this)===0){format.size=1;setError.call(this,this.ERROR_TYPES.ATLEAST)}break;case'PASSWORD':var depend=this.getAttributeByName(element,'DEPEND');var dependElem='',sizeError='';if(!isEmpty()){if(format.type){check=checkType();if(!check){setError.call(this,this.ERROR_TYPES.INVALID);break}if(check&&format.size||check){sizeError=checkSize(element.value);if(sizeError>0){setStringSizeError.call(this,sizeError)}else{if(depend){dependElem=this.FORM.elements[depend];if(dependElem&&dependElem.value!=element.value){setError.call(this,this.ERROR_TYPES.PWD)}}}}else{if(depend){dependElem=this.FORM.elements[depend];if(dependElem&&dependElem.value!=element.value){setError.call(this,this.ERROR_TYPES.PWD)}}}}}else{setError.call(this,this.ERROR_TYPES.EMPTY)}break;default:if(format.required&&isEmpty()){setError.call(this,this.ERROR_TYPES.EMPTY);break}else if(format.type){check=checkType();if(format.type=='date'){setDateSizeError.call(this,check);break}else if(!check){setError.call(this,this.ERROR_TYPES.INVALID);break}}sizeError=checkSize.call(this,element.value);if(sizeError>0){if(element.nodeName=='SELECT'||element.type.toUpperCase()=='CHECKBOX'){setSizeError.call(this,sizeError)}else if(format.type=='number'){setNumberSizeError.call(this,sizeError)}else{setStringSizeError.call(this,sizeError)}}break}function setError(errorNumber){var error=new FormError(element,this.ERROR_MSG_TEMPLATES[this.LANG][errorNumber],errorNumber,format,this.RESULT,this.TEMPLATE);this.ERRORS.push(error)}function isEmpty(){return!element.value.replace(/^\s+/,'').replace(/\s+$/,'')}function checkType(){var value=element.value.toString();if(isEmpty())return true;var re='';switch(format.type){case'RusEng-':re=/^[A-Za-zА-Яа-я]+(-[A-Za-zА-Яа-я]+)*$/;return re.test(value);break;case'login':re=/^[A-Za-z]+[A-Za-z0-9\-_]*$/;return re.test(value);break;case'password':re=/^[A-Za-z]+[A-Za-z0-9\-_]*$/;return re.test(value);break;case'email':re=/^[A-Za-z0-9\-_]+(\.[A-Za-z0-9\-_]+)*@([A-Za-z0-9\-_]+\.)+[A-Za-z]{2,7}$/;return re.test(value);break;case'number':re=/^[-]?\d*\.?\d*$/;return re.test(value);break;case'int':re=/^[-]?\d$/;return re.test(value);break;case'date':return isValidDate(value);break;default:return true}return true}function checkSize(value){var compare=(format.type=='number')?parseInt(value,10):(''+value).length;if(element.nodeName=='SELECT'){compare=countSelected()}else if(element.type.toUpperCase()=='CHECKBOX'){compare=countChecked.call(this);if(typeof(format.size)=='undefined'&&compare===0)return 5}if(typeof(format.size)=='undefined')return-1;var beetwin=format.size.toString().split('-');if(beetwin.length>1&&beetwin[0]!==''){var from=parseInt(beetwin[0],10);var to=parseInt(beetwin[1],10);if((from==to&&compare!=from)||((compare<=from||compare>=to)&&from!=to)){return(from==to)?4:3}}else if(format.size<0&&compare>=format.size*-1){return 1}else if(format.size>0&&compare<=format.size){return 2}return-1}function setSizeError(errorNumber){switch(errorNumber){case 1:setError.call(this,this.ERROR_TYPES.LESS);break;case 2:setError.call(this,this.ERROR_TYPES.ATLEAST);break;case 3:setError.call(this,this.ERROR_TYPES.BETWEENSEL);break;case 4:setError.call(this,this.ERROR_TYPES.INSET);break;case 5:setError.call(this,this.ERROR_TYPES.EMPTY);break;default:return true}}function setNumberSizeError(errorNumber){switch(errorNumber){case 1:setError.call(this,this.ERROR_TYPES.MAXLEN);break;case 2:setError.call(this,this.ERROR_TYPES.MINLEN);break;case 3:setError.call(this,this.ERROR_TYPES.BETWEEN);break;case 4:setError.call(this,this.ERROR_TYPES.SIZENUMBER);break;default:return true}}function setStringSizeError(errorNumber){switch(errorNumber){case 1:setError.call(this,this.ERROR_TYPES.MAXSIZE);break;case 2:setError.call(this,this.ERROR_TYPES.MINSIZE);break;case 3:setError.call(this,this.ERROR_TYPES.BEETWEENSIZE);break;case 4:setError.call(this,this.ERROR_TYPES.SIZE);break;default:return true}}function setDateSizeError(errorNumber){switch(errorNumber){case 1:setError.call(this,this.ERROR_TYPES.INVALID);break;case 2:setError.call(this,this.ERROR_TYPES.BAD_DAY);break;case 3:setError.call(this,this.ERROR_TYPES.BAD_MONTH);break;case 4:setError.call(this,this.ERROR_TYPES.BAD_YEAR);break;default:return true}}function countSelected(){var count=0;for(var i=0;i<element.options.length;i++){if(element.options[i].selected)count++}return count}function countChecked(){var count=0;var i;if(typeof(this.FORM[element.name].length)=='undefined'&&element.checked)count++;else{for(i=0;i<this.FORM[element.name].length;i++){if(this.FORM[element.name][i].checked)count++}}return count}function comparePasswords(){var password='';var password2='';for(var i=0;i<this.FORM.elements.length;i++){var elem=this.FORM.elements[i];if(elem.name.toLowerCase().indexOf('password')!=-1){password2=(password==='')?'':elem.value;password=(password==='')?elem.value:password}if(password2!==''&&password!==''){return(password2==password)}}return true}function isValidDate(str){if(str.search(/[0-9]{2}(\.|\/|\-)[0-9]{2}(\.|\/|\-)[0-9]{4}/g)==-1)return 1;var delim=str.substr(str.length-5).slice(0,-4);var strArr=str.split(delim);if(strArr.length!=3){return 1}var dd=strArr[0];var mm=strArr[1];var yy=strArr[2];if(dd.substr(0,1)=='0')dd=dd.substr(1);if(mm.substr(0,1)=='0')mm=mm.substr(1);if(parseInt(dd,10)>31||parseInt(dd,10)<1)return 2;else if(parseInt(mm,10)>12||parseInt(mm,10)<1)return 3;else if(delim!='.'&&delim!='-'&&delim!='/')return 4;var time=Date.parse(mm+'/'+dd+'/'+yy);var etalonDate=new Date(time);if(parseInt(dd,10)!=etalonDate.getDate())return 2;else if(parseInt(mm,10)!=etalonDate.getMonth()+1)return 3;else if(parseInt(yy,10)!=etalonDate.getFullYear()||parseInt(yy,10)>9999)return 4;return 0}};FormValidator.prototype.getAttributeByName=function(elem,name){name=name.toUpperCase();try{var value=elem.getAttribute(name);return((value)?value:null)}catch(e){return null}return null};var FormItemFormatParser=function(str){var values=str.split('::');var format={type:'',required:true,size:''};try{format.type=values[0];format.size=values[1]}catch(e){return format}return format};var FormError=function(element,msg,errorNumber,format,prefix,template){this.field=element;this.message=msg;this.caption=format.name;this.size=format.size;this.type=errorNumber;this.error_target=null;this.prefix=prefix;this.template=template};FormError.prototype.getMessage=function(){var size=this.size;if(this.type==1||this.type==12||this.type==11){size*=-1}if(this.type==15||this.type==16||this.type==5){size=size.split('-')[0]}return this.message.replace('--fieldLen--',size)};FormError.prototype.print=function(){this.error_target=document.getElementById(this.field.name+((this.prefix)?this.prefix:''));if(!this.error_target)return;this.error_target.innerHTML=this.getMessage();if(document.getElementById(this.field.name+((this.prefix)?this.prefix:'')+'Holder')){if(document.getElementById(this.field.name+((this.prefix)?this.prefix:'')+'Holder').style.display!='block'){document.getElementById(this.field.name+((this.prefix)?this.prefix:'')+'Holder').style.display='block'}}};
