/*
Plugin jquery création d'une surcouche AJAX
De Samuel Mandonnaud
*/
(function($) {
	$.surcouche=function(params) {
		params=$.extend({
			chargementId:'AfficherChargement',
			chargementContenu:'<div></div>',
			contenuId:'contenuAjax',
			contenuChacheId:'contenuAjaxCacher',
			titreId:'ajaxTitle',
			lienClass:'interne',
			elementCommumId:'horsAjax',
			sortieTime:500,
			sortieOption:function() { return {} },
			sortieEffet:'swing',
			sortieFunction:null,
			entrerPreCss:function() { return {} },
			entrerTime:500,
			entrerOption:function() { return {} },
			entrerEffet:'swing',
			entrerFunction:null,
			traitementPerso:function() {},
			page404:'404.php',
			domaine:'',
			debug:false
		}, params);
		
		if (params.domaine=='') {
			alert('Le parametre "domaine" est obligatoire');
		}
		if ($('#'+params.contenuChacheId).size()==0) {
			$(document.body).append('<div id="'+params.contenuChacheId+'"></div>');
			$('#'+params.contenuChacheId).hide();
		}
		$.surcouche.url='';
		$.surcouche.hash='';
		
		var traitement=function() {
			
			if ($('#'+params.titreId).size()==1) {
				document.title=$('#'+params.titreId).text();
				$('#'+params.titreId).remove();
			}
			$('.'+params.lienClass).each(function() {
				var teste=$(this).attr('href');
				if (teste) {
					teste=teste.replace(params.domaine,'');
					teste=teste.replace(/^(\/)/g,'');
					$(this).attr('href','#!'+teste).removeClass(params.lienClass);
				} else {
					if (params.debug) {
						console.log(this);
					}
					
				}
			});
			
			// tous les éléments qui peuvent etre Commumt son tagué
			$('.'+params.elementCommumId+'Placer').addClass(params.elementCommumId+'NonControle');
			
			
			// On scanne les nouveaux élements designés comme était peut Commumt
			$('.'+params.elementCommumId).each(function() {
				var blocDetach=$(this).detach();
				
				
				if ($('#'+$(this).attr('id')).size()==0) { // Si n'existe pas le laisse dans le contenu qui va arrivé
					blocDetach.appendTo('#'+params.contenuChacheId);
				} else { // Si existe déjà on enleve le tague de suppression
					$('#'+$(this).attr('id')).removeClass(params.elementCommumId+'NonControle');
				}
				blocDetach=null;
			});
			
			// Les éléments encore tagué placer dans le boite qui va disparaitre
			$('.'+params.elementCommumId+'NonControle').each(function() {
				var blocDetach=$(this).detach();
				blocDetach.appendTo('#'+params.contenuId);
			});
		}
		$.surcouche.traimentSuite=function() {
			// On sort de leur contenu tous les nouveau élément qui peuvent etre commun
			$('.'+params.elementCommumId).each(function() {
				$(this).insertAfter('#'+params.contenuId).removeClass(params.elementCommumId).addClass(params.elementCommumId+'Placer');
			});
		}
		
		// Function lancé à chaque changement d'adresse
		var changementAdresse=function(event) {
			
			/* Recherche de l'url */
			$.surcouche.url=window.location.hash;
			
			$.surcouche.url=$.surcouche.url.replace(/#!/,'');
			$.surcouche.url=$.surcouche.url.replace(/^\//,'');
			
			if ($.surcouche.url=='') {
				if ($('.mAjax').size()==0) {
					traitement();
					$.surcouche.traimentSuite();
					params.traitementPerso();
					
					$(document.body).addClass('mAjax');
					return;
				}
				$.surcouche.url=document.URL;
			}
			$.surcouche.url=$.surcouche.url.replace('%23','#');
			$.surcouche.url=$.surcouche.url.split('#');
			if ($.surcouche.url[1]) {
				$.surcouche.hash=$.surcouche.url[1];
			} else {
				$.surcouche.hash='';
			}
			$.surcouche.url=$.surcouche.url[0];
			if ($('.mAjax').size()==0) {
				$('#'+params.contenuId).html('');
			}
			$(document.body).addClass('mAjax');
			
			// Insertion d'une div pour prevenu du chargement
			if (params.chargementId!='') {
				$(document.body).append('<div id="'+params.chargementId+'">'+params.chargementContenu+'</div>');
				$('#'+params.chargementId).hide().fadeIn('fast');	
			}
			
			chargement();
		};
		var chargement=function() {			
			$.ajax({
				type:'POST',
				data:{
					version:'ajax'	
				},
				url:$.surcouche.url,
				success:function(msg) {
					
					$('#'+params.contenuChacheId).html(msg);
					
					traitement();
					
					
					if (params.chargementId!='') {
						$('#'+params.chargementId).fadeOut('fast',function() { $(this).remove(); });
					}
					// DECODER LES OPTIONS DE SORTIE
					if (params.sortieFunction!=null) {
						params.sortieFunction();
					} else {
						$('#'+params.contenuId).stop(true).animate(params.sortieOption(),params.sortieTime,params.sortieEffet,function() { $.surcouche.suivant();	});
					}
				},
				error:function() {
					$.surcouche.url=params.page404;
					chargement();
				}
			});
			
		}
		$.surcouche.suivant=function() {
			$('#'+params.contenuId).html($('#'+params.contenuChacheId).html());
			$('#'+params.contenuChacheId).html('');
			$('#'+params.contenuId).css(params.entrerPreCss());
			// Traitement perso
			if (window['mEditeur']) {	
				mEditeur.preparationDoubleClick();		
			}
			
			params.traitementPerso();
			if (params.entrerFunction!=null) {
				params.entrerFunction();
			}	else {
				$('#'+params.contenuId).animate(params.entrerOption(),params.entrerTime,params.entrerEffet,function() { $.surcouche.traimentSuite(); });
			}
		}
		
		if (!SWFAddress) {
			alert('SWFAdress doit etre chargé');
		}
		SWFAddress.addEventListener(SWFAddressEvent.CHANGE,changementAdresse);
		
	}
})(jQuery);
