
var App;
if (!App) App = {};
var Init;
if (!Init) Init = {};
var Options;
if (!Options) Options = {};

App = {
	
    'Stats' : null,
    'ie' : false,
    'ieVersion' : 0,
    'ie6' : false,
    'ie7' : false,
    'ie8' : false,
    'ie9' : false,

    'init' : function() {
		
        App.detectIE();
		
        $("input.hint, textarea.hint").hint();
		
        Init.PrinterSelect("form#printerSelect");
		
        Init.Cart("#module_cart");
		
        Init.Cartridge("#module_cartridges.view");
		
        Init.CartridgeBlock("div.cartridge-block");
		
        Init.Contact("#contactForm");
		
        $(".flashEmail").flash({
            src:'/statics/flash/email_'+App.lang+'.swf',
            'width':190,
            'height':18
        });
		
        $('a.lightbox').click(function(){
            //App.Stats.event("Navigation", "Photo", "Agrandir Photo");
            }).lightBox({
            imageBtnPrev:			'/statics/img/lightbox-btn-prev_'+App.lang+'.gif',
            imageBtnNext:			'/statics/img/lightbox-btn-next_'+App.lang+'.gif',
            imageBtnClose:			'/statics/img/lightbox-btn-close_'+App.lang+'.gif',
            txtOf:					((App.lang == "en") ? 'of':'de')
        });
		
		
        Init.AddToCart($(".view .product-fullspan form.addCart"),function(data) {
            if(data.item && data.item.quantity) {
                if(data.item.quantity < 2) {
                    $(".product-specialmsg .first").show();
                    $(".product-specialmsg .second").hide();
                } else {
                    $(".product-specialmsg .first").hide();
                    $(".product-specialmsg .second").show();
                }
            }
            $(".view .product-fullspan form.addCart input.submit").val((App.lang == "en") ? "Add":"Ajouter");
        },function(error) {
            $(".view .product-fullspan form.addCart").prepend("<div class='error'>"+data.error+"</div>");
            $(".view .product-fullspan form.addCart input.submit").val((App.lang == "en") ? "Add":"Ajouter");
        });
		
        $(".view .product-fullspan form.addCart").submit(function(e) {
            e.preventDefault();
            $(".view .product-fullspan form.addCart input.submit").val((App.lang == "en") ? "Adding...":"Ajout...");
        });
		
		
        Init.Submission("#module_account.submissions");
		
        $("img.qtip-img-big").each(function() {
            if($(this).attr("rel")) {
                Init.ImagePreview($(this));
            }
        });
		
		
    },
	
    'detectIE' : function() {
        if ($.browser.msie) {
            App.ie = true;
            App.ieVersion = parseInt($.browser.version.substr(0,1));
            if(App.ieVersion == 6) {
                App.ie6 = true;
            }
            if(App.ieVersion == 7) {
                App.ie7 = true;
            }
            if(App.ieVersion == 8) {
                App.ie8 = true;
            }
            if(App.ieVersion == 9) {
                App.ie9 = true;
            }
        }
    }
	
};

$(App.init);

/*********************************************
 *
 * Quick Init
 *
 **********************************************/

var FlashMessage = function(message) {
  
	
    var $el = null;
    var self = this;
	
    this.updatePosition = function() {
        var windowWidth = $(window).width();
        var width = $el.outerWidth();
		
        var left = Math.round((windowWidth - width) / 2);
        $el.css("left",left+"px");
    }
	
    this.show = function() {
        self.updatePosition();
        $el.fadeIn("slow");
    }
	
    this.close = function() {
        $el.fadeOut("slow");
    }
	
    this.destroy = function() {
        self.close();
        $el.remove();
    }
	
    $el = $("<div class='flash'>"+message+"</div>");
    $("body").append($el);
    self.show();
	
}


