/**
*********************************************************************************************************************
 Ajax SubmitForm: submit the form via ajax. Message returned is posted on the element
*********************************************************************************************************************
**/
function ajaxSubmit(theform, containerid){
	var url = theform.action;
	var params = Form.serialize(theform);
	new AjaxRequest(containerid, url, 'post', params, null, null);

}

/**
*********************************************************************************************************************
 SimpleRequest: the simple ajax request
*********************************************************************************************************************
**/
var SimpleRequest = function(targetElementId, url, method, parameters) {
	var targetElement = $(targetElementId);
   	if (targetElement == null) {
    	throw 'Target element is null!';
   	}
   	if (url == null) {
  		throw 'URL has to be provided';
  	}
  	if (method == null) {
    	method = 'get';
  	} else if (method != 'get' && method != 'post') {
     	throw 'Method should be get or post'; 
   	}
   	var ajaxOptions = new Object();
   	ajaxOptions.method = method;
   	ajaxOptions.parameters = parameters;
   	ajaxOptions.evalScripts = true;
   	
   	var myAjax = new Ajax.Updater(
    	{ success: targetElement }, 
    	url, 
        ajaxOptions
        );
};
   
/**
*********************************************************************************************************************
 AjaxRequest: the ajax request with onFailure, onSuccess callback
*********************************************************************************************************************
**/
var AjaxRequest = function(targetElementId, url, method, parameters, successCallback, failureCallback) {
   	if (url == null) {
  		throw 'URL has to be provided';
  	}
  	if (method == null) {
    	method = 'get';
  	} else if (method != 'get' && method != 'post') {
     	throw 'Method should be get or post'; 
   	}
   	var ajaxOptions = new Object();
   	ajaxOptions.method = method;
   	ajaxOptions.parameters = parameters;
   	ajaxOptions.evalScripts = true;
   	if(failureCallback != null)
   		ajaxOptions.onFailure = failureCallback;
   	if(successCallback != null)
   		ajaxOptions.onSuccess = successCallback;
   	if(targetElementId != null){	
   		var targetElement = $(targetElementId);
   		var myAjaxUpdater = new Ajax.Updater(
    		{ success: targetElement }, 
    		url, 
    		ajaxOptions
			);
	}else{
		var myAjaxRequest = new Ajax.Request(url, ajaxOptions);
	}	
};
 
/**
*********************************************************************************************************************
 AjaxUpdater: the ajax updater
*********************************************************************************************************************
**/
var AjaxUpdater = function(successContainer, failContainer, url, method, parameters, successCallback, failCallback) {
   	if (url == null) {
  		throw 'URL has to be provided';
  	}
  	if (method == null) {
    	method = 'get';
  	} else if (method != 'get' && method != 'post') {
     	throw 'Method should be get or post'; 
   	}
   	var ajaxOptions = new Object();
   	ajaxOptions.method = method;
   	ajaxOptions.parameters = parameters;
   	ajaxOptions.evalScripts = true;
   	ajaxOptions.onCreate = function(){$(failContainer).setStyle({display:'none'});};
   	ajaxOptions.onFailure = function(t){
   		if(failContainer){
   			$(failContainer).setStyle({display:'block'});
   			$(failContainer).innerHTML = t.responseText;
   		}
   		if(failCallback)
   			eval(failCalback);	
   	};
   	
   	if(successCallback)
   		ajaxOptions.onSuccess = successCallback;
   	var ajaxContainers  = new Object();
   	if(successContainer){
   		ajaxContainers.success = successContainer;
   		ajaxOptions.onComplete = function(){$(successContainer).setStyle({display:'block'});};
    	var myAjaxUpdater = new Ajax.Updater(
    		ajaxContainers, 
    		url, 
    		ajaxOptions
			);
	}
	else{
		var myAjaxRequest = new Ajax.Request(url, ajaxOptions);
	}
}


/**
*********************************************************************************************************************
 FormRequest: the ajax request via form submit. When form submit button click the form is serialized and is sent to
 			server via ajax request
*********************************************************************************************************************
**/
function formRequest(formElementId) {
	Event.observe(formElementId, 'submit', handleSubmitEvent, true);
}
/**
*********************************************************************************************************************
 FormRequest2: the ajax request via form submit. This is a modified version of FormRequest.
 				When form submit button click the form is serialized and is sent to
 				server via ajax request. All submit buttons except the one clicked are not sent to the server
*********************************************************************************************************************
**/

function formRequest2(submitElementId){
   	Event.observe(submitElementId, 'click', handleClickEvent, true);
}
  
/**
*********************************************************************************************************************
 handleSubmitEvent: handler which is responsible for form submit event. This handler is registered in
 				FormRequest
*********************************************************************************************************************
**/
 
function handleSubmitEvent(event) {
  	var formElement = Event.element(event);
  	var params = Form.serialize(formElement);
    if (formElement.tagName.toLowerCase() != 'form') {
    	throw 'Element ' + formElement + ' is not a FORM element!';
   	}
        
   	var method = formElement.method;
    if (method == null) {
    	method = 'get';
    }
   	var url = formElement.action;
    if (url == null) {
    	throw 'No action defined on ' + formElement;
    }
   	try {
    	Event.stop(event);
		var myRequest = new Ajax.Updater(
			{ success: formElement.parentNode }, 
			url, 
			{ 
				method: method, 
				parameters: Form.serialize(formElement),
				evalScripts: true,
				onSuccess: handlerFunc,
				onFailure: errFunc
			});
	} finally {
		return false;
	}
}
/**
*********************************************************************************************************************
 handleClickEvent: handler which is responsible for event click on submit button. This handler is registered in
 				FormRequest2
*********************************************************************************************************************
**/

function handleClickEvent(event) {
	var submitElement = Event.element(event);
	var formElement = submitElement.form;
    var params = [];
	Form.getElements(formElement).
		each(function(element){
			if(element.type.toLowerCase() == 'submit' &&
				element != Event.element(event)){
				//don't do anything
			}
			else{
				var param = Form.Element.serialize(element);
				if(param){
					params.push(param);
				}
			}
		})
		
    if (formElement.tagName.toLowerCase() != 'form') {
    	throw 'Element ' + formElement + ' is not a FORM element!';
   	}
    var method = formElement.method;
    if (method == null) {
    	method = 'get';
    }
    var url = formElement.action;
    if (url == null) {
    	throw 'No action defined on ' + formElement;
   	}
  	var serialized_params = params.join("&");
    try {
    	Event.stop(event);
		var myRequest = new Ajax.Updater(
			{ success: formElement.parentNode }, 
			url, 
			{ 
				method: method, 
				parameters: serialized_params,
				evalScripts: true,
				onFailure: errFunc
			});
	}finally {
		return false;
	}
}

var handlerFunc = function(t) {
	// alert(t.responseText);
}

var errFunc = function(t) {
	alert('Error ' + t.status + ' -- ' + t.statusText);
}
