var userAgent = navigator.userAgent.toLowerCase();
var is_opera  = ((userAgent.indexOf('opera') != -1) || (typeof(window.opera) != 'undefined'));
var is_saf    = ((userAgent.indexOf('applewebkit') != -1) || (navigator.vendor == 'Apple Computer, Inc.'));
var is_webtv  = (userAgent.indexOf('webtv') != -1);
var is_ie     = ((userAgent.indexOf('msie') != -1) && (!is_opera) && (!is_saf) && (!is_webtv));
var is_ie4    = ((is_ie) && (userAgent.indexOf('msie 4.') != -1));
var is_ie7    = ((is_ie) && (userAgent.indexOf('msie 7.') != -1));
var is_ps3    = (userAgent.indexOf('playstation 3') != -1);
var is_moz    = ((navigator.product == 'Gecko') && (!is_saf));
var is_kon    = (userAgent.indexOf('konqueror') != -1);
var is_ns     = ((userAgent.indexOf('compatible') == -1) && (userAgent.indexOf('mozilla') != -1) && (!is_opera) && (!is_webtv) && (!is_saf));
var is_ns4    = ((is_ns) && (parseInt(navigator.appVersion) == 4));
var is_mac    = (userAgent.indexOf('mac') != -1);

function fetch_object(idname)
{
	if (document.getElementById)
	{
		return document.getElementById(idname);
	}
	else if (document.all)
	{
		return document.all[idname];
	}
	else if (document.layers)
	{
		return document.layers[idname];
	}
	else
	{
		return null;
	}
}

function fetch_tags(parentobj, tag)
{
	if (parentobj == null)
	{
		return new Array();
	}
	else if (typeof parentobj.getElementsByTagName != 'undefined')
	{
		return parentobj.getElementsByTagName(tag);
	}
	else if (parentobj.all && parentobj.all.tags)
	{
		return parentobj.all.tags(tag);
	}
	else
	{
		return new Array();
	}
}


// #############################################################################
// Event handlers

/**
* Handles the different event models of different browsers and prevents event bubbling
* @param	event	Event object
* @return	event
*/
function do_an_e(eventobj)
{
	if (!eventobj || is_ie)
	{
		window.event.returnValue = false;
		window.event.cancelBubble = true;
		return window.event;
	}
	else
	{
		eventobj.stopPropagation();
		eventobj.preventDefault();
		return eventobj;
	}
}

/**
* Handles the different event models of different browsers and prevents event bubbling in a lesser way than do_an_e()
* @param	event	Event object
* @return	event
*/
function e_by_gum(eventobj)
{
	if (!eventobj || is_ie)
	{
		window.event.cancelBubble = true;
		return window.event;
	}
	else
	{
		if (eventobj.target.type == 'submit')
		{
			// naughty safari
			eventobj.target.form.submit();
		}
		eventobj.stopPropagation();
		return eventobj;
	}
}





// #############################################################################
// vB_Select_Overlay_Handler
// #############################################################################

/**
* Handler for <select> tags that are overlayed with another element
* Fixes a problem in IE versions older than IE7.
*
* @param	mixed	Object or ID string that is the overlayed object
*/
function vB_Select_Overlay_Handler(overlay)
{
	this.browser_affected = (is_ie && !is_ie7);

	if (this.browser_affected)
	{
		this.overlay = YAHOO.util.Dom.get(overlay);
		this.hidden_selects = new Array();
	}
}

// =============================================================================
// vB_Hidden_Form methods

/**
* Hides any selects that intersect the overlayed object
*/
vB_Select_Overlay_Handler.prototype.hide = function()
{
	if (this.browser_affected)
	{
		var overlay_region = YAHOO.util.Dom.getRegion(this.overlay);

		var selects = document.getElementsByTagName("select");
		for (var i = 0; i < selects.length; i++)
		{
			if (region_intersects(selects[i], overlay_region))
			{
				if (YAHOO.util.Dom.isAncestor(this.overlay, selects[i]))
				{
					continue;
				}
				else
				{
					YAHOO.util.Dom.setStyle(selects[i], "visibility", "hidden");
					this.hidden_selects.push(YAHOO.util.Dom.generateId(selects[i]));
				}
			}
		}
	}
};

