
// figure out our browser type...

var dom_engine = '';
if (document.getElementById)
	dom_engine = 1;					// mozilla, opera etc..
else if (document.all)
	dom_engine = 0;					// IE (pls die, kthx)
else if (document.layers)
	dom_engine = 2;					// NS4, should never happen :P

var active_menu = "";
var mouse_over_menu = "";

function getObject(id)
{
	if(dom_engine == 1)
		obj = document.getElementById(id);
	else if(dom_engine == 0)
		obj = document.all[id];
	else if(dom_engine == 2)
		obj = document.layers[id];
		
	return obj;
}

function getCookieFromDocument(cookie_name)
{
	cname = cookie_name + "=";
	clength = document.cookie.length;
	begin = 0;
	
	while (begin < clength) {
	    vbegin = begin + cname.length;
	    if (document.cookie.substring(begin, vbegin) == cname) {
		var end = document.cookie.indexOf (";", vbegin);
		if (end == -1) {
		    end = clength;
		}
		return unescape(document.cookie.substring(vbegin, end));
	    }
	    begin = document.cookie.indexOf(" ", begin) + 1;
	    if (begin == 0)	{
		break;
	    }
	}
	return null;
}

function setCookieToDocument(cookie_name, cookie_expiredate, cookie_value)
{
    document.cookie=cookie_name+"="+escape(cookie_value)+"; expires="+cookie_expiredate.toGMTString()+"; path=/";
}

function saveObjectToCookie(obj, mode, cookiename)
{
	var already_collapsed=getCookieFromDocument(cookiename);
	var temp = new Array();
	cookieExpireDate = new Date();
	cookieExpireDate.setTime(cookieExpireDate.getTime() + 86400*1000*300);			// 300 days expiration date

	if (already_collapsed) {
	    already_collapsed = already_collapsed.split("\n");

	    for (i in already_collapsed) {
		if (already_collapsed[i] != obj && already_collapsed[i] != "")
		    temp[temp.length] = already_collapsed[i];
	    }
	}

	if (mode)
	    temp[temp.length] = obj;

	setCookieToDocument(cookiename, cookieExpireDate, temp.join("\n"));
}

function doCollapseObject(id, cookiename)
{
	obj = getObject(id);	
	imageid = getObject("img_" + id);
	tempobj = getObject(id);
			
	if (obj.style.display == "none") {	// object is collapsed, show it, clear the cookie
	    obj.style.display = "";
	    saveObjectToCookie(id, 0, cookiename);
	    if (imageid) {
		imageid.src = imageid.src.replace('expand.gif', 'collapse.gif');
	    }
	} else {				// hide the object, save it to the cookie
	    obj.style.display = "none";
	    saveObjectToCookie(id, 1, cookiename);
	    if (imageid) {
		imageid.src = imageid.src.replace('collapse.gif', 'expand.gif');
	    }
	}
	return false;
}

/*
 * functions to change the stylesheet using DOM w/o reloading the page
 */
 
function setActiveStyleSheet(title) {
    var i, a, main;
    for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
	if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
	    a.disabled = true;
	    if(a.getAttribute("title") == title) 
		a.disabled = false;
	}
    }
}

function getActiveStyleSheet() {
    var i, a;
    for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
	if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled) 
	    return a.getAttribute("title");
    }
    return null;
}

function createCookie(name,value,days) {
    if (days) {
	var date = new Date();
	date.setTime(date.getTime()+(days*24*60*60*1000));
	var expires = "; expires="+date.toGMTString();
    }
    else 
	expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
	var c = ca[i];
	while (c.charAt(0)==' ') c = c.substring(1,c.length);
	if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}


function getPreferredStyleSheet() {
    var i, a;
    for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
	if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("rel").indexOf("alt") == -1 && a.getAttribute("title")) 
	    return a.getAttribute("title");
    }
    return null;
}

/*
 * hide the active menu, unless the mouse pointer is over it
 * force = true - hide it immediately
 */
 
function hideActiveMenu(force) {

    if(active_menu != "") {
	if(force == false) {
	    if(mouse_over_menu != "")
		return false;
	}
	obj = getObject(active_menu);
	obj.style.display = "none";
	active_menu = "";
    }
}

/*
 * calculate the top offset of an element, using its parent(s)
 */
 
function getTopOffset(id) {
    
    var offset = id.offsetTop;
    
    while((id = id.offsetParent) != null)
	offset = offset + id.offsetTop;

    return offset;
}

/*
 * same for the left offset
 */
 
