
var prefixes=new Array();

prefixes["_nonempty_"]=validate_nonempty;
prefixes["_email_"]=validate_email;
prefixes["_date_"]=validate_date;
prefixes["_time_"]=validate_time;
prefixes["_daterlim_"]=validate_daterlim;
prefixes["_datellim_"]=validate_datellim;
prefixes["_workdays_"]=validate_workdays;
prefixes["_datetime_"]=validate_datetime;
prefixes["_number_"]=validate_number;
prefixes["_select_"]=validate_select;
prefixes["_radio_"]=validate_radio;
prefixes["_alphastring_"]=validate_alphastring;
prefixes["_login_"]=validate_login;
prefixes["_dirname_"]=validate_dirname;
//marhipov
prefixes["_nonemptyalt_"]=validate_nonemptyalt;
//

warnings=new Array();
warnings["_nonempty_"]="Не заполнено обязательное поле";
warnings["_email_"]="Неверный формат e-mail";
warnings["_date_"]="Неверный формат даты(DD.MM.YYYY)";
warnings["_time_"]="Неверный формат времени(HH:MM)";
warnings["_daterlim_"]="Дата не может быть больше {0}";
warnings["_datellim_"]="Дата не может быть меньше {0}";
warnings["_workdays_"]="Укажите рабочий день недели";
warnings["_number_"]="Неверный формат числа";
warnings["_select_"]="Не выбрано поле";
warnings["_radio_"]="Не выбрано поле";
warnings["_alphastring_"]="Неверный формат(строка из латинских букв)";
warnings["_login_"]="Неверный формат(строка из цифр или латинских букв без пробелов)";
//marhipov
warnings["_nonemptyalt_"]="Не заполнено обязательное поле";
//
warnings["_dirname_"]="Неверный формат названия директории (строка из латинских букв без пробелов)";
warnings["_strlen_"]="Длина поля должна быть {n} символов";
warnings["_minlen_"]="Длина поля не менее {n} символов";
warnings["_maxlen_"]="Длина поля не более {n} символов";
var minlen = 0;
var maxlen = 0;

var checked_fields=new Array();
var GetPrefixPos=0;
var f;

function CheckMandatoryFields(form) {
	f=document.forms[form];
	var prefix;
	var c;
	var i;
	var flag=true;
	var element_name;
	var item;
	var form_length=f.elements.length;

	for(c=0;c<form_length;c++) {
		GetPrefixPos=0;
		item=f.elements[c];
		element_name=item.name;

//добавляем в массив префиксов minlenX и maxlenX,
//если они присутствуют в имени поля.
//без X ошибки не выдаст - но ограничивать не будет
//в имени поля должен быть только один minlenX или
//только один maxlenX или minlenX и maxlenX
//Может действовать на несколько полей
//при пустом поле minlenX отключается ( используйте _nonempty_ )
        var min = /_minlen(\d*)_/.exec(element_name);
        var max = /_maxlen(\d*)_/.exec(element_name);
        var straight = /_strlen(\d*)_/.exec(element_name);

        if( straight ){
            strlen = straight[1];
            if( !prefixes[straight[0]] ){
                prefixes[straight[0]] = validateStrLen;
                warnings[straight[0]] = warnings['_strlen_'].replace('{n}',strlen);
            }
        }

        if( min ){
            minlen = min[1];
            if( !prefixes[min[0]] ){
                prefixes[min[0]] = validateMin;
                warnings[min[0]] = warnings['_minlen_'].replace('{n}',minlen);
            }
        }

        if( max ){
            maxlen = max[1];
            if( !prefixes[max[0]] ){
                prefixes[max[0]] = validateMax;
                warnings[max[0]] = warnings['_maxlen_'].replace('{n}',maxlen);
            }
        }
//

		while( item.name != undefined && (prefix=getNextPrefix(element_name))!="" && !item.disabled)
		{
		    if(!(prefixes[prefix](item)))
			{
                var strAlert = warnings[prefix];

                if( prefix == '_datellim_' )
    		    {
    		        if( item.date_llim )
    		          strAlert = strAlert.replace('{0}', item.date_llim);
    		        else
    		          strAlert = strAlert.replace('{0}', "текущей");
    		    }

                if( prefix == '_daterlim_' )
    		    {
    		        if( item.date_rlim )
    		          strAlert = strAlert.replace('{0}', item.date_rlim);
    		        else
    		          strAlert = strAlert.replace('{0}', "текущей");
    		    }

			    alert(strAlert);
				// marhipov Модифицировано для устранения ошибки при отправке формы со скрытыми полями
				var digits=f.elements[c].name.match("\\d+$");
				if(!f.elements.check_form_langs)
					f.elements[c].focus();
				else
					{
					if(f.elements.check_form_langs.value=="" || (!f.elements.check_form_langs.value.match("_"+digits+"_")))
						f.elements[c].focus();
					}
				//
				return false;
			}
		}
	}

	while(flag) {
		flag=false;
		for(c=0;c<form_length;c++) {
			element_name=f.elements[c].name;
			for(prefix in prefixes) {
				if(element_name != undefined && element_name.substring(0,prefix.length)==prefix) {
					f.elements[c].name=element_name.substring(prefix.length,element_name.length);
					flag=true;
				}
			}
		}
	}

	return true;
}

