/** Copyright (c) 2007-2008 Piotr Głodzik piotr@autocom.pl
 * --------------------------------------------------
 * ArmazonPaginator, version 1.0 alpha
 * Data utworzenia pliku: 2007-10-30
 * Ostatnia modyfikacja:  2008-11-18
 * Konstruktor jako jeden paramert przyjmuje obiekt, którego własciwościami są:
 * - id - default:ArmazonPaginator - identyfikator paginatora
 * - pageNoId default: pageNo - id inputa z numerem strony (jeżeli post, to jest tam zapisywany numer strony, który został wybrany)
 * - method - get/post [default:get] - jaką metoda wysyłać dane
 * Framework javascript Armazon jest integralną częścią Frameworka Armazon dla PHP
 * Jednym właścielem praw autorkich i majątkowych do kodu składającego się za Framework Armazon jest Piotr Głodzik.
 * Rozpowszechnianie kodu, korzystanie z niego w celach niekomercyjnych, oraz komercyjnych bez zgody i wiedzy autora
 * jest zabronione.
 */
function ArmazonPaginator(o) {
    
    // Obiekt reprezentujący paginatora mieści się pod zmienną o przekazaną w argumencie
    
    // Metoda przypisująca zadane lub domyślne wartości właściwości obiektu
    var s=function (n,d) {o[n]=(typeof p=='undefined')?d:(typeof p[n]=='undefined')?d:p[n];};
    
    // Obiekt domyślnych wartości dla właściwości klasy
    var dP = { id : 'ArmazonPaginator',
               method : 'get',
               pageNoId : 'pageNo'
             };
                 
    // Ustawienie wszystkich właściwości klasy na wartości domyślne jezeli zostały pominięte w obiekcie przekazanym do argumentu
    for(k in dP){s(o[k],dP[k])}
            
    // Inicjacja paginatora następuje tylko jeżeli został znaleziony    
    if ( $(o.id) ) {
       
       
    // Przypisanie metody pokazującej okienko dialogowe na onclicku przycisku
    o.showPageNoButton = $(o.id).firstChild; // Przycisk uruchamiający pokazanie okna dialogowego
    o.pageNoDialog = o.showPageNoButton.nextSibling;
    
    o.goToPageButton=o.showPageNoButton.nextSibling.childNodes[2];


    o.pageNoInput=o.goToPageButton.previousSibling;
    o.pageAddress=o.goToPageButton.nextSibling;
               
    o.showPageNoButton.onclick = function(ev) {
                    
        var e=ev||event;
        
        // Jeżeli okienko nie jest widoczne, to pokazanie go
        if ( o.pageNoDialog.style.display != 'block' ) {
                        
            o.pageNoDialog.style.display = 'block';        
            o.pageNoDialog.style.top = this.offsetHeight + 'px';
            o.pageNoInput.focus();
           
            // Przypisanie listenera do całego dokumentu przechwytującego kliknięcie
            if ( document.addEventListener ) { // Dla przeglądarek
            
                document.addEventListener( 'click', o.captureClickOnDocument, false );
            
            } else if ( document.attachEvent ) { // Dla IE
            
                document.attachEvent('onclick', o.captureClickOnDocument );
            
            }        
        
            // Przypisanie listenera do okienka dialogowego przechwytującego kliknięcie                
            if ( o.pageNoDialog.addEventListener ) { // Dla Przeglądarek
            
                o.pageNoDialog.addEventListener( 'click', o.captureClickOnPageNoDialog, false );
        
            } else if ( o.pageNoDialog.attachEvent ) { // Dla IE
            
                o.pageNoDialog.attachEvent( 'onclick', o.captureClickOnPageNoDialog );
            
            }

    } else { // Jeżeli okienko dialogowe jest pokazane
        
       o.pageNoDialog.style.display = 'none';     
       
       // Usunięcie listenerów
       if (o.pageNoDialog.removeEventListener){
            o.pageNoDialog.removeEventListener( 'click', o.captureClickOnPageNoDialog, false );
            document.removeEventListener( 'click', o.captureClickOnDocument, false );
        } else if (o.pageNoDialog.detachEvent){
            
            o.pageNoDialog.detachEvent( 'onclick', o.captureClickOnPageNoDialog );
            document.detachEvent( 'onclick', o.captureClickOnDocument );
            
        } 
        
    }
    
}

/**
 * Metoda submitująca formularz przy kliknięciu na link z numerem strony.
 */
o.submitForm = function(ev) {
        
    var e=ev||event;
        
    // Zapisanie numeru strony do pola formularza       
    if ( $(o.pageNoId) ) {
      
        // Jeżeli następnym elementem w stosunku do klikniętego jest <input>, 
        // to znaczy że jest to przycisk funkcyjny następna/poprzednia/pierwsza/ostatnia
        // wtedy pobieram wartość z pola input        
        if ( this.nextSibling.nodeName == 'INPUT' ) {
            $(o.pageNoId).value=this.nextSibling.value;
        } else {
            $(o.pageNoId).value=this.firstChild.nodeValue
        }
        
    } else {
    
        throw 'ArmazonPaginator::submitForm: Brak pola na numer strony';
    }
    
    // Zablokowanie odpalenia linka
    e.preventDefault?e.preventDefault():e.returnValue = false;
    //Zasubmitowanie formularza
    o.goToPageButton.nextSibling.form.submit();    
    
}

    // Jeżeli ma być wysyałne metoda post, to do wszsytkich wygenerowanych linków przypisuję metode submitującą formularz
    if ( o.method=='post' ) {
        
        var recordsToIterate = $(o.id).getElementsByTagName('a');
        
        for( var x=0;x<recordsToIterate.length;x++) {
                    
            Armazon.addEvent(recordsToIterate[x],'click',o.submitForm);
        }    
    
    }

    

/**
 * EventListener - przechwytuje zdarzenia click w oknie i jeżeli takie zdarzenie nastąpi chowa okno dialogowe wprowadzania numeru strony
 */
o.captureClickOnDocument = function(ev) { 
               
    var e=ev||event;

    // Czy da się to jakoś skrócić?   
    if(e.target&&e.target!=o.showPageNoButton) {
        o.pageNoDialog.style.display = 'none';
    } else if (e.srcElement && e.srcElement!=o.showPageNoButton) {       
            o.pageNoDialog.style.display = 'none';                   
    }        
    
        
}
        
/**
 * EventListener - przechwytuje zdarzenia klikania na oknie dialogowym wprowadzania numeru strony i nie dopuszcza do jego schowania
 */
o.captureClickOnPageNoDialog = function(ev) {
    
         var e=ev||event;
        // Jeżeli kliknięcie zostało wykonane na okienku dialogowym, to wyłączenie bąbelkowania        
        e.stopPropagation?e.stopPropagation():e.cancelBubble=true;
}


/**
 * Sprawdza, czy przejście do strony zostało zasubmitowane enterem
 */
o.checkSubmit = function(ev) {
    var e=ev||event;
        
    // Jeżeli został naciśnięty enter, to wywołuję funkcję, kóra jest wywoływana na onclicku przycisku "idź"
    if ( e.keyCode == 13 ) {
                            
        // Dla opery wyłączenie submitu formularza (inaczej chyba się nie da)
        if ( window.opera ) {
                        
            if (this.form) {
                this.form.onsubmit=function(){return false;}
            }
            
        }
        
        // Zablokowanie submitu formularza dla FF i IE
        e.preventDefault?e.preventDefault():e.returnValue = false;        
        
        o.goToPage();
        
    }
}

/**
 * Przekierowuje na odpowiednią stronę 
 */
o.goToPage = function () {
    
    // Sprawdzenie poprawności wpisanego numeru strony    
    // Dowolny znak nie będący cyfrą
    if( !/\D/.test( o.pageNoInput.value ) ) { 
    
        // Czy jest większe od 0
        if ( o.pageNoInput.value > 0) {
        
            o.pageNoInput.disabled=true;
            o.goToPageButton.disabled=true;
            
            // Działam w zalezności od tego, czy paginator ma być wysłany za pomocą get czy post
            if ( o.method=='get') {                        
            var adres =  o.pageAddress.value + o.pageNoInput.value;            
            window.location.href=adres;
            } else {
                
                // Zapisuję numer strony do ukrytego pola (jeżeli jest)
                if ( $(o.pageNoId) ) {                                
                    $(o.pageNoId).value=o.pageNoInput.value;
                } else {
                    throw 'ArmazonPaginator::submitForm: Brak pola na numer strony';
                }
                
                // Submituję formularz
                o.goToPageButton.nextSibling.form.submit();
                
            }
        }
    }
}


// Dodanie listenera do guzika przekierowującego na stronę
if (o.goToPageButton.addEventListener ) { // Dla przeglądarek
            
    o.goToPageButton.addEventListener( 'click', o.goToPage, false );
    // Listener sprawdzający submit
    o.pageNoInput.addEventListener( 'keydown', o.checkSubmit, false );
        
} else if ( o.goToPageButton.attachEvent ) { // Dla IE
            
    o.goToPageButton.attachEvent( 'onclick', o.goToPage );
    // Listener sprawdzający submit
    o.pageNoInput.attachEvent( 'onkeydown', o.checkSubmit );
            
}


    // Zwrócenie obiektu Paginatora
    return o; 
    
    } else { // Jeżeli nie został znaleziony element paginator, to zwracam false
        return false;
    }
}