Init.Submission = function(selector) {

    var $el = $(selector);
    if(!$el.length) {
        return;
    }
	
    new Init.ItemsSelector($el.find("#printers"),{
        "itemsName" : "printers",
        /*"autocomplete" : "/ajax/printers.json?hascartridge=true",*/
        "autocomplete" : "/ajax/printers.json?",
        "label" : function(data) {
            return data.brand+" "+data.model;
        },
        "id" : "prid",
        'addItem' : function(value,text) {
			
            var self = this;
            var $itemCount = 0;
            var $list = self.$el.find(".results ul.list:eq(0)");
			
            $list.find("li.noresult").hide();
            var item = $list.find("li.tmpl").clone();
            item.append("<input type='hidden' name='"+self._opts.itemsName+"[]' value='"+value+"' />");
            item.append("<input type='hidden' name='"+self._opts.itemsName+"_label[]' value='"+text+"' />");
            item.children("span").text(text);
            item.find(".icons a.rem").click(function(e) {
                e.preventDefault();
                $(this).parent().parent().remove();
                if(!$list.find("li.item").length) {
                    $list.find("li.noresult").show();
                }
            });
            $list.append(item.removeClass("tmpl").addClass("item").show());
            self.$el.find("input.search").val(self.$el.find("input.search").attr("title"));
			
        /*$.getJSON("/ajax/cartridges.json?actualPrice=true&prid="+value,function(data) {
				$list.unblock();
				$list.find("li.noresult").hide();
				var item = $list.find("li.tmpl").clone();
				item.append("<input type='hidden' name='"+self._opts.itemsName+"[]' value='"+value+"' />");
				item.append("<input type='hidden' name='"+self._opts.itemsName+"_label[]' value='"+text+"' />");
				item.children("span").text(text);
				item.find(".icons a.rem").click(function(e) {
					e.preventDefault();
					$(this).parent().parent().remove();
					if(!$list.find("li.item").length) { $list.find("li.noresult").show(); }
				});
				item.append("<ul class='list cartridges'></ul>");
				
				function updatePrice() {
						
					var total = 0;
					
					$el.find("#items div.item").each(function() {
						var data = $.evalJSON(unescape($(this).find("input.data").val()));
						total += data.actualPrice;
					});
					$el.find("#totalPrice").html(total.toFixed(2)+"$");
				}
				
				function removeCartridge(iid) {
					$el.find("#items .i"+iid).remove();
					$el.find("#printers .results ul.list ul.list input.i"+iid).removeAttr("checked");
					if(!$el.find("#items .item").length) { $el.find("#items .noresult").show(); }
					updatePrice();
				}
				
				function addCartridge(iid) {
					if(!$el.find("#items .i"+iid).length) {
						$.getJSON("/ajax/item.json?iid="+iid,function(data) {
							var item = "<div class='item i"+iid+" rel='"+iid+"'>";
							item += "<input type='hidden' name='items[]' value='"+iid+"' />";
							item += "<input type='hidden' class='data' value='"+escape($.toJSON(data))+"' />";
							item += "<div class='fright'><a href='#' class='rem'><img src='/statics/icons/cancel.png' /></a></div>";
							item += "<div class='fright actualprice'>"+data.actualPrice.toFixed(2)+" $</div>";
							item += "<img src='/statics/icons/color_swatch.png' /> "+data.name_fr;
							item += "</div>";
							item = $(item);
							$el.find("#items").append(item);
							$(item).find("a.rem").click(function(e) {
								e.preventDefault();
								removeCartridge($(this).parents("div.item").eq(0).attr("rel"));
							});
							$el.find("#items .noresult").hide();
							updatePrice();
						});
					}
				}
				
				$.each(data,function() {
					var li =$("<li><input type='checkbox' rel='"+this.iid+"' class='i"+this.iid+"'> "+this.name_fr+" ("+this.actualPrice.toFixed(2)+" $)</li>");
					li.find("input[type=checkbox]").click(function() {
						if($(this).is(":checked")) {
							addCartridge($(this).attr("rel"));
						} else {
							removeCartridge($(this).attr("rel"));
						}
					});
					item.find("ul.list").append(li);
				});
				
				$list.append(item.removeClass("tmpl").addClass("item").show());
				self.$el.find("input.search").val(self.$el.find("input.search").attr("title"));
			});*/
			
			
        }
    });

};

Init.ImagePreview = function(selector) {
	
    var $el = $(selector);
    if(!$el.length) {
        return;
    }
	
    $el.qtip({
        content: "<img src='"+$el.attr("rel")+"' />",
        position: {
            corner: {
                target: 'rightMiddle', // Position the tooltip above the link
                tooltip: 'leftMiddle'
            },
            adjust: {
                screen: false // Keep the tooltip on-screen at all times
            }
        },
        show: {
            when: 'mouseover',
            solo: true // Only show one tooltip at a time
        },
        hide: 'mouseout',
        style: {
            tip: true, // Apply a speech bubble tip to the tooltip at the designated tooltip corner
            border: {
                width: 0,
                radius: 4
            },
            name: 'light', // Use the default light style
            width : 400,
            textAlign: 'center'
        }
    });
	
};

