/**  Loader JavaScript
 * @author WebU (Dylann)
 *
 * @TODO avoir une liste de fonction dans les onclic qui désactivent le display (exemple un window.open)
 * ET/OU une class
 * Pour afficher "chargement en cours" quand on change de page.
 * Pour l'utiliser avec prototype, dans la fonction loadPrototype, mettre au début :
    if(document.myLoaderExists && !myLoader.isDisplayed()){
        myLoader.display();
        if(formid == null)
            formid = '';
        if(test == null)
            test = '';
        setTimeout('loadPrototype(\''+url+'\',\''+targetid+'\',\''+formid+'\', \'1\', \''+test+'\')', 1);
        return ;
    }
 * et à la fin
    if(document.myLoaderExists)
        myLoader.hide();
 *
 * Pour l'utiliser sur les chargement normaux mettre juste avant </body> :
        <div id="ajax_loader_content">
            <script type="text/javascript" src="#$themedir#/scripts/loader.js"></script>
            <script type="text/javascript"> 
                var myLoader = new Loader();
                myLoader.init('<p>Loading your page</p>', '', '#$themedir#/images/ajax_loader.gif', '', true, true);
            </script>
        </div>
/*--------------------------------------------------------------------------*/
function Loader(){
    this.version='0.1';
    this.enabled = false ;
    this.useImg = false ;
    this.useTxt = false ;
    this.always = false ;
    this.defaultTxt = '';
    this.processing = 0 ;
    this.noProcessClass = 'noMyLoader';
    this.time = 0 ;
    this.mintime = 0 ;

    /**
    * @param    string  txt             texte à afficher dans le loader
    * @param    string  img             src de l'image à afficher
    * @param    string  imgAlt          Texte alternatif de l'image si elle n'est pas trouvée sur le serveur
    * @param    bool    txtbeforeimg    (optional true) On affiche le texte au dessus de l'image (ou non)
    * @param    bool    always          (optional true) On utilise le loader sur les chargement normaux (changement de page)
    * @param    string  noProcessClass  (optional noMyLoader) utile uniquement si always à true (ou non défini) : class pour que le lien ou le formulaire n'utilise pas le loader
    */
    this.init = function(html, mintime, txt, img, imgAlt, txtbeforeimg, always, noProcessClass){
        var ajax_loader_content = document.getElementById('ajax_loader_content');
        if(ajax_loader_content)
            this.enabled = true ;
        else{
            this.enabled = false ; alert('Div with ID = ajax_loader_content was not found. Impossible to init Ajax_Loader');return ;
        }

        if(noProcessClass!=null && noProcessClass!='')
            this.noProcessClass = noProcessClass ;

        this.always = (always == null || always) ;
        this.useTxt = (txt != null && txt!=false) ;
        this.useImg = (img != null && img!=false) ;
        this.useHTML = (html != null && html!=false) ;
        this.mintime = mintime ;
        //delete script tags
        while(ajax_loader_content.hasChildNodes())
            ajax_loader_content.removeChild(ajax_loader_content.firstChild);

        //set loader_hider and loader
        var ajax_loader_hider = document.createElement('div');
        var ajax_loader = document.createElement('div');
        var attrib ;
        attrib = document.createAttribute('id');
        attrib.nodeValue='ajax_loader_hider';
        ajax_loader_hider.setAttributeNode(attrib);
        attrib = document.createAttribute('id');
        attrib.nodeValue='ajax_loader';
        ajax_loader.setAttributeNode(attrib);


        if(this.useTxt){
            var ajax_loader_txtp = document.createElement('p');         
            ajax_loader_txtp.appendChild(document.createTextNode(txt));
            this.defaultTxt = txt ;
            attrib = document.createAttribute('id');
            attrib.nodeValue='ajax_loader_txtp';
            ajax_loader_txtp.setAttributeNode(attrib);
        }

        if(this.useImg){
            var ajax_loader_imgp = document.createElement('p');
            var ajax_loader_img = document.createElement('img');

            attrib = document.createAttribute('id');
            attrib.nodeValue='ajax_loader_img';
            ajax_loader_img.setAttributeNode(attrib);
            attrib = document.createAttribute('src');
            attrib.nodeValue=img;
            if(imgAlt==null)
                imgAlt = '' ;
            ajax_loader_img.setAttributeNode(attrib);
            attrib = document.createAttribute('alt');
            attrib.nodeValue=imgAlt;
            ajax_loader_img.setAttributeNode(attrib);
            ajax_loader_imgp.appendChild(ajax_loader_img);
            attrib = document.createAttribute('id');
            attrib.nodeValue='ajax_loader_imgp';
            ajax_loader_imgp.setAttributeNode(attrib);
        }

        if(txtbeforeimg){
            if(this.useTxt)
                ajax_loader.appendChild(ajax_loader_txtp);
            if(this.useImg)
                ajax_loader.appendChild(ajax_loader_imgp);
        }else{
            if(this.useImg)
                ajax_loader.appendChild(ajax_loader_imgp);
            if(this.useTxt)
                ajax_loader.appendChild(ajax_loader_txtp);

            if(this.useHTML)
                ajax_loader.innerHTML = html;
            
        }

        ajax_loader_content.appendChild(ajax_loader_hider);
        ajax_loader_content.appendChild(ajax_loader);
        if(!document.getElementById('ajax_loader') || !document.getElementById('ajax_loader_hider')){
            document.myLoaderExists = false ;
            this.enabled = false ;
            alert('Init of Ajax loader failed');
            return ;
        }
        document.myLoaderExists = true ;
        this.initAlways();
    }

    this.initAlways = function(force){
        if(!this.always)return ;
        var attrib ;
        var tags = document.getElementsByTagName('a');
        for(i=0; i<tags.length;i++){
            attrib = tags[i].getAttributeNode('onclick');
            attribclass = tags[i].getAttributeNode('class');
            if(attrib==null || !attrib || attrib.nodeValue == null ){
                tags[i].onclick = function(){
                    if(document.myLoaderExists){myLoader.display(1);}
                    return true ;
                }
            }else{
                if((attribclass!=null && attribclass.nodeValue.match(this.noProcessClass)) || attrib.nodeValue.match('return false')){
                    continue ;
                }else if(!attrib.nodeValue.match('return true')){
                    attrib.nodeValue+=';if(document.myLoaderExists){myLoader.display(1);}return true;';
                }else{
                    attrib.nodeValue = attrib.nodeValue.replace('return true', 'if(document.myLoaderExists){myLoader.display(1);return true;}else return true');
                }
            }
        }

        var tags = document.getElementsByTagName('form');
        for(i=0; i<tags.length;i++){
            attrib = tags[i].getAttributeNode('onsubmit');
            if(attrib==null || !attrib || attrib.nodeValue == null ){
                tags[i].onsubmit = function(){
                    if(document.myLoaderExists){myLoader.display(1);}
                    return true ;
                }
            }else{
                if((attribclass!=null && attribclass.nodeValue.match(this.noProcessClass)) || attrib.nodeValue.match('return false')){
                    continue ;
                }else if(!attrib.nodeValue.match('return true')){
                    attrib.nodeValue+=';if(document.myLoaderExists){myLoader.display(1);}return true;';
                }else{
                    attrib.nodeValue = attrib.nodeValue.replace('return true', 'if(document.myLoaderExists){myLoader.display(1);return true;}else return true');
                }
            }
        }

    }

    this.display = function(notincrement){
        if(!this.enabled) return true;
        notincrement = (notincrement!=null && notincrement==1)
        //this.moveToTop();
        this.displayId('ajax_loader_content', 'block');
        this.centerLoader();
        document.body.style.cursor = "wait";

        if(!notincrement)
            this.processing++;
        var mydate = new Date()
        this.time = mydate.getTime() ;
        return true ;
    }

    this.hide = function(time){
        if(!this.enabled) return ;
        this.processing--;
        if(this.processing>0) return;//we get many calls. we wait the last to hide.
        //this.moveToTop();

        if(this.mintime > 0 && this.time > 0){
            var now = new Date();
            now = now.getTime();
            if(now - this.time < this.mintime){
                time = this.mintime - (now - this.time) ; 
            }
        }
        if(time==null || time=='' || time <= 0){
            this.hideId('ajax_loader_content');
            document.body.style.cursor = "auto";
        }else{
            setTimeout('myLoader.hide(0)', time);
        }
    }

    this.isDisplayed = function(){
        if(!this.enabled) return true ;
        return document.getElementById('ajax_loader_content').style.display=='block';
    }

    this.hideId = function(id){
        var e = document.getElementById(id);
        if(e)
            e.style.display='none';
    }

    this.displayId = function(id, type){
        var e = document.getElementById(id);
        if(e){
            if(type==null || (type!='block' && type!='inline'))
                type = 'block' ;
            e.style.display=type;
        }
    }

    this.setText = function(txt){
        if(!this.enabled || !this.useTxt) return ;
        var nodeP = document.getElementById('ajax_loader_txtp');
        if(!nodeP) return ;
        if(txt==null || txt==false)
            txt = this.defaultTxt ;
        nodeP.firstChild.nodeValue=txt ;
    }

    this.setImg = function(imgSrc){
        if(!this.enabled || !this.useImg) return ;
        var nodeImg = document.getElementById('ajax_loader_img');
        if(!nodeImg){
            return ;
        }
        src = nodeImg.getAttributeNode('src');
        src.nodeValue=imgSrc;
    }

    this.moveToTop = function(){
        window.scrollTo(0,0);
    }

    this.centerLoader = function(){
        var el = document.getElementById('ajax_loader');
        if(!el)
            return ;
        YAHOO.util.Dom.setY(el, Math.round(YAHOO.util.Dom.getDocumentScrollTop() + (YAHOO.util.Dom.getViewportHeight() - el.offsetHeight)/2));
    }
    this.disable = function(){
        this.enabled = false ;
    }

    this.enable = function(){
        this.enabled = true ;
    }
}