vanilla.namespace('libreobjet.commande');

libreobjet.commande = 
{
    libraryURL : null,
    pageURL: null,
    panierNavigationItem : null,
    panierNavigationArticles : null,

    initDeamon : function(prop, articles)
    {
	this.libraryURL = prop.libraryURL;

	// on cherche le menu panier pour le mettre a jour
	var navItem	= $("#view-navigation ul.navigation-quicklinks li.panier a");
	var navArticles	= $(document.createElement("span")).addClass("articles").html(articles);

	navItem.append(navArticles);

	libreobjet.commande.panierNavigationItem = navItem;
	libreobjet.commande.panierNavigationArticles = navArticles;
    },

    initCommandeSteps : function(prop)
    {
	/*
	   On gère la sélection du pays
	*/

	var paysForm	= $("div.totalContainer form[name=updatePays]");
	var updateDiv	= $("div.update", paysForm);

	$("a", updateDiv).click
	(
	    function()
	    {
		paysForm.submit();
	    }
	);

	var f = function()
	{
	    var visible = false;

	    if ( $("div.other", paysForm).is(":visible") )
	    {
		var input = $("div.other input", paysForm).get(0);
		visible = (input.value && input.value != input.initialValue ? true : false);
	    }
	    else
	    {
		$("select", paysForm).each
		(
		    function()
		    {
			visible = visible || ($(this).val() != this.initialValue);
		    }
		);

		$("input:visible", paysForm).each
		(
		    function()
		    {
			visible = visible || (this.checked != this.initialChecked);
		    }
		);
	    }

	    updateDiv.toggle(visible);
	};

	$("div.other input", paysForm).each
	(
	    function()
	    {
		this.initialValue = $(this).val();	
	    }
	)
	.change(f).keyup(f).mouseup(f);

	$("div.chronopost input", paysForm).each
	(
	    function()
	    {
		this.initialChecked = $(this).get(0).checked;	
	    }
	)
	.click(f).change(f);

	$("select.pays", paysForm).each
	(
	    function()
	    {
		this.initialValue = $(this).val();
	    }
	)
	.change
	(
	    function()
	    {
		var value = $(this).val();

		$(this).nextAll("div.other").toggle(value == "other");
		$(this).nextAll("div.chronopost").toggle(value == "france");

		f();
	    }
	)
	.change();

	/*
	   On gère les champs quantité dans le panier
	*/

	$("table.panier td.quantity input.quantity").each
	(
	    function()
	    {
		this.initialValue = this.value;
		libreobjet.commande.createSpinButton
		(
		    this, 
		    function()
		    {
			var i = parseInt(this.value, 10) || 0;
			this.value = Math.max(i, 1);

			$(this).parent().next("div.update").css("visibility", this.value != this.initialValue ? "visible" : "hidden");
		    }
		);
	    }
	);

	$("table.panier td.quantity div.update a").click
	(
	    function()
	    {
		var form = $(this).parents("form");
		if ( $("input", form).val() <= 0 )
		{
		    alert(__("La quantité doit être strictement positive"));
		}
		else
		{
		    form.submit(); 
		}
	    }
	);

	/*
	   On gère la validation de la partie panier
	*/

	$("div.totalContainer div.buttons a.valider").click
	(
	    function(e)
	    {
		var nbVisible = 0;
		$("#view-" + prop.viewId + " div.update:visible").each
		(
		    function()
		    {
			nbVisible += $(this).css("visibility") == "visible" ? 1 : 0;
		    }
		);

		if ( nbVisible > 0 )
		{
		    if ( !confirm(__("Certaines informations de votre panier n'ont pas été mises à jour.\nVoulez-vous continuer ?")) )
		    {
			e.preventDefault();
		    }
		}
	    }
	);

	/*
	   On gère la validation de la partie livraison
	*/

	$("div.livraison div.buttons a.valider").click
	(
	    function()
	    {
		var form	= $(this).parents("form").get(0);
		var prefix	= prop.pluginInstanceCode + ".";
		var facturation	= $("div.field.adresseFacturation input", form).is(":checked");

		if 
		( 
		    // info
		    wisy.form.checkMandatoryFields(form, ["prenom", "nom", "email"], prefix) &&
		    // livraison
		    wisy.form.checkMandatoryFields(form, ["nomLivraison", "adresse1Livraison", "codePostalLivraison", "villeLivraison"], prefix) &&
		    // livraison
		    (
			!facturation || 
			wisy.form.checkMandatoryFields(form, ["nomFacturation", "adresse1Facturation", "codePostalFacturation", "villeFacturation", "paysFacturation"], prefix)
		    ) &&
		    // email
		    wisy.form.checkEmailFields(form, ["email"], prefix)
		)
		{
		    form.submit();
		}
	    }
	);

	/*
	   On gère l'affichage des champs de l'adresse de facturation
	*/

	$("div.livraison div.fields.facturation div.field.adresseFacturation input")
	.change
	(
	    function()
	    {
		$("div.livraison div.fields.facturation div.field").not($(this).parent()).toggle(this.checked);
	    }
	)
	.click 
	(
	    function()
	    {
		$(this).change();
	    }
	)
	.change();


	/*
	   On gère la validation de la partie paiement
	*/
	$("div.paiement div.buttons a.valider").click
	(
	    function()
	    {
		$(this).hide().next("span.loading").show();
		libreobjet.commande.loadPaiementForm
		(
		    $(this).parents("div.carteContainer").find("div.paiementForm"),
		    wisy.toURL(prop.page), prop.pluginInstanceCode, 
		    function()
		    {
			$(this).show().next("span.loading").hide();	
		    }
		    .bind(this)
		);
	    }
	);
    },

    updateNbArticles : function()
    {
	this.panierNavigationArticles.load(this.libraryURL + "libreobjet/plugin/commande/ajax_nbArticles.php");
    },

    addLigne : function(parameters)
    {
	libreobjet.commande.overlay.open
	(
	    this.libraryURL + "libreobjet/plugin/commande/ajax_addLigne.php", parameters,
	    function(contentContainer)
	    {
		// on met à jour le bouton close
		$("a.button.close", contentContainer).click
		(
		    function()
		    {
			libreobjet.commande.overlay.close();
		    }
		);

		$("a.button.basket", contentContainer).attr("href", this.panierNavigationItem.attr("href"));

		// on met à jour le nombre d'articles 
		this.updateNbArticles();
	    }
	    .bind(this)
	);
    },

    createSpinButton : function(input, onchange)
    {
	var pos	    = $(input).position();
	var width   = $(input).outerWidth(true);
	var height  = $(input).outerHeight(false);

	var container = $(input).wrap('<span class="spinButton"></span>');

	var up = $(document.createElement("a")).attr("href", "#").addClass('up').html("<span>up</span>")
	.css
	(
	    {
		left    : pos.left + width,
		top	: pos.top
	    }
	)
	.click
	(
	    function(e)
	    {
		e.preventDefault();

		input.value++;
		$(input).change();
	    }
	);
	
	container.after(up);

	var down = $(document.createElement("a")).attr("href", "#").addClass('down').html("<span>down</span>")
	.css
	(
	    {
		left    : pos.left + width,
		top	: pos.top + height - up.outerHeight()
	    }
	)
	.click
	(
	    function(e)
	    {
		e.preventDefault();

		input.value--;
		$(input).change();
	    }

	);
	
	container.after(down);

	onchange = onchange || function()
	{
	    var i = parseInt(this.value, 10) || 0;
	    this.value = Math.max(i, 1);
	};
	
	container.change(onchange);
    },

    loadPaiementForm : function(container, pageURL, pluginInstanceCode, callbackOnFail)
    {
	container.load
	(
	    this.libraryURL + "libreobjet/plugin/commande/ajax_paiement.php", {"panier.pageURL":pageURL, "panier.pluginInstanceCode":pluginInstanceCode},
	    function()
	    {
		var form = $(this).find("form").get(0);
		if ( !form )
		{
		    if ( callbackOnFail )
		    {
			callbackOnFail();
		    }

		    return;
		}
		else
		{
		    form.submit();
		}
	    }
	);
    }
};

