//var elements  = new Array();
//Элементы формы
var _form_elements                = new Array(  );
var _form_not_null_elements       = new Array(  );
var _form_double_elements         = new Array(  );
var _form_linked_elements         = new Array(  );
var _form_listen_answer           = new Array(  );
//Див элементы формы в которые будет записанна ошибка в поле формы
var _form_error_displays_elements = new Array(  );
var error_messages                = new Array(  );
//form_elements[ form_1 ][ 1 ]  = 'int';
//form_elements[ form_1 ][ 2 ]  = 'int';
//form_elements[ form_1 ][ 3 ]  = 'numeric';
//form_elements[ form_1 ][ 4 ]  = 'email';
//form_elements[ form_1 ][ 5 ]  = 'url';
//form_elements[ form_1 ][ 6 ]  = 'numeric';
//form_elements[ form_1 ][ 7 ]  = 'numeric';
//form_elements[ form_1 ][ 8 ]  = 'img';
//form_elements[ form_1 ][ 8 ]  = 'login';

//Идентификаторы полей которые должны
//быть обязательно заполненны
//form_not_null_elements[ form_1 ][ 3 ] = '';
//Поля значение которых
//должно быть подтверждено
//form_double_elements[ form_1 ][ 3 ] = 4;
//Поля которые зависят от других полей
//form_linked_elements[ form_1 ][ 3 ] = 4;
//form_linked_elements[ form_1 ][ 4 ] = 3;


error_messages[ 'int' ]       = "Должно содержать цыфры!\n"+
                                "и первый элемент не нуль";
error_messages[ 'numeric' ]   = "Числовое значение";
error_messages[ 'email' ]     = 'Не корректный адрес';
error_messages[ 'url' ]       = "Должно содержать латинские литеры\n"+
			        "символы потчеркивания и может иметь цыфры\n"+
			        "после латинского литера";
error_messages[ 'login' ]     = 'Не менее 3-х символов';
error_messages[ 'img' ]       = 'Изображение формата: jpg, bmp, gif';
error_messages[ 'txt' ]       = 'Файл формата txt';
error_messages[ 'password' ]  = 'Не менее 3-х символов';
error_messages[ 'folder' ]    = "Не должно содержать: {\n"+
                                "!"+"@"+"#"+"$"+"%"+"^"+"&"+"*\n"+
                                "("+") "+"-"+"="+"+"+","+"."+"\\\n"+
                                "|" +"/"+"<"+">"+"~"+"`"+"'\n"+
                                "\""+"{"+"}"+"["+"] "+"?"+"\n}"+
                                "\n"+"пробелов или начинаться на цифру";
error_messages[ 'canonical' ] = "Не должно содержать: {\n"+
                                "!"+"@"+"#"+"$"+"%"+"^"+"&"+"*\n"+
                                "("+") "+"-"+"="+"+"+","+"."+"\\\n"+
                                "|" +"/"+"<"+">"+"~"+"`"+"'\n"+
                                "\""+"{"+"}"+"["+"] "+"?"+"\n}"+
                                "\n"+"пробелов или начинаться на цифру";

function write_error_to( mes, div_id ){
	out_div = document.getElementById( div_id );
	if( out_div != null )
		out_div.innerHTML = mes;
}

function get_error_message_type( type ){
    if( error_messages[ type ] != null ){
        return error_messages[ type ];
    }
    return '';
}

function is_digyt( $value ){

    return true;
}

function is_numeric( value ){
    return true;
}

function is_email_name( value ){
    return true;
}

function is_url_name( value ){
    return true;
}

function is_img_name( value ){
    return true;
}

function is_folder_name( value ){
    return true;
}

function is_corect_name( value ){
    return true;
}

function is_login( value ){
    return true;
}

function is_password( value ){
    return true;
}

function is_text_date( value )
{
    reg = /^(([0-9]{2,4})\.?)*$/i;
    if(( value.length==10)&&( value.substr(2,1)==".")&&( value.substr(5,1)==".")&&( value!=""))
    {
        n=value.length;
        day=value.substr(0,2);
        month=value.substr(3,2);
        year=value.substr(6,4);
        if(day>31||day<1)
        {
            return false;
        }
        if(month>12||month<1)
        {
            return false;
        }
        if(year<1753)
        {
            return false;
        }
    }
    return true;
}

