/*****************************************************************************
 *   MyPlaza Global JavaScript (/jscripts/myplaza_global.js)
 *    - MyPlaza for 1.4
 *    By ZiNgA BuRgA (Ported and Updated by Pirata Nervo), 2007-2008
 *
 * Contains JavaScript functions for MyPlaza.
 *****************************************************************************/

// The MyBB popup menu with some modifications :P
var MyPlazaPopupMenu = Class.create();

MyPlazaPopupMenu.prototype = {

	initialize: function(id, openFunc, closeFunc)
	{
		document.currentMenu = "";

		if(!$(id))
		{
			return false;
		}
		this.id = id;
		var element = $(id);
		
		var popupMenu = element.id+"_popup";
		if(!$(popupMenu))
		{
			return false;
		}
		
		this.menu = $(popupMenu);
		
		if(openFunc)
			this.openFunc = openFunc;
		if(closeFunc)
			this.closeFunc = closeFunc;
		
		this.mouseHovered = false;
		document.lockMenu = false;
		this.menu.style.display = "none";
		element.onclick = this.openMenu.bindAsEventListener(this);
		this.menu.onmouseover = this.mouseOver.bindAsEventListener(this);
		this.menu.onmouseout = this.mouseOut.bindAsEventListener(this);
	},
	
	mouseOver: function(e)
	{
		if(document.currentMenu == this.id)
			this.mouseHovered = true;
	},
	mouseOut: function(e)
	{
		if(document.currentMenu == this.id)
			this.mouseHovered = false;
	},
	
	openMenu: function(e)
	{
		Event.stop(e);
		//this.mouseHovered = false;
		if(document.lockMenu) return;
		if(document.currentMenu == this.id)
		{
			this.closeMenu(document.currentMenu);
			return false;
		}
		else if(document.currentMenu != "")
		{
			this.closeMenu(document.currentMenu);
		}
		
		offsetTop = offsetLeft = 0;
		var element = $(this.id);
		do
		{
			offsetTop += element.offsetTop || 0;
			offsetLeft += element.offsetLeft || 0;
			element = element.offsetParent;
		} while(element);
		element = $(this.id);
		this.menu.style.position = "absolute";
		this.menu.style.zIndex = 100;
		this.menu.style.top = (offsetTop+element.offsetHeight-1)+"px";
		// Bad browser detection - yes, only choice - yes.
		if(MyBB.browser == "opera" || MyBB.browser == "safari")
		{
			this.menu.style.top = (parseInt(this.menu.style.top)-2)+"px";
		}
		this.menu.style.left = offsetLeft+"px";
		this.menu.style.visibility = 'hidden';
		this.menu.style.display = '';
		if(this.menu.style.width)
		{
			menuWidth = parseInt(this.menu.style.width);
		}
		else
		{
			menuWidth = this.menu.offsetWidth;
		}
		if(this.menu.style.height)
		{
			menuHeight = parseInt(this.menu.style.height);
		}
		else
		{
			// doesn't work properly :( :(
			menuHeight = this.menu.offsetHeight;
		}
		pageSize = DomLib.getPageSize();
		if(offsetLeft+menuWidth >= pageSize[0])
		{
			this.menu.style.left = (offsetLeft-menuWidth-2)+"px";
			if(MyBB.browser == "ie")
			{
				this.menu.style.left = (parseInt(this.menu.style.left)-2)+"px";
			}
		}
		if(offsetTop+menuHeight >= pageSize[1] - 2)
		{
			this.menu.style.top = (offsetTop-menuHeight)+"px";
			if(MyBB.browser == "ie")
			{
				this.menu.style.top = (parseInt(this.menu.style.top)-2)+"px";
			}
		}
		this.menu.style.display = '';	
		this.menu.style.visibility = 'visible';

		fadeInElement(this.menu.id, 0, 0.3, 1);
		document.currentMenu = element.id;
		//Event.observe(document, 'click', this.closeMenu.bindAsEventListener(this));
		document.onclick = this.closeMenu.bindAsEventListener(this);
		
		if(this.openFunc)
			this.openFunc();
	},
	
	closeMenu: function()
	{
		if(!this.mouseHovered && document.currentMenu && !document.lockMenu)
		{
			menu = document.currentMenu;
			menu = $(menu+"_popup");
			fadeOutElement(document.currentMenu+"_popup", 1, 0.4, 0, function(){
				menu.style.display = "none";
			});
			document.currentMenu = "";
			document.onclick = function() { };
			
			if(this.closeFunc)
				this.closeFunc();
		}
	}
};



function fadeInElement(elemId, alpha, rate, targetAlpha, completeFunc)
{
	if((alpha += rate) > targetAlpha) alpha = targetAlpha;
	setOpacity(document.getElementById(elemId), alpha);
	if(alpha < targetAlpha)
		setTimeout(function(){fadeInElement(elemId, alpha, rate, targetAlpha, completeFunc);}, 50);
	else if(completeFunc)
		completeFunc();
}

function fadeOutElement(elemId, alpha, rate, targetAlpha, completeFunc)
{
	if((alpha -= rate) < targetAlpha) alpha = targetAlpha;
	setOpacity(document.getElementById(elemId), alpha);
	if(alpha > targetAlpha)
		setTimeout(function(){fadeOutElement(elemId, alpha, rate, targetAlpha, completeFunc);}, 50);
	else if(completeFunc)
		completeFunc();
}

