$(function(){
    
    //Zestaaw funkcji callback dla myDialog 
    function callBackSet(){
        
        //Metoda zmieniajaca przyciks aplikowales na oferte
        this.change_button = function(){
            //Usuwam zdarzenie klik oraz inne dane a nastepnie zmienia przycisk
            $('#ad-apply .a-application').fadeOut('slow',function(){
                $(this).unbind('click').click(function(event){ event.preventDefault();})
                .attr({'href' : '#'}).find('input')
                .val('Aplikowałeś na ofertę')
                .removeAttr('id')
                .css({'backgroundImage' : 'url("/img/button_out.png")'});
                //Pokazuje ponownie obiekt
                $(this).fadeIn('slow');
            })
        }
    }
    
    function myDialog(){  
        /**
         * Wlacza objekt ;) i podpina wszelkie zdarzenia
         * Klasy css z podpietymi zdarzeniami
         * .open_msg - otwiera dialog z wiadomoscia
         * .open_application - otwiera dialog apliku
         * .open_spam - otwiera dialog zglos spam
         * .open_confirm - otwiera okno potwierdzenia akcji
         * 
         * Powyższe klasy moga być bezpośrednio w znaczniku <a>
         * lub w dziecku <a> pod warunkiem ze rodzic posiada adres
         * wywoływanego urla
         **/
        
        this.msgSlider = new msgSlider();
        
        this.init = function(){
            
            var This = this; //odnosnik do objektu
            
            //Podpinam zdarzenia confirm
            $('.a-ad-del, .a-ad-susp, .a-msg-del, .a-application-del, .a-favorite-del, .a-remove-avatar, .a-edit-avatar, .dialog-add-file-course, .a-del-course').click(function(event){
                event.preventDefault();
                
                //Pobieram nazwy klas i odpalam dla pasujacej okienko dialogowe
                var dialogs = $(this).attr('class').split(' ');
                //Odpalam okno w zaleznosci od tego czy jest takie
                for( el in dialogs){    
                    //Steruje czy zapytanie ma isc po ajaksie czy ma by wykonany zwykly reload strony
                    var ajax = false;
                    if(/-ajax/.test(dialogs[el])){
                        //Ustawiam flage ze idzie po ajaxie i kasuje -ajax z nazwy klasy, aby mozna bylo wywolac dialogboxa
                        ajax= true; 
                        dialogs[el] = dialogs[el].replace('-ajax', '');
                    }
                    var dialogElement = $('#'+dialogs[el].replace('a-', 'dialog-'));
                    if(dialogElement.length){
                        This.openDialog(dialogElement, This.getUrl($(this)), true, ajax );
                    }
                }
            });
            
            //Podpinam zdarzenia click pod obiekty z dialogami
            $('.a-msg, .a-spam, .a-application').click(function(event){ 
                //Standardowa akcja powstrzymujaca hrefa przed wykonaniem
                event.preventDefault();
                
                //Ustawiam dane dla forma jesli potrzeba. Wymagane przy msg_to_offer i application, spam
                var element_val = $('.element-id', $(this).closest('div')).val();
                $('.element_id').val(element_val); //Kopiowanie kopiuje element_id do dialog-boxa
                
                //Pobieram nazwy klas i odpalam dla pasujacej okienko dialogowe
                var dialogs = $(this).attr('class').split(' ');
                
                //Odpalam okno w zaleznosci od tego czy jest takie
                for( el in dialogs){    
                    var dialogElement = $('#'+dialogs[el].replace('a-', 'dialog-'));

                    if(dialogElement.length){
                        This.openDialog(dialogElement, This.getUrl($(this)), false );
                    }
                }
            });
        //Podpinam zdarzenia pod obiekty z conofirmami
            
        }
        
        /*
         *Pobierz urla potrzebnego do wysylki wiadomosci
         *Sprawdzam objekt przekazany jak i rodzica czy posiada href
         *Jesli href nie zdefiniowany zwracam #
         *@param obji - objekt jquery kliknietego elementu DOM
         */
        this.getUrl = function (obj) {
            
            if(typeof obj.attr('href')== 'string'){
                return obj.attr('href')
            }else{
                if(typeof obj.parent().attr('href')== 'string'){
                    return obj.parent().attr('href');
                }else{
                    return '#';
                }
            }
        }
       
        /*Otwiera okno dialogowe
         *@param object dialogObj - wskaznik do objektu DOM, ktróry ma byćotwarty
         *@param string url - adres url pod jaki ma byc skierowane zapytanie
         *@param bool confirm -  czy otwierane okno jest typu confirm (true), modal(false)
         *@param bool ajax - czy zapytanie ma isc po ajaxie tak/nie
         */
        this.openDialog = function(dialogObj, url, confirm, ajax ){
            
            var This = this; 
            /****************************************************
             *Jesli zdefiniowano wlasne nazwy przyciskow (max 2)
             *To zmieniam nazwy i podpinam zdarzenia
             *Tyczy sie dialoga typu confirm
            */
           var btns = {};
           //Definuje domyslne butony
           btns['Tak'] = function(){This.sendButton(url, ajax)};
           btns['Nie'] = function(){This.close(dialogObj)};
           
          if($('.myButtons', dialogObj).length){
              
              //Kasuje domyslny btns
              btns = {};
              
               //Pobieram przyciski zapisane w span
               var buttons = $('.myButtons', dialogObj).find('span');
               //Jesli mamy submita ustawiam go na akcje zatwioerdzajaca
                if(dialogObj.find('form :submit').length){ 
                    btns[dialogObj.find('form :submit').val()] = function(){ This.sendSubmit(dialogObj); };
                    btns[$(buttons[0]).text()] = function(){ This.close(dialogObj);};
                }else{
                    btns[$(buttons[0]).text()] = function(){This.sendButton(url, ajax)};
                    btns[$(buttons[1]).text()] = function(){ This.close(dialogObj);};
                }
           }

          /*****************************************************/
            
            if(confirm){
                dialogObj.dialog({
                    autoOpen : true,
                    width : 'auto',
                    height : 'auto',
                    resizable : false,
                    modal : true,
                    buttons : btns 
                });
            }else{
                dialogObj.dialog({
                    autoOpen : true,
                    width : 'auto',
                    height : 'auto',
                    modal : true,
                    buttons : {
                        'Wyślij' : function(){
                            $('img', dialogObj).fadeIn('fast');
                            This.send(url, dialogObj, confirm);
                        }, 
                        'Anuluj' : function(){
                            This.close(dialogObj);
                        }
                    }
                });
            }
        }
        
        /*******Funkcje uzywane przy openDialog *****/
        
        //Przycisk wyslij dla confirma
        this.sendButton = function(url, ajax){
             if(ajax) {
                This.send(url, dialogObj)
             }else{
                window.location.href = url;
             }
        }
        
        //Przycisk wyslij dla submita
        this.sendSubmit = function(obj){
            obj.find('form').submit();
        }
       /**********************************************/
        //Wysyla wiadomosc
        this.send = function(url, obj, confirm){
            var This = this;
            if(confirm){
                
            }else{
                $.ajax({
                    type : 'POST',
                    url : url,
                    dataType : 'json',
                    data: $('form',obj).serialize(),
                    /*Warto dodac ta linijke.
                 *statusCode : {
                    404 : function () {
                        pageNotFound();
                    }
                }*/
                    success : function(d){ 
                        /*
                     *Zapytanie wykonane teoretycznie poprawnie. 
                     *Zwracam odpowiedni komunikat w zaleznosci od otrzymanego wyniku
                     */
                        This.resultSuccess(d, confirm, obj);
                        //Ukrywam obrazek
                        $('img', obj).fadeOut('fast');
                    
                    },
                    error : function(){
                        This.close(obj);
                        // slider komunikatu
                        This.msgSlider.slideError('Niestety wystąpił błąd. Ządana akcja nie zostałą wykonana.');
                    }
                });
            }
        }
        /*
     * Steruje informacjami otezymanymi z ajaxa.
     * @param object json - dane otrzymane z request w formacie json
     * @param bool - informacja czy otwarte okono jest confirmem // jak narazie nieprzydatny ale przekazywany
     * @param object - objekt elemntu DOM otwartego dialog-boxa
     */
        this.resultSuccess = function (json, confirm, obj ){
            
            /**
             * json.status: 
             * 0 -error
             * 1- success
             * 2 - notice
             * 
             * Json moze zawierac zmienna callback. Odwolujaca sie do metody zdefiniowanej w klasie callBackSet
             */
             
            //Skoro tu doszedlem znaczy ze wszystko jest ok
            //Wszystko poszlo ok. Komunikat zwrotny
                if(json.status == 1 ){
                    this.close(obj);
                    //Komunikat pomyslnego wyslania wiadomosci
                    this.msgSlider.slideSuccess(json.msg);
                    /**
                     *Prosty callback do funkcji rozszerzajacych dzialanie dialog-boxa, 
                     *callback dostepny w przypadku skucesu
                     */
                    if(typeof json.callback != 'undefined' ){

                        //Zabezpiecznie przed nadpisaniem konstruktora;) a raczej ewentualnym bledem;)
                        if(typeof callBackSet == 'function'){
                            callBackSet = new callBackSet();
                        }
                        if('undefined' != callBackSet[json.callback]){ 
                            callBackSet[json.callback].apply();
                        }
                    }
                    return;
                }
                
                if(json.status == 0 || json.status == 2 ){
                    //Pozostaw otwarty box. //Przypadek walidacji
                    if(json.display == 1 ){
                        //Przypadek gdy msg zawiera kilka komunikatow zapisanych jako objekt
                        if(typeof json.msg == 'object'){
                            for(index in json.msg){
                                //Wyswietlam komunikaty bledow
                                obj.find('.error-'+index).html(json.msg[index]).slideDown('slow');
                                //Podpinam zdarzenie usuniecia komunikatu
                                obj.find('input[name="'+index+'"], textarea[name="'+index+'"]').keypress(function (){
                                    obj.find('.error-'+$(this).attr('name')).slideUp('slow').unbind('keypress');
                                });
                            };
                        }else{
                            obj.find('#send-msg-error').html(json.msg).slideDown('slow');
                            obj.find('textarea, input').keypress(function(){
                                obj.find('#send-msg-error').slideUp('keypress', function(){
                                    $(this).val('');
                                }).unbind('click');
                            });
                        }
                    }else{
                        this.close(obj);
                        if(json.status == 0 ){
                            this.msgSlider.slideError(json.msg);
                        }else{
                            this.msgSlider.slideNotice(json.msg);
                        }
                    }
                }
        }
        
        /*
     * Zamyka okno dialogowe
     * @param object obj - obiekt DOM wskaznik jQuery okna do zamkniecia
     */
        this.close = function(obj){
            obj.dialog('close');
            //Czyszcze wsyzstkie informacje wpisane przez usera
            obj.find('input[type=text], textarea').each(function(){
                $(this).val('');
            });
            
            //Czyszcze informacje o ilosci znakow wprowadzonych jesli zdefiniowano div z iloscia znakow
            obj.find('.charLeft').text(obj.find('.maxLength').val());
            
            //Wykasuj wpisany tekst z pol error
            obj.find('#send-msg-error').text('').css('display' , 'none');
            obj.find('div').each(function(){
                if( /error-/.test($(this).attr('class'))){
                    $(this).text('');
                } 
            })
            obj.find('img').css('display', 'none');
        }
    }
    dialogStart = new myDialog();
    dialogStart.init();
});
