/*-------------------------------------------------------------------------*/ // IPS BASIC MENU CLASS // (c) 2005 Invision Power Services, Inc // ASSUMES "ips_global.js" has been loaded /*-------------------------------------------------------------------------*/ var menu_registered = new Array(); var menu_openfuncs = new Array(); var menu_built = new Array(); var menu_open_menus = new Array(); var menu_cur_open = false; /*-------------------------------------------------------------------------*/ // menu_do_global_init: Initiate all registered menus in HTML /*-------------------------------------------------------------------------*/ function menu_do_global_init() { if ( menu_registered.length > 0 ) { for( var i in menu_registered ) { menu_init( menu_registered[i] ); } //---------------------------------- // Close all menus on click //---------------------------------- document.onclick = menu_action_close; } } /*-------------------------------------------------------------------------*/ // menu_init: Initiate a single menu /*-------------------------------------------------------------------------*/ function menu_init(cid) { var mid = _menu_get_base_name(cid) + "_menu"; var mobj = my_getbyid(mid); if ( document.getElementsByTagName && mobj ) { //---------------------------------- // Control object (link / img, etc) //---------------------------------- var cobj = my_getbyid(cid); // Change cursor to show link try { cobj.style.cursor = "pointer"; } catch(e) { cobj.style.cursor = "hand"; } cobj.unselectable = true; cobj.onclick = _event_menu_click; cobj.onmouseover = _event_menu_mouseover; //---------------------------------- // Save CPU - already init? //---------------------------------- if ( typeof( menu_built[mid]) != "undefined" ) { return; } //---------------------------------- // Pop-up menu obj (hidden div) //---------------------------------- var pobj = my_getbyid(mid); // Set up style defaults pobj.style.display = "none"; pobj.style.position = "absolute"; pobj.style.left = "0px"; pobj.style.top = "0px"; pobj.onclick = _cancel_bubble; pobj.zIndex = 1000; menu_built[mid] = true; } } /*-------------------------------------------------------------------------*/ // Register menu control ID (add to array) /*-------------------------------------------------------------------------*/ function menu_register(cid, callback) { if ( document.getElementsByTagName ) { var cobj = my_getbyid(cid); if (cobj) { menu_registered[menu_registered.length] = cid; if ( callback ) { menu_openfuncs[ cobj ] = callback; } return true; } } return false; } /*-------------------------------------------------------------------------*/ // ACTION: If registered control ID clicked, open menu /*-------------------------------------------------------------------------*/ function menu_action_open(e) { var openmenu = menu_cur_open; var negpad = true; //---------------------------------- // Close current menu(s) //---------------------------------- menu_action_close(); //---------------------------------- // Save CPU - cur open clicked? //---------------------------------- if ( openmenu == e.id ) { return false; } //---------------------------------- // Get ID of menu DIV to show //---------------------------------- var mid = _menu_get_base_name(e.id) + "_menu"; var mobj = my_getbyid(mid); var left_px = _get_obj_leftpos(e); var top_px = _get_obj_toppos(e) + e.offsetHeight; var callbackobj = my_getbyid( e.id ); var ifid = e.id; menu_open_menus[e.id] = true; menu_cur_open = e.id; //---------------------------------- // Show menu DIV //---------------------------------- mobj.style.display = ""; //---------------------------------- // Try and keep it on screen //---------------------------------- var width = parseInt( mobj.style.width ) ? parseInt( mobj.style.width ) : mobj.offsetWidth; if ( (left_px + width) >= document.body.clientWidth ) { left_px = left_px + e.offsetWidth - width; negpad = false; } //---------------------------------- // IE needs a tweak... //---------------------------------- if ( is_ie ) { left_px += ( negpad ) ? -2 : 2; } //---------------------------------- // Finalize menu position //---------------------------------- mobj.style.left = left_px + "px"; mobj.style.top = top_px + "px"; mobj.style.zIndex = 100; //---------------------------------- // Run a custom function? //---------------------------------- if ( menu_openfuncs[ callbackobj ] ) { eval( menu_openfuncs[ callbackobj ] ); } //---------------------------------- // Workaround for IE bug which shows // select boxes and other windows GUI // over divs. SHOW IFRAME //---------------------------------- if ( is_ie ) { try { if ( ! document.getElementById( 'if_' + e.id ) ) { var iframeobj = document.createElement('iframe'); iframeobj.src = 'javascript;'; iframeobj.id = 'if_' + e.id; document.getElementsByTagName('body').appendChild( iframeobj ); } else { var iframeobj = document.getElementById( 'if_' + e.id ); } iframeobj.scrolling = 'no'; iframeobj.frameborder = 'no'; iframeobj.className = 'iframeshim'; iframeobj.style.position = 'absolute'; iframeobj.style.width = parseInt(mobj.offsetWidth) + 'px'; iframeobj.style.height = parseInt(mobj.offsetHeight) + 'px'; iframeobj.style.top = mobj.style.top; iframeobj.style.left = mobj.style.left; iframeobj.style.zIndex = 99; iframeobj.style.display = "block"; } catch(e) { //alert(e); // Oh dear, someones stolen the iframe } } //---------------------------------- // Work around for safari which doesnt // allow a hrefs top be clickable in // a pop up div //---------------------------------- if ( is_safari ) { try { mlinks = mobj.getElementsByTagName('a'); for ( var i = 0 ; i <= mlinks.length ; i++ ) { //---------------------------------- // Ignore non links and links that end with # // As safari likes to do that with href='#' links //---------------------------------- if ( mlinks[i].href && ( mlinks[i].href.indexOf( '#', 0 ) != (mlinks[i].href.length - 1) ) ) { mlinks[i].onmousedown = _safari_onclick_handler; mlinks[i].id = 'saf-link-' + mid + i; } } } catch( e ) { //alert( e ); } } return false; } /*-------------------------------------------------------------------------*/ // Safari: bug fix /*-------------------------------------------------------------------------*/ function _safari_onclick_handler() { if ( this.id ) { window.location = document.getElementById( this.id ).href; } } /*-------------------------------------------------------------------------*/ // ACTION: Close all open menus /*-------------------------------------------------------------------------*/ function menu_action_close() { if ( menu_cur_open ) { for ( i in menu_open_menus ) { my_getbyid(_menu_get_base_name(i) + "_menu").style.display = "none"; //---------------------------------- // Workaround for IE bug which shows // select boxes and other windows GUI // over divs. Hide IFRAME //---------------------------------- if ( is_ie ) { try { document.getElementById( 'if_' + i ).style.display = "none"; } catch(e) { //alert(e);// Oh dear, someones stolen the iframe } } menu_open_menus[i] = false; } } menu_cur_open = false; } /*-------------------------------------------------------------------------*/ // ACTION: If menu open and hover over another cid, close cur open new /*-------------------------------------------------------------------------*/ function menu_action_hover(e) { for ( i in menu_open_menus ) { if (menu_open_menus[i] == true && i != e.id) { menu_action_open(e); return; } } } /*-------------------------------------------------------------------------*/ // Prevent browser bubblin' /*-------------------------------------------------------------------------*/ function _cancel_bubble(obj, extra) { if ( ! obj || is_ie) { if ( extra ) { window.event.returnValue = false; } window.event.cancelBubble = true; return window.event; } else { if (obj.target.type == 'submit') { obj.target.form.submit(); } obj.stopPropagation(); if ( extra ) { obj.preventDefault(); } return obj; } } /*-------------------------------------------------------------------------*/ // EVENT : Mouse over menu /*-------------------------------------------------------------------------*/ function _event_menu_mouseover(e) { e = _cancel_bubble(e, true); menu_action_hover(this); } /*-------------------------------------------------------------------------*/ // EVENT: Menu click /*-------------------------------------------------------------------------*/ function _event_menu_click(e) { e = _cancel_bubble(e, true); menu_action_open(this); } /*-------------------------------------------------------------------------*/ // Get menu basename /*-------------------------------------------------------------------------*/ function _menu_get_base_name(cid) { var endpos = cid.indexOf("."); if (endpos != -1) { return cid.substr(0, endpos); } else { return cid; } } /*-------------------------------------------------------------------------*/ // Get left posititon of object /*-------------------------------------------------------------------------*/ function _get_obj_leftpos(obj) { var left = obj.offsetLeft; while( (obj = obj.offsetParent) != null ) { left += obj.offsetLeft; } return left; } /*-------------------------------------------------------------------------*/ // Get top position of object /*-------------------------------------------------------------------------*/ function _get_obj_toppos(obj) { var top = obj.offsetTop; while( (obj = obj.offsetParent) != null ) { top += obj.offsetTop; } return top; }