$(document).ready(function(){
    pl_js_form_required_fields_bind ();
});

function pl_js_form_required_fields_bind ()
{
    // nalezeni a oznaceni povinnych polozek
    $('input,select,textarea').each(function(){
        var id=$(this).attr('id');
        if (id != "") {
            if ($("label[for='"+id+"']:contains(*)").length == 1) {
                $(this).attr('required','1');
                $(this).parent().addClass('required');
                var str_label = $("label[for='"+id+"']:contains(*)").text();
                str_label = str_label.replace (/\*\s*/,'');
                $("label[for='"+id+"']:contains(*)").text(str_label);
            }
            // emailove adresy
            if ($("label[for='"+id+"']:contains(mail)").length == 1) {
                if ($(this).val() == '') {
                    $(this).val('@');
                }
                $(this).attr('reqtype', '@');
            }
        }
    });

    // kontrola pri odeslani a vypsani hlasky
    $('form').live("submit",function()
    {
        var msg = '';
        var focus = null;

        // test na spravnost poli
        $('input[required], input[reqtype], textarea[required], textarea[reqtype]', $(this)).each(function() {
            if (!pl_js_form_required_fields_test($(this).attr("required"), $(this).attr("reqtype"), $(this).val())) {
                if (!focus) focus = $(this);
                $(this).addClass('wrong');
                msg += $("label[for='"+$(this).attr('id')+"']").text() + "\n";
            }
        });

        if (msg != '') {
            alert(pl_js_form_required_fields_message_error + msg);
            if (focus) focus.focus();
            return false;
        }

        return true;
    });

    // nastaveni hlidani poli za behu
    $('form input[required], form input[reqtype], form textarea[required], form textarea[reqtype]').bind("keyup", pl_js_form_required_fields_check);
    $('form input[required], form input[reqtype], form textarea[required], form textarea[reqtype]').bind("blur", pl_js_form_required_fields_check);
}
/**
 * Testovani hodnoty.
 * @param bool required true pokud je pole povinne
 * @param string type typ hodnoty:
 *               1 - povinne pole
 *               @ - e-mailova adresa
 *
 * @param mixed value vlastni hodnota pole
 *
 * @return bool true pokud hodnota vyhovuje podmince
 */
function pl_js_form_required_fields_test(required, type, value)
{
    switch (type) {
        case "@":
            if (required == undefined && (value == "@" || value == "")) return true;
            return value.search(/[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/) != -1;
            break;

        default:
            return (value || !required);

    }
}

/**
 * Funkce provede testovani zda je pole spravne vyplneno pro editaci (event keyUp) ci prechodu na jine pole
 * (event blur)
 * Pokud dojde je pole spatne vyplneno, pak oznaci prvek tridou "wrong". V opacnem pripade tuto tridu rusi.
 */
function pl_js_form_required_fields_check(event)
{
    if (!pl_js_form_required_fields_test($(this).attr("required"), $(this).attr("reqtype"), $(this).val())) {
        $(this).addClass('wrong');
    } else {
        $(this).removeClass('wrong');
    }
}