//The cartridge block is the div that contains the cartidge image, price and the dynamic add-to-cart behavoir.
Init.CartridgeBlock = function(selector) {

    var $el = $(selector);
    if(!$el.length) {
        return;
    }
	
    var unclicked = true; //This var is a flag indicating that an item has been clicked.  IT is true until the first click.

    //The add-to-cart icon event listener.
    //Display the loading icon and calls the function which makes the ajax call and adds item to cart.
    $el.find(".price-listing tr a.cart").click(function(e) {

        e.preventDefault();
        var $row = $(this).parents("tr").eq(0);
        var $product = $(this).parents("div.product-fullspan").eq(0);
        var displaynone = $row.next("tr.add-item").css("display")=="none";

        //If the add-item row has a display of none, or is not visible, then display it.
        if(displaynone || !($row.next("tr.add-item").length && $row.next("tr.add-item").is(":visible")))
            var showAddItemForm = true;


        //If this clicked product already has the quantity form displayed
        //  if(!unclicked && $row.next("tr.add-item").length && $row.next("tr.add-item").is(":visible")) {
        if(!unclicked && !showAddItemForm) {
            $row.removeClass("clicked");
            $product.find(".price-listing tr").removeClass("unclicked");
            $product.find("tr.add-item").fadeOut("fast");
            if(!$product.find(".clicked").length) {
                $product.find("tr:eq(0)").addClass("clicked");
            }
        } else {
            //the clicked product does not have the quantity form displayed.

            unclicked = false;
            //Set all rows in this product div to unclicked.
            $product.find(".price-listing tr").removeClass("clicked").addClass("unclicked");
            //Set the clicked row to clicked.
            $row.removeClass("unclicked").addClass("clicked");
            //Chnage the form item id to the id of the row that was clicked.
            $product.find("tr.add-item input[name=iid]").val($row.attr("rel"));
            //Move the form row below the clicked row, and remove the unclicked class, which was added a couple lines above.
            $row.after($product.find("tr.add-item").removeClass("unclicked"));

            var $form = $product.find("tr.add-item form.addCart");
            //$product.find("tr.add-item").show("fast");
            if(App.ie8 ) {
                $product.find("tr.add-item").css("display","block");
            }
            else if(App.ie9) {
                $product.find("tr.add-item").css("display","block");
            }
            else {
                $product.find("tr.add-item").fadeIn("fast");
            }
			
            $form.submit();

        }
    });
	
    $el.find("form.addCart").submit(function(e) {

        if(window.location.hostname.indexOf("monencre.ca") >= 0) {
            $(this).unbind('submit');
            $(this).attr("action",'http://cartouchescertifiees.com' + $(this).attr("action"));
            $(this).submit();
            return;
        }
	
        e.preventDefault();
        $(this).find("div.success, div.error").remove();
        $(this).block({
            overlayCSS:{
                background:'#f0f0f0'
            }
        });

    });
	
    Init.AddToCart($el.find("form.addCart"),function(data) {

        //$(this).append("<div class='success'>L'item a été ajouté au panier</div>");
        $(this).unblock();
        $(this).find("input[name=prevQuantity]").val(data.item.quantity);
    },function(error) {
        $(this).append("<div class='error'>"+data.error+"</div>");
        $(this).unblock();
    });
	
    $el.find("form.addCart button.update").click(function(e) {

        e.preventDefault();
        var $form = $(this).parents("form.addCart");
        $form.block({
            overlayCSS:{
                background:'#f0f0f0'
            }
        });
		
        var iid = $form.find("input[name=iid]").val();
        var quantity = parseFloat($form.find("input[name=prevQuantity]").val())-1 + parseFloat($form.find("input[name=quantity]").val());
		
        $.post("/"+App.lang+"/cart/quantity.json","iid="+iid+"&quantity="+quantity,function(data) {
            $form.find("div.success, div.error").remove();
            $form.unblock();
            if(!data.error) {
                $(".cartCount").text(data.count);
                $form.append("<div class='success'>"+((App.lang == "en") ? "Quantity has been updated":"La quantité a été mise à jour")+"</div>");
            } else {
                $form.append("<div class='error'>"+data.error+"</div>");
            }
        },"json");
    });
	
    $el.find("form.addCart button.checkout").click(function(e) {

        e.preventDefault();
        window.location.href = "/"+App.lang+"/cart.html";
    });

    //Tabbed Div selector.
    //This function changes the image on th left side of the cartridge div to the cartridge title that the mouse is over.
    $el.find("table.price-listing tr:not(.add-item)").mouseover(function() {
        var $row = $(this);
        var $product = $(this).parents("div.product-fullspan").eq(0);
        $product.find(".price-listing tr").removeClass("clicked");
        $row.removeClass("unclicked").addClass("clicked");
        var price = $row.find(".item-price").text();
        var $dollars = price.substr(0,price.indexOf("."));
        var $cents = price.substr(price.indexOf(".")+1);
        if($dollars.length>4){
            $displayPrice = "<span style='font-size:22px;padding-top:24px;'>"+$dollars+"</span><sup><span class='comma'>,</span>"+$cents+"</sup>";
        }else if($dollars.length>2){
            $displayPrice = "<span style='font-size:28px;padding-top:22px;'>"+$dollars+"</span><sup><span class='comma'>,</span>"+$cents+"</sup>";
        }else{
            $displayPrice = $dollars+"<sup><span class='comma'>,</span>"+$cents+"</sup>";
        }

        $product.find("span.price").html($displayPrice);
        $product.find(".cartridge-main-photo").html($row.find(".cartridge-photo").html());
        Init.ImagePreview($product.find(".cartridge-main-photo .qtip-img-big"));
		
    });

};

Init.Cartridge = function(selector,success,error) {
	
    var $el = $(selector);
    if(!$el.length) {
        return;
    }
};
//This is the function that makes the ajax request to add a item to the cart
Init.AddToCart = function(selector,success,error) {

    var $el = $(selector);
    if(!$el.length) {
        return;
    }
	
    if(!success || typeof success != "function") {
        success = function(data){};
    }
    if(!error || typeof error != "function") {
        error = function(data){};
    }
	
    $el.submit(function(e) {
        if(window.location.hostname.indexOf("cartouchescertifiees.com") == -1) {
            $(this).unbind('submit');
            $(this).attr("action",'http://cartouchescertifiees.com' + $(this).attr("action"));
            $(this).submit();
            return;
        }
		
        e.preventDefault();
		
        var $form = $(this);
		
        $.post("/"+App.lang+"/cart/add.json",$(this).serialize(),function(data) {
            $el.find("div.success, div.error").remove();
            if(!data.error) {
                //Display message.
                var msg = (App.lang == "en") ? "The item has been added to your cart! <a href='/"+App.lang+"/cart.html'>Go to your shopping cart</a>":"L'item a été ajouté au panier! <a href='/"+App.lang+"/cart.html'>Voir le panier</a>";
                var flash = new FlashMessage(msg);
                //Destroy the flash message after 2 seconds.
                window.setTimeout(function() {
                    flash.destroy();
                },2000);
                $(".cartCount").text(data.count);
                success.call($form,data);
            } else {
                error.call($form,data.error);
            }
        },"json");
		
    });

};

