/* Copyright (c) 2007 Piotr Głodzik piotr@autocom.pl
 * --------------------------------------------------
 * Armazon, version 1.0 alpha
 * Data utworzenia pliku: 2007-04-09 (Poniedziałek Wielkanocny)
 * Ostatnia modyfikacja:  2008-02-23
 *
 * 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.
 */

/* Metoda "skracająca" document.getElementById  */
function $(s){return document.getElementById(s)};

/* Konstruktor klasy Armazon */
var Armazon = new function() {
    
    var o = new Object();
    
    /**
     * Uniwersalna metoda dodająca listenery, pozwala uniknąć rozróżniania przeglądarek
     * za każdym razem przy dodawaniu listenerów.
     * @param object obj obiekt, do którego podpiąć listenera
     * @param string type nazwa eventa którego ma nasłuchiwać
     * @param ref fn funkcja nasłuchująca 
     */
    o.addEvent = function(obj, type, fn){
        
        if ( !obj ) throw 'Armazon.AddEvent: Missing object parameter';
        
        if (obj.addEventListener) {
        
            obj.addEventListener(type, fn, false);
            
        }
        else if (obj.attachEvent){
            obj["e"+type+fn] = fn;
            obj[type+fn] = function(){obj["e"+type+fn](window.event);}
        obj.attachEvent("on"+type, obj[type+fn]);
        }

    }

    /**
     * Tak samo jak wyżej, ale usuwa eventa
     */
    o.removeEvent = function(obj, type, fn){
        if (obj.removeEventListener)
            obj.removeEventListener(type, fn, false);
        else if (obj.detachEvent) {
        obj.detachEvent("on"+type, obj[type+fn]);
        obj[type+fn] = null;
        obj["e"+type+fn] = null;
        }

    }
            
    /**
     * Metoda ustawia właściwości obiektu, na wartości domyślne, oraz sprawdza, czy są ustawiane wymagane parametry.
     * Jeżeli parametr nie jest ustawiony, to metoda rzuca wyjątek.
     * Obiekt z definijami wartości domyślnych ma postać:
     * { nazwaWlasciwosci : { reguired : true/false, def : wartość_domyślna/null } 
     * @param object
     * @param defaultObject
     * @ return object
     */
     o.setDefault = function( obj, defObject ) {
     
        var i,x;
        // Iteruję po obiekcie z definicjami
        for( i in defObject ) {
            
            // Jeżeli iterowany parametr jest wymagany
            if ( defObject[i].required == true ) {
                                
                // Sprawdzam, czy parametr zostal podany
                // Jeżeli nie, to rzucam wyjątek                                
                if ( !obj[i] ) {
                                    
                    throw 'Armazon.setDefault: Missing required parameter: ' + i;
                }
                
            } else { // Jezeli nie jest wymagany
                
                // Ustawiam go na wartosc domyslna, jezeli jest null
                if( obj[i] == null ) {
                
                    obj[i] = defObject[i].def;
                    
                }
            }
        }
        
        return obj;
     }
     
     
     /**
      * Metoda otwierająca nowe okno
      * Jako parametr przyjmuje obiekt, którego właściwościami mogą być:      
      * Parametry, które normlanie przyjmuje metoda window.open
      * string url [Domyślnie:'']      
      * string name [Wymagany]
      * string toolbar [Domyślnie:no]
      * string menubar [Doyślnie:no]
      * string location [Domyślnie:no]
      * string status [Domyślnie:no]
      * string scrollbars [Domyślnie:no]
      * string resizable [Domyślnie:no]
      * string directories [Domyślnie:no]
      * string copyhistory[Domyślnie:no]
      * integer height [Wymagany]
      * integer width [Wymagany]
      * integer left [Domyślnie:0]
      * integer top [Domyślnie:0]
      * @param object      
      */
      o.newWindow = function (obj) {

    
                        
        // Właściwości domyślne
        var dP = { url :  { required : false, def : ''},
                   name : { required : true, def : null },
                   toolbar : { required : false, def : 'no' },
                   menubar : { required : false, def : 'no' },
                   location : { required : false, def : 'no' },
                   status : { required : false, def : 'no' },
                   scrollbars : { required : false, def : 'no'},
                   resizable : { required : false, def : 'no' },
                   direcotries : { required : false, def : 'no' },
                   copyhistory : { required : false, def : 'no' },
                   height : { required : true, def : null },
                   width : { required : true, def : null },
                   left : { required : false, def : 0 },
                   top : { required : false, def : 0 } };
                   
        try {
        
            var o = Armazon.setDefault(obj,dP);
            
        } catch (ex) {
        
                alert(ex);
                
        }                   
        
        return window.open(o.url,o.name,'toolbar='+o.toolbar+',menubar='+o.menubar+',location='+o.location+',status='+o.status+',scrollbars='+o.scrollbars+',resizable='+o.resizable+',directories='+o.direcories+',copyhistory='+o.copyhistory+',height='+o.height+',width='+o.width+',left='+o.left+',top='+o.top);
                   
      }
      
      
      /**
       * Otwiera nowe okno modalne.
       * Jako parametr przyjmuje obiekt, którego właściwościami mogą być:
       *
       */
       o.newModalDialog = function (obj) {
       
        var dP = { url :         { required : true, def : null },
                   center :      { required : false, def : 'yes' },
                   dialogheight: { required : false, def : null },
                   dialogleft :  { required : false, def : null },
                   dialogwidth : { required : false, def : null },
                   dialogtop :   { required : false, def : null },
                   resizable :   { required : false, def : 'no' },
                   scroll    :   { required : false, def : 'no' },
                   param :       { required : false, def : null }
                   };
        try {
                
            var o = Armazon.setDefault(obj, dP);
            
        } catch (ex) {
        
            alert( 'Armazon::newModalDialog: Exception' + ex.message );
            
        }
        
        var params = 'center:'+o.center+';dialogHeight:'+o.dialogheight+'px;dialogLeft:'+o.dialogleft+'px;dialogWidth:'+o.dialogwidth+'px;dialogTop:'+o.dialogtop+'px;resizable:'+o.resizable+';scroll:'+o.scroll;         
        //return window.showModalDialog( o.url, o.param, params );
        return window.showModalDialog( 'about:blank', o.param, params );
       
       }
       
       
    /**
     * Zwraca target dla eventa, ponieważ w róznych przeglądarkach różnie on się nazywa
     * @param object
     * @return object
     */
     o.getEventTarget = function(ev) {
        
        if ( typeof ev.target == 'undefined' ) {
            return ev.srcElement;
        } else {
            return ev.target;
        }
     }    
    
    
    /**
     * Metoda pomocnicza, służąca do debugowania.
     * Zwraca stringa z parami nazwa_właściwości : wartość_właściwości, dla obiektu podanego w argumancie.
     * @param object
     * @return string
     */
     o.showObject = function (o) {
        
        var s ='';
        for ( l in o ) {
            s += l + ':' + o[l]  + "\n";
        }             
        return s;
     }
    
    return o;
}

/* Usuwa wszystkie dzieci elementu */
function cC(c){var x;c.parentNode.replaceChild(x=c.cloneNode(false),c);return x}