function getNextPrefix(name) {
	var prefix;
	for(prefix in prefixes) {
		if(name.substring(GetPrefixPos,GetPrefixPos+prefix.length)==prefix) {
			GetPrefixPos+=prefix.length;
			return prefix;
		}
	}
	GetPrefixPos=0;
	prefix="";
	return prefix;
}

//marhipov
function validate_nonemptyalt(obj) {
	var name=obj.name;
	var new_name,i;
	new_name='f'+name.match(/\d+a\d+$/);
	for(i=0;i<f.elements.length;i++)
		if(f.elements[i].name==new_name || f.elements[i].name=="_radio_"+new_name)
			if(f.elements[i].value=='alt' && f.elements[i].checked=='1' && obj.value=='')
				return false;
	return true;
}
//

//
function validateStrLen(obj){
	var len = obj.value.length;
	if( strlen != 0 && len && len != strlen ){
		return false;
	}
	return true;
}

function validateMax(obj){
	var len = obj.value.length;
	if( maxlen != 0 && len > maxlen ){
		return false;
	}
	return true;
}

//&& len - если поле пустое оно не обрабатывается
function validateMin(obj){
	var len = obj.value.length;
	if( minlen != 0 && len > 0 && len < minlen ){
		return false;
	}
	return true;
}
//

function validate_email(obj) {
	var i;
	var val=obj.value;
	var state=0;
	if(val=="") return true;

	var re;
	re = /^[\w\.-]+@[\w\.-]+\.\w\w+$/;
	if ( !obj.value.match(re) ) return false;
	return true;
}

function validate_date(obj) {
	var i,state=0;
	var val=obj.value;
	var dd="",mm="",yyyy="";
	if(val=="") return true;
	for(i=0;i<val.length;i++) {
		switch(state) {
			case 0:
				if(val.charAt(i)==".") state=1;
				else if("0123456789".indexOf(val.charAt(i))==-1) return false;
				else dd+=val.charAt(i);
				break;
			case 1:
				if(val.charAt(i)==".") state=2;
				else if("0123456789".indexOf(val.charAt(i))==-1) return false;
				else mm+=val.charAt(i);
				break;
			case 2:
				if("0123456789".indexOf(val.charAt(i))==-1) return false;
				else yyyy+=val.charAt(i);
		}
	}
	if(state!=2) return false;
	if(isNaN(parseInt(dd)) || isNaN(parseInt(mm)) || isNaN(parseInt(yyyy))) return false;
	if(dd.length != 2 || mm.length !=2 || yyyy.length != 4) return false;
	if(parseInt(dd) < 0 || parseInt(mm) < 0 || parseInt(dd) > 31 || parseInt(mm) > 12) return false;
	return true;
}

function validate_time(obj) {
	var i,state=0;
	var val=obj.value;
	var hh="",mi="";
	if(val=="") return true;
	for(i=0;i<val.length;i++) {
		switch(state) {
			case 0:
				if(val.charAt(i)==":") state=1;
				else if("0123456789".indexOf(val.charAt(i))==-1) return false;
				else hh+=val.charAt(i);
				break;
			case 1:
				if("0123456789".indexOf(val.charAt(i))==-1) return false;
				else mi+=val.charAt(i);
		}
	}
	if(state!=1) return false;
	if(isNaN(parseInt(hh)) || isNaN(parseInt(mi))) return false;
//marhipov
	if(hh.length != 2 || mi.length !=2) return false;
//
	if(parseInt(hh)>23 || parseInt(mi)<0 || parseInt(mi)>59 || parseInt(mi)<0) return false;
	return true;
}

function validate_daterlim(obj) {
    if(!validate_date(obj)) return false;
    if(obj.value == "") return true;

    var set_sate = string2date(obj.value);

    var cur_date = new Date();
    if(set_sate > cur_date)
    {
        return false;
    }
    else
        return true;
}

function validate_datellim(obj)
{
    if(!validate_date(obj)) return false;
    if(obj.value == "") return true;

    var set_sate = string2date(obj.value);

    if( !obj.date_llim )
    {
        var cur_date = new Date();
        cur_date.setHours(0);
        cur_date.setMinutes(0,0,0);
    }
    else
    {
        //if(!validate_date(obj.date_llim)) return false;
        var cur_date = string2date(obj.date_llim);
    }

    if(set_sate < cur_date)
    {
        return false;
    }
    else
        return true;
}

function validate_workdays(obj)
{
    if(!validate_date(obj)) return false;
    if(obj.value == "") return true;


    var set_sate = string2date(obj.value);

    if( set_sate.getDay() > 5 || set_sate.getDay() == 0 )
    {
        return false;
    }
    else
        return true;
}