Init.AjaxLogin = function(selector,success,error) {
	
    var $el = $(selector);
    if(!$el.length) {
        return;
    }
	
    if(!success || typeof success != "function") {
        success = function(data){};
    };
    if(!error || typeof error != "function") {
        error = function(data){};
    }
	
    $el.submit(function(e) {
		
        e.preventDefault();
        $.post("/"+App.lang+"/login.json",$(this).serialize(),function(data) {
            if(!data.error) {
                success(data);
            } else {
                error(data.error);
            }
        },"json");
		
    });

};

Init.AjaxLogout = function(selector,success) {
	
    var $el = $(selector);
    if(!$el.length) {
        return;
    }
	
    if(!success || typeof success != "function") {
        success = function(data){};
    }
	
    $el.click(function(e) {
		
        e.preventDefault();
		
        $.getJSON("/"+App.lang+"/logout.json",function(data) {
            if(data.success) {
                success();
            }
        });
		
    });

};



Init.Cart = function(selector) {
	
    var $el = $(selector);
    if(!$el.length) {
        return;
    }
    $("cartPurchaseForm").validate();

    function refreshPrice(data) {
		
        $(".cartCount").text(data.count);

        $el.find(".prices .subTotal").text(parseFloat(data.subTotal).toFixed(2)+" $");
        $el.find(".prices .discount").text("-"+parseFloat(data.discount).toFixed(2)+" $");
        $el.find(".prices .shipping").html((parseFloat(data.shipping) > 0) ? (parseFloat(data.shipping).toFixed(2)+" $"):"<strong class='cgreen'>"+((App.lang == "en") ? "Free":"Gratuit")+"</strong>");

        if(data.pickup){
            $el.find(".prices .pickupNotice").show();
            $el.find(".prices .freeShipping").hide();
            $el.find(".prices .freeShippingRemain").hide();
        } else if(parseFloat(data.shipping) == 0 && !data.moreThanCartridges ) {
            $el.find(".prices .freeShipping").show();
            $el.find(".prices .freeShippingRemain").hide();
            $el.find(".prices .pickupNotice").hide();
        } else if(!data.moreThanCartridges) {
            $el.find(".prices .freeShipping").hide();
            $el.find(".prices .freeShippingRemain .amount").text((100-parseFloat(data.subTotal)).toFixed(2)+" $");
            $el.find(".prices .freeShippingRemain").show();
            $el.find(".prices .pickupNotice").hide();
        } else {
            $el.find(".prices .freeShipping").hide();
            $el.find(".prices .freeShippingRemain").hide();
            $el.find(".prices .pickupNotice").hide();
        }

        if(data.total==0){
            $el.find(".paymentType .freepay").show();
            $el.find(".paymentType .freepay input").attr("checked","checked");
            $el.find("input[type=submit,class=freepay]").val((App.lang == 'en') ? "Send the order":"Envoyer la commande").show("input[type=submit,class=freepay]");
            $el.find(".paymentType .paypalpay").hide();
            $el.find(".paymentType .mastercardpay").hide();
            $el.find(".paymentType .visapay").hide();
            $el.find(".paymentType .30days").hide();
            
        
        }else{
            $el.find(".paymentType .freepay").hide();
            $el.find(".paymentType .paypalpay").show();
            $el.find(".paymentType .mastercardpay").show();
            $el.find(".paymentType .visapay").show();

        }


        $el.find(".prices .total").text(parseFloat(data.total).toFixed(2)+" $");
        $el.find(".prices .taxes").html("");
        jQuery.each(data.taxes,function(k,v) {
            $el.find(".prices .taxes").append("<span class='tax' rel='"+k+"'><b>"+v.name+"</b> ("+v.percent_display+" %): <span class='amount'>"+parseFloat(v.tax).toFixed(2)+" $</span></span><br />");
        });
	
    }
	
	
    function showNoItem() {
        var msg = (App.lang == "en") ? "No item in your cart":"Aucun item pour le moment.";
        $el.find(".items table tbody").html('<tr><td colspan="7" align="center"><center><i>'+msg+'</i></center></td></tr>');
        $el.find(".buttons button.clear, .buttons button.checkout").attr("disabled","disabled");
    }
	
    function cleanMessages() {
        $el.find("div.success, div.error, div.notice").remove();
    }

    //POSTAL CODE TAX CALCULATION
    
    //Set all postal code shipping form fields to the same value.
    function setAllShippingPostalCodeFields(postalcode){
        $el.find("form.postalCode input[type=text]").val(postalcode);
        $el.find("table.shipping input[name=shipping_postalcode]").val(postalcode);
    }

    //Get the tax rate for given postal code, update prices in cart.
    function getTaxRate(postalcode){
        $.post("/"+App.lang+"/cart/postalcode.json","postalcode="+postalcode,function(data) {
            if(!data.error) {
                jQuery.each(data.items,function() {
                    $el.find("tr#item_"+this.iid+" input.data").val(escape($.toJSON(this)));
                });
                refreshPrice(data);

            } else {
                alert(data.error);
            }
        },"json");
    }

    //Quick Shipping Cost Postal Code Form
    //Update les taxes et le shipping avec le code postal
    $el.find("form.postalCode").submit(function(e) {
        e.preventDefault();
        //Get input postal code
        var postalcode = $el.find("form.postalCode input[name=postalcode]").val();
        //Change the button text to "Loading"
        $el.find("form.postalCode input[type=submit]").val((App.lang == "en") ? "Loading...":"Chargement...");
        setAllShippingPostalCodeFields(postalcode);
        getTaxRate(postalcode);
        //Change button text back to "go"
        $el.find("form.postalCode input[type=submit]").val("go");

    });

    //Shipping Form Postal Code
    //If the user changes the postal code in the shipping form, update the postal code, update the taxes.
    $el.find("input[name=shipping_postalcode]").blur(function(e){
        e.preventDefault();
        //Get input postal code
        var postalcode = $el.find("table.shipping input[name=shipping_postalcode]").val();
        setAllShippingPostalCodeFields(postalcode);
        getTaxRate(postalcode);
    });

    //HIDE AND SHOW PAYMENT BUTTON
    //payment button appear
   //If a
    var paymentType = $el.find(".paymentType");
    var paymentTypeInputs = $(paymentType).find("input[type=radio]");

    $(paymentTypeInputs).each(function(){
        if($(this).attr("checked")){
            $el.find(".submit_pay").show();
            return;
        }
    });

    $el.find("input[type=submit,class=freepay]").hide();//not exactly sure way this is here...

    $el.find(".paymentType").click(function(){
        $el.find(".submit_pay").fadeIn("fast");
    });


    //Find the promo code, update the cart with the rebate.
    $el.find("form.promoCode").submit(function(e) {
        e.preventDefault();
        //Display Loading Message.
        //$el.find("form.promoCode").fadeOut("fast");
        $el.find("form.promoCode input[type=submit]").val((App.lang == "en") ? "Loading...":"Chargement...");
        $.post("/"+App.lang+"/cart/getpromocode.json",$(this).serialize(),function(data) {
            $el.find("form.promoCode input[type=submit]").val("go");
            if(!data.error) {
                if(data.rebate["message"]!== undefined)
                    alert(data.rebate["message"]);
                jQuery.each(data.items,function() {
                    $el.find("tr#item_"+this.iid+" input.data").val(escape($.toJSON(this)));
                });
                refreshPrice(data);
            } else {
                alert(data.error);
            }
        },"json");
    });
	
    //Update le prix selon la quantité
    $el.find(".items .item input[name=quantity]").blur(function() {
		
        var $input = $(this);
        var $item = $input.parents(".item");
        var quantity = parseInt($input.val());
        var last_quantity = parseInt($input.attr("title"));
        var iid = parseInt($item.attr("rel"));
		
        cleanMessages();
		
        if(last_quantity != quantity) {
            $input.attr("disabled","disabled");
            $el.find(".items").block({
                centerY:false
            });
            $.post("/"+App.lang+"/cart/quantity.json","iid="+iid+"&quantity="+quantity,function(data) {
                $el.find(".items").unblock();
                if(!data.error) {
                    $input.val(data.item.quantity);
                    $item.find(".subtotal").text(parseFloat(data.item.subTotal).toFixed(2)+" $");
                    $item.find("input.data").val(escape($.toJSON(data.item)));
					
                    refreshPrice(data);
					
                } else {
                    alert(data.error);
                }
				
                $input.attr("disabled","").attr("title",$input.val());
				
            },"json");
        }
		
    });
	
	
    //Supprime un item
    $el.find(".items .item a.rem").click(function(e) {
		
        e.preventDefault();
		
        var $link = $(this);
        var $item = $link.parents(".item");
        var iid = parseInt($item.attr("rel"));
        var itemData = $.evalJSON(unescape($item .find("input.data").val()));
		
        cleanMessages();
		
        if(confirm((App.lang == "en") ? "Are you sure you want to remove this item from your cart?":"Voulez-vous vraiment supprimer cet item du panier d'achats ?")) {
            $el.find(".items").block({
                centerY:false
            });
			
            $.post("/"+App.lang+"/cart/remove.json","iid="+iid,function(data) {
                $el.find(".items").unblock();
                if(!data.error) {
                    //  App.Stats.event("Cart", "Remove", itemData.name_fr);
                    $item.remove();
                    refreshPrice(data);
					
                } else {
                //$item.fadeTo("fast",1);
                }
				
                if(!$el.find(".items .item").length && !$el.find(".items .noresult").length) {
                    showNoItem();
                }
				
            },'json');
        }
		
    });
	
    $el.find("input.update").click(function(e) {
        e.preventDefault();
        $.getJSON("/"+App.lang+"/cart/data.json",function(data) {
            refreshPrice(data);
        });
    });
	
    $el.find("input.shop").click(function(e) {
        e.preventDefault();
        window.location = "/";
    });
	
    $el.find("input.clear").click(function(e) {
        e.preventDefault();
        window.location = "/"+App.lang+"/cart/clear.html";
    });

    $el.find("input[type=checkbox].sameAsBilling").click(function(e) {
        if($(this).is(":checked")) {
            $el.find("label.localPickupSpan").fadeOut("fast");
            $el.find("table.shipping").eq(1).fadeOut("fast");
            $el.find("table.shipping input[name=shipping_companyname]").val($el.find("table.billing input[name=billing_companyname]").val());
            $el.find("table.shipping input[name=shipping_contactname]").val($el.find("table.billing input[name=billing_name]").val());
            $el.find("table.shipping input[name=shipping_door]").val($el.find("table.billing input[name=billing_door]").val());
            $el.find("table.shipping input[name=shipping_street]").val($el.find("table.billing input[name=billing_street]").val());
            $el.find("table.shipping input[name=shipping_suite]").val($el.find("table.billing input[name=billing_suite]").val());
            $el.find("table.shipping input[name=shipping_city]").val($el.find("table.billing input[name=billing_city]").val());
            $el.find("table.shipping select[name=shipping_region]").val($el.find("table.billing select[name=billing_region]").val());
            $el.find("table.shipping input[name=shipping_country]").val($el.find("table.billing input[name=billing_country]").val());
            $el.find("table.shipping input[name=shipping_postalcode]").val($el.find("table.billing input[name=billing_postalcode]").val());
            $el.find("table.shipping input[name=shipping_phone]").val($el.find("table.billing input[name=billing_phone]").val());

        } else if(!$el.find("input[type=checkbox].localPickup").is(":checked")) {
            $el.find("label.localPickupSpan").fadeIn("fast");
            $el.find("table.shipping").eq(1).fadeIn("fast");
        }
    });

    //If the user chooses to pickup purchase, hide all the shipping related form fields.
    $el.find("input[type=checkbox].localPickup").click(function(e) {
        if($(this).is(":checked")) {
            $el.find("table.shipping").eq(1).fadeOut("fast");
            $el.find("label.sameAsBillingSpan").fadeOut("fast");
            $el.find("form.postalCode").fadeOut("fast");
            $el.find("table.shipping input[name=shipping_postalcode]").val("");
            $el.find("form.postalCode input[type=text]").val("Postal Code");
        } else if(!$el.find("input[type=checkbox].sameAsBilling").is(":checked")) {
            $el.find("table.shipping").eq(1).fadeIn("fast");
            $el.find("label.sameAsBillingSpan").fadeIn("fast");
            $el.find("form.postalCode").fadeIn("fast");
        }
        $.post("/"+App.lang+"/cart/noshipping.json",$(this).serialize(),function(data) {
			
            if(!data.error) {

                jQuery.each(data.items,function() {
                    $el.find("tr#item_"+this.iid+" input.data").val(escape($.toJSON(this)));
                });
                refreshPrice(data);

            } else {
                alert(data.error);
            }
        },"json");
    });


	
    $el.find("form.login").submit(function() {
        $el.find("form.login").block();
    });
	
    Init.AjaxLogin($el.find("form.login"),function(data){
	
        $el.find("table.billing").unblock();
	
        $el.find("form.login div.error").remove();
		
        $el.find("form.login input.hint").hint("show");
		
        $el.find(".logoutBox").fadeIn("fast").find(".username").text(data.name);
		
        $el.find(".loginBox").fadeOut("fast");
        $el.find(".quickRegister").fadeOut("fast");
		
        $("#logo-login div.login .greetings a.name").text((data.name.length) ? data.name:data.email);
        $("#logo-login div.login .greetings").show();
        $("#logo-login div.login .form").hide();
	$el.find("table.billing input[name=billing_companyname]").val(data.company);
        $el.find("table.billing input[name=billing_name]").val(data.name);
        $el.find("table.billing input[name=billing_door]").val(data.door);
        $el.find("table.billing input[name=billing_street]").val(data.street);
        $el.find("table.billing input[name=billing_suite]").val(data.suite);
        $el.find("table.billing input[name=billing_city]").val(data.city);
        $el.find("table.billing input[name=billing_region]").val(data.region);
        $el.find("table.billing input[name=billing_country]").val(data.country);
        $el.find("table.billing input[name=billing_postalcode]").val(data.postalcode);
        $el.find("table.billing input[name=billing_phone]").val(data.phone);
        $el.find("table.billing input[name=billing_email]").val(data.email);
		
        $el.find("table.billing").fadeOut("fast");
		
        var badge = "<b>"+data.name+"</b><br />";

        badge += data.street+" "+((data.suite) ? ", Suite #"+data.suite:"")+"<br />";
        badge += ((data.city) ? data.city+", ":"")+((data.region) ? data.region+", ":"")+data.country+"<br />";
        badge += data.postalcode;
		
        $el.find("div.billingBadge .address").html(badge);
        $el.find("div.billingBadge").show();
		
        if(parseInt(data["30days"]) == 1) {
            $el.find(".paymentType .spacer").before('<p class="tcenter fleft 30days"><label name="30days">Net 30 jours<br/><input type="radio" name="payment_type" class="radio" value="30days"/></label></p>');
        } else {
            $el.find(".paymentType p.30days").remove();
        }
		
		
    },function(error) {
	
        $el.find("form.login").unblock();
		
        $el.find("form.login div.error").remove();
        $el.find("form.login").append("<div class='error' style='display:none;'>"+error+"</div>").find("div.error").fadeIn("fast");
    });
	
    $el.find("div.billingBadge a.edit").click(function(e) {
        e.preventDefault();
        $el.find("div.billingBadge .address").hide();
        $el.find("div.billingBadge a.edit").hide();
        $el.find("div.billingBadge a.cancel").show();
        $el.find("table.billing").fadeIn("fast");
    });
	
    $el.find("div.billingBadge a.cancel").click(function(e) {
        e.preventDefault();
        $el.find("div.billingBadge .address").show();
        $el.find("table.billing").fadeOut("fast");
        $el.find("div.billingBadge a.cancel").hide();
        $el.find("div.billingBadge a.edit").show();
    });
	
    $el.find("input[name=payment_type]").click(function(e) {
        if($(this).val() == "visa" || $(this).val() == "mastercard") {
            $el.find("div.credit").show("fast");
        } else {
            $el.find("div.credit").hide("fast");
        }

        if($(this).val() == "30days" || $(this).val() == "free") {
            $el.find("input[type=submit,class=freepay]").val((App.lang == 'en') ? "Send the order":"Envoyer la commande");
        } else {
            $el.find("input[type=submit,class=submit_pay]").val((App.lang == 'en') ? "Pay the order":"Payer la commande");
        }
    });
	
    $el.find("a.logout").click(function() {
        $el.find(".logoutBox").block();
    });
	
    Init.AjaxLogout("a.logout",function() {

        $el.find(".logoutBox").unblock();
        $el.find(".loginBox").fadeIn("fast");
        $el.find(".quickRegister").fadeIn("fast");
        $el.find(".logoutBox").fadeOut("fast").find(".username").text("");
        $el.find("div.billingBadge").hide();
        $el.find("table.billing").fadeIn("fast");
        $("#logo-login div.login .greetings").hide();
        $("#logo-login div.login .form").show();
        $el.find(".paymentType p.30days").remove();
    });
	
};

