﻿/*================================================================================================================================
Librarie de script pour IE et FF basé sur l'offset by jf pedrazzani
Owner: admin@refmatrix.com

Gestion des menu via leur offset.
Le but étant de générer moin d'évènement afin d'avoir des affichages de sous menu plus stable et moins gourmand en ressources
================================================================================================================================*/
//------------------------------------------------------------
//fonctions de détection du navigateur simplistes
//------------------------------------------------------------
//begin
document.IsIE = function() {
    return (navigator.appName.toUpperCase().indexOf('MICROSOFT') > -1) ? true : false;
}
document.IsFF = function() {
    return (navigator.appName.toUpperCase().indexOf('NETSCAPE') > -1) ? true : false;
}
//End
//------------------------------------------------------------
//cache les chemin des liens: onmouseover="return Winstat('')" onmouseout="return Winstat('')"
//------------------------------------------------------------
//Begin
function Winstat(str) {
    window.status = str;
    return true;
}
//End
//------------------------------------------------------------
//fonctions de bas niveau utilisées entre autre en cours de dev
//------------------------------------------------------------
//begin
function EnumPropsObject(oBj) {
    var oBjProps = '[' + oBj.tagName.toUpperCase() + ']\n';
    oBjProps += '\n<!--************BEGIN***********';
    for (prop in oBj) {
        oBjProps += '\n' + prop + ' = ' + eval('oBj.' + prop);
    }
    oBjProps += '\n***********END***********-->\n';
    return oBjProps;
}

function GetPropsObjectArray(oBj) {
    var oBjProps = new Array(0);
    try {
        for (prop in oBj) {
            oBjProps[oBjProps.length] = prop;
        }
    }
    catch (ex) {
        var err = '';
        try { err = EnumProps(ex) } catch (e) { err = ex }
        alert('GetPropsObjectArray:\n' + err);
    }
    return oBjProps;
}
function GetPropsValuesArray(oBj, propsArray) {
    var oBjValues = new Array(0);
    try {
        for (i = 0; i < propsArray.length; i++) {
            oBjValues[i] = eval('oBj.' + propsArray[i]);
        }
    }
    catch (ex) {
        var err = null;
        try {
            err = EnumProps(ex);
        }
        catch (e) { err = ex }
        alert('GetPropsValuesArray:\n' + err);
    }
    return oBjValues;
}

function EnumPropEvent(oBj) {
    try {
        var oBjProps = '\n****[Event type: ' + oBj.type.toUpperCase() + ']****\n';
        try { oBjProps += '****[Event tag name: ' + oBj.srcElement.tagName.toUpperCase() + ']****' } catch (ex) { }
        oBjProps += '\n<!--************BEGIN***********';
        for (prop in oBj) {
            oBjProps += '\n' + prop + ' = ' + eval('oBj.' + prop);
        }
        oBjProps += '\n***********END***********-->\n';
        return oBjProps;
    } catch (ex)
    { return null/*alert(EnumProps(ex))*/ }
}

