/*-------------------------------------------------------------------------*/ // IPS BASIC MENU CLASS // (c) 2005 Invision Power Services, Inc // ASSUMES "ips_global.js" has been loaded /*-------------------------------------------------------------------------*/ ipsmenu = new ips_menu(); /*-------------------------------------------------------------------------*/ // INIT Handler class /*-------------------------------------------------------------------------*/ function ips_menu() { this.menu_registered = new Array(); this.menu_openfuncs = new Array(); this.menu_over_css = new Array(); this.menu_out_css = new Array(); this.menu_open_event = new Array(); this.dynamic_register = new Array(); this.menu_cur_open = null; this.dynamic_html = null; } /*-------------------------------------------------------------------------*/ // Register menu control ID (add to array) /*-------------------------------------------------------------------------*/ ips_menu.prototype.register = function ( cid, callback, menu_over_css, menu_out_css, event_type ) { if ( event_type ) { this.menu_open_event[ cid ] = ( event_type == 'onmouseover' ) ? 'onmouseover' : 'onclick'; } this.menu_registered[ cid ] = new ips_menu_class( cid ); if ( callback ) { this.menu_openfuncs[ cid ] = callback; } if ( menu_over_css && menu_out_css ) { this.menu_over_css[ cid ] = menu_over_css; this.menu_out_css[ cid ] = menu_out_css; } return this.menu_registered[ cid ]; }; /*-------------------------------------------------------------------------*/ // Register menu control ID (add to array) /*-------------------------------------------------------------------------*/ ips_menu.prototype.close = function () { if ( this.menu_cur_open ) { this.menu_registered[ this.menu_cur_open ].close(); } }; /*-------------------------------------------------------------------------*/ // ips_menu_class: Object for each menu /*-------------------------------------------------------------------------*/ function ips_menu_class( cid ) { this.cid = cid; this.initialized = false; this.init_control_object(); this.init_menu(); }; /*-------------------------------------------------------------------------*/ // ips_menu_class: Initiate a single menu /*-------------------------------------------------------------------------*/ ips_menu_class.prototype.init_control_object = function() { this.cid_obj = document.getElementById( this.cid ); //---------------------------------- // Change cursor to show link //---------------------------------- try { this.cid_obj.style.cursor = "pointer"; } catch(e) { this.cid_obj.style.cursor = "hand"; } this.cid_obj.unselectable = true; if ( ipsmenu.menu_open_event[ this.cid ] == 'onmouseover' ) { this.cid_obj.onmouseover = ips_menu_events.prototype.event_onclick; } else { this.cid_obj.onclick = ips_menu_events.prototype.event_onclick; this.cid_obj.onmouseover = ips_menu_events.prototype.event_onmouseover; } this.cid_obj.onmouseout = ips_menu_events.prototype.event_onmouseout; }; /*-------------------------------------------------------------------------*/ // ips_menu_class: Initiate a single menu /*-------------------------------------------------------------------------*/ ips_menu_class.prototype.init_menu = function() { this.cid_menu_obj = document.getElementById( this.cid + '_menu' ); if ( this.cid_menu_obj ) { //---------------------------------- // Save CPU - already init? //---------------------------------- if ( this.initialized ) { return; } //---------------------------------- // Pop-up menu obj (hidden div) //---------------------------------- this.cid_menu_obj.style.display = "none"; this.cid_menu_obj.style.position = "absolute"; this.cid_menu_obj.style.left = "0px"; this.cid_menu_obj.style.top = "0px"; this.cid_menu_obj.onclick = ipsclass.cancel_bubble_low; this.cid_menu_obj.zIndex = 50; this.initialized = true; } }; /*-------------------------------------------------------------------------*/ // ips_menu_class: Open menu /*-------------------------------------------------------------------------*/ ips_menu_class.prototype.open = function( obj ) { //---------------------------------- // Not init? //---------------------------------- if ( ! this.cid_menu_obj ) { this.initialized = false; this.init_menu(); } //---------------------------------- // Close current menu(s) //---------------------------------- if ( ipsmenu.menu_cur_open != null ) { ipsmenu.menu_registered[ ipsmenu.menu_cur_open ].close(); } //---------------------------------- // Save CPU - cur open clicked? //---------------------------------- if ( ipsmenu.menu_cur_open == obj.id ) { return false; } //---------------------------------- // Set current open menu //---------------------------------- ipsmenu.menu_cur_open = obj.id; //---------------------------------- // Get ID of menu DIV to show //---------------------------------- var left_px = ipsclass.get_obj_leftpos(obj); var top_px = ipsclass.get_obj_toppos(obj) + obj.offsetHeight; var ifid = obj.id; //try //{ // if ( is_safari && ! ipb_is_acp ) // { // top_px += 20; // } //} //catch(error) //{ // if ( is_safari ) // { // top_px += 20; // } //} //---------------------------------- // Show menu DIV.. but keep it underneath //---------------------------------- this.cid_menu_obj.style.zIndex = -1; this.cid_menu_obj.style.display = ""; //---------------------------------- // Try and keep it on screen //---------------------------------- var width = parseInt( this.cid_menu_obj.style.width ) ? parseInt( this.cid_menu_obj.style.width ) : this.cid_menu_obj.offsetWidth; if ( (left_px + width) >= document.body.clientWidth ) { left_px = left_px + obj.offsetWidth - width; } //----------------------------------------- // Firefox bump //----------------------------------------- if ( is_moz ) { top_px -= 1; } //---------------------------------- // Finalize menu position //---------------------------------- this.cid_menu_obj.style.left = left_px + "px"; this.cid_menu_obj.style.top = top_px + "px"; this.cid_menu_obj.style.zIndex = 100; //---------------------------------- // Run a custom function? //---------------------------------- if ( ipsmenu.menu_openfuncs[ obj.id ] ) { eval( ipsmenu.menu_openfuncs[ obj.id ] ); } //---------------------------------- // Workaround for IE bug which shows // select boxes and other windows GUI // over divs. SHOW IFRAME //---------------------------------- if ( is_ie ) { try { if ( ! document.getElementById( 'if_' + obj.id ) ) { var iframeobj = document.createElement('iframe'); iframeobj.src = 'javascript:;'; iframeobj.id = 'if_' +obj.id; document.getElementsByTagName('body').appendChild( iframeobj ); } else { var iframeobj = document.getElementById( 'if_' +obj.id ); } iframeobj.scrolling = 'no'; iframeobj.frameborder = 'no'; iframeobj.className = 'iframeshim'; iframeobj.style.position = 'absolute'; iframeobj.style.width = parseInt(this.cid_menu_obj.offsetWidth) + 'px'; iframeobj.style.height = parseInt(this.cid_menu_obj.offsetHeight) + 'px'; iframeobj.style.top = this.cid_menu_obj.style.top; iframeobj.style.left = this.cid_menu_obj.style.left; iframeobj.style.zIndex = 99; iframeobj.style.display = "block"; } catch(error) { //alert(error); // 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 = this.cid_menu_obj.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] != null && mlinks[i].href != null && mlinks[i].href && ( mlinks[i].href.indexOf( '#', 0 ) != (mlinks[i].href.length - 1) ) ) { mlinks[i].onmousedown = ips_menu_events.prototype.event_safari_onclick_handler; mlinks[i].id = 'saf-link-' + this.cid + i; } } } catch( error ) { //alert( error ); } } if ( this.cid_obj.editor_id ) { this.cid_obj.state = true; IPS_editor[this.cid_obj.editor_id].set_menu_context(this.cid_obj, 'mousedown'); } return false; }; /*-------------------------------------------------------------------------*/ // ips_menu_class: Close a menu /*-------------------------------------------------------------------------*/ ips_menu_class.prototype.close = function() { if ( this.cid_menu_obj != null ) { this.cid_menu_obj.style.display = "none"; } else if ( ipsmenu.menu_cur_open != null ) { ipsmenu.menu_registered[ ipsmenu.menu_cur_open ].cid_menu_obj.style.display = 'none'; } ipsmenu.menu_cur_open = null; if ( this.cid_obj ) { if ( ipsmenu.menu_out_css[ this.cid_obj.id ] ) { this.cid_obj.className = ipsmenu.menu_out_css[ this.cid_obj.id ]; } } //---------------------------------- // Workaround for IE bug which shows // select boxes and other windows GUI // over divs. Hide IFRAME //---------------------------------- if ( is_ie ) { try { document.getElementById( 'if_' + this.cid ).style.display = "none"; } catch(error) { //alert(e);// Oh dear, someones stolen the iframe } } //----------------------------------------- // IPS Editor stuff //----------------------------------------- if ( this.cid_obj.editor_id ) { this.cid_obj.state = false; IPS_editor[ this.cid_obj.editor_id ].set_menu_context( this.cid_obj, 'mouseout' ); } }; /*-------------------------------------------------------------------------*/ // ACTION: If menu open and hover over another cid, close cur open new /*-------------------------------------------------------------------------*/ ips_menu_class.prototype.hover = function(e) { if ( ipsmenu.menu_cur_open != null ) { if ( ipsmenu.menu_registered[ ipsmenu.menu_cur_open ].cid != this.id ) { this.open(e); } } }; /*-------------------------------------------------------------------------*/ // INIT: ips menu events /*-------------------------------------------------------------------------*/ function ips_menu_events() { }; /*-------------------------------------------------------------------------*/ // Safari: bug fix /*-------------------------------------------------------------------------*/ ips_menu_events.prototype.event_safari_onclick_handler = function() { if ( this.id ) { window.location = document.getElementById( this.id ).href; } }; /*-------------------------------------------------------------------------*/ // Event: On mouseover /*-------------------------------------------------------------------------*/ ips_menu_events.prototype.event_onmouseover = function(e) { e = ipsclass.cancel_bubble(e, true); ipsmenu.menu_registered[ this.id ].hover(this); if ( ipsmenu.menu_over_css[ this.id ] ) { this.className = ipsmenu.menu_over_css[ this.id ]; } }; /*-------------------------------------------------------------------------*/ // Event: On mouseout /*-------------------------------------------------------------------------*/ ips_menu_events.prototype.event_onmouseout = function(e) { e = ipsclass.cancel_bubble(e, true); if ( ipsmenu.menu_out_css[ this.id ] && ipsmenu.menu_cur_open != this.id ) { this.className = ipsmenu.menu_out_css[ this.id ]; } }; /*-------------------------------------------------------------------------*/ // Event: On click /*-------------------------------------------------------------------------*/ ips_menu_events.prototype.event_onclick = function(e) { e = ipsclass.cancel_bubble(e, true); if ( ipsmenu.menu_cur_open == null ) { if ( ipsmenu.menu_over_css[ this.id ] ) { this.className = ipsmenu.menu_over_css[ this.id ]; } ipsmenu.menu_registered[ this.id ].open(this); } else { // For the RTE, if we click from font to size, for example // we want the menu to open... //ipsmenu.menu_registered[ this.id ].close(); if ( ipsmenu.menu_cur_open == this.id ) { ipsmenu.menu_registered[ this.id ].close(); if ( ipsmenu.menu_out_css[ this.id ] ) { this.className = ipsmenu.menu_out_css[ this.id ]; } } else { if ( ipsmenu.menu_over_css[ this.id ] ) { this.className = ipsmenu.menu_over_css[ this.id ]; } ipsmenu.menu_registered[ this.id ].open(this); }; } }; /*-------------------------------------------------------------------------*/ // Global INIT /*-------------------------------------------------------------------------*/ function menu_do_global_init() { //---------------------------------- // Close all menus on click //---------------------------------- document.onclick = menu_action_close; //---------------------------------- // Write HTML //---------------------------------- if ( ipsmenu.dynamic_html != null && ipsmenu.dynamic_html != '' ) { } //---------------------------------- // Register //---------------------------------- if ( ipsmenu.dynamic_register.length ) { for( var i=0; i < ipsmenu.dynamic_register.length; i++ ) { if ( ipsmenu.dynamic_register[i] ) { ipsmenu.register( ipsmenu.dynamic_register[i] ); } } } }; /*-------------------------------------------------------------------------*/ // Global: Close menus from any app /*-------------------------------------------------------------------------*/ function menu_action_close(e) { try { if( e.button == 2 || e.button == 3 ) { return; } } catch( acold ) {}; ipsmenu.close(e); };