/************************* AJAX WRAPPER MECHANISM *****************************/
function sn_getAjax(formName, customParams, resultElementName, userData, url) {
	params = new Hash({
		f: formName,
		ajax: 1
	});

	params = params.merge(customParams);

	new Ajax.Request(url,
	{
		method: 'POST',
		parameters: params,
		onSuccess: function (transport) {
			result = transport.responseText;
			if(result.length > 0) {
				result = result.evalJSON(true);
			} else {
				result = '';
			}
			sn_gotAjax(formName, result, resultElementName, userData);
		},
		onComplete: function(transport) {
			sn_completedAjax(formName, resultElementName, userData);
		},
		onFailure: function(transport) {
			sn_failedAjax(formName, resultElementName, userData);
		}
	});
}

function sn_getAjaxByQuery(formName, query, resultElementName, userData) {
	params = new Hash({
		f: formName,
		ajax: 1
	});

	params = params.toQueryString() + '&' + query;

	new Ajax.Request('index.php',
	{
		method: 'POST',
		parameters: params,
		onSuccess: function (transport) {
			result = transport.responseText;
			if(result.length > 0) {
				result = result.evalJSON(true);
			} else {
				result = '';
			}
			sn_gotAjax(formName, result, resultElementName, userData);
		},
		onFailure: function(transport) {
			sn_failedAjax(formName, resultElementName, userData);
		}
	});
}

function sn_gotAjax(formName, result, resultElementName, userData) {
	funcName = "sn_" + formName.dasherize().camelize() + "Handler";
	eval ( funcName + "(result, resultElementName, userData)");
}

function sn_failedAjax(formName, resultElementName, userData) {
	funcName = "sn_" + formName.dasherize().camelize() + "ErrorHandler";
	eval ( funcName + "(result, resultElementName, userData)");
}

function sn_completedAjax(formName, resultElementName, userData) {
	funcName = "sn_" + formName.dasherize().camelize() + "CompleteHandler";
	eval ( funcName + "(result, resultElementName, userData)");
}
/******************************************************************************/

function check_username( elementId )
{
	username = document.getElementById( elementId ).value;
	customParams = {username: username};
	sn_getAjax( "check_username", customParams, "", {field:elementId} );
}

function sn_checkUsernameHandler( result, resultElementName, userData )
{
	if ( result.code == 0 )
	{
		document.getElementById( userData[ 'field' ] ).style.background = "yellow";
	}else{
		// aici facem rosu
		alert('rosu');
	}
}

function ax_submit_form( id )
{
	form = document.getElementById( id );
	url = form.action;

	customParams = { formId : id }
	customParams[ "json" ] = 1;
	for ( i=0; i < form.elements.length; i++ )
	{
		elem = form.elements[i];
		if ( elem.type == "checkbox" )
		{
			customParams[ elem.name ] = elem.checked;
		}else if ( elem.type == "select-one" )
		{
			customParams[ elem.name ] = elem.options[ elem.selectedIndex ].value;
		}else{
			customParams[ elem.name ] = elem.value;
		}
	}

	if ( customParams[ "f" ] )
	{
		handler = customParams[ "f" ];
	}else{
		handler = "generic_form_handler";
	}

	sn_getAjax( handler, customParams, "", {form_id:id}, url );
}

function sn_genericFormHandlerHandler( result, resultElementName, userData )
{
	result = result.result;
	if ( result.ajaxExitCode == 0 )
	{
		innerRes = result.ajaxTextResponse.evalJSON(true);
		if ( innerRes.js )
		{
			eval( innerRes.js );
		}
	}else{
		alert( result.ajaxTextResponse );
	}
}

function sn_customFormHandlerHandler( result, resultElementName, userData )
{
	result = result.result;
	if ( result.ajaxExitCode == 0 )
	{
		innerRes = result.ajaxTextResponse.evalJSON(true);
		if ( innerRes.js )
		{
			eval( innerRes.js );
		}
	}else{
		alert( result.ajaxTextResponse );
	}
}

function load_children( id, moduleName )
{
	// get value
	elem = document.getElementById( id );
	formId = elem.form.id;
	if ( elem.type == "select-one" )
	{
		value = elem.options[ elem.selectedIndex ].value;
	}else if ( elem.type == "checkbox" )
	{
		value = elem.checked;
	}else{
		value = elem.value;
	}

	customParams = {id:id}
	customParams[ id ] = value;
	customParams[ "formId" ] = formId;
	url = "index.php?module="+moduleName + ".ajxinternal&ajax=1&json=1";
	sn_getAjax( "load_children", customParams, "", customParams, url );
}

function sn_loadChildrenHandler( result, resultElementName, userData )
{
	result = result.result;
	if ( result.ajaxExitCode == 0 )
	{
		innerRes = result.ajaxTextResponse.evalJSON(true);
		elem = document.getElementById( innerRes.id );
		elem.options.length = 0;
		if ( innerRes.children )
		{
			children = innerRes.children;
			for ( i=0; i<children.length; i++ )
			{
				o = new Option( children[i].innerHTML, children[i].value );
				elem.options.add(o);
			}
		}
		elem.style.display = "";
	}
}

/**
* Calls a module's action through AJAX
* On success, calls the user defined callback function ( camelized ResponseHandler)
*
* @param module
* @param action
* @param customParams 			-	Prototype Hash containing user params
* @param callback				-	Callback action name (response handler will be of form camelized(callback)ResponseHandler)
* @param requestJSON			-	If the request must return a JSON object
*
* Callback function prototype is:
* function callbackResponseHandler( JSONObject result, Hash params )
*/
function doAjaxAction( module, action, customParams, callback, requestJSON ){
	params = new Hash({
		ajax: 1
	});
	params = params.merge(customParams);
	paramsS = params.toQueryString()

	if ( requestJSON > 0)
	{
		paramsS += "&json=1";
	}

	new Ajax.Request('index.php?module=' + module +'&action=' + action,
	{
		method: 'POST',
		parameters: paramsS,
		onSuccess: function (transport) {

			result = transport.responseText;

			if(result.length > 0) {
				result = result.evalJSON(true);
			} else {
				result = '';
			}
			dispatchAjaxCallback( callback, result, params );
		}
	});
}

/**
* Dispatches the AJAX response in JSON form to the ResponseHandler
*/
function dispatchAjaxCallback( callback, result, params )
{
	funcName = callback.dasherize().camelize() + "ResponseHandler";
	eval ( funcName + "(result, params)");
}

function doAjaxActionUpdater( module, action, customParams, div, requestJSON)
{
	params = new Hash({
		ajax: 1
	});
	params = params.merge(customParams);
	paramsS = params.toQueryString()

	if ( requestJSON > 0)
	{
		paramsS += "&json=1";
	}
	var myAjax = new Ajax.Updater(
	{success: ""+div+""},
	'index.php?module=' + module + '&action=' + action,
	{
		method: 'POST',
		parameters: paramsS
	}
	);
}