var error_stack = new Array();
var messages = {'no_publication' : 'Nie wybrano typu publikacji, nie mogę przeprowadzić sprawdzania',
                'no_set' : 'Brak zdefiniowanego zestawu',
                'no_dots' : 'Brak kropek w tekscie dla mieszarki, bądź jest ich za mało (wymagane jest minimalnie 10 zdań)',
                'wrong_count' : 'Z podanego tekstu możesz wygenerować: %s a chcesz: %s, natomiast projekt pozwala na: %s',
                'wrong_count_art' : 'Wprowadziłeś %s artykułów, natomiast chcesz wygenerowac %s, a maksymalnie możesz %s',
                'wrong_count_nor' : 'Wprowadziłeś %s tekstów, nastomiast wpisałeś, że checsz: %s',
                'wrong_count_tpl' : 'Zła ilość w szablonach, chcesz wprowadzić %s, a możesz %s',
                'to_short' : 'Wprowadzony tekst jest za krótki',
                'wrong_links' : 'W wprowadzonym tekscie są błędne linki',
                'to_short_mix' : 'Tekst do mieszarki jest za krótki, ma: %s znaków',
                'no_links_mix' : 'Niepoprawnie wprowadzone bądź brak linków w tekscie do mieszarki',
                'wrong_balance' : 'Niepoprawne nawiasy',
                'worng_brackets' : 'Błędne nawiasy na pozycjach: %s',
                'no_brackets' : 'Brak nawiasów',
                'wrong_links' : 'Niepoprawne linki',
                'wrong_link' : 'Niepoprawny link: %s',
                'wrong_text' : 'Niepoprawny tekst',
                'dane_ok' : 'Wprowadziłeś poprawne dane',
                'wrong_art_len' : 'Nie można wygenerować tak krótkich artykułów',
                'wrong_number' : 'Niepoprawny numer',
                'wrong_radio' : 'Nieprawidłowy wybór',
                'wrong_url' : 'Nieprawidłowy adres url',
                'wrong_year' : 'Nieprawidłowy rok',
                'wrong_month' : 'Nieprawidłowy miesiąc',
                'wrong_day' : 'Niepoprawny dzień',
                'wrong_select' : 'Niepoprawny wybór',
                'wrong_email' : 'Niepoprawny email',
                'change_brackets' : 'Zmiana nawiasów z: %s na: {}',
                'change_separator' : 'Zmiana separatora z: %s na: |',
                'special_domain_count' : 'Za dużo artykulow (%s), istnieje tylko %s zdefiniowanych domen specjalnych',
                'not_special_domain_count' : 'Za dużo artykulow (%s), istnieje tylko %s zdefiniowanych domen niespecjalnych'}
function validate()
{
    error_stack = new Array();
    var result = false;
    if (validate_simple() && validate_logic())
        result = true;
        
    show_errors();
    
    return result;
}

function show_errors()
{
    $('#error_stack').html('');
    for (var i = 0; i<  error_stack.length;i++)
    {
        $('#error_stack').append('<div class="powiadomienie '+error_stack[i]['type']+' png_bg"><a href="#" onclick="closep(this);" class="close"><img src="images/cross_grey_small.png" title="Close this powiadomienie" alt="close" /></a><div>' + error_stack[i]['message'] + '</div></div>');
    }
}

function get_message(code)
{
    if(!messages[code])
        return 'Brak kodu błędu: ' + code
    var message = messages[code];
    for (i=1;i<arguments.length;i++) {
        message = message.replace('%s', arguments[i]);
    }
    return message;
}

function validate_logic()
{
    //sprawdz czy publikacja
    var pubtype = $('input[name=action_type]:radio:checked').val();
    if (!pubtype)
    {
        error_stack.push({'type' : 'blad', 'message' : get_message('no_publication')});
        return false;
    }
    var alllinks = $('#isalllinks').val();
    var link_source = $('input[name=link_source]:radio:checked').val() == 'manual' ? true : false;
    var vpub = true;
    var vurl = true;
    var vcount = true;
    var vpyramid = $('input[name=simple_pyramid]').is(':checked');
    var vhasset = $('.setclass').is(':visible'); //sprawdza czy jest jakiś zestaw, będzie trzeba zrobić jakiś hack na simpleadd
    if ($('#pagename')){
        if ($('#pagename').val() == 'simpleadd')
            vhasset = true;
    }
    if (!vhasset)
        error_stack.push({'type' : 'blad', 'message' : get_message('no_set')});
    if (pubtype == 'publication')
    {
        vpub = validate_publication(link_source);
        vcount = validate_count();
    }
    else{//is template
        vcount = validate_count_template();
    }
    
    if (link_source && !vpyramid && !alllinks)
        vurl = validate_urls();
    if (!vurl){
        error_stack.push({'type' : 'blad', 'message' : get_message('wrong_links')})
    }

    return vpub & vurl & vcount & vhasset;
}