function valid_value( value, type ){
    fl = true;
    switch( type ){
        case 'int':
            fl = is_digyt( value );
        break;
        case 'numeric':
            fl = is_numeric( value );
        break;
        case 'email':
            fl = is_email_name( value );
        break;
        case 'url':
            fl = is_url_name( value );
        break;
        case 'img':
            fl = is_img_name( value );
        break;
        case 'folder':
            fl = is_folder_name( value );
        break;
        case 'canonical':
            fl = is_corect_name( value );
        break;
        case 'login':
            fl = is_login( value );
        break;
        case 'password':
            fl = is_password( value );
        break;
    }
    return fl;
}

function valid( form_id )
{
    //alert( "'"+form_id+"'" );
    var form = document.getElementById( form_id );
    //alert( form.name );
    if( form == null )
        return false;

    curr_elements           = new Array(  );
    not_null_elements       = new Array(  );
    linked_elements         = new Array(  );
    error_displays_elements = new Array(  );
    ok = true;

    //alert( ok + ' 1' );
    if( _form_elements[ form_id ] != null ){
        curr_elements = _form_elements[ form_id ];
        ok = false;
    }

    //alert( ok + ' 2' );
    if( _form_linked_elements[ form_id ] != null ){
        linked_elements = _form_linked_elements[ form_id ];
        ok = false;
    }

    //alert( ok + ' 3' );
    if( _form_not_null_elements[ form_id ] != null ){
      not_null_elements = _form_not_null_elements[ form_id ];
      ok = false;
    }

    //alert( ok + ' 4' );
    if( _form_error_displays_elements[ form_id ] )
       error_displays_elements = _form_error_displays_elements[ form_id ];
    //alert( ok + ' 5' );
    if( ok )
        return ok;

    //alert( form.elements.length );

    var l  = form.elements.length;

    if( l <= 0 )
        return true;
    var mes_empty_field = "Поле пусто";
    var correct = true;
    var not_nul = "Некоторые обязательные поля не заполнены\n";
    var is_not_nul = true;
    var not_cor = "Не коректно заполненны поля\n";
    var is_not_cor = true;
    var linked  = "Одно из полей обязательно для заполнения\n";
    var is_linked = true;

    //alert( l );

    for( var i = 0; i < l; i++ ){
        element = form.elements[ i ];
        //alert(element.type+'\n'+  element.value + '\n' +element.id + '\n' + not_null_elements[ element.id ] + '\ncor: ' + correct );
        id      = element.id;
        value   = element.value;
        if( value != '' ){
            if( curr_elements[ id ] != null ){
                if( !valid_value( value, curr_elements[ id ] ) ){
                    /*element.style.borderStyle="solid 2px;";*/
                    element.style.borderColor="RED";
                    correct    = false;
                    is_not_cor = false;
                    err = get_error_message_type( curr_elements[ id ] );
                    if( error_displays_elements[ id ] != null )
                       write_error_to( err, error_displays_elements[ id ] );
                }
            }
        }else if( not_null_elements[ id ] != null ){
            /*element.style.borderStyle="solid 2px;";*/
            element.style.borderColor="RED";
            if( error_displays_elements[ id ] != null )
                write_error_to( mes_empty_field, error_displays_elements[ id ] );
            correct    = false;
            is_not_nul = false;
        }
    }
    //alert( correct );
    if( !correct ){
        var mes = '';
        if( !is_not_cor )
            mes += not_cor;
        if( !is_not_nul )
            mes += not_nul;
        alert( mes );
        return false;
    }
    return true;
}

function theInputHave(input){
  var ok=false;
  var a='';
  for(var i = 0; i < input.length; i++) {
    var chr=input.charAt(i);
    var fined=false;
    for(var j = 1; j < theInputHave.arguments.length;j++) {
      if (chr == theInputHave.arguments[j]){fined=true;}
    }
    if(fined==true) ok=true;
  }
  return ok;
}