/**
* Un-hides any hidden selects
*/
vB_Select_Overlay_Handler.prototype.show = function()
{
	if (this.browser_affected)
	{
		var selectid;
		while (selectid = this.hidden_selects.pop())
		{
			YAHOO.util.Dom.setStyle(selectid, "visibility", "visible");
		}
	}
};




// #############################################################################
// DHTML Popup Menu Handling (complements vbulletin_menu.js)

/**
* Wrapper for vBmenu.register
*
* @param	string	Control ID
* @param	boolean	No image (true)
* @param	boolean	Does nothing any more
*/
function vbmenu_register(controlid, noimage, datefield){
	if (typeof(vBmenu) == "object"){
		return vBmenu.register(controlid, noimage);
	}
	else{
		return false;
	}
}

/**
* Sets an element and all its children to be 'unselectable'
*
* @param	mixed	Object/Object ID to be made unselectable
*/
function set_unselectable(obj){
	obj = YAHOO.util.Dom.get(obj);

	if (!is_ie4 && typeof obj.tagName != 'undefined'){
		if (obj.hasChildNodes()){
			for (var i = 0; i < obj.childNodes.length; i++){
				set_unselectable(obj.childNodes[i]);
			}
		}
		obj.unselectable = 'on';
	}
}

function menuInit()
{
	// finalize popup menus
	if (typeof vBmenu == 'object')
	{
		// close all menus on document click or resize
		if (typeof(YAHOO) != "undefined")
		{
			YAHOO.util.Event.on(document, "click", vbmenu_hide);
			YAHOO.util.Event.on(window, "resize", vbmenu_hide);
		}
		else if (window.attachEvent && !is_saf)
		{
			document.attachEvent('onclick', vbmenu_hide);
			window.attachEvent('onresize', vbmenu_hide);
		}
		else if (document.addEventListener && !is_saf)
		{
			document.addEventListener('click', vbmenu_hide, false);
			window.addEventListener('resize', vbmenu_hide, false);
		}
		else
		{
			window.onclick = vbmenu_hide;
			window.onresize = vbmenu_hide;
		}

		// add popups to pagenav elements
		var pagenavs = fetch_tags(document, 'td');
		for (var n = 0; n < pagenavs.length; n++)
		{
			if (pagenavs[n].hasChildNodes() && pagenavs[n].firstChild.name && pagenavs[n].firstChild.name.indexOf('PageNav') != -1)
			{
				var addr = pagenavs[n].title;
				pagenavs[n].title = '';
				pagenavs[n].innerHTML = '';
				pagenavs[n].id = 'pagenav.' + n;
				var pn = vBmenu.register(pagenavs[n].id);
				pn.addr = addr;

				if (is_saf)
				{
					pn.controlobj._onclick = pn.controlobj.onclick;
					pn.controlobj.onclick = vBpagenav.prototype.controlobj_onclick;
				}
			}
		}

		// process the pagenavs popup form
		if (typeof addr != 'undefined')
		{
			fetch_object('pagenav_form').gotopage = vBpagenav.prototype.form_gotopage;
			fetch_object('pagenav_ibtn').onclick = vBpagenav.prototype.ibtn_onclick;
			fetch_object('pagenav_itxt').onkeypress = vBpagenav.prototype.itxt_onkeypress;
		}

		// activate the menu system
		vBmenu.activate(true);
	}

	// the new init system
	vBulletin.init();

	return true;
}

function vBulletin_Framework(){
	this.events = new Array();
}

vBulletin_Framework.prototype.add_event = function(eventname){
	this.events[eventname] = new YAHOO.util.CustomEvent(eventname);
}

var vBulletin = new vBulletin_Framework();

