/* nowy obiekt */
var data = new BrowserEngine();


/**
 *  @class BrowserEngine
 *  @author itheaz.com
 *  @contact bok@itheaz.com
 *
 *  Klasa do obsługi błędów wynikających z niedoskonałości przeglądarek internetowych 
 *  głównie internet explorer, ale także z niepełną implementacją CSS w innych przeglądarkach.
 *
 *  Klasa obsługuje także elementy takiej jak menu etc.
 */

function BrowserEngine(){
    var userAgent = navigator.userAgent;                // Pobieramy informacje o przeglądarce

    var isOpera = window.opera && opera.buildNumber;    // Sprawdzamy czy używana przeglądarka to Opera
    var isKonqueror = /Konqueror/i.exec(userAgent);     // Sprawdzamy czy używana przeglądarka to Konqueror


	
    /*
     *  metoda zwracająca obiekt, który jest uchwytem do identyfikatorów xhtml'a
     *
     *  @param id
     *  @return obj
     */

    function getObjId(id){
	    var obj = eval('document.getElementById ? document.getElementById("'+id+'") : document.all.'+id);
	    return obj;
    }
    
    
    /*
     *  metoda obsługująca menu główne na stronie zarówno po 
     *  najechaniu myszką na pozycję (over) jak i zjechanie z niej (out)
     */

    function initMenu(){
        if(getObjId("sidebar")){
            var divsArr = new Array();
            var listArr = new Array();
            var rectArr = new Array();

            divsArr = getObjId("sidebar").getElementsByTagName("div");
            for(var i=0, c=divsArr.length; i<c; i++){
                if(divsArr[i].className == "sideBox menuType"){
                    listArr[i] = divsArr[i].getElementsByTagName("li");
                    rectArr[i] = new Array();
                    
                    for(var j=0, k=listArr[i].length; j<k; j++){
                        rectArr[i][j] = listArr[i][j].getElementsByTagName("div");

                        if(listArr[i][j].className == "last"){
                            eval(''+
                                'listArr['+i+']['+j+'].onmouseover = function(){'+
                                    'rectArr['+i+']['+j+'][0].className = "activeRectangle hover";'+
                                    'listArr['+i+']['+j+'].className = "last hover";'+
                                '}'+
                            '');
                            
                            eval(''+
                                'listArr['+i+']['+j+'].onmouseout = function(){'+
                                    'rectArr['+i+']['+j+'][0].className = "activeRectangle";'+
                                    'listArr['+i+']['+j+'].className = "last";'+
                                '}'+
                            '');
                        }
                        else{
                            eval(''+
                                'listArr['+i+']['+j+'].onmouseover = function(){'+
                                    'rectArr['+i+']['+j+'][0].className = "activeRectangle hover";'+
                                    'listArr['+i+']['+j+'].className = "hover";'+
                                '}'+
                            '');

                            eval(''+   
                                'listArr['+i+']['+j+'].onmouseout = function(){'+
                                    'rectArr['+i+']['+j+'][0].className = "activeRectangle";'+
                                    'listArr['+i+']['+j+'].className = "";'+
                                '}'+
                            '');
                        }
                    }
                }
            }
        }
    }


    /*
     *  metoda naprawiająca bug w przeglądarkach nie bosługujących do końca CSS'a 
     *  chodzi o ułożenie identyczną wysokość dwóch kolumn - sidebar i content
     */    

    function sameHeight(){
        if(getObjId("sidebar") && getObjId("content")){
            var sidebar = getObjId("sidebar");
            var content = getObjId("content");
            
            if(sidebar.clientHeight > content.clientHeight)
                content.style.height = (content.clientHeight * 1) + ((sidebar.clientHeight * 1) - (content.clientHeight * 1)) + 5 + "px";
        }
    }


    /*
     *  metoda naprawiająca różnice pomiędzy różnymi przeglądarkami
     *  głównie używane dla opery i konqueror'a
     */

    function fakeStyle(){
        var inpArr = new Array();
        var rdoArr = new Array();
        var btnArr = new Array();
        var edtArr = new Array();
        
        var countInpArr = 0;
        var countBtnArr = 0;
        var countEdtArr = 0;

        inpArr = document.getElementsByTagName("input");
        countInpArr = inpArr.length;

        if(countInpArr > 0){
            for(var i=0, j=0, k=0, l=0; i<countInpArr; i++){
                if(inpArr[i].type == "submit"){
                    inpArr[i].onfocus = blurLink;
                    btnArr[j] = inpArr[i];
                    j++;
                }
                
                if(inpArr[i].type == "radio"){
                    rdoArr[l] = inpArr[i];
                    l++;
                }
                
                if(inpArr[i].type == "text" || inpArr[i].type == "password"){
                    edtArr[k] = inpArr[i];
                    k++;
                }
            }
        }

        countBtnArr = btnArr.length;
        countEdtArr = edtArr.length;
        
        // style poprawiające bugi dla konqueror'a
        if(isKonqueror){
            var lblArr = new Array();
            var hrArr = new Array();

            if(countBtnArr > 0){
                for(var i=0; i<countBtnArr; i++){
                    btnArr[i].style.width = 58 + "px";
                    btnArr[i].style.height = 20 + "px";
                }
            }
            
            var radioLength = rdoArr.length;
            if(radioLength > 0){
                for(var i=0; i<radioLength; i++){
                    rdoArr[i].style.margin = "-5px 0 0 0";
                }
            }
            
            lblArr = document.getElementsByTagName("label");
            for(var i=0, c=lblArr.length; i<c; i++)
                if(lblArr[i].className == "radioLabel")
                    lblArr[i].style.bottom = "5px";
            
            getObjId("searchSubmit").style.width = "20px";
            
            hrArr = getObjId("middle").getElementsByTagName("hr");
            for(var i=0, c=hrArr.length; i<c; i++)
                if(hrArr[i].className == "middleLine")
                    hrArr[i].style.marginTop = "50px";
        }
        
        // style poprawiające bugi opery
        if(isOpera){
            if(countBtnArr > 0)
                for(var i=0; i<countBtnArr; i++)
                    btnArr[i].style.padding = 0;
        }
        
        // style poprawiająca bugi te same zarowno dla opery jak i dla konqueror'a
        if(isOpera || isKonqueror){
            if(countEdtArr > 0)
                for(var i=0; i<countEdtArr; i++)
                    edtArr[i].style.padding = 0;
        }
    }

    
    /*
     *  metoda słóżaca do zdejmowania dla wszystkich linków
     *  blura - metoda: blurLink
     */
    
    function linkFocusBlur(){
        var linkArr = new Array();
        
        linkArr = document.getElementsByTagName("a");
        for(var i=0, c=linkArr.length; i<c; i++)
            linkArr[i].onfocus = blurLink;
    }
    
    
    /*
     *  metoda słóżąca do robienia onfocus="blur()" na wybrane elementy
     *  przypisuje dla pola this.blur odpowiednią metodę
     */

    function blurLink(){
        if(this.blur) 
            this.blur(); 
    }


    /*
     *  główna metoda publiczna inicjująca pozozstałe metody
     *  jest wywoaływana poza ciałem klasy, jako obiekt
     */

    this.init = function(){
        sameHeight();
        fakeStyle();
        initMenu();
        linkFocusBlur();
    }
};


/* funkcja onload ustawiona na window - czyli wywoływana jest po załadowaniu całej strony */
window.onload = function(){
    data.init();    // wywołanie obiektu
    delete data;    // kasowanie obiektu
}

