560 lines
14 KiB
JavaScript
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);
|
|
};
|
|
|
|
|