
var ajaxToken = 0;
var ajaxLoading = 0;
var ajaxHandler = null;
var AjaxReady = null;

var ajaxFormTiming = 150;

$(document).ready(function(){

	$('body').append('<a href="#" style="display:none" id="ajaxHandler" >ajaxHandler</a>');

	ajaxHandler = $('#ajaxHandler');
	AjaxReady = ajaxHandler; // retro compatibility 
	ajaxHandler.click(function(){
		return false
	});

	var AjaxLoadBlock = $('#ajaxLoadingBlock') ;
	var blockHeader = $('#blockHeader') ;

	ajaxHandler.ajaxStart(function(){
		if(!isIE) AjaxLoadBlock.stop().fadeTo(300,1);
		else AjaxLoadBlock.slideDown(250);
		blockHeader.addClass('ajaxLoading');
	});

	ajaxHandler.ajaxSend(function(){
		ajaxLoading = 1;
		ajaxToken = ajaxToken + 1 ;
	});

	ajaxHandler.ajaxStop(function(){
		if(!isIE) AjaxLoadBlock.stop().fadeTo(350,0,function(){
			blockHeader.removeClass('ajaxLoading');
		});
		else AjaxLoadBlock.slideUp(250,function(){
			blockHeader.removeClass('ajaxLoading');
		});
		ajaxLoading = 0;
		ReadyScript();
		});

	AjaxLoadBlock.hide();
	
	constructAjaxForm();
	//constructAjaxOrder();
	constructAjaxActions();

	ajaxLoadScript(function(){
		constructAjaxForm()
		//constructAjaxOrder();
		constructAjaxActions();
	});
});

/**
 * Pour ajouter des scripts qui doivent s'éxécuter à chaque fois qu'une requête ajax est terminé
 * ajaxLoadScript(function(){maFonction()});
 */

function ReadyScript(){
	ajaxHandler.trigger('click');	
}

function ajaxLoadScript(nFunction){
	if($.isFunction(nFunction)){
		ajaxHandler.click(nFunction);
	}
}


// LINKED TO ajaxForm anyway , so must have a valid jsAjaxForm with same action that the link 
function constructAjaxOrder(){

	$('.jsAjaxOrder,.jsAjaxPaging').each(function(){
		// on recherche le formulaire lié 
		var el = $(this);
		var orderUrl = el.attr('href');
		var baseOrderUrl = orderUrl.substring(0,orderUrl.indexOf('?')); 
		if(baseOrderUrl){
			var formEl = $('form[action="'+baseOrderUrl+'"]');
			var targetEl = formEl.find('input[name=ajaxTarget]').val() ;
			var sourceEl = formEl.find('input[name=ajaxSource]').val() ;
			//loadUrl(orderUrl,'',targetEl,sourceEl);
			el.unbind('click').click(function(event){
				log(targetEl);
				log(sourceEl);
				loadUrl(orderUrl,'',targetEl,sourceEl,'replace',function(response){
						var titleEl = $(formEl.find('input[name=ajaxTitle]').val(),response);
						if(titleEl.length){
							$(formEl.find('input[name=ajaxTitle]').val()).html(titleEl.html());
						}
						var pagingEl = $(formEl.find('input[name=ajaxPaging]').val(),response);
						if(pagingEl.length){
							$(formEl.find('input[name=ajaxPaging]').val()).html(pagingEl.html());
						}
					});
				event.preventDefault();
				return false;
			});
		}
	});

}

function constructAjaxForm(){
	if(isIE8 || !isIE){
		$('form.jsAjaxForm').each(function(){
			var formEl = $(this);
			if(formEl.find('.jsAjaxFormDone').length >= 1){
				log('Ajax Form allready done');
				return true; // continue to next form
			}else{
				log('Construct Ajax Form');
				log(formEl);
			}
			var formTimer = null;
			var formAjaxTiming = ajaxFormTiming;

			var targetEl = formEl.find('input[name=ajaxTarget]').val() ;
			var sourceEl = formEl.find('input[name=ajaxSource]').val() ;

			var actionUrl = formEl.attr('action') ;
			var actionAjaxUrl = formEl.find('input[name=ajaxAction]').val();
			if(actionAjaxUrl) actionUrl = actionAjaxUrl;

			if(formEl.find('input[name=ajaxAction]').val() != '') actionUrl = formEl.find('input[name=ajaxAction]').val();

			formEl.append('<input type="hidden" name="ajax" value="ajax" />'); 
			if(targetEl != '' && targetEl != undefined ){
				formEl.submit(function(){
					// cas champs en jsEmpty 
					var jsEmpty = formEl.find('.jsEmptyDone');
					var	jsEmptyDone = new Array();
					jsEmpty.each(function(){
						var inputEl = $(this);
						if(inputEl.val() == inputEl.attr('rel')){ // c'est le texte par défaut du champs 
							// on en tient pas compte lors du submit 
							jsEmptyDone.push({ obj: inputEl, name:inputEl.attr('name')});
							inputEl.attr('name','');
						}
					});
					log('Submit Ajax Form');
					loadUrl(actionUrl,formEl.serialize(),targetEl,sourceEl,'replace',function(response){
						var titleEl = $(formEl.find('input[name=ajaxTitle]').val(),response);
						if(titleEl.length){
							$(formEl.find('input[name=ajaxTitle]').val()).html(titleEl.html());
						}
						var pagingEl = $(formEl.find('input[name=ajaxPaging]').val(),response);
						if(pagingEl.length){
							$(formEl.find('input[name=ajaxPaging]').val()).html(pagingEl.html());
						}
					});
					$.each(jsEmptyDone,function(key,value){
						var inputEl = value.obj;
						inputEl.attr('name',value.name);
					});
					return false;
				});		
			}	
			formEl.find('input,select').each(function(){
				var inputEl = $(this);
				inputEl
					.change(function(){
						if(formTimer) window.clearTimeout(formTimer);
						formTimer = window.setTimeout(function(){formEl.trigger('submit')},formAjaxTiming);
					})
					.keyup(function(){
						if(formTimer) window.clearTimeout(formTimer);
						formTimer = window.setTimeout(function(){formEl.trigger('submit')},formAjaxTiming);
					});
			});

			formEl.append('<span style="display:none !important" class="jsAjaxFormDone"></span>'); 

		});
	}
}

function constructAjaxActions(){
	$('.jsAjaxPopup').hegydPopup({}).removeClass('jsAjaxPopup').addClass('jsAjaxPopupDone');
}

function loadUrl(url,datas,target,source,mode,callbackFunction){

	if(mode == '' || mode == undefined) mode = 'replace';

	if(url != ''){
		$.ajax({
			url: url,
			type: "get",
			data: datas+'&ajax=1',
			dataType: "html",
			success: function(response){
				if(source != '' && source != undefined ){
					if(mode == 'append'){
						$(target).append($(source,response).html());
					}else{
						$(target).html($(source,response).html());
					}
				}else{
					if(mode == 'append'){
						$(target).append(response);
					}else{
						$(target).html(response);
					}
				}
				if( $.isFunction(callbackFunction) ) callbackFunction(response) ;
			}
		});
	}
}

function ajaxRpc(model,method,datas,callbackFunction,callbackParam){

	var url = '/rpc' + model + '.html';
	$.ajax({
		url: url,
		type: "post",
		data: datas+'&ajax=1&rpcMethod='+method,
		dataType: "json",
		success: function(response){
			if( $.isFunction(callbackFunction) ) callbackFunction(response,callbackParam) ;
		}
	});
}