Init.PrinterSelect = function(selector) {
	
    var $el = $(selector);
    if(!$el.length) {
        return;
    }
	
    var selectBrand = $el.find(".brand select").ufd({
        skin:"plain",
        manualWidth: 308
    });
	
    var selectModel = $el.find(".model select").ufd({
        skin:"plain",
        manualWidth: 308
    });
	
    //If no brand has been selected, disable the select model.
    if($(selectBrand).val()==0){
        selectModel.ufd("disable");
    }else{
       //Grab the models for selected brand. 
       grabModelBrands();
    }
	
    selectBrand.bind("change",function(){grabModelBrands()});
    selectModel.bind("change",function() {
        $el.find(".ufd input").removeClass("error");
        $el.find(".submit").fadeTo("fast",0.3);
        $el.submit();
    });
	
    function grabModelBrands(){
        $el.find(".ufd input").removeClass("error");
	
        var brand = selectBrand.val();
        if(brand != "0") {
            selectModel.html("<option value='0'>"+((App.lang == "en") ? "Loading models...":"Chargement des modèles...")+"</option>").ufd("changeOptions").ufd("disable");
            $.getJSON("/ajax/printers.json?p=-1&hascartridge=true&prbid="+brand,function(data) {
                //modelLoadingStop();
                if(!data.length) {
                    selectModel.html("<option value='0'>"+((App.lang == "en") ? "No model":"Aucun modèle")+"</option>");
                    selectModel.ufd("changeOptions");
                    selectModel.ufd("disable");
                } else {
                    selectModel.html("<option value='0'>"+((App.lang == "en") ? "Select a model":"Sélectionnez un modèle")+"</option>");
                    $(data).each(function() {
                        selectModel.append("<option value='"+brand+"/"+this.permalink+"'>"+this.model+"</option>");
                    });
                    selectModel.ufd("changeOptions");
                    selectModel.ufd("enable");
                }
				
            });
        } else {
            selectModel.html("<option value='0'>"+((App.lang == "en") ? "Select a brand":"Sélectionnez une marque")+"</option>");
            selectModel.ufd("changeOptions");
            selectModel.ufd("disable");
        }
	
    }
	
    $el.submit(function(e) {
	
        e.preventDefault();
		
        $el.find(".ufd input").removeClass("error");
		
        if(selectBrand.val() == "0") {
            $el.find(".brand .ufd input").addClass("error");
            return;
        } else if(selectModel.val() == "0") {
            $el.find(".model .ufd input").addClass("error");
            return;
        }
		
        window.location = $(this).attr("action")+selectModel.val();
		
    });

};

