/**
* FORM FUNCTIONS
*/

/**
* @param string action
* @param string name of form, if not passed than the first form will be used!
* @param string optional, GET variables for form submission
* @param boolean optional, validate form? defaults to true..
* @param string optional, target subform name
* @param integer optional, id of the receiver of this form action
*
* @return boolean
*/
function setFormAction(szAction,szForm,szVarString,bValidate,szTargetSubform,nReceiverID)
{
	if (typeof szVarString == "undefined")
		szVarString = '';

	if (typeof bValidate == "undefined")
		bValidate = true;

	if (typeof szTargetSubform == "undefined")
		szTargetSubform = false;

	if (typeof nReceiverID == "undefined")
		nReceiverID = false;

	var oForm = document.forms[szForm ? szForm : 0];
	if (!oForm)
	{
		alert("Error: Could not find form ["+szForm+"]");
		return false;
	}

	var nodeAction = oForm.elements['szAction'];
	if (!nodeAction)
	{
		alert("Error: Could not set action value [form: "+oForm.name+" ("+szForm+"), action: "+szAction+"], action formelement not found!");
		return false;
	}

	if (nReceiverID != false)
	{
		var nodeReceiver = oForm.elements['nReceiverID'];
		if (nodeReceiver)
			nodeReceiver.value = nReceiverID;
	}

	if (!bValidate)
		szVarString = (szVarString && szVarString != '' ? szVarString + '&' : '') + 'bValidate=0';

	if (szTargetSubform && szTargetSubform != '')
		szVarString = (szVarString && szVarString != '' ? szVarString + '&' : '') + 'szTargetSubform='+szTargetSubform;

	if (szVarString && szVarString != '')
		oForm.action += '?' + szVarString;

	if (szTargetSubform && szTargetSubform != '')
		oForm.action += '#' + szTargetSubform;

	nodeAction.value = szAction;

	return true;
}

/**
* @param string action, pass false if you do not want it unchanged
* @param string name of form, if not passed than the first form will be used! Pass 0 if you do not want to set this parameter.
* @param string optional, GET variables for form submission
* @param boolean optional, validate form? defaults to true..
* @param string optional, target subform name
* @param boolean optional, call onsubmit event function? defaults to true
*
* @return boolean true if action could not be set! Adjusted to a direct call from onClick="return submitFormAction(..)"
*/
function submitFormAction(szAction,szForm,szVarString,bValidate,szTargetSubform,bDoOnSubmit)
{
	if (typeof szVarString == "undefined")
		szVarString = '';

	if (typeof bValidate == "undefined")
		bValidate = true;

	if (typeof szTargetSubform == "undefined")
		szTargetSubform = false;

	if (typeof bDoOnSubmit == "undefined")
		bDoOnSubmit = true;

	var oForm = document.forms[szForm ? szForm : 0];
	if (!oForm)
	{
		alert("Error: Could not find form ["+szForm+"]");
		return true;
	}

	if (!bValidate)
		szVarString = (szVarString && szVarString != '' ? szVarString + '&' : '') + 'bValidate=0';

	if (szTargetSubform && szTargetSubform != '')
		szVarString = (szVarString && szVarString != '' ? szVarString + '&' : '') + 'szTargetSubform='+szTargetSubform;

	if (szVarString && szVarString != '')
		oForm.action += '?' + szVarString;

	if (szTargetSubform && szTargetSubform != '')
		oForm.action += '#' + szTargetSubform;

	if (szAction != false)
	{
		var nodeAction = oForm.elements.szAction;
		if (!nodeAction)
		{
			alert("Error: Could not set action value!");
			return true;
		}

		nodeAction.value = szAction;
	}

	if (bDoOnSubmit)
		raiseEvent('submit',oForm);

	oForm.submit();

	return false;
}

/**
* @param object view
* @param string default value
*/
function removeDefault(oView,szDefault)
{
	if (oView.value == szDefault && szDefault != '')
		oView.value = '';
}

