// JavaScript Document

//zmiana wyglądu pola file
function zmiana_file(){
   $(this).css({
        "position": "relative",
	"text-align": "right",
	"-moz-opacity":"0",
	"filter": "alpha(opacity: 0)",
	"opacity": "0.0",
	"z-index": "2"
   });

    var pojemnik_glowny = $("<div>").css({
        "position" : "relative"
    });

    var pojemnik_dodatkowe = $('<div>').css({
        "position": "absolute",
	"top": "1px",
	"left": "0px"
    });

    $(pojemnik_dodatkowe).css({
        "width" : $(this).width() + 5 + "px"
    });

    var dodatkowy_input = $('<input type="text" readonly>');

    $(dodatkowy_input).css({
        "width" : $(this).width() - 105 + "px",
        "float" : "left",
        "z-index": "3",
        "margin-right" : "2px"
    });

    var dodatkowy_przycisk = $("<div>").addClass('file');
    $(dodatkowy_przycisk).css({
        "float" : "left"
    });
    $(dodatkowy_przycisk).text("Przeglądaj...");

    if ($.browser.mozilla) {
       $(pojemnik_dodatkowe).css({
            "width" : $(this).width() + 2 + "px"
        });
    }

    if ($.browser.msie) {
       $(pojemnik_dodatkowe).css({
            "width" : $(this).width() + 15 + "px"
        });
        $(dodatkowy_input).css({
            "width" : $(this).width() - 105 + "px"
        });
    }
    
    if ($.browser.safari) {
       $(pojemnik_dodatkowe).css({
            "width" : $(this).width() + "px"
        });
       $(dodatkowy_przycisk).css({
            "margin-top" : "2px"
       });
       $(dodatkowy_input).css({
            "width" : $(this).width() - 108 + "px"
        });
    }
    
    if ($.browser.opera) {
       $(pojemnik_dodatkowe).css({
            "width" : $(this).width() + 13 + "px"
        });
       $(dodatkowy_input).css({
            "width" : $(this).width() - 97 + "px"
        });
    }
    
    $(this).wrap(pojemnik_glowny);
    $(this).after(dodatkowy_input);
    $(dodatkowy_input).wrap(pojemnik_dodatkowe);
    $(dodatkowy_input).after(dodatkowy_przycisk);

    $(this).bind("change", function(){
        $(dodatkowy_input).val($(this).val());
    })
    
};

//zmiana wyglądu przycisków
function zmiana_przycisk(){
   var odnosnik = $('<a href="#">' + $(this).val() + '</a>');
   $(odnosnik).attr('name', $(this).attr('name'));
   $(odnosnik).attr('value', $(this).attr('value'));
   $(this).replaceWith(odnosnik);
   if($(this).hasClass('_super-duzy')) $(odnosnik).wrap('<div class="przycisk-duzy">');
   if($(this).hasClass('_super-maly')) $(odnosnik).wrap('<div class="przycisk-maly">');
  
   if($(this).attr('type') == 'submit'){
       $(odnosnik).click(function(){
            var temp = $('<input />');
            $(temp).attr('type', 'hidden');
            $(temp).attr('name', $(this).attr('name'));
            $(temp).attr('value', $(this).attr('value'));
            var form = $(this).closest('form');
            $(temp).appendTo(form);
            $(form).submit();
       })
   };

  if($(this).attr('type') == 'reset'){
       $(odnosnik).click(function(){
           $(this).closest('form').each(function(){
               this.reset();
           });
       })
   }
 };

//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'] ){
        var 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łędem
    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);
        }
    } else{ //kasowanie opisu pola przed wysłaniem
        var opis = $(this).data('opis');
        for(i = 0; i < opis.length; i++){
            var obiekt = opis[i];
            if($(obiekt).is("select")){
                if($(obiekt).find(":selected").text() == $(obiekt).data('walidacja')['opis']){
                        $(obiekt).find(":selected").text("");
                    } 
            }else{        
                if($(obiekt).val() == $(obiekt).data('walidacja')['opis']){
                   $(obiekt).val("");
                }
           }      
        }
    }
    return poprawne;
}

//inicjalizuje parametry walidacji formularza
function inicjalizuj(){
    var walidacja = [];
    var opis = [];
    $(this).data('walidacja', walidacja);
    $(this).data('opis', opis);

    // 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 _opis = 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 opis = /_opis\{(.+)\}/;

        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;
        }

        //ustawienia dla opisu pola
        var param = opis.exec(klasa);
        if(param){
            walidacja['opis'] = param[1];
            _opis = true;
            if($(this).is("select")){
                 $(this).find(":selected").text(walidacja['opis']);
                 if(!$.browser.msie){
                     $(this).css({
                        'color': '#919191'
                    });
                 }
            }else{
               
                if($(this).attr("type") == "password"){
                    var input = $('<input type="text">');
                    $(input).data('pole', this);
                    $(input).addClass($(this).attr("class"));
                    $(input).attr("style", $(this).attr("style"));
                    $(input).css({
                        'color': '#919191'
                    });
                    $(input).val(walidacja['opis']);
                    
                    $(input).focus(function(){
                        var pole =  $(this).data("pole");
                        $(this).hide();
                        $(pole).show();
                        $(pole).focus();
                    });
                    
                    $(this).blur(function(){
                        if($(this).val() == ""){
                            var pole =  $(this).data("pole");
                            $(this).hide();
                            $(pole).show();
                        }
                    });
                    
                    $(this).after(input);
                    $(this).data('pole', input);
                    $(this).hide();
                }else
                {
                    $(this).css({
                        'color': '#919191'
                    });
                    $(this).val(walidacja['opis']);
                    
                }
            }
        }

        //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(_opis){
            if($(this).attr("type") != "password"){
                if((!$(this).is("select")) || ($(this).is("select") && (!$.browser.msie))){
                    $(this).focus(function(){
                        $(this).css({
                            'color': 'black'
                        });
                        if($(this).is("select")){
                           if($(this).find(":selected").text() == $(this).data('walidacja')['opis']){
                                $(this).find(":selected").text(" ");
                           }
                        }else{
                            if($(this).val() == $(this).data('walidacja')['opis']){
                                $(this).val("");
                            }
                        }
                    });

                    $(this).blur(function(){
                        if($(this).is("select")){
                            if($(this).find(":selected").text() == " "){
                                $(this).find(":selected").text($(this).data('walidacja')['opis']);
                                $(this).css({
                                    'color': '#919191'
                                });
                            }
                        }else{
                            if($(this).val() == ""){
                                $(this).val($(this).data('walidacja')['opis']);
                                $(this).css({
                                    'color': '#919191'
                                });
                            }
                        }
                    });
                }
            }
            //dodanie obiektu do tablicy opis formularza
            $(this).closest('form').data('opis').push(this); 
        }

        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._super-form').each(inicjalizuj);
     $('form._super-form input[type=file]._super').each(zmiana_file);
     $('form._super-form input[type="submit"]._super-duzy, form._super-form input[type="reset"]._super-duzy, form._super-form input[type="submit"]._super-maly, form._super-form input[type="reset"]._super-maly').each(zmiana_przycisk);
     $('form._super-form label').hide();
})