function getLeftOffset(id) {
    var offset = id.offsetLeft;
    
    while((id = id.offsetParent) != null)
	offset = offset + id.offsetLeft;

    return offset;
}

/*
 * show a menu (id) at the given anchor element (where)
 * direction: 0 > show downwards
 *	      1 > show upwards
 */
	      
function showDMenu(id, where, direction) {
    
    var x;
    var y;
    var m_clientWidth;
    if(active_menu != id)
	hideActiveMenu(true);
    
    anchor = getObject(where);
    x = anchor.offsetLeft;
    if(direction == 0)
	y = getTopOffset(anchor) + anchor.offsetHeight;
    else
	y = getTopOffset(anchor);
    x = getLeftOffset(anchor);    
    obj = getObject(id);
        
    if(obj.style.display == "none") {
	m_clientWidth = document.body.clientWidth;
	obj.style.top = y + "px";
	obj.style.left = x + "px";
	obj.style.display = "";
	if((x + obj.offsetWidth) >= m_clientWidth)
	    obj.style.left = (m_clientWidth - obj.offsetWidth) + "px";
	if(direction == 1)
	    obj.style.top = y - obj.offsetHeight + "px";
	else {
	    if(document.all && navigator.userAgent.toLowerCase().indexOf("opera") == -1)
		winHeight = document.documentElement.offsetHeight;
	    else
		winHeight = window.innerHeight;
	    //alert("y = " + y + "height = " + obj.offsetHeight + " clientH = " + winHeight + "  top = " + document.documentElement.scrollTop);
	    if((y + obj.offsetHeight) >= (document.documentElement.scrollTop + winHeight)) {
		y = y - obj.offsetHeight - anchor.offsetHeight;
		obj.style.top = y + 'px';
	    }
	}
	active_menu = id;
	mouse_over_menu = id;
    }
    else {
	obj.style.display = "none";
	active_menu = "";
	mouse_over_menu = "";
    }
    
    return false;
}

/*
 * dynamicall build and show the user menu, using the predefined template (id = user_dmenu)
 * id = menu id
 * where = id of the anchor element (where the menu should pop up)
 */
 
function buildUserMenu(scripturl, user_id, email, pm, icq, msn, aim, yim, id, where) {

    iobj = getObject('um_profilelink');
    iobj.href = scripturl + '?action=profile;u=' + user_id;
    
    row = getObject('um_pmrow');
    if(pm == 1) {
	iobj = getObject('um_pmlink');
	row.style.display = '';
	iobj.href = scripturl + '?action=pm;sa=send;u=' + user_id;
    }
    else
	row.style.display = 'none';
	
    row = getObject('um_mailrow');
    if(email != '') {
	row.style.display = '';
	iobj = getObject('um_emaillink');
	iobj.href = scripturl + '?action=emailuser;sa=email;uid=' + user_id;
    }
    else
	row.style.display = 'none';
	
    row = getObject('um_searchrow');
    iobj = getObject('um_searchlink');
    iobj.href = scripturl + '?action=profile;area=showposts;u=' + user_id;

    iobj.style.display = '';
    row = getObject('um_icqrow');
    iobj = getObject('um_icqlink');
    iobj.href = 'http://web.icq.com/whitepages/about_me/1,,,00.html?Uin=' + icq;
    iobj.innerHTML = '<img class="midimage" src="http://web.icq.com/whitepages/online?icq=' + icq + '&img=5" width="16" height="16" alt="icq" border="0" />&nbsp;' + icq;

    if(icq != '')
	row.style.display = '';
    else
	row.style.display = 'none';
	

    row = getObject('um_msnrow');
    iobj = getObject('um_msnlink');
    iobj.href = 'http://members.msn.com/' + msn;
    img = getObject('um_msnimg');
    iobj.innerHTML = '<img id="um_msnimg" class="midimage" src="' + img.src + '" width="16" height="16" alt="msn" border="0" />&nbsp;' + msn;
    if(msn != '')
	row.style.display = '';
    else
	row.style.display = 'none';
	

    row = getObject('um_aimrow');
    iobj = getObject('um_aimlink');
    iobj.href = 'aim:goim?screenname=' + aim + '&message=Hi.+Are+you+there?;';
    img = getObject('um_aimimg');
    iobj.innerHTML = '<img id="um_aimimg" class="midimage" src="' + img.src + '" width="16" height="16" alt="aim" border="0" />&nbsp;' + aim;
    if(aim != '')
	row.style.display = '';
    else
	row.style.display = 'none';

    row = getObject('um_yimrow');
    iobj = getObject('um_yimlink');
    iobj.href = 'http://edit.yahoo.com/config/send_webmesg?.target=' + yim;
    iobj.innerHTML = '<img id="um_yimimg" class="midimage" src="http://opi.yahoo.com/online?u=' + yim + '" width="16" height="16" alt="yim" border="0" />&nbsp;' + yim;
    if(yim != '')
	row.style.display = '';
    else
	row.style.display = 'none';
			    
    iobj = getObject('um_imheader');
    if(icq == '' && msn == '' && aim == '' && yim == '')
	iobj.style.display = 'none';
    else
	iobj.style.display = '';
    showDMenu(id, where, 0);
}

