/** ----------------------------------------------------------------------------

    extension:  REZET
    author:     Samuel Le Morvan (http://www.babylon-design.com/share/popin/)
    editor:     INTERNETHIC

    modifications:    Ouverture en popin des liens .popin avec passage des parametres des fomurlaires en AJAX

----------------------------------------------------------------------------- */

REZET_PopinBehaviors = (function(){

    // Verification si IE6 pour hack
	ie6 = ($.browser.msie && ($.browser.version == "6.0")) ? true : false;

	// Variable permettant de savoir si la scrollbar est affichee
	var hasScrollH = false;
	var hasScrollV = false;

	/**
	 * Initialisation du module
	 * @param base objet jQuery du parent des liens a activer
	**/
	function initPopin(base){
		base.find('.popin').click(function(){
			loadPopin( '/layout/set/popup'+jQuery(this).attr('href') );
			jQuery(this).blur();
			return false;
		});

		base.find('form.resultPopin').submit(function(){
			// Ouverture du resultat de recherche en popin
			loadPopin( '/layout/set/popup'+jQuery(this).attr('action'), getFormData( jQuery(this) ) );
			jQuery(this).blur();
			return false;
		});

		base.find('.linkPopin').click(function(){
			loadLinkPopin( jQuery(this).attr('href') );
			jQuery(this).blur();
			return false;
		});

		base.find('.closePopin').click(function(){
			closePopin();
		});
	}

	/**
	 * Fonction load
	 * affiche les elements de la popin + chargement du externalLink dans celle-ci + passage de parametres s'il y a
	**/
	function loadPopin(externalLink, data){
		if(!data) data = null;

		// Insertion du voile & du Loader
		$("body").prepend('<div class="rezetPopin-voile"></div>');
		$("body").prepend('<div class="rezetPopin-loading"><div></div></div>');

		// CSS du voile
		$(".rezetPopin-voile").css("opacity", 0).css("left", 0).css("z-index", "1000").css("width", "100%").css("height", 0).css("background-color", "#000").css("background-position", "center center").css("background-repeat", "no-repeat");

		// Patch IE6
		if(ie6 == true) {
			PPNhtmlScroll 			= document.getElementsByTagName("html")[0].scrollTop;
			var PPNbodyMargin 		= new Object();
			PPNbodyMargin.top 		= parseInt($("body").css("margin-top"));
			PPNbodyMargin.right 	= parseInt($("body").css("margin-right"));
			PPNbodyMargin.bottom 	= parseInt($("body").css("margin-bottom"));
			PPNbodyMargin.left 		= parseInt($("body").css("margin-left"));

			$("html, body").css("height", "100%").css("overflow", "hidden");
			$("body").height($("body").height());
			PPNbodyHeight = parseInt($("body").height());
			$("html, body").css("overflow", "visible").css("overflow-x", "visible");

			PPNbodyTop = ((PPNbodyMargin.top + PPNbodyMargin.bottom) < PPNhtmlScroll) ? (PPNbodyMargin.top + PPNbodyMargin.bottom - PPNhtmlScroll) : 0;
			$("body").css("top", PPNbodyTop ).css("position", "relative");
			$(".rezetPopin-voile").css("position", "absolute").css("top", -(PPNbodyMargin.top + PPNbodyMargin.bottom - PPNhtmlScroll) ).css("left", (- PPNbodyMargin.left) ).css("width", $("html").width());
		} else {
			$("html, body").css("overflow", "hidden");
			$(".rezetPopin-voile").css("top", 0).css("position", "fixed");
		}

		// Affichage du voile
		$(".rezetPopin-voile").animate({opacity:"0.5", height:((ie6 == true) ? (PPNbodyHeight + PPNbodyMargin.top + PPNbodyMargin.bottom) : "100%")}, function() {

			// Loader Show
			$(".rezetPopin-loading").show();

			// Insertion de la popin et animation
			$(".rezetPopin").css("height", $("body").height() );

			// Ajout Popin + Close Button
			$("body").prepend('<div class="rezetPopin"><div class="rezetPopin-content"></div><a class="rezetPopin-close"></a></div>');

			// Ajout de l'ombre autour de la popin, sauf pour ie6
			if(ie6 != true) { $('.rezetPopin').append('<div class="rezetPopin-bg rezetPopin-bg-n"></div><div class="rezetPopin-bg rezetPopin-bg-ne"></div><div class="rezetPopin-bg rezetPopin-bg-e"></div><div class="rezetPopin-bg rezetPopin-bg-se"></div><div class="rezetPopin-bg rezetPopin-bg-s"></div><div class="rezetPopin-bg rezetPopin-bg-sw"></div><div class="rezetPopin-bg rezetPopin-bg-w"></div><div class="rezetPopin-bg rezetPopin-bg-nw"></div>');}

			// chargement du HTML externe
    		jQuery('.rezetPopin .rezetPopin-content').load(externalLink + " #popinContentToLoad", data, popinContentLoaded);

		});
	}

	/**
	 * Fonction loadInnerPopin
	 * affiche les elements de la popin + chargement du externalLink dans celle-ci + passage de parametres s'il y a
	**/
	function loadLinkPopin(externalLink, data){
		if(!data) data = null;

		// Loader Show
		$(".rezetPopin-loading").fadeIn("slow");

		// Opacity 0.5 pour simuler le chargement
		$(".rezetPopin-content").css("opacity", 0.5);

		// chargement du HTML externe
		jQuery('.rezetPopin .rezetPopin-content').load(externalLink + " #popinContentToLoad", data, popinContentLoaded);

	}


	/**
	 * Appele lorsque le contenu de la lightbox a ete charge
	 * Positionnement, bouton fermer et action sur les formulaires + masque le loading
	**/
	function popinContentLoaded(){
		if (jQuery('html').hasClass('msie6')){ gimmeMyCSS2(); }

		// pour les liens intra-popin
		REZET_PopinBehaviors.initPopin(jQuery(".rezetPopin-content"));

		// Calcul et affichage de la popin
		calculatePopinSize();

	    // Loader Hide
		$(".rezetPopin-loading").fadeOut("slow");

        // Opacity 0.5 pour simuler le chargement
		$(".rezetPopin-content").css("opacity", 1);

		// Close button Show
		$(".rezetPopin-close").show();

		// Hack IE
		if(ie6 == true) { $(".rezetPopin").css("top", parseInt($(".rezetPopin").css("top")) - PPNbodyTop ); }

		// Close buttons action
		jQuery('.rezetPopin-close, .rezetPopin-voile').click(closePopin);

		// Submit des forms
		jQuery("#popinContentToLoad").find("form").submit(submitForm);
	}

	function pressKey(evt) {
    	var evt = (evt) ? evt : ((event) ? event : null);
    	var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
    	if(evt.keyCode == 27) {
    	    closePopin();
    	}
    }

    document.onkeypress = pressKey;


	/**
	 * Fermeture de la lightbox
	**/
	function closePopin(){
		$("html").unbind("keydown");

		$(".rezetPopin").fadeOut("slow", function() {
			$(".rezetPopin-voile").animate({opacity:0, height:0}, function() {
				// Suppression du voile & Deverrouillage du scroll
				if(ie6 == true) {
					$("html, body").css("height", "auto").css("overflow", "auto").css("overflow-x", "hidden");
					$("body").css("top", 0);
					window.scrollTo(0, (PPNhtmlScroll) );
				} else {
					$("html, body").css("overflow", "auto");
				}
				$(".rezetPopin, .rezetPopin-voile").remove();
			});
		});
	}


	/**
	 * Envoie les donnees du formulaire via AJAX
	**/
	function submitForm(){

	    // Loader Show
		$(".rezetPopin-loading").fadeIn("slow");

		// Opacity 0.5 pour simuler le chargement
		$(".rezetPopin-content").css("opacity", 0.5);

        // envoi des donnees par AJAX
		jQuery.ajax({
			url:      jQuery(this).attr("action"),
			data:     getFormData(jQuery(this)),
			cache:    false,
			success:  successForm,
			complete: completeForm,
			error:    errorForm,
			dataType: 'html',
			type:     jQuery(this).attr("method")
		});

		return false;
	}


	/**
	 * Renvoie un objet contenant les donnees du formulaire
	 * @param form Objet jQuery du formulaire
	**/
	function getFormData(form){
        var formData = {};
        form.find(":input").each(function(){
            if (jQuery(this).attr("type") == "checkbox") {
                formData[jQuery(this).attr("name")] = jQuery(this).attr("checked");
            } else if (jQuery(this).attr("type") == "radio") {
                /* On remonte au parent pour lister tous les boutons radios et prendre la valeur de celui qui est coche */
                formData[jQuery(this).attr("name")] = jQuery(this).parent().find(":input:radio:checked").val();
            } else {
                formData[jQuery(this).attr("name")] = jQuery(this).val();
            }
        });

        return formData;
	}

    /**
	 * Fonction de callback de reponse AJAX aux formulaires
	 * @param retour 		le retour des formulaires
	**/
	function successForm(retour, data, status){

	    // Split au niveau du div "popinContentToLoad"
	    var contentDataSplit = retour.split('<div id="popinContentToLoad">');

	    // Split au niveau du div "popinContentToSplit" a partir du div "popinContentToLoad"
	    var contentData = contentDataSplit[1].split('<div id="popinContentToSplit">');

	    // Affichage de la zone entre les 2 Splits
        jQuery("#popinContentToLoad").empty().append( contentData[0] );

        // Opacite a 1 pour simuler la fin du chargement
        $(".rezetPopin-content").css("opacity", 1);

        // Calcul et affichage de la popin
		calculatePopinSize();

		// Loader Hide
		$(".rezetPopin-loading").fadeOut("slow");

		// Ecouteur pour submit des forms
        jQuery("#popinContentToLoad").find("form").submit(submitForm);

	}

	/**
	 * Fonction de callback de l'appel AJAX aux formulaires
	 * @param data 		les donnees chargees
	 * @param status	une chaine specifiant le statut http de la reponse
	**/
	function completeForm(data, status){

	}

	/**
	 * Fonction de callback pour les erreurs d'envoi de formulaire
	 * @param XMLHttpRequest	XMLHttpRequest object
	 * @param textStatus		a string describing the type of error that occurred
	 * @param errorThrown		an optional exception object, if one occurred
	**/
	function errorForm(XMLHttpRequest, textStatus, errorThrown){

	}


	/**
	 * Fonction de calcul de la taille de la popin et affichage
	**/
	function calculatePopinSize(){
	    // Tailles max un peu reduite par rapport a la fenetre du navigateur pour eviter que la popin ne depasse de la page
        var maxHeight = $(window).height() - 100;
        var maxWidth  = $(window).width() - 100;

        // Recuperation de la taille du contenu de la popin
		var popinHeight = $("#popinContentToLoad .innerPopin").height();
		var popinWidth  = $("#popinContentToLoad .innerPopin").width();

		// Si on depasse les tailles max, on va devoir afficher les scrollbars, on agrandi un peu la taille pour laisser de la place pour la scrollbar
		if( popinHeight >= maxHeight ) {
		    popinHeight = maxHeight;

		    // Ajout de 20px pour la scrollbar uniquement si elle n'est pas encore presente
		    if( hasScrollV == false ) {
		        popinWidth  = popinWidth + 20;
		        hasScrollV = true;
		    }
		}

		if( popinWidth >= maxWidth ) {
		    popinWidth  = maxWidth;

		    // Ajout de 20px pour la scrollbar uniquement si elle n'est pas encore presente
		    if( hasScrollH == false ) {
		        popinHeight  = popinHeight + 20;
		        hasScrollH = true;
		    }
		}

		(ie6 == true) ? $(".rezetPopin").css("position", "absolute").css("margin-top", 0) : $(".rezetPopin").css("position", "fixed").css("top", "50%").css("margin-top", -(popinHeight/2));

		// Taille de la popin et de son contenu
		$(".rezetPopin").css("background-color", "#ffffff").css("padding", "20px").css("left", "50%").css("z-index", "1100").css("width", popinWidth).css("height", popinHeight).css("margin-left", -(popinWidth/2));
		$(".rezetPopin-content").css("height", $(".rezetPopin").height() - parseInt($(".rezetPopin").css("padding-top")) - parseInt($(".rezetPopin").css("padding-bottom")));
		$("#popinContentToLoad").css("height", popinHeight ).css("width", popinWidth );
		$(".innerPopin").css("height", popinHeight ).css("width", popinWidth );

		// Affichage des scrollbar
		$('.innerPopin').jScrollPane();
	}


	return {
		initPopin: initPopin
	}

})();
