
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(){
	if($.hegydPopup){
		$('.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
 * 
 * @description : Fonction globale d'appels Ajax / RPC
 * @param :  model $model 
 * @param :  method $method 
 * @param :  datas $datas 
 * @param :  callbackFunction $callbackFunction 
 * @access : public
 * @return : void
 * @date : 2011-04-20
 * @author : François Guémard <f.guemard@hegyd.com>
 */
function ajaxRpc(model,method,datas,callbackFunction,callbackParam,async,dataType) {

    if ($.isPlainObject(model)) {
		var url 			 = model.url;
        var method           = model.method;
        var datas     		 = model.datas;
        var callbackFunction = model.callback;
        var callbackParam    = model.params;
        var async            = model.async;
        var dataType         = model.type;
		var defaultParams	 = model.params;
        var model            = model.model;
    }

	if (typeof(url) == 'undefined' || !url)
		var url = 'ajax/rpc.html';

	if (typeof(dataType) == 'undefined' || !dataType)
		var dataType = 'JSON';
	
	if (typeof(datas) == 'undefined' || !datas)
		var datas = {};

	// Passage du context JS en datas pour la fonction appelé
	datas.context = {
		'pathName' : window.location.pathname
	};

	var params = {};

	if (typeof(defaultParams) != 'undefined' && defaultParams)
		params = defaultParams

	params.model  = model;
	params.method = method;
	params.datas  = datas;

    if (typeof(async) == 'undefined') {
        var async = true;
    }

    //log(params);
	var ajax = $.ajax({
		type: 'POST',
		url: url,
		data: params,
		dataType: dataType,
        async: async,
		success: function(response) {
			if ($.isFunction(callbackFunction))
				callbackFunction(response,callbackParam);

		},
        error: function(error) {
            notify(error);
        }
	});

	return ajax;

}

