/*======================================================================*\
|| #################################################################### ||
|| # vBulletin 3.5.0
|| # ---------------------------------------------------------------- # ||
|| # Copyright ©2000-2005 Jelsoft Enterprises Ltd. All Rights Reserved. ||
|| # This file may not be redistributed in whole or significant part. # ||
|| # ---------------- VBULLETIN IS NOT FREE SOFTWARE ---------------- # ||
|| # http://www.vbulletin.com | http://www.vbulletin.com/license.html # ||
|| #################################################################### ||
\*======================================================================*/
/**
* vBulletin popup menu example usage:
*
* To create a new popup menu:
* Click me
*
* To create a dynamic popup menu with a title and two options:
* Click me
*
*/
// #############################################################################
// vB_Popup_Handler
// #############################################################################
/**
* vBulletin popup menu registry
*/
function vB_Popup_Handler()
{
/**
* Options:
*
* @var integer Number of steps to use in sliding menus open
* @var boolean Use opacity face in menu open?
*/
this.open_steps = 10;
this.open_fade = false;
this.active = false;
this.menus = new Array();
this.activemenu = null;
this.hidden_selects = new Array();
}
// =============================================================================
// vB_Popup_Handler methods
/**
* Activate / Deactivate the menu system
*
* @param boolean Active state for menus
*/
vB_Popup_Handler.prototype.activate = function(active)
{
this.active = active;
}
/**
* Register a control object as a menu control
*
* @param string ID of the control object
* @param boolean Do not add an image (true)
*
* @return vB_Popup_Menu
*/
vB_Popup_Handler.prototype.register = function(controlkey, noimage)
{
this.menus[controlkey] = new vB_Popup_Menu(controlkey, noimage);
return this.menus[controlkey];
}
/**
* Hide active menu
*/
vB_Popup_Handler.prototype.hide = function()
{
if (this.activemenu != null)
{
//this.activemenu.hide();
this.menus[this.activemenu].hide();
}
}
// #############################################################################
// initialize menu registry
vBmenu = new vB_Popup_Handler();
/**
* Function to allow anything to hide all menus
*
* @param event Event object
*
* @return mixed
*/
function vbmenu_hide(e)
{
if (e && e.button && e.button != 1 && e.type == 'click')
{
return true;
}
else
{
vBmenu.hide();
}
}
// #############################################################################
// vB_Popup_Menu
// #############################################################################
/**
* vBulletin popup menu class constructor
*
* Manages a single menu and control object
* Initializes control object
*
* @param string ID of the control object
*/
function vB_Popup_Menu(controlkey, noimage)
{
this.controlkey = controlkey;
this.menuname = this.controlkey.split('.')[0] + '_menu';
this.init_control(noimage);
if (fetch_object(this.menuname))
{
this.init_menu();
}
this.slide_open = (is_opera ? false : true);
this.open_steps = vBmenu.open_steps;
}
// =============================================================================
// vB_Popup_Menu methods
/**
* Initialize the control object
*/
vB_Popup_Menu.prototype.init_control = function(noimage)
{
this.controlobj = fetch_object(this.controlkey);
this.controlobj.state = false;
if (this.controlobj.firstChild && (this.controlobj.firstChild.tagName == 'TEXTAREA' || this.controlobj.firstChild.tagName == 'INPUT'))
{
// do nothing
}
else
{
if (!noimage && !(is_mac && is_ie))
{
var space = document.createTextNode(' ');
this.controlobj.appendChild(space);
var img = document.createElement('img');
img.src = IMGDIR_MISC + '/menu_open.gif';
img.border = 0;
img.title = '';
img.alt = '';
this.controlobj.appendChild(img);
}
this.controlobj.unselectable = true;
if (!noimage)
{
this.controlobj.style.cursor = pointer_cursor;
}
this.controlobj.onclick = vB_Popup_Events.prototype.controlobj_onclick;
this.controlobj.onmouseover = vB_Popup_Events.prototype.controlobj_onmouseover;
}
}
/**
* Init the popup menu object
*/
vB_Popup_Menu.prototype.init_menu = function()
{
this.menuobj = fetch_object(this.menuname);
if (this.menuobj && !this.menuobj.initialized)
{
this.menuobj.initialized = true;
this.menuobj.onclick = e_by_gum;
this.menuobj.style.position = 'absolute';
this.menuobj.style.zIndex = 50;
// init popup filters (ie only)
if (is_ie && !is_mac)
{
this.menuobj.style.filter += "progid:DXImageTransform.Microsoft.alpha(enabled=1,opacity=100)";
this.menuobj.style.filter += "progid:DXImageTransform.Microsoft.shadow(direction=135,color=#8E8E8E,strength=3)";
}
this.init_menu_contents();
}
}
/**
* Init the popup menu contents
*/
vB_Popup_Menu.prototype.init_menu_contents = function()
{
var tds = fetch_tags(this.menuobj, 'td');
for (var i = 0; i < tds.length; i++)
{
if (tds[i].className == 'vbmenu_option')
{
if (tds[i].title && tds[i].title == 'nohilite')
{
// not an active cell
tds[i].title = '';
}
else
{
// create a reference back to the menu class
tds[i].controlkey = this.controlkey;
// handle mouseover / mouseout highlighting events
tds[i].onmouseover = vB_Popup_Events.prototype.menuoption_onmouseover;
tds[i].onmouseout = vB_Popup_Events.prototype.menuoption_onmouseout;
if (typeof tds[i].onclick == 'function')
{
// allow onclick events from
elements to override elements inside
tds[i].ofunc = tds[i].onclick;
tds[i].onclick = vB_Popup_Events.prototype.menuoption_onclick_function;
}
else
{
// attempt to emulate a click on internal elements
tds[i].onclick = vB_Popup_Events.prototype.menuoption_onclick_link;
}
// wondering what this was supposed to do actually...
if (!is_saf && !is_kon)
{
try
{
links = fetch_tags(tds[i], 'a');
for (var j = 0; j < links.length; j++)
{
if (typeof links[j].onclick == 'undefined')
{
links[j].onclick = e_by_gum;
}
}
}
catch(e)
{
// hmmm...
}
}
}
}
}
}
/**
* Show the menu
*
* @param object The control object calling the menu
* @param boolean Use slide (false) or open instantly? (true)
*/
vB_Popup_Menu.prototype.show = function(obj, instant)
{
if (!vBmenu.active)
{
return false;
}
else if (!this.menuobj)
{
this.init_menu();
}
if (!this.menuobj)
{
return false;
}
if (vBmenu.activemenu != null)
{
vBmenu.menus[vBmenu.activemenu].hide();
}
vBmenu.activemenu = this.controlkey;
this.menuobj.style.display = '';
if (vBmenu.slide_open)
{
this.menuobj.style.clip = 'rect(auto, auto, auto, auto)';
}
this.pos = this.fetch_offset(obj);
this.leftpx = this.pos['left'];
this.toppx = this.pos['top'] + obj.offsetHeight;
if ((this.leftpx + this.menuobj.offsetWidth) >= document.body.clientWidth)
{
this.leftpx = this.leftpx + obj.offsetWidth - this.menuobj.offsetWidth;
this.direction = 'right';
}
else
{
this.direction = 'left'
}
this.menuobj.style.left = this.leftpx + 'px';
this.menuobj.style.top = this.toppx + 'px';
if (!instant && this.slide_open)
{
this.intervalX = Math.ceil(this.menuobj.offsetWidth / this.open_steps);
this.intervalY = Math.ceil(this.menuobj.offsetHeight / this.open_steps);
this.slide((this.direction == 'left' ? 0 : this.menuobj.offsetWidth), 0, 0);
}
else if (this.menuobj.style.clip && vBmenu.slide_open)
{
this.menuobj.style.clip = 'rect(auto, auto, auto, auto)';
}
// deal with IE putting |