// JavaScript Document

//funkcja pomocnicza zliczajaca liczbe slów w tekscie
function liczba_slow(tekst){
    tekst = tekst.replace(/^\s+/,'');
    tekst = tekst.replace(/\s+$/,'');
    var slowa = tekst.split(/\s+/);
    var liczba = slowa.length;
    if (slowa[0] == ''){
        liczba = 0;
    }
    return liczba;
}

//liczy slowa wpisane w polu i wyswietla ilosc  w elemencie o id "nazwa pola"+"_slow"
function licz_slowa(){
    var liczba = liczba_slow($(this).val());
    var nazwa_pola = '#'+$(this).attr('name')+'_slow';
    $(nazwa_pola).html(liczba);
    if(liczba >= $(this).data('walidacja')['slowa-min']){
        $(nazwa_pola).css('color','#999999');
    } else{
        $(nazwa_pola).css('color','#FF3300');
    }
}

//funkcja walidujaca dane obiektu zwraca true w przypadku powodzenia i false w przypadku bledu,
//wyswietla kod bledu
function waliduj_pole(obiekt, pokaz_komunikat){
    var poprawne = true;
    var komunikat = '';
    var walidacja = $(obiekt).data('walidacja');
    var error_div = $(obiekt).data('pole_komunikatu');
    var tekst = $(obiekt).val();

    //walidacja dla pola wymaganego
    if(walidacja['wymagane']){
        if(tekst == ''){
            komunikat += 'Pole musi być wypełnione...<br/>';
            poprawne = false;
        }
    }

    //walidacja dla numeru telefonu
    if(walidacja['telefon']){
        if(tekst != ''){
            var telefon = /(^\d{9}$)|(^\d{11}$)/;
            var temp = tekst.replace(/(\s+)|(-+)|\(|\)/g, '');
            temp = temp.replace(/^\+/, '');

            if(!(telefon.test(temp))){
                komunikat += 'Podana wartość nie jest poprawnym numerem telefonu (9 lub 11 cyfr)...<br/>';
                poprawne = false;
            }
        }
    }

    //walidacja dla numeru telefonu
    if(walidacja['kod-pocztowy']){
        if(tekst != ''){
            var kod_pocztowy = /^\d{2}-\d{3}$/;

            if(!(kod_pocztowy.test(tekst))){
                komunikat += 'Podana wartość nie jest poprawnym kodem pocztowym...<br/>';
                poprawne = false;
            }
        }
    }

    //walidacja dla domen
    if(walidacja['strona-www']){
        if(tekst != ''){
            var strona_www = /^(https?:\/\/)?([A-Za-z0-9]+[\-.]?[A-Za-z0-9]+)+\.[A-Za-z]{2,6}$/;

            if(!(strona_www.test(tekst))){
                komunikat += 'Podana wartość nie jest poprawnym adresem strony...<br/>';
                poprawne = false;
            }
        }
    }

    //walidacja dla subdomen
    if(walidacja['subdomena']){
        if(tekst != ''){
            var subdomena = /^[A-Za-z0-9]+$/;

            if(!(subdomena.test(tekst))){
                komunikat += 'Podana wartość nie jest poprawna...<br/>';
                poprawne = false;
            }
        }
    }

    //walidacja dla e-mail
    if(walidacja['e-mail']){
        if(tekst != ''){
            var e_mail = /^((([A-Za-z0-9!#$%&\'*+/=?^_`{|}~-][A-Za-z0-9!#$%&\'*+/=?^_`{|}~-]*)|("[^\\\"]*"))\.?)+@([A-Za-z0-9]+\-?[A-Za-z0-9]+\.)+[A-Za-z]{2,6}$/;

            if(!(e_mail.test(tekst))){
                komunikat += 'Podana wartość nie jest poprawnym adresem e-mail...<br/>';
                poprawne = false;
            }
        }
    }

    //walidacja dla pola z minimalną liczba slów
    if(walidacja['slowa-min']){
        if(liczba_slow(tekst) < walidacja['slowa-min']){
            komunikat += 'Wprowadzono zbyt małą liczbę słów...<br/>';
            poprawne = false;
        }
    }

    //walidacja porównywania haseł
    if(walidacja['haslo2']){
        if(tekst != $("input[name='haslo']").val()){
            komunikat += 'Wprowadzono wartość inną niż podano w polu hasło...<br/>';
            poprawne = false;
        }
    }


    //ustawienia dla sprawdzenia ajax
    if(poprawne && walidacja['sprawdz'] ){
        wynik = $.ajax({type:'POST', url: walidacja['sprawdz'], data: { wartosc: tekst }, async: false}).responseText;
        if (wynik == 'error'){
            komunikat += 'Podana wartość nie jest dostępna...<br/>';
            poprawne = false;
        }
    }


    //wyswietlenie komunikatu błędu lub usuwanie ustawień związaych z błędeminną
    if(!poprawne){
        // ustawienie i wyświetlenie komunikatu
        $(error_div).html(komunikat);
        if(pokaz_komunikat){
            $(error_div).fadeIn(500);
            if(!$(obiekt).hasClass('error')) $(error_div).animate({opacity: 1.0}, 2000);
        }
        //ustawienia wyświetlania pola na error
        $(obiekt).addClass('error');
    } else{
        $(obiekt).removeClass('error');
    }

    $(error_div).fadeOut(500);

    return poprawne;
}

function waliduj_formularz(){
    var poprawne = true;
    var walidacja = $(this).data('walidacja');

    //wadlidacja wymaganych pól formularza
    for(i = 0; i < walidacja.length; i++){
        poprawne = waliduj_pole(walidacja[i], false) && poprawne ;
    }

    //wyświetlenie komunikatu w przypadku błędu
    if(!poprawne){
        var error_div = $(this).data('pole_komunikatu');
        $(error_div).html('Przed wysłaniem formularza popraw błędy w polach oznaczonych kolorem czerwonym...');
        var target_offset = $(this).offset();
        var target_top = target_offset.top -50;
        $('html, body').animate({scrollTop:target_top}, 400);
        if($(error_div).is(':hidden')){
            $(error_div).fadeIn(1000);
            $(error_div).animate({opacity: 1.0}, 4000);
            $(error_div).fadeOut(1000);
        }
    }
    return poprawne;
}

//inicjalizuje parametry walidacji formularza
function inicjalizuj_walidacje(){
    var walidacja = [];
    $(this).data('walidacja', walidacja);

    // wywolanie funkcji dla wszystkich elementów formularza z parametrem "enabled"
    $(this).find(':enabled').each(function(){
        var _waliduj = false;
        var _blur = false;
        var _liczslowa = false;
        var walidacja = [];

        var wymagane = /_wymagane/;
        var slowa_min =/_slowa\-min\{(\d+)\}/;
        var telefon = /_telefon/;
        var strona_www = /_strona\-www/;
        var subdomena = /_subdomena/;
        var e_mail = /_e\-mail/;
        var kod_pocztowy = /_kod\-pocztowy/;
        var haslo2 = /_haslo2/;
        var sprawdz = /_sprawdz\{(.+)\}/;


        var klasa = $(this).attr('class');

        //ustawienia dla wymaganych
        if( wymagane.test(klasa) ){
            walidacja['wymagane'] = true;
            _blur = true;
            _waliduj = true;
        }

        //ustawienia dla numeru telefonu
        if( telefon.test(klasa) ){
            walidacja['telefon'] = true;
            _blur = true;
            _waliduj = true;
        }

        //ustawienia dla kodu pocztowego
        if( kod_pocztowy.test(klasa) ){
            walidacja['kod-pocztowy'] = true;
            _blur = true;
            _waliduj = true;
        }

        //ustawienia dla strony www
        if( strona_www.test(klasa) ){
            walidacja['strona-www'] = true;
            _blur = true;
            _waliduj = true;
        }

        //ustawienia dla subdomen
        if( subdomena.test(klasa) ){
            walidacja['subdomena'] = true;
            _blur = true;
            _waliduj = true;
        }

        //ustawienia dla e-mail
        if( e_mail.test(klasa) ){
            walidacja['e-mail'] = true;
            _blur = true;
            _waliduj = true;
        }

        //ustawienia dla minimalnej liczby slów - pobieranie parametru czyli liczby slów
        var param = slowa_min.exec(klasa);
        if(param){
            walidacja['slowa-min'] = param[1];
            _blur = true;
            _waliduj = true;
            _liczslowa = true;
            //dodanie kontenera na liczbę wyrazów
            var div = $('<div>');
            $(div).addClass('liczba-slow');
            $(div).html('słów: <span id="'+$(this).attr('name')+'_slow">0</span>');
            $(this).before(div);
        }

        //ustawienia dla porównywania haseł
        if( haslo2.test(klasa) ){
            walidacja['haslo2'] = true;
            _blur = true;
            _waliduj = true;
        }

        //ustawienia dla sprawdzenia ajax
        var param = sprawdz.exec(klasa);
        if(param){
            walidacja['sprawdz'] = param[1];
            _blur = true;
            _waliduj = true;
        }

        //dodanie tablicy walidacji do danych pola
        $(this).data('walidacja', walidacja);

        //ustawieanie wymaganych zdarzen obiektów formularza
        if(_blur) $(this).blur(function(){waliduj_pole(this, true);});
        if(_liczslowa){
            $(this).keyup(licz_slowa);
            $(this).focus(licz_slowa);
        }

        if(_waliduj){
            //dodanie pola do tablicy walidacji formularza
            $(this).closest('form').data('walidacja').push(this);
            // dodawanie div'a komunikatu dla pola
            var error_div = $('<div>');
            $(error_div).addClass('error-tip');
            $(this).after(error_div);
            $(this).data('pole_komunikatu', error_div);
            //ustawienia zdarzenia focus
            $(this).focus(function(){
                var error_div = $(this).data('pole_komunikatu');
                if($(this).hasClass('error')){
                    $(error_div).fadeIn(500);
                }
            });
        }
    }); //each (this).find(':enabled')

    // ustawienie zdarzenie submit formularza - walidacja wszystkich wymaganych pól
    $(this).submit(waliduj_formularz);

    // dodawanie div'a komunikatu dla formularza
    var error_div = $('<div>');
    $(this).prepend(error_div);
    $(this).data('pole_komunikatu', error_div);
    $(error_div).addClass('error-tip-form');
}

$(function(){
    //inicjowanie walidacji dla wszystkich formularzy z klasa _sprawdz
    $('form._waliduj').each(inicjalizuj_walidacje);

})