// An show/hide object - like a header.
function smfToggle(uniqueId, initialState)
{
	this.uid = uniqueId;
	this.state = initialState;
	this.use_cookie = 1;
	// Needed for setting theme options - kept hidden!
	var themeOptions = Array(5);
	themeOptions[0] = null;
	this.useCookie = useCookie;
	this.toggle = toggleHeader;
	this.setOptions = setOptions;
	this.imageToggles = new Array();
	this.panelToggles = new Array();
	this.addToggleImage = addToggleImage;
	this.addTogglePanel = addTogglePanel;

	// Should the shrinker use a cookie?
	function useCookie(mode)
	{
		this.use_cookie = mode ? 1 : 0;
	}

	// Actually shrink the header!
	function toggleHeader(mode)
	{
		// Just a toggle?
		if (mode == null)
			mode = !this.state;

		// Do we need to set a cookie?
		if (this.use_cookie)
			document.cookie = this.uid + '=' + (mode ? 1 : 0);

		// Set a theme option?
		if (themeOptions[0] != null)
		{
			var curMode = themeOptions[2] ? !mode : mode;
			smf_setThemeOption(themeOptions[0], curMode ? 1 : 0, themeOptions[3] == 0 ? null : themeOptions[3], themeOptions[1], themeOptions[4]);
		}

		// Toggle the images.
		var x = 0;
		for (x = 0; x < this.imageToggles.length; x++)
		{
			var curImage = document.getElementById(this.imageToggles[x][0]);
			if (curImage)
				curImage.src = mode ? this.imageToggles[x][2] : this.imageToggles[x][1];
		}

		// Now toggle the panels.
		for (x = 0; x < this.panelToggles.length; x++)
		{
			// Inverse?
			var curMode = this.panelToggles[x][1] ? !mode : mode;
			var curPanel = document.getElementById(this.panelToggles[x][0]);
			if (curPanel)
				curPanel.style.display = curMode ? "none" : "";
		}

		this.state = mode;
	}

	// Set the theme option that should change with this.
	function setOptions(newThemeOptions, sessID, flip, themeID, preferenceKey)
	{
		themeOptions[0] = newThemeOptions;
		themeOptions[1] = sessID;
		themeOptions[2] = flip == null ? 0 : 1;
		themeOptions[3] = themeID == null ? 0 : themeID;
		themeOptions[4] = preferenceKey == null ? '' : ';admin_key=' + preferenceKey;
	}

	// Add an image to toggle (id, mode = 0 image, mode = 1 image)
	function addToggleImage(imageID, mode0Image, mode1Image, useImagePath)
	{
		var curIndex = this.imageToggles.length;
		this.imageToggles[curIndex] = Array(3);
		this.imageToggles[curIndex][0] = imageID;
		this.imageToggles[curIndex][1] = (useImagePath == null ? smf_images_url : '') + mode0Image;
		this.imageToggles[curIndex][2] = (useImagePath == null ? smf_images_url : '') + mode1Image;
	}

	// Add a panel which should toggle with the header.
	function addTogglePanel(panelID, flip)
	{
		var curIndex = this.panelToggles.length;
		this.panelToggles[curIndex] = Array(2);
		this.panelToggles[curIndex][0] = panelID;
		this.panelToggles[curIndex][1] = flip == null ? 0 : 1;
	}
}

function showPreviewTip(anchor_object, from_object)
{
    var e = window.event;
    
    anchor = getObject(anchor_object);
    tip = getObject('preview_tip');
    if(anchor != 'undefined') {
	from = getObject(from_object);
	tip.innerHTML = from.innerHTML;
	tip.style.top = getTopOffset(anchor) + 15 + 'px';
	tip.style.left = getLeftOffset(anchor) + 'px';
	tip.style.width = '500px';
	tip.style.height = 'auto';
	tip.style.display = '';
    }
}

function hidePreviewTip()
{
    tip = getObject('preview_tip');
    if(tip != 'undefined') {
	tip.style.display = "none";
    }
}
    