// this function copied and modified from effects.js
function setOpacity(element, value)
{
	if (value == 1)
	{
		element.style.opacity = (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : null;
		if(/MSIE/.test(navigator.userAgent))
			element.style.filter = element.style.filter.replace(/alpha\([^\)]*\)/gi,'');  
	}
	else
	{
		if(value < 0.00001) value = 0;
		element.style.opacity = value;
		if(/MSIE/.test(navigator.userAgent))  
			element.style.filter = element.style.filter.replace(/alpha\([^\)]*\)/gi,'') +"alpha(opacity="+value*100+")";  
	}
}

// builds an AJAX request from values in a form
function buildAjaxRequest(formObj)
{
	var sReq = "";
	var e = formObj.elements;
	
	//alert(formObj); // debug 
	
	for(i=0; i<e.length; i++)
	{
		// ignore "action" and unchecked radiobuttons/checkboxes
		if(e[i].name && e[i].name != "action" && ((e[i].type != "radio" && e[i].type != "checkbox") || (e[i].checked)))
			sReq += "&" + e[i].name + "=" + e[i].value;
			
		//alert(e[i].name + i); // debug :D
	}
	// strip preceeding "&"
	sReq = sReq.substr(1);
	return sReq;
}

/**
 * Standard AJAX buy routine - for MyPlaza modules
 * 
 * You should call this from a form's onSubmit event, ie onSubmit="return doAjaxBuy(this, <params>);"
 * @param the form object - should always be "this"
 * @param the action parameter sent to xmlhttp.php?action=
 * @param the #element of the submit button - this is called through formObj.elements array (0 = don't change submit button text)
 * @param the value to change the submit button whilst AJAX is running
 * @param the ID of the place to store the AJAX return message (can be left blank)
 * @param (optional) a function to run once AJAX is complete (and successsful)
 * @return false (always)
 */
function doAjaxBuy(formObj, xmlhttpAction, submitElem, newVal, messageId, completeFunc)
{
	var e=formObj.elements;
	var useIframe = false;
	// disable submit buttons
	for(i=0;i<e.length;i++)
		if(e[i].type == "submit")
			e[i].disabled=true;
		// also, see if there are file elements in the form
		else if(e[i].type == "file")
			useIframe = true;
	
	// if there are file uploads, we have to use the uglier IFrame Method
	if(useIframe)
	{
		// the following code is based off the code from here:
		//  http://www.webtoolkit.info/ajax-file-upload.html
		if(!document.getElementById("ajax_iframe"))
		{
			var d = document.createElement('div');
			d.innerHTML = '<iframe style="display: none;" src="about:blank" id="ajax_iframe" name="ajax_iframe"></iframe>';
			document.body.appendChild(d);
		}
		
		var i = document.getElementById("ajax_iframe");
		i.location = "about:blank";
		i.onload = function() {
			if (i.contentDocument) {
	            var ib = i.contentDocument;
	        } else if (i.contentWindow) {
	            var ib = i.contentWindow.document;
	        } else {
	            var ib = window.frames["ajax_frame"].document;
	        }
			var responseText = "";
			if(ib.location.href != "about:blank")
				responseText = ib.body.innerHTML;
			
			doAjaxBuyComplete(e, submitElem, oldVal, messageId, responseText, completeFunc);
		};
		
		formObj.setAttribute('target', 'ajax_iframe');
		
		// since this can't be changed at this time, we will expect module developers,
		// to change the action before the user sends the request
		//formObj.setAttribute('action', 'xmlhttp.php?action='+xmlhttpAction);
		return true;
	}
	
	// if no files, we'll use standard AJAX :P
	
	if(submitElem)
	{
		var oldVal = e[submitElem].value;
		e[submitElem].value=newVal;
	}
	document.lockMenu = true;
	req = buildAjaxRequest(formObj);
	/* Pirata Nervo: does not use ajax() to request anymore but Ajax.Request otherwise it would not work */
	new Ajax.Request('xmlhttp.php?action='+xmlhttpAction, {method: 'post', postBody: req,
		onComplete: function(request) { doAjaxBuyComplete(e, submitElem, oldVal, messageId, request.responseText, completeFunc); }
	});
	return false;
}


function doAjaxBuyComplete(frmElems, submitElem, oldVal, messageId, responseText, completeFunc)
{
	for(i=0;i<frmElems.length;i++)
		if(frmElems[i].type == "submit")
			frmElems[i].disabled=false;
	if(submitElem)
		frmElems[submitElem].value=oldVal;
	document.lockMenu = false;
	var m = responseText;
	ajaxSuccess = !(!m);
	if(!m)m = "<span style='color: red;'>"+plaza_ajax_err_msg+"</span>";
	m = m.split('<span sep=\"sep\">&nbsp;</span>');
	
	if(messageId)
	{
		document.getElementById(messageId).style.display = '';
		document.getElementById(messageId).innerHTML = m[0];
		fadeInElement(messageId, 0, 0.3, 1, function(){
			setTimeout(function(){
				fadeOutElement(messageId, 1, 0.1, 0, function(){
					document.getElementById(messageId).style.display = 'none';
				});
			}, 3000);
		});
	}
	if(completeFunc && ajaxSuccess) completeFunc(m);
}
