/**
    Document   : AjaxBrowser.js
    Author     : Pierre FEVRIER
    Description: Classe permettant de passer toute la navigation du site en Ajax
 */

function AjaxBrowser (parentObject)
{
    this.parent = parentObject;


    // A-t-on à faire aux boulets ?
    this.is_old_IE          = false
    this.need_ie_listener   = false;

    // Préchargement du message de chargement
    this._init_messageBox();

    this._pre_init();
}

    AjaxBrowser.prototype._pre_init = function()
    {
        // URL complète avec extension
        var page_url = document.location.href;

        var page_url_split = page_url.split(this.parent.domain_name);

        // Si l'url ne possède pas d'ancre et que le visiteur n'est pas sur la page d'accueil,
        // on modifie l'url pour passer en navigation Ajax
        if (page_url.indexOf('#') == -1 && page_url_split[1] != '')
        {
            window.location.replace('http://'+this.parent.domain_name+'#'+page_url_split[1]);
        }
        else
        {
            // Ancre définie dans l'url
            this.anchor = location.hash;

            // initialisation du listener d'ancre qui permettra de détecter un changement de page
            this.set_url_listener();

            // Si l'url a été réécrite, on initialise toutes les variables de la page
            if (page_url.indexOf('#') != -1)
            {
                this._init();
            }
            else
            {
                // On charge les fonctions relatives à la page d'accueil
                this.parent._load_page_components ('accueil', '');
            }
        }
    }

    AjaxBrowser.prototype._init = function()
    {
        // Affichage du message de chargement
        this.show_messageBox('Chargement de la page...');

        // Page actuelle (ex: contact.html ou creations/mon-portfolio.html)
        this.current_page = location.hash.substr(1);

        // Pas d'expressions regulières dans un switch donc on utilise des if
        if (/^accueil.*$/.test(this.current_page))
        {
            this._set_infos_page (-17, 135, 'accueil', 'ajax=enable');
        }
        else if (/^creations.*$/.test(this.current_page))
        {
            this._set_infos_page (84, 160, 'creations', 'ajax=enable');
        }
        else if (/^cv.*$/.test(this.current_page))
        {
            this._set_infos_page (210, 99, 'cv', 'ajax=enable');
        }
        else if (/^contact.*$/.test(this.current_page))
        {
            this._set_infos_page (275, 143, 'contact', 'ajax=enable');
        }
        else if (/^blog.*$/.test(this.current_page))
        {
            // On modifie la cible du bouton du menu
            this.parent.menu.change_target (document.getElementById('blog'), 385, 111);

            // On modifie le titre de la page
            document.title = 'Portfolio de Pierre FEVRIER - Mon Blog';
            this.msgBox.display = 'none';

            this.parent._load_page_components ('blog', '');
        }
        else if (/^a\-propos.*$/.test(this.current_page))
        {
            this._set_infos_page (461, 153, 'a-propos', 'ajax=enable');
        }
        else if (this.current_page == '')
        {
            this._set_infos_page (-17, 135, 'accueil', 'ajax=enable');
        }
        else
        {
            this._set_error_404();
        }
    }

    AjaxBrowser.prototype._set_infos_page = function (pos, larg, page, postData)
    {
        // Menu contenant l'info du nom de la page
        this.target = document.getElementById(page);

        // On modifie la cible du bouton du menu
        this.parent.menu.change_target (this.target, pos, larg);

        // On demande le contenu de la page au serveur
        var req = this._get_ajax_object();

        req.open('POST', 'http://'+this.parent.domain_name+this.current_page, true);
        req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

        req.onreadystatechange = function()
        {
            if(req.readyState == 4)
            {
                if (req.status != 404)
                {
                    ctl.ajax.msgBox.display = 'none';
                    var docXML = req.responseXML;
                    ctl.content_div.innerHTML = docXML.getElementsByTagName("data").item(0).firstChild.data;

                    // On modifie le titre de la page
                    document.title = 'Portfolio de Pierre FEVRIER - '+docXML.getElementsByTagName("title").item(0).firstChild.data;

                    // Chargement des infos relatives à la page
                    ctl._load_page_components (page);

                    // Google analytics for Ajax
                    ctl.ajax.trackPage();
                }
                else
                {
                    ctl.ajax._set_error_404();
                }
            }
        }
        req.send(postData);
    }

    AjaxBrowser.prototype._set_error_404 = function()
    {
        // On cible le bouton "accueil" en cas d'erreur 404
        this.parent.menu.change_target (document.getElementById('accueil'), -17, 135);
        this.msgBox.display = 'none';
        this.parent.content_div.innerHTML = '<h2>Erreur 404: Page introuvable ou inexistante</h2><p style="margin-bottom: 0px;"><img src="http://'+this.parent.domain_name+'Application/images/icon_warning.gif" alt="" style="vertical-align:middle;" /> Désolé, mais vous cherchez quelque chose qui ne se trouve pas ici ...</p>';
        document.title = 'Portfolio de Pierre FEVRIER - Erreur 404: Page introuvable ou inexistante';
    }

    AjaxBrowser.prototype._init_messageBox = function ()
    {
        // Tableau des images à précharger
        var images = new Array('msgBox_top.gif', 'msgBox_bottom.gif');
        document.loadedImages = new Array();
        // Préchargement des images
        for (var i=0; i<images.length; i++) {
            document.loadedImages[i] = new Image(1, 1);
            document.loadedImages[i].src = 'http://'+this.parent.domain_name+'Application/images/'+ images[i];
        }

        var opacity = 70;
        var content_fader = document.createElement('div');
            content_fader.id                    = 'content_fader';
            content_fader.style.display         = 'none';
            content_fader.style.height          = document.getElementById("contenu").offsetHeight;
            content_fader.style.opacity         = (opacity / 100);
            content_fader.style.MozOpacity      = (opacity / 100);
            content_fader.style.KhtmlOpacity    = (opacity / 100);
            content_fader.style.filter          = 'alpha(opacity=' + opacity + ')';

        var msgBox = document.createElement('div');
            msgBox.id = 'msgBox';

        var msgBox_top = document.createElement('div');
            msgBox_top.id = 'msgBox_top';

        var msgBox_bottom = document.createElement('div');
            msgBox_bottom.id = 'msgBox_bottom';

        var msgBox_content = document.createElement('div');
            msgBox_content.id = 'msgBox_content';

        var msgBox_text = document.createElement('p');
            msgBox_text.id = 'msgBox_text';
            msgBox_text.innerHTML = 'Chargement de la page...';

        var msgBox_animation = document.createElement('img');
            msgBox_animation.id     = 'msgBox_animation';
            msgBox_animation.src    = 'http://'+this.parent.domain_name+'Application/images/msgBox_loader.gif';
            msgBox_animation.alt    = '';

        var msgBox_closer = document.createElement('p');
            msgBox_closer.id = 'msgBox_closer';

        msgBox_content.appendChild(msgBox_text);
        msgBox_content.appendChild(msgBox_animation);
        msgBox_content.appendChild(msgBox_closer);

        msgBox.appendChild(msgBox_top);
        msgBox.appendChild(msgBox_content);
        msgBox.appendChild(msgBox_bottom);

        content_fader.appendChild(msgBox);

        document.getElementById('bgMilieuCentre').insertBefore(content_fader, this.parent.content_div);

        this.msgBox = content_fader.style;
    }

    AjaxBrowser.prototype.show_messageBox = function (message, type, mask)
    {
        if (mask)
        {
            this.msgBox.display = 'none';
        }
        else
        {
            // Retour en haut de la page
            window.scrollTo(0, 0);
            var closer = document.getElementById('msgBox_closer');
            closer.innerHTML = '';
            closer.style.display = 'none'
            if (type == 'info')
            {
                document.getElementById('msgBox_animation').src = 'http://'+this.parent.domain_name+'Application/images/msgBox_info.gif';
                closer.innerHTML = '<a href="http://'+this.parent.domain_name+'contact.html" onclick="ctl.ajax.show_messageBox(\'\', \'\', true); return false;">[Fermer]</a>';
                closer.style.display = 'block';
            }
            else if (type == 'error')
            {
                document.getElementById('msgBox_animation').src = 'http://'+this.parent.domain_name+'Application/images/msgBox_error.gif';
                closer.innerHTML = '<a href="http://'+this.parent.domain_name+'contact.html" onclick="ctl.ajax.show_messageBox(\'\', \'\', true); return false;">[Fermer]</a>';
                closer.style.display = 'block';
            }
            else
            {
                document.getElementById('msgBox_animation').src = 'http://'+this.parent.domain_name+'Application/images/msgBox_loader.gif';
            }
            document.getElementById('msgBox_text').innerHTML = message;
            this.msgBox.height = this.parent.content_div.offsetHeight+'px';
            this.msgBox.display = 'block';
        }
    }

    AjaxBrowser.prototype.set_anchor = function(newAnchor)
    {
        // Si l'url possède déjà une ancre
        if (window.location.href.match(new RegExp('#.*$')))
        {
            window.location = window.location.href.replace(new RegExp('#.*$'), '#'+newAnchor);
        }
        else // Sinon, il suffit de l'ajouter à la fin
        {
            window.location = window.location.href+'#'+newAnchor;
        }
    }

    AjaxBrowser.prototype._get_ajax_object = function()
    {
        if(window.XMLHttpRequest) // Firefox
        {
            return new XMLHttpRequest();
        }
        else if(window.ActiveXObject) // Internet Explorer
        {
            return new ActiveXObject("Microsoft.XMLHTTP");
        }
        else // XMLHttpRequest non supporté par le navigateur
        {
            alert("Votre navigateur ne supporte pas la technologie AJAX, veuillez le mettre à jour pour pouvoir consulter ce site.");
            return false;
        }
    }

    AjaxBrowser.prototype.set_url_listener  = function ()
    {
        if(this.anchor != location.hash)
        {
            this.anchor = location.hash;
            if (this.is_old_IE)
            {
                this.need_ie_listener = true;
                this.iFrame.setAttribute('src', 'http://'+this.parent.domain_name+'iFrame/'+this.anchor.substr(1));
            }
            this._init();
        }
        this.timer = setTimeout(function () {ctl.ajax.set_url_listener()},200);
    }

    AjaxBrowser.prototype.set_location  = function ()
    {
        var iFrame_location = this.iFrame.contentWindow.getLocation();
        if(this.anchor != iFrame_location)
        {
            clearTimeout(this.timer);
            location.hash = iFrame_location;
            this.anchor = iFrame_location;
            this.set_url_listener();
            this._init();
        }
    }

    AjaxBrowser.prototype.ie_pre_init = function()
    {
        this.is_old_IE = true;
        // Ajout d'une iFrame que le boulet puisse gérer l'historique de navigation Ajax
        document.write('<iframe name="ajaxHistoryForIE" id="ajaxHistoryForIE" style="display: none;"></iframe>');
        this.iFrame = document.getElementById('ajaxHistoryForIE');
        if (this.anchor == '')
        {
            this.iFrame.setAttribute('src', 'http://'+this.parent.domain_name+'iFrame/accueil.html');
        }
        else
        {
            this.iFrame.setAttribute('src', 'http://'+this.parent.domain_name+'iFrame/'+this.anchor.substr(1));
        }
    }

    AjaxBrowser.prototype.trackPage = function ()
    {
        tracker._trackPageview('/'+this.current_page);
    }