function allCharsIs(input){
  var ok=true;
  var a="";
  for (var i = 0; i < input.length; i++) {
    var chr=input.charAt(i);
    var fined=false;
    for(var j = 1; j < allCharsIs.arguments.length; j++) {
      if (chr == allCharsIs.arguments[j]){fined=true;}
    }
    if(fined==false) ok=false;
  }
  return ok;
}
function amountCharecters(input,ch){
	var count=0;
	for(var i=0;i<input.length;i++){
		if(input.charAt(i)==ch) count++;
	}
	return count;
}
//id=11
function isDigyt(input) {
	  return allCharsIs(input,"0", "1", "2", "3", "4",
	        "5", "6", "7", "8", "9", "0");
	}
//id=2
function isNumeric(input) {
 var chr = input.charAt(0);
  if(chr=="0")return false;
  return allCharsIs(input,"1", "2", "3", "4",
        "5", "6", "7", "8", "9", "0");
}
//id=10
function isUrlName(input){
	if(input.charAt(0)=="_")
		if(isNumeric(input.charAt(1)))return false;
	if(isNumeric(input))return false;
    return allCharsIs(input,"_",
	"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
"1", "2", "3", "4","5", "6", "7", "8", "9", "0");
}
//id=1
function isCorectName(input){
    if(isNumeric(input.charAt(0)))return false;
    return !theInputHave(input,"!","@","#","$","%","^","&","*",
    "(",")","-","=","+",",",".","\\","|","/","<",">",
    "~","`","'","\"","{","}","[","]","?");
}
//id=20
function isEMailName(input){
	//alert(input);
	if(amountCharecters(input,'@')==1)
		if(amountCharecters(input,".")>=1){
			s=input.indexOf('@');
			var user=input.substring(0,s-1);
			//if(user.charAt(0)!="_")
				/*if(allCharsIs(user,"_",
					"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
					"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")){
					var dom=input.substring(s+1,input.length);
				if(allCharsIs(dom,".",
					"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
					"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"))*/
					return true;
				//}
		}
	return false;
}

function follow_mask_input_text_data_move( key, element )
{
    //alert( key );
    var pos = doGetCaretPosition( element );

    //arrow left
    if( key == 37 &&  pos > 0 )
    {
        /*if( pos == 3 || pos == 6 )
        {
            pos -= 2;
        }
        else*/
            pos -= 1;
        setCaretPosition( element, pos );
        return false;
    }
    //arrow right
    if( key == 39 &&  pos < 10 )
    {
        /*if( pos+1 == 2 || pos+1 == 5 )
        {
            pos += 2;
        }
        else*/
            pos += 1;
        setCaretPosition( element, pos );
        return false;
    }
    return false;
}

function follow_mask_input_text_data_edit( key, element )
{
    //alert( key );
    var b_str;
    var e_str;
    var pos = doGetCaretPosition( element );
    //backspace
    if( key == 8 && pos > 0 )
    {
        if( pos != 3 && pos != 6 )
        {
            b_str = element.value.substring( 0, pos-1 );
            e_str = element.value.substring( pos );
            element.value = b_str + '_' + e_str;
            if( pos == 3 || pos == 6 )
            {
                pos -= 2;
            }
            else
                pos -= 1;
        }
        else
        {
            b_str = element.value.substring( 0, pos-2 );
            e_str = element.value.substring( pos );
            element.value = b_str + '_.' + e_str;
            pos -= 2;
        }
        setCaretPosition( element, pos );
        return false;
    }
    if( key == 46 && pos < 10 )
    {
        if( pos != 2 && pos != 5 )
        {
            b_str = element.value.substring( 0, pos );
            e_str = element.value.substring( pos+1 );
            element.value = b_str + '_' + e_str;
        }
        /*else
        {
            b_str = element.value.substring( 0, pos-2 );
            e_str = element.value.substring( pos );
            element.value = b_str + '_.' + e_str;
            pos -= 2;
        }*/

        setCaretPosition( element, pos );
        return false;
    }
    return false;
}