function validate_datetime(obj) {
	var i,state=0;
	var val=obj.value;
	var dd="",mm="",yyyy="",hh="",mi="";
	if(val=="") return true;
	for(i=0;i<val.length;i++) {
		switch(state) {
			case 0:
				if(val.charAt(i)==".") state=1;
				else if("0123456789".indexOf(val.charAt(i))==-1) return false;
				else dd+=val.charAt(i);
				break;
			case 1:
				if(val.charAt(i)==".") state=2;
				else if("0123456789".indexOf(val.charAt(i))==-1) return false;
				else mm+=val.charAt(i);
				break;
			case 2:
				if(val.charAt(i)==" ") state=3;
				else if("0123456789".indexOf(val.charAt(i))==-1) return false;
				else yyyy+=val.charAt(i);
				break;
			case 3:
				if(val.charAt(i)==":") state=4;
				else if("0123456789".indexOf(val.charAt(i))==-1) return false;
				else hh+=val.charAt(i);
				break;
			case 4:
				if("0123456789".indexOf(val.charAt(i))==-1) return false;
				else mi+=val.charAt(i);
		}
	}
	if(state!=4) return false;

	if(isNaN(parseInt(dd)) || isNaN(parseInt(mm)) || isNaN(parseInt(yyyy))) return false;
	if(parseInt(dd) < 0 || parseInt(mm) < 0 || parseInt(dd) > 31 || parseInt(mm) > 12) return false;
	if(isNaN(parseInt(hh)) || isNaN(parseInt(mi))) return false;
//marhipov
	if(hh.length != 2 || mi.length !=2) return false;
//
	if(parseInt(hh)>23 || parseInt(mi)<0 || parseInt(mi)>59 || parseInt(mi)<0) return false;
	return true;
}

function validate_nonempty(obj) {

	// добавлено с целью корректной проверки заполненности чекбокса с суффиксом _nonempty_
	if( obj.type == 'checkbox' && !obj.checked )
	{
		return false;
	}

	var val=obj.value;
	if(val.replace(/(^\s*)|(\s*$)/g, "")=="") return false;
	return true;
}

function validate_number(obj) {
//Измения: исправлен баг проверки на число
//Дата изменения: 30.10.2003 17:51
//Автор: Архипов Максим и Холодий Андрей

	if (obj.value == "") return true;
	var re;
	re = /^-?\d+[\.,]?\d*$/;
	if ( !obj.value.match(re) ) return false;
	return true;
}

function validate_select(obj) {
	var val=obj.options[obj.selectedIndex].value;
	if(val==-1 || val=="") return false;
	return true;
}

function validate_radio(obj) {
	var obj_name=obj.name;
	obj = f[obj.name];
	if(checked_fields[obj_name]==true){
		return true;
	}
	var status=false;
	var obj_length=obj.length;
	for (var i = 0;i<obj_length; i++){
   		if (obj[i].checked){
			status=true;
		}
	}
	if(status){
		checked_fields[obj_name]=true;
	}
	return status;
}

function validate_alphastring(obj) {
	var val=obj.value;
	for(i=0;i<val.length;i++) {
        	if(!is_alpha(val.charAt(i))&&!is_number(val.charAt(i))&&!is_addsymb(val.charAt(i))) return false;
	}
	return true;
}

function validate_login(obj) {
	var val=obj.value;
	for(i=0;i<val.length;i++) {
        	if(!val.match("^[\\w]+$")) return false;
//			if(!is_alnum2(val.charAt(i))) return false;
	}
	return true;
}

function validate_dirname(obj) {
	var val=obj.value;
	for(i=0;i<val.length;i++) {
        	if(!is_alnum2(val.charAt(i))) return false;
	}
	return true;
}

function is_alpha(c) {
	if("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM".indexOf(c)!=-1) return true;
	return false;
}

function is_number(c) {
	if("0123456789".indexOf(c)!=-1) return true;
	else return false;
}

function is_alnum(c) {
	if(is_alpha(c) || is_number(c)) return true;
	return false;
}

function is_alnum2(c) {
	if(is_alnum(c) || c=="_" || c=="-" || c==".") return true;
	return false;
}

function is_addsymb(c) {
	if("_-\.\ ".indexOf(c)!=-1) return true;
	else return false;
}

function string2date(str_date) {
	var re_date = /^(\d+)\.(\d+)\.(\d+)$/;
	if (!re_date.exec(str_date)) {
		return (false);
	} else {
		var arrD = new Array();
		var m, d, Y;
		arrD = str_date.split(".");
		d = parseInt(correct_num(arrD[0]));
		m = parseInt(correct_num(arrD[1])) - 1;
		Y = parseInt(arrD[2]);
		return (new Date(Y, m, d));
		//return (new Date (RegExp.$3, RegExp.$2-1, RegExp.$1));
	}
}

function correct_num(strIn) {
	var res;
	if (strIn.length = 2 && (strIn.substr(0, 1) == '0')) {
		res = strIn.substr(1, 1);
	} else {
		res = strIn;
	}
	return (res);
}