libreobjet.commande.overlay =
{
    open : function(url, parameters, callback)
    {
	this.show();

	$("#overlayContent").load
	(
	    url, parameters, 
	    function()
	    {
		this._adjustHeight();

		// on appelle la callback
		callback($("#overlayContent"));
	    }
	    .bind(this)
	);
    },

    close : function()
    {
	this.hide();
    },

    show  : function()
    {
	if ( $("#overlayBackground").is(":visible") )
	{
	    return;
	}

	var b = $("body");
	var d = $("html");

	// on enregistre tout d'abord l'état du body et du html
	this.bodyCSS	    = this._saveCSS(b);
	this.documentScroll = d.scrollTop();
	this.documentCSS    = this._saveCSS(d);

	// on initialise le body et le html
	d.add(b).css
	({
	    margin	: 0,
	    padding	: 0,
	    width	: "100%",
	    height	: "100%"
	});

	$("#overlayBackground").css("opacity", 1).add("#overlayContainer").fadeIn(500);
	$("#overlayContent").height(0).html("<p>Chargement ...</p>").css("overflow", "hidden").height($("#overlayContent").get(0).scrollHeight);
	this._center();
    },

    hide : function()
    {
	if ( !$("#overlayBackground").is(":visible") )
	{
	    return;
	}

	this._restoreCSS($("body"), this.bodyCSS);
	this._restoreCSS($("html"), this.documentCSS);

	$("#overlayContent").empty();
	$("#overlayBackground").css("opacity", 1).add("#overlayContainer").fadeOut(500);
    },

    _adjustHeight : function()
    {
	$("#overlayContent").css("visibility", "hidden");

	$("#overlayContainer")
	.wait
	(
	    0, 
	    function()
	    {
		$("#overlayContent").animate
		(
		    {
			height : $("#overlayContent").get(0).scrollHeight		    
		    },

		    {
			step : this._center.bind(this),
			complete : function()
			{
			    $("#overlayContent").css("visibility", "visible").css("overflow", "auto");
			    $("#overlayBackground").css("opacity", 0.9);
			}
		    }
		);
	    }
	    .bind(this)
	);
    },

    _center : function()
    {
	if ( !$("#overlayBackground").is(":visible") )
	{
	    return;
	}

	$("#overlay").css("margin-top", Math.max(10, $("html").height()/2 - $("#overlay").outerHeight()/2 + $("html").scrollTop()));
    },

    _saveCSS : function(e)
    {
	var p = {};
	p.width		= e.css("width");
	p.height	= e.css("height");
	p.margin	= e.css("margin");
	p.padding	= e.css("padding");

	return p;
    },

    _restoreCSS : function(e, c)
    {
	e.css(c);
    }
};
