﻿Reflow.nissan = {

	lang: (typeof currentLanguage == "undefined") ? "en": currentLanguage,
	formCheck: (typeof formCheckUrl == "undefined" || formCheckUrl == null) ? "": formCheckUrl,
	
	pendingAlertManager: function() {
		/* ------------------------------------------------------------ */
		/* Delete Alert */
				
		/* Success in deleting pending alert */
		this.deletePendingAlertSuccess = function (data, success) {
			if(this.li !== null && data.error == false) {
				
				jQuery('.pending-alert-message').hide();

				this.li.fadeOut('slow', function(e) {
					jQuery(this).remove()
				});

				var nbAlert = parseInt(jQuery("#customer-data-box .update").html()) - 1;
				nbAlert = (nbAlert >= 0 ? nbAlert : 0);
				
				jQuery("#customer-data-box .update").html(nbAlert);
				jQuery("#pending-alert .title var").html(nbAlert);
				
				if(nbAlert == 0) {
					jQuery("#pending-alert .bt-clear-all").fadeOut('slow', function(e) {
						jQuery(this).remove();
					});
				}
			}
			else if (data.error == true) {
				jQuery('.pending-alert-message p').addClass("error").html(data.message);
				jQuery('.pending-alert-message').show();
			}
		};
				
		/* Success in deleting pending alert and redirect to url */
		this.deleteAndRedirectPendingAlertSuccess = function (data, success) {
			if(this.redirectUrl && this.redirectUrl != "") {
				window.location = this.redirectUrl;
				jQuery('.pending-alert-message p').addClass("error").html(Reflow.widgets.rsm.getText("pending-alert.redirect"));
				jQuery('.pending-alert-message').show();
			}
		};

		/* Success deleting all pending alert */
		this.deleteAllPendingAlertSuccess = function (data, success) {
			jQuery('.pending-alert-message').hide();
					
			jQuery('.alert-content ul').fadeOut('slow', function(e) {
				jQuery(this).remove()
			});
			
			jQuery("#customer-data-box .update").html("0");
			
			jQuery("#pending-alert .title var").html("0");
			
			jQuery("#pending-alert .bt-clear-all").fadeOut('slow', function(e) {
				jQuery(this).remove()
			});
		};
		
		/* Fail to deleting pending alert */
		this.deletePendingAlertFail = function (e) {
			jQuery('.pending-alert-message p').addClass("error").html(jQuery('#pending-alert').attr("data-message-error"));
			jQuery('.pending-alert-message').show();
		};
		
		/* Display waiting message */
		this.maskingContentPendingAlert = function (e) {
			jQuery('.pending-alert-message p').removeClass("error").html(jQuery('#pending-alert').attr("data-message-waiting"));
			jQuery('.pending-alert-message').show();
		};
		
		
		/* Delete one pending alert */
		this.deletePendingAlert = function (e) {
			e.preventDefault();
			var pendingAlertObject = e.data.that;
			var url = jQuery(this).attr('href');
			var redirectUrl = "";
			var fncSuccess = pendingAlertObject.deletePendingAlertSuccess;
			
			if(jQuery(this).hasClass("delete-all-alert")) {
				var fncSuccess = pendingAlertObject.deleteAllPendingAlertSuccess;
			}
			
			if(jQuery(this).hasClass("see-alert")) {
				url = jQuery(this).siblings(".delete-alert").attr('href');
				redirectUrl = jQuery(this).attr('href');
				var fncSuccess = pendingAlertObject.deleteAndRedirectPendingAlertSuccess;
			}
			
			
			jQuery.ajax({
				type: "GET",
				error : pendingAlertObject.deletePendingAlertFail,
				beforeSend : pendingAlertObject.maskingContentPendingAlert,
				success : fncSuccess,
				dataType : "json",
				url : url,
				pendingAlertObject : pendingAlertObject,
				li: jQuery(this).parent(),
				redirectUrl: redirectUrl
			});
			
		};
		

		/* ------------------------------------------------------------ */
		/* Roll over */
	
		this.timeoutID = -1;
		this.openingLink = null;
		
		this.hide = function () {
			jQuery("#pending-alert").fadeOut(100);
		};
		
		this.showHandler = function (e) {
			var pendingAlertObject = e.data.that;
			clearTimeout(pendingAlertObject.timeoutID);
			
			if (jQuery(this).hasClass("open-pending-alert")) {
				this.openingLink = jQuery(this);
			}

			var updatePicto = this.openingLink.find(".update");
			var updatePictoPosition = updatePicto.position();
			var customerDataBox = jQuery("#customer-data-box").position();

			jQuery("#pending-alert").css({left: (customerDataBox.left + updatePictoPosition.left + updatePicto.width() / 2 - 213), top: (updatePictoPosition.top + updatePicto.height())}).fadeIn(100);
		};
		
		this.hideHandler = function (e) {
			var that = e.data.that;
			that.timeoutID = setTimeout(that.hide, 500);
		};
		
		this.hideMessage = function (e) {
			jQuery(this).hide();
		};
		
		this.init = function () {
			if(jQuery("#pending-alert").length && jQuery(".open-pending-alert").length) {
				jQuery(".open-pending-alert").bind('mouseenter', {that : this}, this.showHandler);
				jQuery(".open-pending-alert").bind('mouseleave', {that : this}, this.hideHandler);

				jQuery("#pending-alert").bind('mouseenter', {that : this}, this.showHandler);
				jQuery("#pending-alert").bind('mouseleave', {that : this}, this.hideHandler);
				

				jQuery('#pending-alert .delete-alert, #pending-alert .delete-all-alert').bind('click', {that : this}, this.deletePendingAlert);
				jQuery('#pending-alert .see-alert').bind('click', {that : this, redirect : true}, this.deletePendingAlert);
				if(!jQuery('.pending-alert-message').length) {
					jQuery("#pending-alert .alert-content").append('<div class="pending-alert-message"><p></p></div>');
					jQuery('.pending-alert-message').hide().bind("click", this.hideMessage);
				}
			}
		};
	},
	
	/* Carousel */
	carouselArticleManager: function() {

		this.init = function () {
			if (jQuery('.carousel-other-articles').length) {
				jQuery('.carousel-other-articles .carousel').each(function(){
					var btNext = jQuery(this).siblings(".bt-next");
					var btPrevious = jQuery(this).siblings(".bt-prev");
					if (jQuery(this).find("> ul > li").length > 3 && typeof jQuery(this).jCarouselLite !== "undefined") {
						jQuery(this).jCarouselLite({
							visible: 3,
							speed: 800,
							btnNext: btNext,
							btnPrev: btPrevious
						});
					}
					else {
						btNext.hide();
						btPrevious.hide();
					}
				});
			}
		}
	},
	
	/* Carousel */
	carouselAfterSalesManager: function() {

		this.init = function () {
			if (jQuery('.after-sales-carousel, .bluetooth-config-carousel').length) {
				jQuery('.after-sales-carousel, .bluetooth-config-carousel').each(function(){
					if (jQuery(this).find("> ul > li").length > 1 && typeof jQuery(this).jCarouselLite !== "undefined") {
						var eltControler = "";
						for (i = 1; i <= jQuery(this).find("> ul > li").length; i++) {
							eltControler =  eltControler + "<li><a class=\"scroll-"+i+(i==1?" active":"")+"\"><span>"+i+"</span></a></li>";
						}
						
						jQuery(this).after("<ul class=\"controller\">"+eltControler+"</ul>");
					
						var btNext = jQuery(this).siblings(".bt-next");
						var btPrevious = jQuery(this).siblings(".bt-prev");
						var btControl = jQuery(this).siblings(".controller").find("a");
						jQuery(this).jCarouselLite({
							visible: 1,
							speed: 800,
							btnGo: btControl,
							btnNext: btNext,
							btnPrev: btPrevious,
							beforeStart: function (a) {
								btControl.removeClass("active");
							},
							afterEnd: function (a) {
								var cl = ".scroll-" + (parseInt(a.attr("class").replace(/^.*-([0-9]+)$/gi, "$1")) + 1);
								btControl.filter(cl).addClass("active");
							}
						});
					}
					else {
						jQuery(this).siblings(".bt-next, .bt-prev, .controller").hide();
					}
				});
			}
		}
	},
    
   carouselHome: function() {

		this.init = function () {
			if (jQuery('.home-carousel').length) {
					
				var nbSlide=jQuery('.home-carousel li').length;	//Combien de li
				
				jQuery(".pagination-carousel").append(nbSlide);
				
				jQuery('.home-carousel').each(function(){
					if (jQuery(this).find("> ul > li").length > 1 && typeof jQuery(this).jCarouselLite !== "undefined") {
						var eltControler = "";
						for (i = 1; i <= jQuery(this).find("> ul > li").length; i++) {
							eltControler =  eltControler + "<li><a class=\"scroll-"+i+(i==1?" active":"")+"\"><span>"+i+"</span></a></li>";
						}
						
						jQuery(".navigation-carousel-home").append("<ul class=\"controller\">"+eltControler+"</ul>");
					
						var btNext = jQuery(this).siblings(".bt-next");
						var btPrevious = jQuery(this).siblings(".bt-prev");
						var btControl = 	jQuery(".navigation-carousel-home .controller").find("a");
						jQuery(this).jCarouselLite({
							visible: 1,
							speed: 800,
							btnGo: btControl,
							btnNext: btNext,
							btnPrev: btPrevious,
							auto:true,					
							beforeStart: function (a) {
							btControl.removeClass("active");
							},
							afterEnd: function (a) {
								var nb = (parseInt(a.attr("class").replace(/^.*-([0-9]+)$/gi, "$1")) + 1),
									cl = ".scroll-" + nb;
								btControl.filter(cl).addClass("active");
								jQuery(".pagination-carousel span").html( nb );
								
							}
						});
					}
					else {
						jQuery(this).siblings(".bt-next, .bt-prev, .controller").hide();
					}
				});
			}
		}
	},
     
    	

    validateRegister: function validateRegister(arg) {
		var id = "";
		
		if (typeof arg === "string") {
			id = arg;
		}
		else {
			id = arg.id;
		}
		
        /** check form **/
        // validateur
        jQuery(id).validator({
            lang: Reflow.nissan.lang,
            // do not validate inputs when they are edited
            //errorInputEvent: null,
            effect: 'oneach',
            onBeforeValidate: function(e, els) {
                jQuery.each(els,
                function() {
                	if (jQuery(this).is(":not(:hidden)")) {
	                	if (jQuery(this).is("[data-label-associate]")) {
	                		
	                		jQuery("#" + jQuery(this).data("label-associate")).removeClass("error-field");
	                	}
	                    jQuery(this).closest("div").find("p.error").remove();
	                    jQuery(this).closest("div").removeClass("error-field");
	                    jQuery('label[for="' + jQuery(this).attr("id") + '"]').removeClass("error");
	                    jQuery(this).closest(".radio-list, .radio-list-wide").find("label, .label").removeClass("error");
	                 }
                });
            }
        }).submit(function(e) {
            var form = jQuery(this);
            // client-side validation OK.
            var formCheck = Reflow.nissan.formCheck;
             
              if(this.submitedOneTime == true) {
              	e.preventDefault();
              }
              
              if (!e.isDefaultPrevented()) {
            	  if (typeof arg === "object" && typeof arg.validCallback === "function") {
	              		arg.validCallback({e: e, form: form});
	              		e.preventDefault();
	              	}
	              	else {
	                  this.submitedOneTime = true;
	                  
	                  if(formCheck != "") {
		                  // submit with AJAX
		                  jQuery.ajax({
		                      // url de validation pour les champs
		                      url:formCheck + "?" + form.serialize() + "&rdm=" + Math.random() + ((formCheck.indexOf("?") != -1 || formCheck.indexOf(".html") != -1) ? "&ajax=1": "?ajax=1"),
		                      dataType: "json",
		                      async: false,
		                      success: function(json) {
		                          // everything is ok. (server returned true)
		                          if (json === true) {
		                              //let action of the form to be submitted "normally"  
		                              this.submitedOneTime = true;       
		                          } else {
		                              // server-side validation failed. use invalidate() to show errors
		                              form.data("validator").invalidate(json);
		                              // prevent default form submission logic
		                              e.preventDefault();
		                          }
		                      }
		                  });
	                  }
	              	}
              }
        	  
          });
    },
	
	fieldDispaly: function () {
		
		this.addRequired = function (elem) {
			
			elem.each(function () {
				
				if (jQuery(this).is(":not([required])")) {
					jQuery(this).attr("required", "required");
					jQuery("label[for=" + jQuery(this).attr("id") + "]").append(" *");
				}
				
			});
			
			
		};
		
		this.removeRequired = function (elem) {
			
			elem.each(function () {
				
				if (jQuery(this).is(":not([data-init-rqd])")) {
					jQuery(this).removeAttr("required");
					
					var labelTxt = jQuery("label[for=" + jQuery(this).attr("id") + "]").text();
					labelTxt = labelTxt.replace(" *", "");
					
					jQuery("label[for=" + jQuery(this).attr("id") + "]").text(labelTxt);
				}
				
			});
			
		};
		
		this.clickInput = function (el) {
			var pInput = jQuery(el).data("primary").split("|");
			for (i = 0; i < pInput.length; i ++) {
				pInput[i] = "#" + pInput[i];
			}
			pInput = jQuery(pInput.join(", "));
			
			if (el.is(":radio")) {
				
				if (el.data("primary-rqd") == true) {
					this.addRequired(pInput);
				}
				else{
					this.removeRequired(pInput);
				}
				
			}
			else if (el.is(":checkbox")) {
				
				if (el.is(":checked")) {
					if (el.is("[data-optout-rqd]")) {
						this.removeRequired(pInput);
					}
					else{
						this.addRequired(pInput);
					}
				}
				else{
					if (el.is("[data-optout-rqd]")) {
						this.addRequired(pInput);
					}
					else{
						this.removeRequired(pInput);
					}					
				}
				
			}
			
		};
		
		this.clickHandler = function (e) {
			var that = e.data.that;
			that.clickInput(jQuery(this));
		};
		
		this.hide = function (elem) {
			
			elem.hide().find("select, input, textarea").each(function(){
    			var field = jQuery(this);
    			
    			if (field.hasClass("radio-required")) {
    				field.attr("data-radio-required", "radio-required");
    				field.removeClass("radio-required");
    			}
    			if (field.is("[required]")) {
    				field.attr("data-required", field.attr("required"));
    				field.removeAttr("required");
    			}
    			if (field.is("[data-equals]")) {
    				field.attr("data-data-equals", field.attr("data-equals"));
    				field.removeAttr("data-equals");
    			}
    			
    			if (jQuery(this).is(":checked")) {
    				jQuery(this).removeAttr("checked");
    			}
    			
    		});
			
		};  
		
		this.show = function (elem) {
			var that = this;
			elem.show().find("select, input, textarea").each(function(){
    			var field = jQuery(this);

    			if (field.is("[data-radio-required]")) {
    				field.addClass("radio-required");
    			}
    			if (field.is("[data-required]")) {
    				field.attr("required", field.attr("data-required"));
    			}
    			if (field.is("[data-data-equals]")) {
    				field.attr("data-equals", field.attr("data-data-equals"));
    			}
    			
    			if (field.is("[data-primary]") && (field.is(":checked") || field.is(":checkbox"))){
    				that.clickInput(field);
    			}
    			
    		}).show();
			
		};
		
		this.toggle = function (el) {
			var id = el.data("secondary");

			if (el.val() == "") {
				
				if(jQuery("[data-secondary=" + id + "]").length > 1) {
					
					var empty = true;
					jQuery("[data-secondary=" + id + "]").each(function () {
						
						if (jQuery(this).val() !== "") {
							empty = false;
						}
						
					});
					
					if (empty == true) {
						this.hide(jQuery("#"+id));
						this.removeRequired(el);
					}
				}
				else{
					this.hide(jQuery("#"+id));
					this.removeRequired(el);	
				}
				
			}
			else{
				this.show(jQuery("#"+id));
			}
			
		};
		
		this.toggleHandler = function (e) {
			var that = e.data.that;
			that.toggle(jQuery(this));
		};
		
		this.init = function () {
			var that = this;
			
			jQuery("[data-primary]").each(function () {
				
				var pInput = jQuery(this).data("primary").split("|");
				for (i = 0; i < pInput.length; i ++) {
					
					if (jQuery("#" + pInput[i] ).is("[required]")) {
						jQuery("#" + pInput[i] ).attr("data-init-rqd", "required");
					}
				}
				
				jQuery(this).bind("click", {"that": that}, that.clickHandler);
				
			});
			
			jQuery("[data-secondary]").each(function () {
				
				jQuery(this).bind("keyup", {"that": that}, that.toggleHandler);
				that.toggle(jQuery(this));
				
			});
			
		};
		
	},
	
    initForms: function initForms(arg) {

    	var id = "";
			
    	if (typeof arg === "string") {
    		id = arg;
    	}
    	else {
    		id = arg.id;
    	}

		//add "required" on the checkbox's validate-fields attr
		jQuery('input[type="checkbox"]').each(function(i){
			var $that = jQuery(this);
			if($that.attr('value') == "optout"){
				if(!$that.data('validate-fields')){return false;}
				if($that.data('validate-fields').indexOf(',') > -1){
					return;
					
					//when data-fields = 'aaa,zzz,eee,rrr,ttt,yyy'
					//when data-fields = 'aaa,zzz, eee,rrr , ttt,yyy'
					
					/*
					var newData = $that.data('validate-fields');
					newData = "#" + newData.replace(' ', '');
					newData = newData.replace(',', ',#');
					//console.log(newData)
					jQuery(newData).attr('required', "required");
					*/
				}else{
					var newData = $that.data('validate-fields');
					jQuery("#" + newData).attr('required', "required");
				}
			}
		});
		
		(new Reflow.nissan.fieldDispaly()).init()
		
    	jQuery(id).find("[data-set-field]").bind("click", function(e){
    		var field = "#"+jQuery(this).data("set-field");
    		var value = ""+jQuery(this).data("set-value");
    		if(field != "#" && value != "" && typeof jQuery(field).val !== "undefined") {
    			jQuery(field).val(value);
    			if(jQuery(this).attr("type") !== "submit") {
    				jQuery(field).closest("form")[0].submit();
    			}
    			// Sinon, c'est la validation qui poste ou pas le form
    		}
    	});

        var api = jQuery(id).data("validator");
        //validator settings
        jQuery.tools.validator.fn("[data-equals]", "Value not equal with the \"<strong>$1</strong>\" field",
        function(input) {
            var name = input.attr("data-equals"),
            field = this.getInputs().filter('[name="' + name + '"]'),
            label = jQuery('label[for="' + name + '"]:eq(0)').html();
            
            return input.val() == field.val() ? true: [label];
        });
        // Validation type 
	    //	- au moins x champ requis
	    //	- de x à y champs requis
	    jQuery.tools.validator.fn("[data-x-required]",
			function(input) {
			    var groupName = input.data("x-required"),
			    	nbRequiredMin = 1,
			    	nbRequiredMax = 10000;
			    
			    if (groupName.indexOf("|") !== -1) {
			    	var groupNameSplit = groupName.split("|");
			    	nbRequiredMin = parseInt(groupNameSplit[1], 10);
			    	if (groupNameSplit.length > 2) {
			    		nbRequiredMax = parseInt(groupNameSplit[2], 10);
			    	}
			    }
			    var group = jQuery('[data-x-required="' + groupName + '"]');
			    
			    if (input.attr("type") === "checkbox" || input.attr("type") === "radio") {
			    	return (group.filter('input:checked').length >= nbRequiredMin && group.filter('input:checked').length <= nbRequiredMax);
			    }
			    else {
			    	
			    	var ok = false,
			    		i = 0;
			    	for (i = 0; i < group.length; i++) {
			    		var value = jQuery(group.get(i)).val();
			    		if (typeof value !== "undefined" && /^\s*$/.test(value) === false) {
			    			ok = true;
			    			break;
			    		}
			    	}
			    	
			    	return ok;
			    }
			}
	    );
	  
	  jQuery.tools.validator.fn("[data-group]", "Value not equal with the \"<strong>$1</strong>\" field",
     
      function(input) {
			
			if (jQuery(input).data("group") == "1") {
				var group1DataResult, group2DataResult; 
	            
		        group1DataResult=(input.val() !== ""); 
		       
		        group2DataResult=false; 
			   	
			   	jQuery("[data-group='2']").each(function(){ 
			
					if(jQuery(this).val() !== ""){
					
						group2DataResult=true; 
						
					}
				
			   	});
			   	
			  	 return group1DataResult || group2DataResult;	
			}
			else if (jQuery(input).data("group") == "2") {
				
				 var dataResult = true;
            
	            if (input.val() == "" && jQuery("[data-group='1']").val() == "") {
	            	
	            	dataResult = false;
	            	
	            }
	            else{
	            	dataResult = true;
	            }
	            
			  	 return dataResult;
				
			}
	
        });
	  	
	   // Date validator
		jQuery.tools.validator.fn("[data-date-required]", function(input, value) {
			
			var validDate = true;
			
			var group_members = input.parent().find("[data-date-required]");			
			
			var year = jQuery("[data-date-required=year]", input.parent()), month = jQuery("[data-date-required=month]", input.parent()), day = jQuery("[data-date-required=day]", input.parent());			
			
			var rangeStart = false;
			
			if (typeof year.data("range-start") !== "undefined") {
				rangeStart = new Date(parseInt(year.data("range-start"),10), "00", "01");
			}
			var rangeStop = new Date();
			if (typeof year.data("range-stop") !== "undefined") {
				var rangeStop = new Date(parseInt(year.data("range-stop"),10)+1, "00", "01");
			}
			
			if (year.val() !== "" && month.val() !== "" && day.val() !== "") {
				var monthChoice = parseInt(month.val(),10) - 1;
				var testDate = new Date(year.val(), monthChoice, day.val());
				
				if(testDate.getDate() != parseInt(day.val(),10) || testDate.getMonth() != monthChoice || testDate.getFullYear() !=  year.val()){
					validDate = false;
				}
				else{
					
					if ( testDate > rangeStop) {
						validDate = false;
					}
					else{
						if (rangeStart != false && rangeStart > testDate) {							
								validDate = false;							
						}
					}
				}
			}
			else{
				if (year.val() == "" && month.val() == "" && day.val() == "") {
					validDate = true;
				}
				else{
					validDate = false;
				}
			}
			
            return validDate;
			
		});

        // Radio validation
        jQuery.tools.validator.fn(".radio-required",
        function(input) {
            var name = input.attr("name");
            var group_members = jQuery('input:not(:hidden)[name=' + name + ']');
            var checked_count = jQuery('input:not(:hidden)[name=' + name + ']:checked').length;
            if ((checked_count == 0) && (group_members.first().attr('id') == input.attr('id'))) {
                jQuery('input:not(:hidden)[name=' + name + ']').click(function() {
                	jQuery(id).data("validator").reset(jQuery('input:not(:hidden)[name=' + name + ']'));
                });
                jQuery(id).data("validator").invalidate(jQuery(group_members.last()));
                return false;
            } else {
                return true;
            }
        });
        // checkbox group validation
        jQuery.tools.validator.fn(".checkbox-group-required",
        function(input) {
            var checked_count = jQuery('input.checkbox-group-required:checked').length;
            if (checked_count == 0) {                
                return false;
            } else {
                return true;
            }
        });
        // Au moins 1 de rempli
        jQuery.tools.validator.fn("[data-at-least-one]",
        function(input) {
        	var key = input.data("at-least-one"); 
        	var checked_count = 0;
        	if (input.is(":checkbox")) {
                checked_count = jQuery('[data-at-least-one="'+key+'"]:checked').length;
        	}
        	else{
        		
        		jQuery('[data-at-least-one="'+key+'"]').each(function() {
        			
        			if(jQuery(this).val() !== ""){
        				checked_count = 1;
        			}
        			
        		})
        		
        	}
            if (checked_count == 0) {                
                return false;
            } else {
                return true;
            }
        });
        
        
        
        // Au moins 1 de rempli
        jQuery.tools.validator.fn("[data-at-least-phone]",
        function(input) {
        	var key = input.data("at-least-phone");
        	var checked_count = 0;
        	if (input.is(":checkbox")) {
                checked_count = jQuery('[data-at-least-phone="'+key+'"]:checked').length;
        	}
        	else{
        		
        		jQuery('[data-at-least-phone="'+key+'"]').each(function() {
        			
        			if(jQuery(this).val() !== ""){
        				checked_count = 1;
        			}
        			
        		})
        		
        	}
            if (checked_count == 0) {                
                return false;
            } else {
                return true;
            }
        });
        
        
        // minlength attribute management
        jQuery.tools.validator.fn("[minlength]", "This field must be at least $1 characters long",
        function(input, value) {
            var min = input.attr("minlength");
            return value.length >= min ? true: [min];
        });
        // maxlength attribute management
        jQuery.tools.validator.fn("[maxlength]", "This field can't be more than $1 characters long",
        function(input, value) {
            var max = input.attr("maxlength");
            return value.length <= max ? true: [max];
        });
        //specific error rendering
        jQuery.tools.validator.addEffect("oneach",
        function(errors, event) {
            jQuery.each(errors,
            function(index, error) {
            	if (error.input.is("[data-label-associate]")) {
            		
            		jQuery("#" + error.input.data("label-associate")).removeClass("error-field").addClass("error-field");
            	}
            	if (error.input.is(":not(.checkbox-group-required)")) {
	                error.input.closest("div").find("p.error").remove();
	                error.input.closest("div").removeClass("error-field");
	                error.input.closest("div").addClass("error-field");
	                if (error.input.is("[data-date-required]")) {
	                	var labelId = error.input.closest("div").find("[data-date-required=day]").attr("id");
	                	error.input.closest("div").append("<p class='error'>" + error.messages[0].replace('$1', jQuery('label[for="' + labelId + '"]:eq(0)').text().replace(/(^(\s*\*\s*))|((\s*\*\s*)$)/, "")) + "</p>");
	                }
	                else{
	                	error.input.closest("div").append("<p class='error'>" + error.messages[0].replace('$1', jQuery('label[for="' + error.input.attr("id") + '"]:eq(0)').text().replace(/(^(\s*\*\s*))|((\s*\*\s*)$)/, "")) + "</p>");
	                }
	                /*
	                field = this.getInputs().filter('[name="' + name + '"]'),
	                label = jQuery('label[for="' +  error.input.attr("id") + '"]:eq(0)').text();
	                */
	                jQuery('label[for="' + error.input.attr("id") + '"]').addClass("error");
	                error.input.closest(".radio-list, .radio-list-wide").find("label, .label").addClass("error");
            	}
            	else{
            		if (!error.input.closest(".tab-form").siblings(".error-msg").length) {
            			error.input.closest(".tab-form").before("<p class='error-msg'></p>");
            		}
            		error.input.closest(".tab-form").siblings(".error-msg").html(error.messages[0]);
            	}
            });

            // the effect only remove errors when all inputs are valid  
        },
        function(inputs) {
            jQuery.each(inputs,
            function() {
            	if (jQuery(this).is("[data-label-associate]")) {
            		
            		jQuery("#" + jQuery(this).data("label-associate")).removeClass("error-field");
            	}
                jQuery(this).closest("div").find("p.error").remove();
                jQuery(this).closest("div").removeClass("error-field");
                jQuery('label[for="' + jQuery(this).attr("id") + '"]').removeClass("error");
                jQuery(this).closest(".tab-form").siblings(".error-msg").remove()
            })
        });
        jQuery.tools.validator.localize(Reflow.nissan.lang, formTranslation);
        

        //launch validation
        jQuery(id).each(function(el, index){
        	 if(typeof jQuery(this).data("validation-vin-url") === "undefined") {
             	Reflow.nissan.validateRegister({id: this});
             }
             else {
             	Reflow.nissan.validateRegister({id: this, validCallback: function(ev){
     				var vinField = ev.form.find("#"+ev.form.data("validation-vin-id"));
     				
             		jQuery.ajax({
             			type: "GET",
     					url: ev.form.data("validation-vin-url"),
     					data: "vinCode="+vinField.val(),
     					dataType: "html",
     					cache: false,
     					success: function(data, XMLHttpRequest, textStatus) {
             				var ok = false;
             				var inlineError = false;
             				
             				var errorMessage = "";
             				
             				//data = data.replace(/\s/gi,"");
             				
             				switch (data) {
             					case vinValidationData.errorCode.VIN_EMPTY:
                 					errorMessage = vinValidationData.errorMessage.errorEmpty;
             					break;
             					case vinValidationData.errorCode.VIN_TOO_SHORT:
         							errorMessage = vinValidationData.errorMessage.errorTooShort;
                 					break;
             					case vinValidationData.errorCode.VIN_NOT_RECOGNIZED:
         							errorMessage = vinValidationData.errorMessage.errorNotRecognized;
                 					break;
             					case vinValidationData.errorCode.IS_LEAF_ALREADY_REGISTRATED:
         							errorMessage = vinValidationData.errorMessage.errorAlreadyRegistredLeaf;
                 					break;
             					case vinValidationData.errorCode.IS_LEAF_NOT_DECODE:
         							errorMessage = vinValidationData.errorMessage.errorNotDecodeLeaf;
                 					break;
             					case vinValidationData.errorCode.IS_LEAF_OK:           
         							ev.form.find("#"+vinValidationData.fields.nextPage).val(vinValidationData.url.nextPageIfVinLeaf);
         							ok = true;  
                 					break;
             					case vinValidationData.errorCode.IS_OK:       
                 					ev.form.find("#"+vinValidationData.fields.nextPage).val(vinValidationData.url.nextPageIfVin);
     								ok = true;
                 					break;
                 				default:
                 					inlineError = true;
                 					errorMessage = '<p class="error">'+vinValidationData.errorMessage.unknownError+'</p>';
                 					break;
             				}

             				
             				if(ok == true) {
             					ev.form[0].submit();
             				}
             				else {
             					if(inlineError == true) {
                 					vinField.parent().append(errorMessage);
                 					vinField.closest(".field").addClass("error-field");
                 					jQuery("label[for="+vinField.attr("name")+"]").addClass("error");
             					}
             					else {
                 					ev.form.find("#"+vinValidationData.fields.nextPage).val(vinValidationData.url.nextPageForceVin);
                 					Reflow.widgets.popinManager.popin("popin-valide-vin").setContent(errorMessage);
                 					Reflow.widgets.popinManager.popin("popin-valide-vin").addCallback( {
                	    				openCallback: function(e) {
                	    					e.popin.find("input[type=button]").bind("click", function(event){
                	    						event.preventDefault();
                	    						ev.form[0].submit();
                	    					});
                	    				}
                	    			});
                 					Reflow.widgets.popinManager.popin("popin-valide-vin").open();
             					}
             				}
     					},
     					error: function(XMLHttpRequest, textStatus, errorThrown){
         					vinField.parent().append(vinValidationData.errorMessage.serverError);
         					vinField.closest(".field").addClass("error-field");
         					jQuery("label[for="+vinField.attr("name")+"]").addClass("error");
     					}
             		});
             		
             	}
            	});
           }
        });

       

    },
    
    popinConfirmation : function () {
    	
    	this.open = function (e) {
    		e.preventDefault();

    		var link = this;
    		
    		if (!jQuery("#popin-confirm").length) {
    			Reflow.widgets.popinManager.create( {id: "popin-confirm"} );
    			Reflow.widgets.popinManager.popin("popin-confirm").addCallback({
    				/*dataLoaded: function(e) {

    					e.loadedData = e.loadedData.replace("{MESSAGE}", Reflow.widgets.rsm.getText("popin.confirm.message").replace("$1", jQuery(link).text()));

    					return e.loadedData;
    				},*/
    				contentAdded: function(e) {
						e.popin.find(".message p:not(.generic)").remove();
						if (jQuery(link).data("message")) {
							e.popin.find(".message p.generic").hide();
							e.popin.find(".message").append("<p>"+jQuery(link).data("message")+"</p>");
						}
						else {
							e.popin.find(".message p.generic").show();
							e.popin.find(".message").append("<p>"+jQuery(link).text()+"</p>");
						}
    				},
    				openCallback: function(e) {
						e.popin.find(".bt-confirm").attr("href", link.href);
    				}
    			});
    			Reflow.widgets.popinManager.popin("popin-confirm").load(Reflow.widgets.rsm.getUrl("popin.confirm"));
    		}
    		else {
    			Reflow.widgets.popinManager.popin("popin-confirm").addCallback({
    				dataLoaded: null,
    				openCallback: null,
    				beforeOpen: function(e) {
						e.popin.find(".bt-confirm").attr("href", link.href);
						e.popin.find(".message p:not(.generic)").remove();
						if (jQuery(link).data("message")) {
							e.popin.find(".message p.generic").hide();
							e.popin.find(".message").append("<p>"+jQuery(link).data("message")+"</p>");
						}
						else {
							e.popin.find(".message p.generic").show();
							e.popin.find(".message").append("<p>"+jQuery(link).text()+"</p>");
						}
					}
				});
    			Reflow.widgets.popinManager.open("popin-confirm");
    		}
    	};
    	
    	
    	this.init = function () {
    		jQuery(".open-confirm-popin").bind("click", {that: this}, this.open);
    	}
    },
    popinZIndex: 1000,
    popinGeneric : function () {
    	
    	this.open = function (e) {
    		e.preventDefault();
    		var mainEvent = e,
    			that = mainEvent.data.that;
    		
    		var link = this;
    		var popinId = link.rel;
    		popinId = popinId || jQuery(this).closest(".rf-popin").attr("id");
    		
    		if (typeof popinId !== "undefined" && popinId !== "") {
	    		if (jQuery("#"+popinId).length == 0) {
	    			Reflow.widgets.popinManager.create( {id: popinId} );
	    		}
	    		

    			Reflow.widgets.popinManager.popin(popinId).addCallback( {
    				beforeOpen: function (e) {
    					e.popin.css({"zIndex": Reflow.nissan.popinZIndex++});
    				},
    				openCallback: function(e) {
    					if (mainEvent.data.overPopin == true) {
    						e.popin.find('.close-popin').unbind().bind("click", function(){
    							e.popinObject.close({"bgOpen" : true});
    						});
    					}
    					
    					if (e.popin.find('[data-reload-on-close]').length) {
    						e.popinObject.addCallback({
    							beforeClose: function (e) {
    								location.reload();
    							}
    						});
    					}
	    				if (e.popin.find('[data-reload-page]').length) {
	    					var delay = e.popin.find('[data-reload-page]').data('reload-page');
	    					if(typeof delay === "number") {
	    						delay = parseInt(delay) * 1000;
	    					}
	    					else {
	    						delay = 0;
	    					}
	    					setTimeout (function(){
	    						location.reload();
	    					}, delay);
	    				}
	    				else {
		    				if (typeof jQuery.tools !== "undefined" && jQuery("#"+popinId+" form").length) {
			    		        Reflow.nissan.validateRegister({
							    	id:"#"+popinId+" form", 
							    	validCallback: function(ev){
			    		        		if (ev.form.attr("data-no-ajax-post") != "true") {
			    		        			e.popinObject.loadForm(ev.form[0]);
			    		        		}
			    		        		else {
			    		        			ev.form[0].submit();
			    		        		}
							    	}
							    });
		    		        }
	    					e.popin.find('.open-in-popin').bind("click", {that: that}, that.open);
	    					e.popin.find('.open-on-popin').bind("click", {that: that, overPopin: true}, that.open);
	    				}
    				}
    			});
    			
    			if (jQuery(link).attr("href").indexOf("#") != -1) {
    				/*var popArr = jQuery(link).attr("href").split("#");
    				var popId = "#"+popArr[popArr.length - 1];
    				Reflow.widgets.popinManager.popin(popinId).setContent(jQuery(popId).html());*/
    				Reflow.widgets.popinManager.popin(popinId).open();
    			}
    			else {
    				Reflow.widgets.popinManager.popin(popinId).load(link.href);
    			}
    		}
    	};
    	
    	
    	this.init = function () {
    		jQuery(".open-generic-popin").bind("click", {that: this}, this.open);
    	};
    },
    tooltipManager: function() {
    	this.init = function () {    		
    		jQuery(".bt-tooltip").hover(function(e) {
    			var link = jQuery(this);
    			var linkPos = link.position();
    			var tooltip = jQuery("#" + link.attr("href").split("#")[1]);
    			
    			tooltip.css({left: linkPos.left - link.width() / 2 - 10, top: linkPos.top - tooltip.height() - 15});
    			tooltip.show();
    		},
    		function (e) {
    			jQuery("#" + jQuery(this).attr("href").split("#")[1]).hide();
    		});
    	}
    },
    
    bluetoothManager: function () {
    	
    	// This file demonstrates the different options of the pagination plugin
        // It also demonstrates how to use a JavaScript data structure to 
        // generate the paginated content and how to display more than one 
        // item per page with items_per_page.
                
        /**
         * Callback function that displays the content.
         *
         * Gets called every time the user clicks on a pagination link.
         *
         * @param {int}page_index New Page index
         * @param {jQuery} jq the container with the pagination links as a jQuery object
         */
		this.pageselectCallback = function pageselectCallback(page_index, jq){
            // Get number of elements per pagionation page from form
			var items_per_page = jQuery('#items_per_page').val();
			var max_elem = Math.min((page_index+1) * items_per_page, members.length);
            var newcontent = '<ul>';
            
            // Iterate through a selection of the content and build an HTML string
            for(var i=page_index*items_per_page;i<max_elem;i++)
            {
				newcontent += '<li><a href="'+ members[i][2] +'"><p class="telephone-name">' + members[i][0] + '</p>';
				newcontent += '<img src="' + members[i][1] ;
				newcontent += '" alt="' + members[i][0] + '" title="' + members[i][0] + '"/></a></li>';
            }
            newcontent += '</ul>';
			            
            // Replace old content with new content
            jQuery('#container-tel').html(newcontent);
            
            // Prevent click event propagation
            return false;
        };
        
        // The form contains fields for many pagiantion optiosn so you can 
        // quickly see the resuluts of the different options.
        // This function creates an option object for the pagination function.
        // This will be be unnecessary in your application where you just set
        // the options once.
        this.getOptionsFromForm = function getOptionsFromForm(){
            var opt = {callback: this.pageselectCallback, class_multi:".pagination-multi"};
            // Collect options from the text fields - the fields are named like their option counterparts
            jQuery("input:hidden").each(function(){
                opt[this.name] = this.className.match(/numeric/) ? parseInt(this.value) : this.value;
            });
            return opt;
        };
    	
    	this.filterByBrand = function filterByBrand() {
			var brand = jQuery(this).val();
			window.location.href = Reflow.widgets.rsm.getUrl('bluetooth.phone-selection') + brand;
		};
		
		this.showInstructions = function showInstructions(e){
			e.preventDefault();
			jQuery('#instructions-nav a').removeClass("active");
			jQuery(this).addClass("active");
			jQuery('.instructions-container').slideUp();
			jQuery(jQuery(this).attr("href")).slideDown();
			
			
			if (jQuery.browser.msie && jQuery.browser.version<7) {

 				jQuery('#nissan-global-footer').css('position','relative');
 				jQuery('#nissan-global-footer').css('margin-top','-70px');
 			
 		
			};

			
		
		};
		
    	this.init = function () {
    		if (jQuery("#container-tel").length) {
    			jQuery('#brands').bind("change", this.filterByBrand);

    			// Create pagination element with options from form
                var optInit = this.getOptionsFromForm();
                
                jQuery(".pagination-display").pagination(members.length, optInit);
                this.pageselectCallback(0, jQuery(".pager-select"));
    		}
    		if (jQuery("#instructions-nav").length) {
    			jQuery('#instructions-nav a').bind("click", this.showInstructions);
    		}
    	};
    },
    
    fixIEs: function () {
    	if(jQuery.browser.msie && jQuery.browser.version < 8) {
    		jQuery("label img").bind("click", function() {
    			jQuery(this).closest("label").trigger("click");
    		});
    	}
    },
    
    emag: {
    	historyTabs: function () {
    	
	    	this.displayHistoryBlock = function displayHistoryBlock(event){
	    		event.preventDefault();
	    		if (!jQuery(this).hasClass("active")) {
	    			jQuery(this).parent().addClass("active")
	    							.siblings(".active").removeClass("active");
	    							
	    			var blockUrl = jQuery(this).attr('href');
	    			jQuery(blockUrl).show().siblings(".emag-history-content").hide();
	    		}
	    	} 
    	
    		this.init = function () {
    			/* eMag */
    			if (jQuery('.emag-history-heading').length) {
    				var activeItem;
    				if (jQuery('.emag-history-heading .active').length) {
    					activeItem = jQuery('.emag-history-heading .active');
    				}
    				else {
    					activeItem = jQuery('.emag-history-heading > li:first');
    					activeItem.addClass("active");
    				}
    				var urlhistoryDisplay = activeItem.find('a').attr("href");
    				jQuery(urlhistoryDisplay).siblings(".emag-history-content").hide();
    				
    				jQuery('.emag-history-heading a').bind('click', this.displayHistoryBlock);
    			}
    		};
    	}
    },
    
    displayHideManager: function () {
    	
    	this.isParentVisible = function (elem) {
    		var parentElem = elem.closest(".std").attr("id");
    		if(!parentElem || jQuery("[data-child="+parentElem+"]").length == 0) {
    			return true;
    		}
    		else {
    			return jQuery("[data-child="+parentElem+"]:visible").length > 0;
    		}
    	};
    	
    	this.show = function (elem) {
    		var that = this;
    		
    		if (this.isParentVisible(elem)) {
    			elem.show();
    		}
    		else {
    			this.hide(elem);
    		}
    		
    		elem.find("select, input, textarea").each(function(){
    			var field = jQuery(this);

    			if (typeof field.attr("data-radio-required") !== "undefined") {
    				field.addClass("radio-required");
    			}
    			if (typeof field.attr("data-required") !== "undefined") {
    				field.attr("required", field.attr("data-required"));
    			}
    			if (typeof field.attr("data-data-equals") !== "undefined") {
    				field.attr("data-equals", field.attr("data-data-equals"));
    			}
    		});
    		
    		elem.find("[data-child]").each(function(){
    			var child = jQuery(this);
    			that.toggle(child);
    		});
    		
		};
    	
    	this.hide = function (elem) {
    		var that = this;
    		elem.hide();
    		
    		elem.find("select, input, textarea").each(function(){
    			var field = jQuery(this);
    			
    			if (field.hasClass("radio-required")) {
    				field.attr("data-radio-required", "radio-required");
    				field.removeClass("radio-required");
    			}
    			if (typeof field.attr("required") !== "undefined") {
    				field.attr("data-required", field.attr("required"));
    				field.removeAttr("required");
    			}
    			if (typeof field.attr("data-equals") !== "undefined") {
    				field.attr("data-data-equals", field.attr("data-equals"));
    				field.removeAttr("data-equals");
    			}
    		});
    		
    		elem.find("[data-child]").each(function(){
    			var child = jQuery(this);
    			that.hide(jQuery("#"+child.attr("data-child")));
    		});
			
		};
    	
    	this.toggle = function (elem, parent) {
    		
    		if(elem.attr("type") != "radio") {
    			
				if (elem.val() !== null && elem.val() !== elem.attr("data-empty-value")) {
					this.show (jQuery("#"+elem.attr("data-child")));
				}
				else {
					this.hide(jQuery("#"+elem.attr("data-child")));
				}
    		}
    		else {
    			var checkedElem;
    			jQuery('input[name='+elem.attr("name")+']').each(function(){
    				if(this.checked == true) {
    					checkedElem = this;
    				}
    			});
    			
    			if(checkedElem != null && jQuery(checkedElem).val() !== null && jQuery(checkedElem).val() !== elem.attr("data-empty-value")) {
					this.show(jQuery("#"+elem.attr("data-child")));
    			}
    			else {
					this.hide(jQuery("#"+elem.attr("data-child")));
    			}
    		}
		};
		
    	this.toggleHandler = function (e) {
			e.data.that.toggle( jQuery(this) );
		};
    	
    	this.init = function () {
    		var that = this;
			jQuery("[data-child]").bind("change", {that: this}, this.toggleHandler);
			jQuery("[data-child]").each(function(el){
				var wrapper = jQuery(this).closest(".std");
				if(jQuery("[data-child="+wrapper.attr("id")+"]").length == 0) {
					that.toggle(jQuery(this));
				}
			});
		};
    },
    
    changeSelectManager: function () {
    	
    	this.show = function (elem) {
    		var that = this;
    		elem.show();
    		
    		elem.find("select, input, textarea").each(function(){
    			var field = jQuery(this);

    			if (typeof field.attr("data-radio-required") !== "undefined") {
    				field.addClass("radio-required");
    			}
    			if (typeof field.attr("data-required") !== "undefined") {
    				field.attr("required", field.attr("data-required"));
    			}
    			if (typeof field.attr("data-data-equals") !== "undefined") {
    				field.attr("data-equals", field.attr("data-data-equals"));
    			}
    			if (typeof field.attr("data-data-date-required") !== "undefined") {
    				field.attr("data-date-required", field.attr("data-data-date-required"));
    			}
    			
    		});    		
    		
		};
    	
    	this.hide = function (elem) {
    		var that = this;
    		elem.hide();
    		
    		elem.find("select, input, textarea").each(function(){
    			var field = jQuery(this);
    			
    			if (field.hasClass("radio-required")) {
    				field.attr("data-radio-required", "radio-required");
    				field.removeClass("radio-required");
    			}
    			if (typeof field.attr("required") !== "undefined") {
    				field.attr("data-required", field.attr("required"));
    				field.removeAttr("required");
    			}
    			if (typeof field.attr("data-equals") !== "undefined") {
    				field.attr("data-data-equals", field.attr("data-equals"));
    				field.removeAttr("data-equals");
    			}
    			if (typeof field.attr("data-date-required") !== "undefined") {
    				field.attr("data-data-date-required", field.attr("data-date-required"));
    				field.removeAttr("data-date-required");
    			}
    		});
			
		};
    	
    	this.toggle = function (elem, parent) {
    		
    		var displayLength = jQuery("option:selected", elem).data("change-value");
    		if (displayLength == 0) {
    			this.hide(jQuery("[data-select-display=" + elem.attr("id") + "]"));
    		}
    		else{
    			this.hide(jQuery("[data-select-display=" + elem.attr("id") + "]:eq(" + displayLength + "), [data-select-display=" + elem.attr("id") + "]:gt(" + displayLength + ")"));
        		this.show(jQuery("[data-select-display=" + elem.attr("id") + "]:lt(" + displayLength + ")"));
    		}
			
		};
		
    	this.toggleHandler = function (e) {
			e.data.that.toggle( jQuery(this) );
		};
    	
    	this.init = function () {
    		var that = this;
			jQuery("[data-select-change]").bind("change", {that: this}, this.toggleHandler);
			jQuery("[data-select-change]").each(function(el){
				that.toggle(jQuery(this));
			});
		};
    },
    
    toggleDisplay: function () {
    	
    	this.toggle = function(e) {
    		e.preventDefault();
    		var target = jQuery(this).attr("href");
    		if(typeof target !== "undefined" && jQuery(target).length) {
    			if (jQuery(target).is(":visible")) {
    				jQuery(target).slideUp("normal", function(){
    					/* Fix footer bug on IE6 */
    					if (jQuery.browser.msie && jQuery.browser.version < 7) {
    						jQuery("#nissan-global-footer").css("bottom", "auto").css("bottom", "0");
    					}
    				});
    			}
    			else {
    				jQuery(target).slideDown("normal", function(){
    					/* Fix footer bug on IE6 */
    					if (jQuery.browser.msie && jQuery.browser.version < 7) {
    						jQuery("#nissan-global-footer").css("bottom", "auto").css("bottom", "0");
    					}
    				});
    			}
    		}
    	};
    	
    	this.init = function () { 
    		var that = this;
            jQuery(".js-toggle-display").bind("click", {that: this}, this.toggle);
            jQuery(".js-toggle-display").each(function(){
        		var target = jQuery(this).attr("href");
        		if(typeof target !== "undefined" && jQuery(target).length) {
        			jQuery(target).hide();
        			jQuery(target).find(".js-close-display").bind("click", {that: that}, that.toggle);
        		}
            });
    	};
    },
    
    cookieManager: {

    	// COOKIE
    	createCookie: function (name,value,days) {
    		if (days) {
    			var date = new Date();
    			date.setTime(date.getTime()+(days*24*60*60*1000));
    			var expires = "; expires="+date.toGMTString();
    		}
    		else var expires = "";
    		document.cookie = name+"="+value+expires+"; path=/";
    	},
    	
    	readCookie: function (name) {
    		var nameEQ = name + "=";
    		var ca = document.cookie.split(';');
    		for(var i=0;i < ca.length;i++) {
    			var c = ca[i];
    			while (c.charAt(0)==' ') c = c.substring(1,c.length);
    			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    		}
    		return null;
    	},
    	
    	eraseCookie: function (name) {
    		createCookie(name,"",-1);
    	}
    	
    },
    
    starRating: function () {

    	var readOnlyRating = false;

    	// removing error message
    	this.removeLayer = function (currentForm){
    		msgView = window.setTimeout(function(){
    			
    			jQuery(currentForm).find(".rating-msg").fadeOut(800,function(){
    				jQuery(this).remove();
    			})
    			
    		}, 3000);
    	};

    	//showing error message
    	this.displayRatingMsg = function (currentForm,displayMsg, that){
    		if(!jQuery(currentForm).find(".rating-msg").length){
    			jQuery(currentForm).find(".article-rating-votes").after("<div style=\"display:none\" class=\"rating-msg\"><span class=\"msg-trick\"></span><span class=\"msg-content\">"+displayMsg+"</span></div>").siblings(".rating-msg").fadeIn(800,function(){
    				that.removeLayer(currentForm);
    			});
    		}
    		else{
    			jQuery(currentForm).find(".rating-msg").html(displayMsg);
    			that.removeLayer(currentForm);
    		}
    	};

    	this.init = function () {
    		var that = this;
    		
    		jQuery(".article-rating-form input[type=submit]").hide();
    		
    		jQuery(".article-rating-form").bind("submit", function(){
    			var currentForm =  jQuery(this);
    			var currentFormId =  jQuery(this).attr("id");
    			
    			if (!readOnlyRating){

    				var submitUrl = jQuery(this).attr("action");
    				var serializeData = jQuery(this).serialize();
    				var displayMsg = "";
    				
    				jQuery.ajax({
    					type: "GET",
    					url: submitUrl,
    					data: serializeData,
    					dataType: "xml",
    					success: function(XMLHttpRequest, textStatus) {
    						
    						var ratingAverage = Math.ceil(jQuery(XMLHttpRequest).find("average").text());
    						var ratingVotes = jQuery(XMLHttpRequest).find("votes").text();
    						
    						jQuery(currentForm).find(".article-rating-votes").html("("+ratingVotes+")");
    						jQuery(currentForm).find("input.article-star").rating("selectDisplay",ratingAverage-1);
    						jQuery(currentForm).find("input.article-star").rating("readOnly");
    						jQuery(currentForm).find(".article-rating-default").val(ratingAverage);
    						
    						displayMsg = Reflow.widgets.rsm.getText("rating.confirm");
    						readOnlyRating = true;
    						
    						Reflow.nissan.cookieManager.createCookie("MyNissanRating_"+currentFormId,ratingAverage);
    						
    					},
    					error: function(XMLHttpRequest, textStatus, errorThrown){
    						displayMsg = "<span class=\"error\">"+Reflow.widgets.rsm.getText("rating.server-error")+"</span>";
    					},
    					complete: function(XMLHttpRequest, textStatus){
    						that.displayRatingMsg(currentForm,displayMsg, that);					
    						
    					}
    				});
    			}
    			else{
    				that.displayRatingMsg(currentForm,Reflow.widgets.rsm.getText("rating.already-voted"), that);
    			}
    			
    			return false;
    		});
    		
    		
    		// init rating
    		jQuery(".article-rating-form").each(function(){

    			var ratingform = jQuery(this);
    			var formId = jQuery(this).attr("id");
    			var initXML = jQuery(this).attr("action");
    			var initRatingAverage = 0;
    			var initRatingVotes = "0"
    			
				jQuery.ajax({
					type: "GET",
					url: initXML + "?",
					dataType: "xml",
					success: function(XMLHttpRequest, textStatus) {
						initRatingAverage = Math.ceil(jQuery(XMLHttpRequest).find("average").text());
						initRatingVotes = jQuery(XMLHttpRequest).find("votes").text();
						jQuery(ratingform).find(".article-rating-votes").html("("+initRatingVotes+")");				
					},
					error: function(XMLHttpRequest, textStatus, errorThrown){
						
						displayMsg = "<span class=\"error\">"+ratingMsg.serverError+"</span>";
					},
					complete: function(){
						
						var cookieDetect = Reflow.nissan.cookieManager.readCookie("MyNissanRating_"+formId)
						
						if(cookieDetect){
							readOnlyRating = true
						}
						
						jQuery(ratingform).find(".article-star").rating({
							callback: function(value){
								jQuery(this.form).trigger("submit");
							}
						});
						jQuery(ratingform).find(".article-star").rating("selectDisplay",initRatingAverage-1);
						if (readOnlyRating){
							jQuery(ratingform).find(".article-star").rating("readOnly")
						}
					}
				});
    		});
    		
    	}
    },
    
    pushCarousel: function () {

    	this.init = function () {
			if (jQuery(".push-carousel").length) {
				jQuery(".push-carousel").each(function(){
					jQuery(this).after("<a class=\"previous-bt\"><span>Previous</span></a><a class=\"next-bt\"><span>Next</span></a>");
					var btNext = jQuery(this).siblings(".next-bt");
					var btPrevious = jQuery(this).siblings(".previous-bt");
					jQuery(this).jCarouselLite({
						btnNext: btNext,
						btnPrev: btPrevious,
						speed: 500,
						visible: 1
					});
				});
			}
    	}
    },
    
    placeHolderFix: function () {
		if(typeof Modernizr !== "undefined" && !Modernizr.input.placeholder){
			$("input").each( function(){
				if($(this).val()=="" && $(this).attr("placeholder")!=""){
					$(this).val($(this).attr("placeholder"));
					$(this).focus(function(){
						if($(this).val()==$(this).attr("placeholder")) $(this).val("");
					});
					$(this).blur(function(){
						if($(this).val()=="") $(this).val($(this).attr("placeholder"));
					});
				}
			});
		}
    },
    
    interceptManager: function () {
    	
    	this.loadData = function (e) {
    		e.preventDefault();
    		
    	};
    	
    	this.loadDataSelect = function (select) {    		
    		var wrapper = jQuery(select).data("load-wrapper");
    		//{0}" data-load-param="model"
    		var url = jQuery(select).data("load-url");
    		
    		if (jQuery(select).data("load-param")) {
    			var values = jQuery(select).data("load-param").split("|");
    			for (var v=0; v<values.length; v++) {
    				url = url.replace("{"+v+"}", jQuery("#"+values[v]).val());
    			}
    		}
    		else {
    			if(jQuery(select).val() == null) {
    				return;
    			}
    			url = url.replace("{0}", jQuery(select).val());
    		}
    		
    		if(typeof wrapper !== "undefined" && jQuery("#"+wrapper).length) {
    		
	    		jQuery.ajax({
					url: url,
					dataType: 'html',
					success: function(data) {
	    				jQuery("#"+wrapper).html(data);
	    				jQuery("#"+wrapper).trigger("change");
	    			},
	    			beforeSend: function () {
	    				jQuery("#"+wrapper).siblings('.ajax-load').remove();
	    				jQuery("#"+wrapper).after('<span class="ajax-load"></span>');
	    			},
	    			complete: function () {
	    				jQuery("#"+wrapper).siblings('.ajax-load').remove();
	    			},
					error: function(data) {
	    				//console.log(data);
	    			}
				});
    		}
    	};
    	
    	this.loadDataSelectHandler = function (e) {
    		e.data.that.loadDataSelect(this);
    	};
    	
    	this.loadAtStart = function() {
    		jQuery("[data-load-at-start]").each(function(el){
    			var url = jQuery(this).data("load-at-start");
    			jQuery.ajax({
    				url: url,
    				dataType: 'html',
    				success: function (data, status, xhr) {
    					this.wrapper.html(data);
   						this.wrapper.trigger("change");
						setTimeout(Reflow.nissan.fixSelects,200);
    				},
    				error: function (xhr, status) {
    				},
    				wrapper: jQuery(this)
    			});
    		});
    	};
    	
    	this.init = function () {
    		var that = this;
    		
    		this.loadAtStart();
    		
    		jQuery("a[data-load-wrapper]").bind("click", {that: this}, this.loadData);
    		jQuery("select[data-load-url]").bind("change", {that: this}, this.loadDataSelectHandler);
    		jQuery("select[data-load-url]").each(function(){
    			if(jQuery(this).val() !== "") {
    				that.loadDataSelect(this);
    			}
    		});
    	};
    },
    
    deleteForm: function deleteForm () {
    	var flag;
    	
    	this.checkForm = function () {   
    		
    		flag = false;
    		
    		if (jQuery("#delete-form input:checkbox[required]").is(":not(:checked)")){
    			flag = true;
    		}
    		
    		jQuery("#delete-form input:radio.radio-required").each(function () {
    			
    			var siblingsChecked = jQuery(this).siblings("[name=" + jQuery(this).attr("name") + "]:checked").length;
    			
    			if ( (jQuery(this).is(":not(:checked)")) && (siblingsChecked == 0)) {
    				
    				flag = true;
    				
    			}
    		});
    		
    		if ( flag == true ){
    			jQuery("#delete-submit").parent().addClass("bt-2-disabled");
    		}
    		else{
    			jQuery("#delete-submit").parent().removeClass("bt-2-disabled");
    		}
    		
    	};
    	
    	this.init = function () {
    		
    		var that = this;
    		
    		that.checkForm();
    		jQuery("input[required]").bind("change", function () {
    			
    			that.checkForm();
    			
    		});
    		jQuery("#delete-form").bind("submit", function (e) {
    			if (flag == true){
    				e.preventDefault();
    			}
    		});
    		
    	};    	
    	
    },
    
    tabsDisplay: function tabsDisplay () {
    	
    	var that = this;
    	
    	this.ieCorrection = function () {
    		
    		jQuery(".tab-form").removeClass(".tab-form").addClass(".tab-form");
    		jQuery("#wrapper").removeAttr("id").attr("id", "wrapper");
    		jQuery("#main").removeAttr("id").attr("id", "main");
    		
    	};
    	
    	this.creatCookie = function (elt)  {
    		
    		var visibleElts = elt.closest(".tab-form").find(".active-item");
    		
    		var idVisible = [];
    		
    		visibleElts.each(function () {
    			
    			idVisible.push(jQuery(".toggle-heading:first a", this).attr("href").split("#")[1]);
    			
    		});
    		jQuery.cookie("youplus-aftersales", idVisible.toString(), { expires: 7 });
    		
    	}
    	
    	this.toggleTabs = function (e) {
    		
    		e.preventDefault();
    		var href = jQuery(this).attr("href").split("#")[1];
    		var elt = jQuery(this);
    		
    		if (typeof document.body.style.maxHeight === "undefined") {
    			
    			jQuery("#" + href).toggle(0, function () {
    				
    				elt.closest(".toggle-item").toggleClass("active-item");
    				that.ieCorrection();
    				that.creatCookie(elt);
    				
    			});
    			
    		}
    		else{
	    		if (jQuery("#" + href).is(":visible")){
	    			jQuery("#" + href).slideUp("800", function () {
	    				
	    				elt.closest(".active-item").removeClass("active-item");
	    				that.creatCookie(elt);
	    				
	    			});
	    		}
	    		else{
	    			
	    			elt.closest(".toggle-item").addClass("active-item");
	    			jQuery("#" + href).slideDown("800", function () {
	    				that.creatCookie(elt);
	    			});
	    			
	    		}
    		}
    		
    		
    	};
    	
    	this.toggleDetails = function (e) {
    		
    		e.preventDefault();
    		var href = jQuery(this).attr("href").split("#")[1];
    		
    		if (jQuery(this).parents(".disabled").length) {
    			jQuery("#" + href).hide();
    		}
    		else{
    			jQuery("#" + href).toggle();
    		}
    		
    		
    	};
    	
    	this.init = function () {
    		
    		jQuery(".details-link").each(function () {
    			
    			jQuery(this).bind("click", {that: that}, that.toggleDetails);
    			var href = jQuery(this).attr("href").split("#")[1];
    			if (jQuery("#" + href).is(":visible")) {
    				jQuery(this).trigger("click");
    			}
    			
    		});
    		
    		if (jQuery.cookie("youplus-aftersales") && jQuery.cookie("youplus-aftersales").length !== 0){
    			var activeTabs = jQuery.cookie("youplus-aftersales").split(",");
    			for (i=0; i< activeTabs.length; i++) {
    				
    				jQuery("#"+ activeTabs[i]).closest(".toggle-item").addClass("active-item");
    				
    			}
    		}
    		
    		jQuery(".toggle-heading a").each(function () {
    			
    			jQuery(this).bind("click", {that: that}, that.toggleTabs);
    			
    			if (!jQuery(this).closest(".toggle-item").hasClass("active-item")) {
	    			var href = jQuery(this).attr("href").split("#")[1];
	    			jQuery("#" + href).hide();
    			}
    			
    		});
    		
    		if (jQuery(".tab-form .disabled").length) {
    			
	    		var disabledTooltip = jQuery("<div class='disabled-tooltip'><div class='inner'>" + Reflow.widgets.rsm.getText("tooltip.disabled") + "</div></div>")
	    		
	    		disabledTooltip.css({
	    			position: "absolute",
					zIndex: "10",
					display: "none"
	    		});
	    		jQuery("#main").after(disabledTooltip);
	    		var heightDisabled = jQuery(".disabled-tooltip").height();
	    		var timeout;
	    		jQuery(".tab-form .disabled")
	    		.bind("mouseleave", function (e) {
					e.stopPropagation();
					timeout = window.setTimeout(function () {
						jQuery(".disabled-tooltip").hide();
					}, 200)
				})
				.bind("mouseenter", function (e) {
					e.stopPropagation();
					window.clearTimeout(timeout);
					jQuery(".disabled-tooltip").show();
				})
				.bind("mousemove", function (e) {
	    			jQuery(".disabled-tooltip").css({
	    				top: e.pageY - heightDisabled - 12,
	    				left: e.pageX
	    			});
				});
	    		
    		}
    		
    	};
    	
    },
    
    confirmPrice: function confirmPrice() {
    	
    	this.toggleHandler = function () {
    		
    		var form = jQuery(this).closest("form");    		
    		var ajaxUrl = form.attr("data-ajax-action");
    		var formData = form.serialize();
    		
    		jQuery.ajax({
    			type: "POST",
    			url: ajaxUrl,
    			data: formData,
    			success: function (msg) {
    				jQuery(".tab-form-total .total").html(msg);
    			},
    			complete: function (msg) {
    				(new Reflow.nissan.tooltipManager()).init();
    			}
    		});
    		
    	};
    	
    	this.init = function () {
    		
    		var that = this;
    		
    		jQuery("[data-ajax-action] input:checkbox").bind("change", {that: that}, that.toggleHandler);
    		
    	};
    	
    },
    
    booking: function booking () {
    	
    	this.submitHandler = function (e) {
    		var flag = false
    		
    		jQuery(".booking-required", this).each(function () {
    			if (jQuery(this).val() == "") {
    				flag = true;
    			}
    		});
    		
    		if (flag == true) {
    			e.preventDefault();
    			if (!jQuery(this).siblings(".error-msg").length) {
    				jQuery(this).before("<p class='error-msg'></p>");
        		}
    			jQuery(this).siblings(".error-msg").html(Reflow.widgets.rsm.getText("booking.error"));
    		}
    		else{    			
    			jQuery(".error-msg").remove();
    			jQuery.cookie("youplus-aftersales", null);
    		}
    		
    	};
    	
    	this.init = function () {
    		
    		var that = this;
    		
    		jQuery(".booking-form").bind("submit", {that: that}, that.submitHandler)
    		
    	};
    	
    },
    
    updateSelection: function updateSelection (argA, argB, argC, argD, argE) {
    	jQuery("#day").val(argA);
		jQuery("#month").val(argB);
		jQuery("#year").val(argC);
		jQuery("#start").val(argD);
		jQuery("#size").val(argE);
    },
    
    changePage: function changePage (arg) {
    	
    },
    
    flashLoaded: function flashLoaded () {
    	
    },
    
    jsCallTest: function jsCallTest (arg) {
    	
    },
    
    resizeHeader: function resizeHeader(val){
		jQuery("#nissan-global-header").css('display', 'block'); 
		jQuery("#global-flash-header").css('display', 'block');
		 
		jQuery("#nissan-global-header").height(val);
		jQuery("#global-flash-header").height(val);
    	 
    },
    
    resizeFooter: function resizeFooter(val){
    	 jQuery("#nissan-global-footer").height(val);
    	 jQuery("#global-flash-footer").height(val);
    },
    
    openBox: function openBox(val){
    
    	this.open = function (e) {
    		var box = jQuery(this).closest('[class~="box-1"]');
    		
    		if(box.hasClass('open')){//si c'est déjà ouvert
				jQuery(this).siblings('ul.nav-1').slideUp();
				box.removeClass('open');
			}
			else{//sinon on va l'ouvrir
				jQuery("#main-navigation .box-1.open").each(function(idx, el){
					jQuery(this).find("ul.nav-1").slideUp();
					jQuery(this).removeClass('open');
				});
				
				box.addClass('open');
				jQuery(this).siblings('ul.nav-1').slideDown();
			}
			e.preventDefault();
    	};
    	this.init = function () {	
    		jQuery("#main-navigation .box-1 ul.nav-1").hide();//hide les ul par défaut
    		jQuery("#main-navigation a.navigation-box").bind('click', this.open);
    	};
    },
	
	myGarageOrder: function myGarageOrder(val){
    	this.init = function () {	
    		jQuery( "#my-cars-sortable" ).sortable({ axis: 'y' ,opacity: '0.8'  });
    		
    		jQuery( "#my-cars-sortable" ).bind("sortstop", function (event, ui) {
    			
    			var sortList = ""
    			var sortItems = jQuery("li",this);
    			
    			
    			for (i = 0; i< sortItems.length; i++) {
    				
    				sortList += jQuery(sortItems[i]).attr("id");
    				if (i < sortItems.length - 1) {
    					sortList += "|";
    				}
    				
    			}
    			
    			jQuery("#sort-result").val(sortList);
    			
    		});
    		
    	};
    },
	
    popinZoom : function () {
    	
    	this.open = function (e) {
    		e.preventDefault();
    		var mainEvent = e,
    			that = mainEvent.data.that;
    		
    		var link = this;
    		var popinId = link.rel;
    		popinId = popinId || jQuery(this).closest(".rf-popin").attr("id");
    		
    		if (typeof popinId !== "undefined" && popinId !== "") {
	    		if (jQuery("#"+popinId).length == 0) {
	    			Reflow.widgets.popinManager.create( {id: popinId} );
	    		}
	    		

    			Reflow.widgets.popinManager.popin(popinId).addCallback( {
    				beforeOpen: function (e) {
    					e.popin.css({"zIndex": Reflow.nissan.popinZIndex++});
    				},
    				openCallback: function(e) {
    					var popin = e.popin;
    					var ev = e;
    					
    					e.popin.find(".ofr-zoom-lk").live("click", function (e) {
    						e.preventDefault();
    						var el = jQuery(this);
    						
    						popin.find(".inner-zoom").stop(true, true);
    						
    						popin.find(".zoom-popin").css({
    							height: popin.find(".zoom-popin").height()
    						})
    						ev.popinObject.centerPopin();
    						
    						popin.find(".inner-zoom").fadeOut(300, function () {
    							jQuery(this).remove();
    							jQuery(this).closest(".zoom-popin").addClass("loading");
    							
    							jQuery.ajax({
	    							url: el.attr("href"),
	    							success: function (data, textStatus, jqXHR) {
	    								jQuery(".zoom-popin", popin).append('<div class="inner-zoom"></div>');
	    								jQuery(".inner-zoom", popin).hide().append(data);
	    								
	    								jQuery('img', popin).bind("load", function(){
											ev.popinObject.centerPopin();
											ev.popinObject.centerPopin(that.contentElement);
										}).each(function(idx, el){
											el.src = el.src;
										});
										
	    								jQuery(".zoom-popin", popin).css({
			    							height: "auto"//jQuery(".visu", popin).height()
			    						});			    						
			    						
	    								jQuery(".inner-zoom", popin).fadeIn(500, function () {
	    									//ev.popinObject.centerPopin();
	    								});
	    							}
	    						});
	    													
    						});
    						
    						
    					});
    				
    				}
    			});
    			
    			if (jQuery(link).attr("href").indexOf("#") != -1) {
    				Reflow.widgets.popinManager.popin(popinId).open();
    			}
    			else {
    				Reflow.widgets.popinManager.popin(popinId).load(link.href);
    			}
    		}
    	};
    	
    	
    	this.init = function () {
    		jQuery(".open-zoom-popin").bind("click", {that: this}, this.open);
    	};
    },
	
	inZoom: function () {
		
		this.handler = function (el) {
			
			var url = jQuery(el).attr("href");
			var target = "#" + jQuery(el).attr("data-in-zoom");
			
			jQuery(target).animate({
				opacity: 0
			}, 500, function () {
				
				jQuery.ajax({
					url: url,
					success: function (data, textStatus, jqXHR) {
						
						jQuery(target).empty().append(data).animate({
							opacity: 1
						}, 500);
						(new Reflow.nissan.popinZoom()).init();
					}
				});
				
			});
			
		};
		
		this.clickHandler = function (e) {
			e.preventDefault();
			e.data.that.handler(this);
		};
			
		this.init = function () {
			var that = this;
			jQuery("[data-in-zoom]").bind("click", {that: that}, that.clickHandler);
			
		};
		
	},
	
	tabs: function () {
		
		this.handler = function (el) {
			
			var target = jQuery("#" + jQuery(el).attr("href").split("#")[1]);
			
			if (!jQuery(el).parent().hasClass("on")) {
			
				target.siblings(".n-tab-ct:visible").slideUp(300, function () {
					jQuery(el).parent().addClass("on").siblings(".on").removeClass("on");
					target.slideDown(600);
					
				});
				
			} 
			
		};
		
		this.clickHandler = function (e) {
			e.preventDefault();
			e.data.that.handler(this);
		};
		
		this.init = function () {
			var that = this;
			
			jQuery(".n-tabs").each(function () {
				
				jQuery("a", this).bind("click", {that: that}, that.clickHandler);
				
				if (!jQuery(".on", this).length) {
					jQuery("li:first-child", this).addClass("on");
				}
				
				var target = jQuery("#" + jQuery(".on a", this).attr("href").split("#")[1]);
				target.show().siblings(".n-tab-ct").hide();
				
			});
			
		}
		
	},
	
	deploy: function () {
		
		this.handler = function (el) {
			
			var target = jQuery("#" + jQuery(el).attr("href").split("#")[1]);
			
			if (!jQuery(el).hasClass("on")) {
				jQuery(el).addClass("on");
				target.slideDown(600);
				jQuery(el).text(jQuery(el).attr("data-close-txt"));
			} 
			else{
				target.slideUp(300, function () {
					jQuery(el).removeClass("on");
					jQuery(el).text(jQuery(el).attr("data-open-txt"));
				});
			}
			
		};
		
		this.clickHandler = function (e) {
			e.preventDefault();
			e.data.that.handler(this);
		};
		
		this.init = function () {
			var that = this;
			
			jQuery(".deploy-bt").each(function () {
				
				jQuery(this).bind("click", {that: that}, that.clickHandler);
				
				var target = jQuery("#" + jQuery(this).attr("href").split("#")[1]);
				
				if (jQuery(this).hasClass("on")) {
					target.show();
					jQuery(this).text(jQuery(this).attr("data-close-txt"));
				} 
				else{
					target.hide();
					jQuery(this).text(jQuery(this).attr("data-open-txt"));
				}
				
			});
			
		}
		
	},
	
	edit: function () {
		
		this.trigger = function (el) {
			
			jQuery(el).hide();
			jQuery(el).siblings(".ofr-sort-sbt, .ofr-sort-undo").css("display", "inline-block");
			
			jQuery( ".ofr-page-content" ).sortable({
				axis: 'y' ,
				opacity: '0.8',
				cursor: 'move'
			})
    		
    		.bind("sortstop", function (event, ui) {
    			
    			var sortList = ""
    			var sortItems = jQuery("li", this);
    			
    			
    			for (i = 0; i< sortItems.length; i++) {
    				
    				sortList += jQuery(sortItems[i]).attr("id");
    				if (i < sortItems.length - 1) {
    					sortList += "|";
    				}
    				
    			}
    			
    			jQuery("#ofr-sort-result").val(sortList);
    			
    		})
    		
    		.find("a").bind("click", function (e) {
    			e.preventDefault();
    		});
    		
    		jQuery( ".ofr-page-content" ).find("li, a").css({
    			cursor: "move"
    		});
			
		}; 
		
		this.triggerHandler = function (e) {
			e.preventDefault();
			e.data.that.trigger(this);
		};
		
		
		
		this.triggerTabs = function (el) {
			
			jQuery(el).hide();
			jQuery(el).siblings(".ofr-sort-sbt, .ofr-sort-undo").css("display", "inline-block");
			
			jQuery( ".ofr-tabs" ).sortable({
				axis: 'x' ,
				opacity: '0.8',
				cursor: 'move'
			})
    		
    		.bind("sortstop", function (event, ui) {
    			
    			var sortList = "",
    				sortItemsLength = jQuery("li", this).length;
    			
    			jQuery("li", this).each(function(idx, el){
    				sortList += jQuery(this).find("a").attr("href").split("#")[1];
    				if (idx < sortItemsLength - 1) {
    					sortList += "|";
    				}
    			});
    			
    			jQuery("#ofr-sort-result").val(sortList);
    			
    		})
    		
    		.find("a").bind("click", function (e) {
    			e.preventDefault();
    		}).
    		end()
    		.find("li, a, span").css({
    			cursor: "move"
    		});
		}; 
		
		this.triggerTabsHandler = function (e) {
			e.preventDefault();
			e.data.that.triggerTabs(this);
		};
		
		this.init = function () {
			var that = this;
    			
    		jQuery(".ofr-sort-lk").bind("click", {that: that}, that.triggerHandler);
    		
    		jQuery(".ofr-sort-tabs").bind("click", {that: that}, that.triggerTabsHandler);
				
		};
		
	},
	
	fixSelects: function(){
		if(Reflow.nissan.initialValue != ''){
			jQuery('select#citta').find('option').each(function(){
				jQuery(this).removeAttr('selected');
			})
			jQuery('select#citta option[data-order-value='+Reflow.nissan.initialValue+']').attr('selected','selected');
			jQuery('select#citta').trigger('change');
		}
		
		jQuery("select#citta").bind('change',function(){
			jQuery('#realCityValue').val(jQuery("select#citta option:selected").attr('data-order-value'));
		})
	},
	
	
	init : function () {
		Reflow.nissan.initialValue = jQuery('#realCityValue').val();
    	(new Reflow.nissan.openBox()).init();
    	
		(new Reflow.nissan.pendingAlertManager()).init();
		(new Reflow.nissan.carouselArticleManager()).init();
		(new Reflow.nissan.carouselHome()).init();
		(new Reflow.nissan.pushCarousel()).init();
		(new Reflow.nissan.carouselAfterSalesManager()).init();

		(new Reflow.nissan.toggleDisplay()).init();
		(new Reflow.nissan.displayHideManager()).init();
		(new Reflow.nissan.changeSelectManager()).init();
		
		(new Reflow.nissan.interceptManager()).init();
		
		(new Reflow.nissan.popinConfirmation()).init();
		(new Reflow.nissan.popinGeneric()).init();
		(new Reflow.nissan.tooltipManager()).init();
		(new Reflow.nissan.bluetoothManager()).init();
		(new Reflow.nissan.emag.historyTabs()).init();
		(new Reflow.nissan.starRating()).init();
		Reflow.nissan.placeHolderFix();
		
		//Offers
		if (typeof jQuery.fn.bxSlider !== "undefined") {
			$('.list-slider').each(function () {
					if (jQuery(".item", this).length > 3) {
						jQuery(this).bxSlider({
							displaySlideQty: 3
						});
					}
			});
		}
		if ( (typeof jQuery.fn.pajinate !== "undefined") && !(jQuery("[data-edit-mode]").length > 0) ) {
			$('#ofr-page').pajinate({
				num_page_links_to_display: 3,
				items_per_page: 5,
				item_container_id: ".ofr-page-content",
				nav_panel_id: ".ofr-pager .pager-lk",
				show_first_last: false
			});
		}
		(new Reflow.nissan.tabs()).init();
		(new Reflow.nissan.deploy()).init();
		(new Reflow.nissan.popinZoom()).init();	
		(new Reflow.nissan.inZoom()).init();	
		
		if (jQuery("[data-edit-mode]").length > 0) {
			
			(new Reflow.nissan.edit()).init();
			
		}
		
		
		//Aftersales
		(new Reflow.nissan.tabsDisplay()).init();
		(new Reflow.nissan.confirmPrice()).init();
		(new Reflow.nissan.booking()).init();
		
		//sortable Mygarage order
		(new Reflow.nissan.myGarageOrder()).init();
		
		//(new Reflow.nissan.deleteForm()).init();
		
		if (typeof jQuery.tools != "undefined") {
			
			jQuery("form").attr("novalidate","novalidate");
            //treat all forms and find required="required" fields or ".radio-required" classes fields to check
            Reflow.nissan.initForms("form");
        }
		
		
		Reflow.nissan.fixIEs();

		if(typeof swfobject !== "undefined") {
			swfobject.embedSWF(flashNavigationParam.file, "global-flash-header", "100%", "100%", "9.0.0", flashNavigationParam.expressinstall, flashvarsHeader, paramsHeader, attributesHeader);
			swfobject.embedSWF(flashNavigationParam.file, "global-flash-footer", "100%", "100%", "9.0.0", flashNavigationParam.expressinstall, flashvarsFooter, paramsFooter, attributesFooter);
			
		}
	}
};

Reflow.nissan.innerShiv = (function() {
	var d, r;
	
	return function(h, u) {
		if (!d) {
			d = document.createElement('div');
			r = document.createDocumentFragment();
			/*@cc_on d.style.display = 'none';@*/
		}
		
		var e = d.cloneNode(true);
		/*@cc_on document.body.appendChild(e);@*/
		e.innerHTML = h;
		/*@cc_on document.body.removeChild(e);@*/
		
		if (u === false) return e.childNodes;
		
		var f = r.cloneNode(true), i = e.childNodes.length;
		while (i--) f.appendChild(e.firstChild);
		
		return f;
	}
}());

jQuery(document).ready(function() {
    Reflow.nissan.init();
});