function follow_mask_input_text_data( event, element )
{
    if( window.event ) event = window.event;

    //var key = (typeof event.charCode == 'undefined' ? event.keyCode : event.charCode);
//Определяем что нажали
    key = event.keyCode ? event.keyCode :
               event.charCode ? event.charCode :
               event.which ? event.which : void 0;
    //alert( key );

    //arrow up, down, left right
    if( key > 36 && key < 41 )
    {
        follow_mask_input_text_data_move( key, element );
        event.returnValue = false;
        return false;
    }

    //backspace, dell
    if( key == 8 || key == 46 )
    {
        follow_mask_input_text_data_edit( key, element );
        event.returnValue = false;
        return false;
    }

    //другие функциональные клавиши
    if( event.ctrlKey || event.altKey || key <  37 )
    {
        //alert('ok');
        event.returnValue = true;
        return true;
    }
    //alert( key );
    //не цифры
    if ( key < 48 || key > 57 )
    {
        //alert('fail');
        event.returnValue = false;
        return false;
    }
//Получаем символ
    key = String.fromCharCode( key );
    var pos = doGetCaretPosition( element );

    if( pos >= 10 )
    {
        event.returnValue = false;
        return false;
    }

    if( pos==0 && key > 3  )
    {
        event.returnValue = false;
        return false;
    }

    if( pos == 1 )
    {
        var fn_day = element.value.substring( 0, 1 );
        if( fn_day == '_' && key > 0 )
        {
            element.value = '0' + element.value.substring( 1 );
            //event.returnValue = false;
            //return false;
        }
        else if( fn_day > 2 && key > 1 )
        {
            event.returnValue = false;
            return false;
        }

    }

    if( pos==2 || pos==5 )
    {
        pos += 1;
        //setCaretPosition( element, pos );
    }

    if( pos == 3 && key > 1 )
    {
        event.returnValue = false;
        return false;
    }

    if( pos == 4 )
    {
        var fn_month = element.value.substring( pos-1, pos );
        if( fn_month == '_' && key > 0 )
        {
            element.value = element.value.substring( 0, pos-1 ) + '0' + element.value.substring( pos );
            //event.returnValue = false;
            //return false;
        }
        else if( fn_month > 0 && key > 2 )
        {
            event.returnValue = false;
            return false;
        }
        else if( fn_month == 0 && key == 0 )
        {
            event.returnValue = false;
            return false;
        }
    }
/*
    if( pos > 5 )
    {
        var liter = new String( _current_date_year ).substring( pos-6, pos-5 );
        if( liter < key )
        {
            event.returnValue = false;
            return false;
        }
    }
*/

    var str = element.value.substring( 0, pos );
    str += key;
    str += element.value.substring( pos+1 );
    element.value = str;
    if( pos+1==2 || pos+1==5 )
    {
        pos += 2;
    }
    else
        pos += 1;
    setCaretPosition( element, pos );

    event.returnValue = false;
    return false;
}


function marking_input_text_data( element )
{
    if( element.value == '' )
    {
        element.value = '__.__.____';
    }
    setCaretPosition( element, 0  );
}

function unmarking_input_text_data( element )
{
    reg = /^(([0-9]{2,4})*\.?)*$/i;
    if( element.value == '__.__.____' )
    {
        element.value = '';
    }
    else if( !reg.test( element.value ) )
    {
        element.value = '';
    }
    //setCaretPosition( element, 0  );
}
function valid_with_need_checkbox(form_id,r_name)
{
    //alert( form_id + "\n" + r_name );
    var form = document.getElementById( form_id );
    if( form == null )
    {
        throw new Error("Элемент с id=\""+form_id+"\" не найден!");
        return false;
    }
    if(valid(form_id))
    {
        var elements = form.getElementsByTagName( 'input' );
        if( null == elements )
        {
            return false;
        }
        var l = elements.length;
        //alert( l );
        if( l > 0 )
        {
            for( var i=0; i<l; i++ )
            {
                //alert( elements[i].type + "\n" + elements[i].name + "\n" + elements[i].checked );
                if( elements[i].type=='checkbox' && elements[i].name.indexOf( r_name )!=-1 && elements[i].checked==true )
                {
                    return true;
                }
            }
        }
    }
    else
        return false;
    alert('Выбирите хотябы одну рубрику!');
    return false;
}
