//IE FF LIB part 1 /*================================================================================================================================ Librarie de script pour IE et FF by Bosshog Owner: admin@box-of-pandore.com Gestion des menu via leur offset. Le but étant de générer moin d'évènement afin d'avoir des affichage 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\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 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 //IE FF LIB part 2 //------------------------------------------------------------ //Retourne l'offset sous forme d'objet BaseOffsetObject. //L'objet expose les propriétés de BaseOffsetObject. //------------------------------------------------------------ //Begin function GetOffset(ObjEvent) { var oBj = null; /*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; 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(document.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(document.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; 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('\nGetMenuScopeIE:\n' + EnumProps(ex)); } return Ret; } //End //IE FF LIB part 3 //------------------------------------------------------------ //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.ObjectToShow = document.getElementById(this.Id);//Object dont l'id est passée en parametre if(document.IsFF()) { try{ this.EventTagName = EventSrcElement.tagName.toUpperCase(); } catch(ex){alert(ex)} } else { this.EventTagName = (HavingTagName(event.srcElement)==true)?event.srcElement.tagName.toUpperCase() : ''; } if(document.IsFF()){this.EventObject = EventSrcElement} else { if(document.IsIE()){this.EventObject = event.srcElement} } //alert(this.EventTagName); //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(document.IsFF()){AnchorXY = GetOffset(this.EventObject)} else { if(document.IsIE()){AnchorXY = GetOffset(event)} } var RunLoop = true, iCheck = 0; while(RunLoop) { try{ if(this.EventTagName == 'DL') { RunLoop = false; break; } else { if(document.IsIE()){this.EventObject = GetParentHavingTagName(this.EventObject)} if(document.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); if(document.IsFF()){MenuXY = GetOffset(this.EventObject)} if(document.IsIE()){MenuXY = GetOffset(this.EventObject)} if(MenuXY.MinX) { 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{ tempX = (event.x != null)?event.x+document.documentElement.scrollLeft:e.clientX; tempY = (event.y != null)?event.y+document.documentElement.scrollTop:e.clientY; } catch(ex) { tempX = e.clientX; tempY = e.clientY; } if (tempX < 0){tempX = 0} if (tempY < 0){tempY = 0} if(tempX < document.CurrentMenuActive.MinLeft || tempX > document.CurrentMenuActive.MaxLeft || tempY < document.CurrentMenuActive.MinY || tempY > document.CurrentMenuActive.MaxY) { 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){} } catch(ex){} } } catch(ex){} return true; } //End //-->