Init.Contact = function(selector) {
	
    var el = $(selector);
    if(!el.length) {
        return;
    }
	
    el.find("form").submit(function(e) {
        e.preventDefault();
        var form = $(this);
        el.find("div.success").remove();
        el.find("div.error").remove();
        if(form.validate()) {
            form.block(Options.block_contact);
            $.post("/"+App.lang+"/contact.json",form.serialize(),function(data) {
                form.unblock();
                if(!data.error && data.success) {
                    // App.Stats.event("Contact", "Write", form.find("input[name=email]").val());
                    el.find("form").before("<div class='success' style='cursor:pointer;'>"+data.msg+"</div>");
                    el.find(".success").click(function() {
                        el.find(".success").remove();
                    });
                    form.find("textarea[name=message]").val("");
                    form.find("input[type=text]").each(function() {
                        $(this).val($(this).attr("title")).addClass("hasHint");
                    });
                } else {
                    el.find("form").before("<div class='error'>"+data.error+"</div>");
                }
            }, "json");
        }
    });

};

Init.ItemsSelector = function(selector,_opts) {

    // Options
    _opts = jQuery.extend({
        'itemsName': "items",
        "autocomplete" : "/admin/printers.json",
        "label" : "label",
        "id" : "id",
        "addTitle" : "Ajouter un item",
        "addPost" : "/admin/items/add.json",
        "addDialog" : "/admin/items/add.html #content",
        'addItem' : function(value,text) {
			
            var $list = $(this).find("ul.list:last");
			
            $list.find("li.noresult").hide();
            var item = $list.find("li.tmpl").clone();
            item.append("<input type='hidden' name='"+_opts.itemsName+"[]' value='"+value+"' />");
            item.append("<input type='hidden' name='"+_opts.itemsName+"_label[]' value='"+text+"' />");
            item.children("span").text(text);
            item.find(".icons a.rem").click(function(e) {
                e.preventDefault();
                $(this).parent().parent().remove();
                if(!$list.find("li.item").length) {
                    $list.find("li.noresult").show();
                }
            });
            $list.append(item.removeClass("tmpl").addClass("item").show());
            $(this).find("input.search").val($(this).find("input.search").attr("title"));
        }
    }, _opts);

    if(!$(selector).length) {
        return;
    }
    var $el = $(selector);
	
    this._opts = _opts;
    this.$el = $el;
    var self = this;
	
    function getID(data) {
        if(typeof _opts.id == "function") {
            return _opts.id(data);
        } else {
            return data[_opts.id];
        }
    }
	
    function getLabel(data) {
        if(typeof _opts.label == "function") {
            return _opts.label(data);
        } else {
            return data[_opts.label];
        }
    }
	
	
	
    new Autocomplete($el.find("input[type=text].search"),{
        "url" : _opts.autocomplete,
        "paramName" : "autocomplete",
        "method" : "GET",
        "waitDelay" : 100,
        "minChars" : 2,
        "format" : "json",
        "onLoading" : function() {
            $el.find(".searchResults .spinner").remove();
            if(!$el.find(".searchResults ul").length || $el.find(".searchResults ul li.noresult").length) {
                $el.find(".searchResults").show().html("<div align='center' class='spinner'><img src='/statics/img/loading_block.gif' /></div>");
            } else {
                $el.find(".searchResults ul").after("<div align='center' class='spinner'><img src='/statics/img/loading_block.gif' /></div>");
            }
        },
        "onEmpty" : function() {
            $el.find(".searchResults").html("").hide();
        },
        "onLoad" : function(data) {
            $el.find(".searchResults").show().html("<ul class='list "+_opts.itemsName+"'></ul>");
            if(data.length) {
                if(jQuery.trim($(this).val()).length) {
                    //data = data.slice(0,15);
                    if(data.length > 15) {
                        $el.find(".searchResults").css({
                            "overflow":"auto",
                            "height":"200px"
                        });
                    } else {
                        $el.find(".searchResults").css({
                            "overflow":"visible",
                            "height":"auto"
                        });
                    }
                    $(data).each(function() {
                        var item = "<span>"+getLabel(this)+"</span>";
                        item += '<input type="hidden" value="'+getID(this)+'" class="id" />';
                        item += '<input type="hidden" value="'+getLabel(this)+'" class="label" />';
                        $el.find(".searchResults ul").append("<li>"+item+"</li>");
                    });
                    $el.find(".searchResults ul li").click(function(e) {
                        _opts.addItem.call(self,$(this).find("input.id").val(),$(this).find("input.label").val());
                        $(this).remove();
                        if(!$el.find(".searchResults ul li").length) {
                            $el.find("input[type=text].search").val($el.find("input[type=text].search").attr("title"));
                            $el.find(".searchResults").html("").hide();
                        }
                    });
                } else {
                    $el.find(".searchResults").html("").hide();
                }
            } else {
                $el.find(".searchResults ul").append("<li class='noresult'>Aucun résultat</li>");
            }
        }
    });
	
    $el.find("a.new").click(function(e) {
        e.preventDefault();
        new AjaxFormDialog({
            "title" : _opts.addTitle,
            "postUrl" : _opts.addPost,
            "dialogUrl" : _opts.addDialog,
            "dialogOpts" : {  },
            "onSuccess" : function(data) {
                $(this).dialog("destroy");
                addItem.call($el,getID(data),getLabel(data));
            }
        });
    });
	
    $el.find("li.item .icons a.rem").click(function(e) {
        e.preventDefault();
		
        var $el = $(this).parents(selector);
		
        $(this).parent().parent().remove();
        if(!$el.find("ul.list li.item").length) {
            $el.find("ul.list li.noresult").show();
        }
    });
	
};


