/**
 * [PHPFOX_HEADER]
 * 
 * @copyright		[PHPFOX_COPYRIGHT]
 * @author			Raymond Benc
 * @package 		Phpfox
 * @version 		$Id: ajax.js 751 2009-07-10 07:37:37Z Raymond_Benc $
 */

/**
 * Creates an AJAX call using jQuery.load()
 * Data is inserted into DOM
 *
 * @param string sCall Name of the Component
 * @param string sExtra Extra params we plan to pass
 */
$.ajaxBox = function(sCall, sExtra)
{
	var sParams = getParam('sJsAjax') + '?phpfox[ajax]=true&phpfox[call]=' + sCall;
	if (sExtra)
	{
		sParams += '&' + sExtra;
	}	
	
	if (!sParams.match(/phpfox\[security_token\]/i))
	{
		sParams += '&phpfox[security_token]=' + oCore['log.security_token'];
	}	
	
	return sParams;
}

var oCacheAjaxRequest = null;
var aCacheAjaxLastCall = {};

window.onbeforeunload = function() 
{
	if (oCacheAjaxRequest !== null)
	{
		oCacheAjaxRequest.abort();
	}	
}

/**
 * Create AJAX Call
 *
 * @param	string	sFunction	Name of the function we plan to use
 * @param	string	sId	Form ID
 */
$.fn.ajaxCall = function(sCall, sExtra, bNoForm)
{	
	var sUrl = getParam('sJsAjax');
	var sParams = '&phpfox[ajax]=true&phpfox[call]=' + sCall + '' + (bNoForm ? '' : this.getForm());
	if (sExtra)
	{
		sParams += '&' + ltrim(sExtra, '&');
	}
	
	if (!sParams.match(/phpfox\[security_token\]/i))
	{
		sParams += '&phpfox[security_token]=' + oCore['log.security_token'];
	}
	
	if (oCacheAjaxRequest !== null)
	{
		oCacheAjaxRequest.abort();
		if (isset(aCacheAjaxLastCall['last_call']) && aCacheAjaxLastCall['last_call'] != sCall)
		{
			sParams += '&phpfox[last_call]=' + aCacheAjaxLastCall['last_call'];			
		}		
		if (isset(aCacheAjaxLastCall['last_param']))
		{
			sParams += '&phpfox[last_param]=' + aCacheAjaxLastCall['last_param'];			
		}			
	}
	
	if (sCall == 'im.getMessages' || sCall == 'im.getRooms')
	{
		aCacheAjaxLastCall = {
			last_call: sCall	
		};
		
		if (sCall == 'im.getMessages')
		{		
			aMatches = sParams.match(/&im_id=(.*?)&/i);
			if (aMatches !== null && isset(aMatches[1]))
			{
				aCacheAjaxLastCall['last_param'] = aMatches[1];		
			}	
		}
	}
	
	oCacheAjaxRequest = $.ajax({
			data: sParams			
		}
	);
}

$.ajaxCall = function(sCall, sExtra)
{
    $(this).ajaxCall(sCall, sExtra, true);
}

/**
 * Get form details
 * @param	string	frm	Form ID or Element ID
 * @return	string	Return parsed URL string
 */
$.fn.getForm = function()
{
	var objForm = this.get(0);	
	var prefix = "";
	var submitDisabledElements = false;
	
	if (arguments.length > 1 && arguments[1] == true)
	{
		submitDisabledElements = true;
	}
	
	if(arguments.length > 2)
	{
		prefix = arguments[2];
	}

	var sXml = '';
	if (objForm && objForm.tagName == 'FORM')
	{
		var formElements = objForm.elements;		
		for(var i=0; i < formElements.length; i++)
		{
			if (!formElements[i].name)
			{
				continue;
			}
			
			if (formElements[i].name.substring(0, prefix.length) != prefix)
			{
				continue;
			}
			
			if (formElements[i].type && (formElements[i].type == 'radio' || formElements[i].type == 'checkbox') && formElements[i].checked == false)
			{
				continue;
			}
			
			if (formElements[i].disabled && formElements[i].disabled == true && submitDisabledElements == false)
			{
				continue;
			}
			
			var name = formElements[i].name;
			if (name)
			{				
				sXml += '&';
				if(formElements[i].type=='select-multiple')
				{
					for (var j = 0; j < formElements[i].length; j++)
					{
						if (formElements[i].options[j].selected == true)
						{
							sXml += name+"="+encodeURIComponent(formElements[i].options[j].value)+"&";
						}
					}
				}
				else
				{
					sXml += name+"="+encodeURIComponent(formElements[i].value);
				}
			}
		}
	}	

	if ( !sXml )
	{
		sXml += "&" + objForm.name + "="+ encodeURIComponent(objForm.value);
	}	
	
	return sXml;
}