function EnumProps(oBj) {
    var oBjProps = '';
    for (prop in oBj) {
        oBjProps += '\n' + prop + ' = ' + eval('oBj.' + prop);
    }
    return oBjProps;
}
//end
//------------------------------------------------------------
//Retourne un object scope
//------------------------------------------------------------
//Begin
function BaseOffsetObject() {
    this.MinLeft = 0;
    this.MinTop = 0;
    this.MaxLeft = 0;
    this.MaxTop = 0;
    this.MinX = 0;
    this.MinY = 0;
    this.MaxX = 0;
    this.MaxY = 0;
    this.CursorX = 0;
    this.CursorY = 0;
    this.Height = 0;
    this.Width = 0;
    this.ActiveMenu = null;
}
//end
//------------------------------------------------------------
//Retourne true si l'objet à une propriété tagName
//------------------------------------------------------------
//Begin
function HavingTagName(oBj) {
    var ret = true;
    var test = null;
    try { test = oBj.tagName } catch (ex) { ret = false }
    return ret;
}
//end
//------------------------------------------------------------
//Retourne le prochain parent qui à une propriété tagName
//------------------------------------------------------------
//Begin
function GetParentHavingTagName(oBj) {
    var i = 0;
    var ret = null;
    var continueLoop = true;
    try { oBj = (oBj.parentElement != null) ? oBj.parentElement : oBj.parentNode; } catch (ex) { }
    while (!HavingTagName(oBj) && continueLoop) {
        i++;
        try { oBj = (oBj.parentElement != null) ? oBj.parentElement : oBj.parentNode; } catch (ex) { }
        if (i > 100) { ret = false; continueLoop = false; alert('GetParentHavingTagName have make ' + i + ' loops!') }
    }
    return oBj;
}
//End
//------------------------------------------------------------
//Capture la position du curseur.
//Ajoute les propriétés à l'objet document (tempX et tempY)
//affecte la position du curseur aux propriétés
//------------------------------------------------------------
//Begin
document.tempX = null;
document.tempY = null;
function getMouseXY(e) {
    try {
        document.tempX = (event.x != null) ? event.x + document.documentElement.scrollLeft : e.clientX;
        document.tempY = (event.y != null) ? event.y + document.documentElement.scrollTop : e.clientY;
    }
    catch (ex) {
        document.tempX = e.clientX;
        document.tempY = e.clientY;
    }
    if (document.tempX < 0) { document.tempX = 0 }
    if (document.tempY < 0) { document.tempY = 0 }
    return true;
}
document.onmousemove = getMouseXY;
//End
//------------------------------------------------------------
//Retourne la position du curseur sous forme d'objet.
//L'objet expose 2 propriétés: x et y.
//------------------------------------------------------------
//Begin
function GetCursorXY() {
    var PositionXY = new Object();
    PositionXY.x = document.tempX;
    PositionXY.y = document.tempY;
    return PositionXY;
}
//End
//------------------------------------------------------------
//Affiche la position du curseur
//------------------------------------------------------------
//Begin
function ShowXY() {
    try {
        document.getElementById('DocumentMouseX').innerHTML = GetCursorXY().x;
        document.getElementById('DocumentMouseY').innerHTML = GetCursorXY().y;
    }
    catch (e) { }
}
//End
//La position est mise à jour toutes les 500 millisecondes
//var IntervalId = setInterval('ShowXY()', 500);
//
//------------------------------------------------------------
//Retourne l'offset sous forme d'objet BaseOffsetObject.
//L'objet expose les propriétés de BaseOffsetObject.
//------------------------------------------------------------
//Begin
function GetOffset(ObjEvent) {
    var oBj = null;
    var MenuStartLeft = 110; //Rustine pour FF
    /*affecte le bon objet pour la suite*/
    try { oBj = (ObjEvent.srcElement != null) ? ObjEvent.srcElement : ObjEvent; } catch (ex) { }

    var Ret = new BaseOffsetObject;
    var i = 0;
    var continueLoop = true;
    var TagName = null;

    this.IsFF = document.IsFF();
    this.IsIE = document.IsIE();

    try {
        //Recherche l'attribut tagName sur l'objet, sinon passe au parent jusqu'à body
        try {
            while (!HavingTagName(oBj)) {
                oBj = oBj.parentElement;
            }
        }
        catch (ex) { Ret = null }
        TagName = oBj.tagName.toUpperCase();

        //Detecte les coordonnées minimum X et Y du menu pour IE
        if (this.IsIE) {
            Ret.MinLeft = document.tempX - event.offsetX;
            Ret.MinTop = document.tempY - event.offsetY;
            Ret.MinX = Ret.MinLeft;
            Ret.MinY = Ret.MinTop;
            //Detecte les coordonnées maximum X et Y du menu pour IE  
            Ret.MaxLeft = Ret.MinLeft + oBj.clientWidth - 4;
            Ret.MaxTop = Ret.MinTop + oBj.clientHeight - 4;
            Ret.MaxX = Ret.MaxLeft;
            Ret.MaxY = Ret.MaxTop;
            Ret.Width = (oBj.clientWidth != null) ? oBj.clientWidth : oBj.offsetWidth;
            Ret.Height = (oBj.clientHeight != null) ? oBj.clientHeight : oBj.offsetHeight;
        }
        if (this.IsFF) {
            //Detecte les coordonnées minimum X et Y du menu pour FF                                        
            var curX = 0, offX = 0, curY = 0, offY = 0;
            curY = document.tempY;
            curX = document.tempX;
            Ret.cursorX = curX;
            Ret.cursorY = curY;
            offX = (oBj.offsetX != null) ? oBj.offsetX : oBj.offsetLeft;
            Ret.MinLeft = (offX + MenuStartLeft);
            Ret.Width = (oBj.clientWidth != null) ? oBj.clientWidth : oBj.offsetWidth;
            Ret.Height = (oBj.clientHeight != null) ? oBj.clientHeight : oBj.offsetHeight;
            offY = curY;
            offY = (offY - Ret.Height);
            Ret.MinTop = offY;
            Ret.MinX = Ret.MinLeft;
            Ret.MinY = Ret.MinTop;
            //Detecte les coordonnées maximum X et Y du menu pour FF
            offX = (oBj.clientWidth != null) ? oBj.clientWidth : oBj.offsetWidth;
            Ret.MaxLeft = (Ret.MinLeft + offX);
            offY = (oBj.clientHeight != null) ? oBj.clientHeight : oBj.offsetHeight;
            Ret.MaxTop = (Ret.MinTop + offY);
            Ret.MaxX = Ret.MaxLeft;
            Ret.MaxY = Ret.MaxTop;
        }
    }
    catch (ex) {
        alert('\nGetOffset:\n' + EnumProps(ex));
    }
    return Ret;
}
//End
//
//------------------------------------------------------------
//Affiche ou cache le menu enfonction de la position du curseur
//------------------------------------------------------------
//Begin
function ShowHideMenu(id, EventSrcElement) {
    try {
        var NbPossibleMenu = 0;
        this.Id = id; //id de l'élément à afficher
        this.MenuObject = null; //élément maitre du sous menu
        this.SubMenuObject = null; //element DD du menu
        this.MenuIndex = 1;
        this.IsFF = document.IsFF();
        this.IsIE = document.IsIE();
        this.ObjectToShow = document.getElementById(this.Id); //Object dont l'id est passée en parametre
        if (this.IsFF) {
            try {
                this.EventTagName = EventSrcElement.tagName.toUpperCase();
            }
            catch (ex) { alert(ex) }
        }
        else {
            this.EventTagName = (HavingTagName(event.srcElement) == true) ? event.srcElement.tagName.toUpperCase() : '';
        }

        if (this.IsFF) { this.EventObject = EventSrcElement }
        else {
            if (this.IsIE) { this.EventObject = event.srcElement }
        }
        //Si mouseover
        if (this.ObjectToShow != null && this.EventTagName == 'A') {
            //on affiche / cache
            try {
                this.ObjectToShow.style.display = 'block';
                if (document.CurrentMenuActive != null) {
                    if (document.CurrentMenuActive.ActiveMenu != null && document.CurrentMenuActive.ActiveMenu.id != ObjectToShow.id) {
                        document.CurrentMenuActive.ActiveMenu.style.display = 'none';
                        document.onmousemove = getMouseXY;
                    }
                    else
                    { return true }
                }
                try {
                    var AnchorXY = null;
                    //alert('ici');
                    if (this.IsFF) { AnchorXY = GetOffset(this.EventObject) }
                    else {
                        if (this.IsIE) { AnchorXY = GetOffset(event) }
                    }
                    var RunLoop = true, iCheck = 0;
                    while (RunLoop) {
                        try {
                            if (this.EventTagName == 'DL') {
                                RunLoop = false;
                                break;
                            }
                            else {
                                if (this.IsIE) { this.EventObject = GetParentHavingTagName(this.EventObject) }
                                if (this.IsFF) { this.EventObject = GetParentHavingTagName(this.EventObject) }
                            }
                        } catch (e) { alert(e) }
                        this.EventTagName = this.EventObject.tagName.toUpperCase();
                        iCheck++;
                        if (iCheck >= 5 || this.EventTagName == 'BODY') { RunLoop = false; break; }
                    }
                    var MenuXY = GetOffset(this.EventObject);
                    try {
                        //Le bug du show hide ce situ ici
                        document.CurrentMenuActive = new Object();
                        document.CurrentMenuActive.ActiveMenu = this.ObjectToShow;
                        document.CurrentMenuActive.MaxX = MenuXY.MaxX;
                        document.CurrentMenuActive.MaxLeft = MenuXY.MaxX;
                        document.CurrentMenuActive.MaxY = AnchorXY.MinY + MenuXY.Height;
                        document.CurrentMenuActive.MaxTop = document.CurrentMenuActive.MaxY;
                        document.CurrentMenuActive.MinX = MenuXY.MinX;
                        document.CurrentMenuActive.MinLeft = document.CurrentMenuActive.MinX;
                        document.CurrentMenuActive.MinY = AnchorXY.MinY;
                        document.CurrentMenuActive.MinTop = document.CurrentMenuActive.MinY;


                        document.onmousemove = function(e) {
                            try {
                                document.tempX = event.x + document.documentElement.scrollLeft;
                                document.tempY = event.y + document.documentElement.scrollTop;
                            }
                            catch (ex) {
                                //alert('onmousemove:\n' + ex);
                                document.tempX = e.clientX;
                                document.tempY = e.clientY;
                            }

                            if (document.tempX < 0) { document.tempX = 0 }
                            if (document.tempY < 0) { document.tempY = 0 }

                            if (IsOutOfMenuRange(false)) {
                                var MenuIndex = 1;
                                var NbPossibleMenu = (document.getElementsByTagName('DD').length < 20) ? 20 : document.getElementsByTagName('DD').length;
                                MenuIndex = 1;
                                while (MenuIndex < NbPossibleMenu) {
                                    if (document.getElementById('smenu' + MenuIndex) != null) {
                                        document.getElementById('smenu' + MenuIndex).style.display = 'none';
                                    }
                                    MenuIndex++;
                                }
                                document.CurrentMenuActive = null;
                                document.onmousemove = getMouseXY;
                            }
                            else {
                                document.CurrentMenuActive.ActiveMenu.style.display = 'block';
                            }
                            return true;
                        }

                    } catch (ex) { alert(ex); }
                }
                catch (ex) { }
            }
            catch (ex) { }
        }

    }
    catch (ex) { }

    return true;
}

//Defini si le curseur est dans le scope du menu
function IsOutOfMenuRange(ShowMsg) {
    var ret = false;
    //            var msg = 'tempX = ' + document.tempX + ' < MinLeft = ' + document.CurrentMenuActive.MinLeft;
    //            msg += '\ntempX = ' + document.tempX + ' > MaxLeft = ' + document.CurrentMenuActive.MaxLeft;
    //            msg += '\ntempY = ' + document.tempY + ' < MinY = ' + document.CurrentMenuActive.MinY;
    //            msg += '\ntempY = ' + document.tempY + ' > MaxY = ' + document.CurrentMenuActive.MaxY;
    //            if (ShowMsg) { alert(msg); }
    ret = (document.tempX < document.CurrentMenuActive.MinLeft) ? true : false;
    ret = (document.tempX > document.CurrentMenuActive.MaxLeft) ? true : ret;
    ret = (document.tempY < document.CurrentMenuActive.MinY) ? true : ret;
    ret = (document.tempY > document.CurrentMenuActive.MaxY) ? true : ret;
    return ret;
}

//End
//-->    