function validate_new_links_count()
{
    var spaces = parseInt(trim($('.spaces').text()), 10);
    var count = 0;
    $('.count').each(function(){
       count += parseInt($(this).val(), 10);
    });
    return spaces >= count;
}


function validate_publication(link_source)
{
    //walidacja tekstów
    var texttype = $('input[name=text_type]:radio:checked').val();
    if (!texttype) return false;
    link_source = $('input[name=link_source]:radio:checked').val() == 'manual' ? true : false;
    if (texttype == 'synonym')
    {
        var syn = validate_synonym_text(link_source)
        if (!syn['text'] && syn['links'])
        {
            $('#art_round_desc').css('border', '1px solid green');
            return true;
        }
        else
        {
            $('#art_round_desc').css('border', '1px solid red');
            return false;
        }
    }
    else
    {
        var nor = validate_normal_articles(link_source);
        if (nor['text'] && nor['links'])
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

function validate_article(miesz)
{
    error_stack = new Array();
    if (miesz)
        link_source = true;
    else
        link_source = $('input[name=link_source]:radio:checked').val() == 'manual' ? true : false;
    var syn = validate_synonym_text(link_source);
    if (!syn['text'] && syn['links'])
    {
        $('#art_round_desc').css('border', '1px solid green');
        show_errors();
        return true;
    }
    else
    {
        $('#art_round_desc').css('border', '1px solid red');
        show_errors();
        return false;
    }
}

function validate_count_template()
{
    var available = $('#maxcount') ? $('#maxcount').val() : 500;
    var desired = 0;
    $('.quant_art').each(function(){
       desired += parseInt($(this).find('input:first').val(), 10);
    });
    if (desired > available){
        error_stack.push({'type' : 'blad', 'message' : get_message('wrong_count_tpl', desired, available)});
        return false;
    }
    return true;
}

function validate_count()
{
    var texttype = $('input[name=text_type]:radio:checked').val();
    if (texttype == 'synonym')
    {
        var v = $('#art_round_desc').val().length;
        var available = $('#maxcount') ? parseInt($('#maxcount').val(), 10) : 500;
        var counted = parseInt(v / 100, 10);
        var desired = 0;
        $('.quant_art').each(function(){
           desired += parseInt($(this).find('input:first').val(), 10);
        });
        if (desired > counted || desired > available)
            error_stack.push({'type' : 'informacja', 'message' : get_message('wrong_count', counted, desired, available)});
        if (available < 1)
        {
            error_stack.push({'type' : 'blad', 'message' : get_message('wrong_count', counted, desired, available)});
            return false;
        }
        if ($('#special_domains').is(':checked')){
            special_domains_count = parseInt($('#special_domains_count').val(), 10);
            if (counted > special_domains_count){
                error_stack.push({'type' : 'blad', 'message' : get_message('special_domain_count', counted, special_domains_count)});
                return false;
            }
        }
        else if ($('#not_special_domains').is(':checked')){
            special_domains_count = parseInt($('#not_special_domains_count').val(), 10);
            if (counted > special_domains_count){
                error_stack.push({'type' : 'blad', 'message' : get_message('not_special_domain_count', counted, special_domains_count)});
                return false;
            }
        }
        return true;
    }
    else{
        var available = $('#maxcount') ? $('#maxcount').val() : 500;
        var counted = 0;
        var desired = 0;
        var global = true;
        //$('.quant_art').each(function(){
        //   desired += parseInt($(this).find('input:first').val(), 10);
        //});
        $('.setclass').each(function(){
           d = parseInt($(this).find('.quant_art').find('input:first').val(), 10);
           c = parseInt($(this).find('.normal_article').val().split('<"tagend">').length, 10);
           //last is empty
           if (trim($(this).find('.normal_article').val()).match(/<"tagend">$/)){
             c--;
           }

           if (c != d){
                global = false;
                error_stack.push({'type' : 'blad', 'message' : get_message('wrong_count_nor', c, d)});
                set_valid($(this).find('.normal_article'), false);
           }
           else{
                set_valid($(this).find('.normal_article'), true);
           }
           desired += d;
           counted += c;
        });
        if (!global)
            return false;
        if (desired > counted || desired > available)
            error_stack.push({'type' : 'informacja', 'message' : get_message('wrong_count_art', counted, desired, available)});
        if (available < 1)
        {
            error_stack.push({'type' : 'blad', 'message' : get_message('wrong_count_art', counted, desired, available)});
            return false;
        }
        if ($('#special_domains').is(':checked')){
            special_domains_count = parseInt($('#special_domains_count').val(), 10);
            if (counted > special_domains_count){
                error_stack.push({'type' : 'blad', 'message' : get_message('special_domain_count', counted, special_domains_count)});
                return false;
            }
        } else if ($('#not_special_domains').is(':checked')){
            special_domains_count = parseInt($('#not_special_domains_count').val(), 10);
            if (counted > special_domains_count){
                error_stack.push({'type' : 'blad', 'message' : get_message('not_special_domain_count', counted, special_domains_count)});
                return false;
            }
        }
        return true;
    }
    return true;
}

function count_all_tagend()
{
    //ROBZUDOWAĆ, PRZENIESC DO validate_count i zrobić sprawdzanie
    c = 0;
    $('.normal_article').each(function(){
        c += $(this).val().split('<"tagend">').length;
    });
    return c;
}

function validate_urls()
{
    //sprawdza url-e
    var res = false;
    var set = 1;
    $('.setclass').each(function(){
        var link = 1;
       $(this).find('.linkset').each(function(){
            var url = $(this).find('input:first').attr('value');
            var title = $(this).find('input:last').attr('value');
            if (url && title){
                if (url && !(/^http/.test(url))){
                    $(this).find('input:first').val('http://' + url);
                }
                if (validators['url'][1]($(this).find('input:first')) && validators['text'][1]($(this).find('input:last')))
                    res = true;
            } else {
                union = $(this).find('textarea').val();
                if (union){
                    if (validate_unionlink(union)){
                        res = true;
                    }
                }
            }
            if (res){
                $(this).find('input').css('border', '1px solid green');
                $(this).find('textarea').css('border', '1px solid green')
            }
            else{
                $(this).find('input').css('border', '1px solid red');
                $(this).find('textarea').css('border', '1px solid red');
            }
            link++;
       });
       set++;
    });
    return res;
}

function validate_unionlink(link){
    link = trim(link);
    /* Validates: {keyword:url|keyword:url}  */  
    if (!link.match(/^{.*?}$/)){
        return false;
    }
    link = link.replace(/^{/, '').replace(/}$/, '');
    pairs = link.split('|');
    if (!pairs || !pairs.length){
        return false;
    }
    for(i = 0; i < pairs.length; i++){
        if (!pairs[i] || !pairs[i].length){
            return false;
        }
        items = pairs[i].split(':');
        if (!items || items.length < 2){
            return false;
        }
        keyword = items[0];
        link = items.slice(1).join(':');
        
        if (!link || !keyword){
            return false;
        }
        if (!validators['href'][1](link) || !validators['text_var'][1](keyword)){
            error_stack.push({'type' : 'blad', 'message' : get_message('wrong_link', keyword + '@' + link)});
            return false;
        }
    }
    return true;
}

function SafeHTML(S) {
    return S.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
}

function has_links(text)
{
    var c = document.createElement('p');
    $(c).html(text);
    var links = $(c).find('a');
    if (!links || links.length == 0)
        return false;
    var res = true;
    links.each(function(){
        if (!validators['href'][1]($(this).attr('href')))
        {
            res = false;
            error_stack.push({'type' : 'blad', 'message' : get_message('wrong_link', $(this).html()) + ' w artykule: ' + SafeHTML(text).substring(0, 150)});
        }
    });
    return res;
}

function validate_normal_articles(link_source)
{
    var res = true;
    var current = true;
    var link = true;
    $('.normal_article').each(function(){
        current = true;
        var arts = $(this).val().split('<"tagend">');
        counter = arts.length;
        //last is empty
        if (trim($(this).val()).match(/<"tagend">$/)){
          counter--;
        }
        for (var i = 0;i<counter;i++)
        {
            if (arts[i].length < 400)
            {
                error_stack.push({'type' : 'blad', 'message' : get_message('to_short')});
                res = false;
                current = false;
                continue;
            }
            if (!link_source && !has_links(arts[i]))
            {
                error_stack.push({'type' : 'blad', 'message' : get_message('wrong_links')});
                current = false;
                res = false;
                link = false;
            }
        }
        if (!current)
            $(this).css('border', '1px solid red');
        else
            $(this).css('border', '1px solid green');
    });
    return {'links' : link,
            'text' : res}
}

function validate_synonym_text(link_source)
{
    var v = $('#art_round_desc').val();
    max_text_len = 3000;
    if ($('#user_no')){
        user_no = parseInt($('#user_no').val(), 10) - 102939;
        if (user_no == 277 || user_no == 289){
            max_text_len = 1000;
        }
    }
    if (v.length < max_text_len)
    {
        error_stack.push({'type' : 'blad', 'message' : get_message('to_short_mix', v.length)});
        return {'links' : false,
                'text' : true};
    }
    regex = /[\[\]]+|[\{\}]+|[\(\)]+/
    if (!regex.test(v))
    {
        error_stack.push({'type' : 'blad', 'message' : get_message('no_brackets')});
        return {'links' : false,
                'text' : true};
    }
    dots = v.split('. ').length;
    if (dots < 10){
        error_stack.push({'type' : 'blad', 'message' : get_message('no_dots')});
        return {'links' : false,
                'text' : true};
    }
    v = prepare_synonym_text(v);
    $('#art_round_desc').val(v);
    gen_text(v);
    
    if (!link_source && !has_links(v))
    {
        error_stack.push({'type' : 'blad', 'message' : get_message('no_links_mix')});
        return {'links' : false,
                'text' : true};
    }
    
    var balance = bal(v, '[{',']}');
    if (balance != false)
        error_stack.push({'type' : 'blad', 'message' : get_message('wrong_balance')});
    var bra = brackets(v);
    if (bra.length > 0)
    {
        idx = '';
        for (var i = 0;i<bra.length;i++)
            idx += ' ' + bra[i];
        error_stack.push({'type' : 'blad', 'message' : get_message('worng_brackets', idx)});
        
        return {'links' : true,
                'text' : true};
    }
    return {'links' : true,
            'text' : balance};
}

function validate_simple()
{
    var valid = true;
    var c = true;
    $('.valid').each(function(){
        c = true;
        if ($(this).is(':visible'))
        {
            var validator = $(this).attr('class').split(' ').slice(-1);
            if (!validators[validator][1]($(this)))
            {
                valid = false;
                c = false;
                if ($('.noconfirm').val() === undefined)
                {
                    var p = get_parent($(this));
                    p.find('.powiadomienie').remove();
                    p.append(get_error($(this).attr('alt') + ' : ' + validators[validator][0], 'blad'));
                }
            }
            set_valid($(this), c);
        }
        
    });
    return valid;
}

function validate_blur(obj)
{
    if (!$(obj).hasClass('valid'))
    {
        set_valid(obj, true);
        return true;
    }
    var validator = $(obj).attr('class').split(' ').slice(-1);
    var valid = true;
    if (!validators[validator][1](obj))
    {
        valid = false;
        if ($('.noconfirm').val() === undefined)
        {
            var p = get_parent(obj);
            p.find('.powiadomienie').remove();
            p.append(get_error($(obj).attr('alt') + ' : ' + validators[validator][0], 'blad'));
        }
    }
    set_valid(obj, valid);
    return valid;
    
}

function set_valid(obj, valid)
{
    $(obj).css('border', '1px solid ' + ((valid) ? 'green' : 'red'));
    if (valid && $('.noconfirm').val() === undefined){
        p = get_parent(obj);
        p.find('.powiadomienie').remove();
        p.append(get_error(get_message('dane_ok'), 'ok'));
    }
    //$(get_parent(obj)).css('border', '1px solid ' + ((valid) ? 'green' : 'red'));
}

function no_border(obj)
{
    $(obj).css('border-color', '#d5d5d5');
}

function get_parent(obj)
{
    if ($(obj).attr('type') == 'radio')
        return $(obj).parent().parent();
    else{
        if ($(obj).hasClass('year') || $(obj).hasClass('day') || $(obj).hasClass('month')){
            return $(obj).parent().parent().parent();
        }
        if ($(obj).hasClass('uper'))
            return $(obj).parent().parent().parent().parent().parent();
            
        return $(obj).parent();
    }
}

function get_error(message, type)
{
    return '<div class="powiadomienie '+type+' png_bg"><a href="#" onclick="closep(this); return false;" class="close"><img src="images/cross_grey_small.png" title="Close this powiadomienie" alt="close" /></a><div>' + message + '</div></div>';
}

/**
 * MIESZARKA
 */

//ethanak bal
//var bad_char=bal(art_miesz_text,'[{(',']})');
//zwraca false bądź nr elementy gdzie znajdzie błąd
function bal(str,pt1,pt2)
{
    var i,j,ch,stk,rc;
    rc=true;
    stk=''
    for (i=0;i<str.length;i++) {
        ch=str[i]
        n=pt1.indexOf(ch);
        if (n>=0) {
            stk=ch+stk;
            continue;
        }
        n=pt2.indexOf(ch)
        if (n<0) continue;
        if (!stk || stk[0] != pt1[n]) {
            rc=false;
            break;
        }
        stk=stk.substr(1)
    }
    if (rc && stk) rc=false;
    if (rc) return false;
    return i;
}

//sprawdzi czy nawiasy się zgadają, jak output.length > 0 to znaczy, że nie
function brackets(str)
{
    var open = new Array();
    var closed = new Array();
    for (i=0;i<str.length;i++)
    {
        ch = str[i];
        if (ch == '{')
            open.push(i);
        if (ch == '}')
        {
            if (open.length == 0)
                closed.push(i)
            else
                open.pop();
        }
    }
    var output = open.concat(closed);
    return output;
}

function gen_text(text)
{
    html = '';
    b = brackets(text);
    i = 0;
    id = 0;
    while (i < text.length)
    {
        if (text[i] == '{' || text[i] == '}')
        {
            if (b.indexOf(i) > -1)
                c = closing_bracket(text, i + 1);
            else
                c = closing_bracket(text, i);
            class_ = b.indexOf(i) > -1 || b.indexOf(c) > -1 ? 'bad' : ((id + 1) % 2);
            html += '<span id="span_'+(++id)+'" class="unseen klasa_'+class_+'" onclick="show_span(\''+id+'\', event);">'+text.substring(i, c)+'</span>';
            i = c;
        }
        else
            html += text[i++];
    }
    $("#text").html(html);
}

function save_span(obj)
{
    var id = get_id(obj.name);
    $('#span_'+id).text($('#t_zm').val());
    $('#dodatek').hide();
    $('#art_round_desc').val($('#text').text());
    validate_article();
}

function show_span(id,e)
{
	var el="span_"+id;
	g("dodatek").style.display='block';
	g("t_zm").value=g(el).innerHTML;
	var poz=getXY(g(el))
	var pY=parseInt(poz[1])+24;
	pY+='';	
	g('dodatek').style.top=pY+'px';
	g('dodatek').style.position='absolute';
        $('#upd_button').attr('name', 'upd_' + id);
}

function closing_bracket(text, offset)
{
    op = 0;
    cl = 0;
    for (var i = offset;i<text.length;i++)
    {
        if (text[i] == '{')
            op++;
        if (text[i] == '}')
            cl++;
        if (op == cl && (op > 0 || cl > 0))
            return i + 1;
    }
    return offset;
}

/**
 * Przygotowanie tektsu do mieszarki
 */
        
function prepare_synonym_text(text)
{
    var brackets = find_current_brackets(text);
    var separator = find_current_separator(text);
    return set_all(text, brackets, separator);
}


function find_current_brackets(text)
{
    var bras = new Array('{}', '[]');
    var last = 0;
    var max = '';
    for (var i = 0; i < bras.length;i++)
    {
        bra = bras[i];
        regex = new RegExp('\\' + bra[0] + '(.*?)\\' + bra[1]);
        out = text.split(regex);
        if (out.length > last)
            max = bra;
        last = out.length;
    }
    return max;
}


function find_current_separator(text)
{
    var separators = '|,/\\';
    var max = '';
    var last = 0;
    for (var i = 0; i < separators.length; i++)
    {
        sep = separators[i];
        if (text.indexOf(sep) < 0)
            continue;
        regex = new RegExp('(\\' + sep + '+?)', 'g');
        out = text.match(regex).length;
        if (out > last)
            max = sep;
        last = out;
    }
    return max;
}

function set_all(text, brackets, separator)
{
    if (brackets != '{}')
    {
        error_stack.push({'type' : 'informacja', 'message' : get_message('change_brackets', brackets)});
        text = ''.replace(new RegExp(brackets[0], 'g'), '{').replace(new RegExp(brackets[1], 'g'), '}');
    }
    if (separator == '|'){
        return text;
    }
    error_stack.push({'type' : 'informacja', 'message' : get_message('change_separator', separator)});
    regex = /(\{.*?\})/
    items = text.split(regex);
    out = '';
    regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
    for (var i = 0; i < items.length; i++)
    {
        //hack - obejście bardziej - pewnie kiedyś wróci, albo sam to zrobię, dziś już nie mam czasu - gdy jest linkiem nic nie rób
        if ((items[i].indexOf('}') > -1 || items[i].indexOf('{') > -1) && !items[i].match(/http:\/\/|https:\/\//)){
            out += items[i].replace(new RegExp(separator, 'g'), '|');
        }
        else {
            out += items[i];
        }
    }
    return out;
}
/**
 * PROSTE WALIDATORY
 */
function remove_html(t)
{
    return t.replace(/(<([^>]+)>)/ig,'');
}


var validators={
    'text' : [get_message('wrong_text'), function(obj)
     {
        var minlen = 3;
        if ($(obj).attr("disabled") == true)
            return true;
        var v = $(obj).val();
        v = remove_html(v);
        $(obj).val(v);
        if (v.length < minlen && v.search(/^([0-9a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]+)$/) < 0)
            return false;
        else
            return true;
     }],
    'text_var' : [get_message('wrong_text'), function(v)
     {
        minlen = 3;
        v = remove_html(v);
        if (v.length < minlen && v.search(/^([0-9a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]+)$/) < 0)
            return false;
        else
            return true;
     }],
    'number' : [get_message('wrong_number'), function(obj)
     {
        var v = $(obj).val();
        if (v.length == 0)
            return false;
        if (!v.match(/^\d+$/) || parseInt(v, 10) <= 0)
            return false;
        else
            return true;
     }],
    'art_len' : [get_message('wrong_art_len'), function(obj)
     {
        if (!validators['number'][1](obj))
            return false;
        var v = parseInt($(obj).val(), 10);
        if (v < 450)
            return false;
        return true;
     }],
     'radio' : [get_message('wrong_radio'),function(obj)
     {
        if($('input[name='+$(obj).attr('name')+']:radio:checked').length == 0)
            return false;
        return true;
     }],
    'url' : [get_message('wrong_url'), function(obj)
     {
        var v = $(obj).val();
        if (v.substring(0, 7) != 'http://' && v.substring(0, 8) != 'https://'){
            v = 'http://' + v;
            $(obj).val(v);
        }
        var regexp = /(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
        return regexp.test(v);

     }],
    'href' : [get_message('wrong_url'), function(value)
     {
        var regexp = /(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
        return regexp.test(value);

     }],
    'email' : [get_message('wrong_email'), function(obj)
    {
       var regexp = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/
       return regexp.test($(obj).val());
    }],
    'year' : [get_message('wrong_year'),function(obj)
     {
        var v = $(obj).val();
        if (!v.match(/^\d{4}$/))
            return false;
        d = new Date();
        v = parseInt(v, 10);
        if (v < d.getFullYear())
            return false;
        return true;
     }],
    'month' : [get_message('wrong_month'),function(obj)
     {
        var v = $(obj).val();
        if (v.length == '1')
        {
            v = '0' + v;
            $(obj).val(v);
        }
        if (!v.match(/^\d{2}$/))
            return false;;
        v = parseInt(v, 10);
        if (v > 12 || v <= 0)
            return false;
        return true;
     }],
    'day' : [get_message('wrong_day'),function(obj)
     {
        month = parseInt($('#month_' + get_id($(obj).attr('name'))).val(), 10);
        year = parseInt($('#year_' + get_id($(obj).attr('name'))).val(), 10);
        day = parseInt($(obj).val(), 10);
        var isLeap = new Date(year,1,29).getDate() == 29;
        days = new Array(31, isLeap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
        if (days[month - 1] < day)
            return false;
        var v = $(obj).val();
        if (v.length == '1')
        {
            v = '0' + v;
            $(obj).val(v);
        }
        
        if (!v.match(/^\d{2}$/))
            return false;
        v = parseInt(v, 10);
        if (v > 31 || v <= 0)
            return false;
        return true;
     }],
    'select' : [get_message('wrong_select'), function(obj)
    {
        if (parseInt($(obj).val(), 10) == 0)
            return false;
        return true;    
    }]};