/*********************************************
 *
 * Google Analytics Object
 *
 **********************************************/

var Analytics = function(account) {

    var self = this;
	
    try {
        self.tracker = _gat._getTracker(account);
        self.account = account;
    } catch(err) {}
	
};

Analytics.prototype.tracker = null;
Analytics.prototype.account = null;

Analytics.prototype.setVar = function(visitor) {
    if(!this.tracker) {
        return;
    }
    try {
	
        this.tracker._setVar(visitor);
		
    } catch(err) {}
};

Analytics.prototype.track = function(page) {
    if(!this.tracker) {
        return;
    }
    try {
	
        if(!page) {
            this.tracker._trackPageview();
        }
        else{
            this.tracker._trackPageview(page);
        }
		
    } catch(err) {}
};

Analytics.prototype.event = function(cat,action,label) {
    if(!this.tracker) {
        return;
    }
    try {
	
        this.tracker._trackEvent(cat, action, label);
		
    } catch(err) {}
};


/*********************************************
 *
 * Common options
 *
 **********************************************/

Options = {

    "qtip_cart" : {
        content: '',
        hide: 'unfocus',
        style: {
            tip: 'topLeft',
            name: 'green'
        },
        prerender:true,
        position: {
            corner: {
                target: 'bottomLeft',
                tooltip: 'topLeft'
            }
        }
    }

};

/*********************************************
 *
 * Templates
 *
 **********************************************/

Templates = {

    "render" : function(text,values) {
        var re_cache = {};
        var tmpl = text.replace(/%7B/ig,'{').replace(/%7D/ig,'}');
        $.each(values, function(k,v) {
            tmpl = tmpl.replace( new RegExp('{'+k+'}', 'gm'), v );
        });
		
        return tmpl;

    }
};
