Files
IPB/Development/javascript_uncompressed/jscripts/ips_menu.js
T
2025-12-19 00:26:08 -08:00

560 lines
14 KiB
JavaScript

/*-------------------------------------------------------------------------*/
// 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);
};