/**
* Formats a request string out of form values
* Notice: Uses jquery!
*
* @param string form id - not name because it can not be selected through jquery!
*
* @return string request
*/
function getFormRequest(szForm)
{
	var aInputs  = $('#'+szForm+' input,#'+szForm+' textarea,#'+szForm+' select');
	var szRequest = "";

	aInputs.each(function(i,el)
	{
		if (szRequest != "")
			szRequest += '&';

		szRequest += el.name + '=' + el.value;
	});

	return szRequest;
}

/**
* Joins multiple request strings
*
* @param string multiple request strings
*
* @return string joined request
*/
function joinRequest()
{
	var szRequest = "";

	for (var i=0;i != arguments.length;i++)
	{
		if (szRequest != "")
			szRequest += '&';

		szRequest += arguments[i];
	}

	return szRequest;
}

/**
* POPUP FUNCTIONS
*/

/**
* @param string href
* @param integer popup width
* @param integer popup height
* @param boolean popup scrollable?
* @param boolean popup resizable?
*
* @return boolean true if popup could not be opened! Adjusted to a direct call from onClick="return openPopup(..)"
*/
function openPopup(szFile,nWidth,nHeight,bScrollable,bResizable)
{
	window.open(szFile,'','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars='+(bScrollable ? 'yes' : 'no')+',resizable='+(bResizable ? 'yes' : 'no')+',width='+nWidth+',height='+nHeight+',top=100,left=100');

	return false;
}

/**
* UTILITY FUNCTIONS
*/

/**
* PHP-like in_array()
*
* @param mixed needle
* @param array haystack
* @param boolean strict comparison mode?
*
* @return boolean needle in haystack array?
*/
function in_array(mixedNeedle,a,bStrict)
{
	var bFound	= false,
		bStrict = !!bStrict,
		mixedKey;

	for (mixedKey in a)
	{
		if ((bStrict && a[mixedKey] === mixedNeedle) || (!bStrict && a[mixedKey] == mixedNeedle))
		{
			bFound = true;
			break;
		}
	}

	return bFound;
}

/**
* Framework action triggered by javascript
*
* @param string action
* @param string optional url, pass false to use current url
* @param int optional framework object receiver id, pass false and the action will be received by the application object of the framework
* @param string optional parameter (formatted like a query string, no question mark needed!)
*
* @return boolean true if action could not be done! Adjusted to a direct call from onClick="return doAction(..)"
*/
function doAction(szAction,szURL,nReceiverID,szParams)
{
	var szActionURL = szURL != undefined && szURL != false ? szURL : window.location.protocol+'//'+window.location.host+window.location.pathname;

	szActionURL += '?szAction='+szAction;

	if (nReceiverID != undefined && nReceiverID != false)
		szActionURL += '&nReceiverID='+nReceiverID;

	if (szParams != undefined && szParams != false)
		szActionURL += '&'+szParams;

	window.location.href = szActionURL;

	return false;
}

/**
* Performs an asyncronous request by using jquery
*
* @param string url
* @param string parameter (formatted like a query string, no question mark needed!)
* @param function optional, invoked when call successful
* @param function optional, invoked when an error occurs
* @param function optional, invoked when call completed
*
* @return boolean url successfully requested?
*/
function doAJAXRequest(szURL,szParams,funcSuccess,funcError,funcComplete)
{
	$.ajax({type	: 'GET',
			url		: szURL,
			datatype: 'json',
			data	: szParams,
			success : function(mixedData)
			{
				if (funcSuccess != undefined)
					funcSuccess(mixedData);
			},
			error	: function(mixedData)
			{
				if (funcError != undefined)
					funcError(mixedData);
			},
			complete: function(mixedData)
			{
				if (funcComplete != undefined)
					funcComplete(mixedData);
			}
	});

	return true;
}

/**
* @param string event type (for example: submit, click, ...)
* @param object
*/
function raiseEvent(szType,oObj)
{
	if (document.createEvent)
	{
		var e = document.createEvent("Events");

		e.initEvent(szType,true,true);
		oObj.dispatchEvent(e);
	}
	else if (document.createEventObject)
	{
		var e = document.createEventObject();

		oObj.fireEvent('on'+szType,e);
	}
}
