var mb = mb?mb:{};

/**
 * MB forms js
 */
mb.forms = new ( function($) 
{
    var me = this;
    me.zipIsValid = true;
    me.vehChanged = false;
    var financeOptionsTerms = {};
	mb.broadcaster.addListener( mb.events.INITED, function() { mb.forms.init(); });

	/**
	 * must be call by application
	 */
	me.init = function()
	{
		mb.logger.info("forms.init()");

		mb.broadcaster.addListener( mb.events.PAGE_LOADED, function(e,args) {
            mb.forms.onPageLoaded(e);
        });
		
		mb.broadcaster.addListener( mb.events.FRAGMENT_LOADED, function(e,args) {
            mb.forms.onFragmentLoaded(e);
        });

	};

	/**
	 * handles the page load event to complete initializing/setup
	 */
	me.onPageLoaded = function( d ) {
		initPageStyles( d );
	};

	me.onFragmentLoaded = function( d ) {
    
        var node = d.getNode();
        var section = d.getProperty('section');
        var subsection = d.getProperty('subsection');
		var contextPath = d.getProperty("contextPath");
		
		//Disable email list for global uncheck.(Manage Email Subscription)
		if(d.getProperty("subsection") == "subscribe") {
			$("#form-manage-interests input#optIn").change(function(){
				if(!$(this).is(":checked"))
				{
					$("#form-manage-interests fieldset input").attr("disabled",true); 
					
				}
				else
				{
					$("#form-manage-interests fieldset input").attr("disabled",false); 
				}
				
			});
			 
		}
		
        if (section == 'vehicles' && subsection == 'email'){
            mb.forms.wireEmail();
        } else if (
                (section == 'vehicles' && subsection == 'email-confirmation')
                || (section == 'dealers' && subsection == 'email-confirmation')
            ){

            $('.continue').click(function(){
                mb.modal.hide(node);
                return false;
            });
        } 
        

        /* Payment Estimator Modal */
        if(d.getProperty("subsection") == "payment-estimator-modal") {
        	mb.logger.info('payment-estimator-modal');
        	createGAEventTag('Contact_Form', 'Contact_Form:Start', 'Contact_Form:Payment_Estimator');
        	
        	$("#baseImg").val($(".composite img.base").attr("src"));
        	
        	//wire up print function
            $('#payment-estimator-footer .print').unbind('click').click(function(e){
            	e.preventDefault();
            	var data = $('#payment-estimator-form').serialize();
            	var zip = $('#zip').val();
            	data = data + '&zip='+zip;
            	$('#vehicles li.show').each(function(){
            		var img;
            		img = $('.composite img', this).attr('src'); 
            		
            		var baseImg = $('#baseImg').val();
            		var year = $('.year', this).text();
            		var modelName = $('.modelName', this).text();
            		var engine = $('.engine', this).text();
            		var power = $('.power', this).text();
            		var total = $('.total', this).text();
            		
                	data = data + '&img='+img+'&baseImg='+baseImg+'&year='+year+'&modelName='+modelName+'&engine='+engine+'&power='+power+'&total='+total;
            	});
            	window.open($(this).attr('href')+'?'+data + '&monthly1=' + $("#monthly1").text() + '&monthly2=' + $("#monthly2").text() + '&monthly3=' + $("#monthly3").text() );
            	return false;
            });
            
            // TODO fix hack
            if($("#type1").attr('value') != "") {
                $("#payment-form-2").show();
                $("#payment-estimator-footer").show();
                $(".payment-subheader-1").hide();
                $(".payment-subheader-2").show();
//				mb.metrics.trackInteraction( {"WT.si_x":2,"WT.si_n":"PaymentEstimator"} );
				mb.logger.info('***************************');
            } else {
                $("#payment-form-2").hide();
                $("#payment-estimator-footer").hide();
                $(".payment-subheader-1").show();
                $(".payment-subheader-2").hide();
            }
        
            // trigger the form change handler
            $("#payment-vehicle-select").change( function(){
                $("#payment-form-1 .show").removeClass("show");
                var vehicleId = $("#payment-vehicle-select").attr("value");                
                          	
                if(vehicleId == "--Select--" || vehicleId == "" || vehicleId.length ==0)
                {
                	vehicleId = "default";
                }
                	
                //vehicleId =  vehicleId == "--Select--" ?  "default" : vehicleId;
                mb.logger.info("payment-vehicle-select changed to "+vehicleId);
                $("#vehicle-"+vehicleId).addClass("show"); 
                var msrp = $("#vehicle-"+vehicleId+" #vehicle-msrp").text();
                $("#msrp").val(parseInt(msrp));
                
                $(".col2 .btn-gray-gradient.track-click ").show();
                $("input#zip").removeAttr('disabled');
                $("#payment-form-2").hide();
                $("#payment-estimator-footer").hide();
                $(".payment-subheader-1").show();
                $(".payment-subheader-2").hide();
                
                me.vehChanged = true;
            });

            $("#payment-vehicle-select").trigger('change');
            
            // ajax form
            var form = $("#payment-estimator-form");
            
            // financial options change
            $('select.payment-type').bind('change', function() {
                if( $(this).val() == 'Lease' ) {
                    $(this).closest('ul').find('input.payment-rate').val('N/A').attr('disabled','disabled');                    
                    $(this).closest('ul').find('select.payment-miles option:selected').text($(this).closest('ul').find('select.payment-miles option:selected').val() + ',000');
                    $(this).closest('ul').find('select.payment-miles').removeAttr('disabled');
                    
                } else {
                	$(this).closest('ul').find('select.payment-miles option:selected').text('N/A');
                    $(this).closest('ul').find('select.payment-miles').attr('disabled','disabled');                    
                    $(this).closest('ul').find('input.payment-rate').val('').removeAttr('disabled');
                }
                
                var paymentTypeElement = form.find('select.payment-term').eq(parseInt($(this).attr("id").slice(-1))-1); 
                $(paymentTypeElement).empty();
                for(var i=0; i < financeOptionsTerms[$(this).val()].length; i++ )
                	$(paymentTypeElement).append( '<option value="' + financeOptionsTerms[$(this).val()][i] + '">' + financeOptionsTerms[$(this).val()][i] + ' Months</option>' );
                
            } );
            
            $(".btn-gray-gradient.submit:not(#payment-estimator-footer a)").click(function() {
            	me.btnLabel = $(this).text();
                $(form).submit();
                return false;
            });
            
            $("#zip").keyup(function(event){
            	  if(event.keyCode == 13){
            	    $("#viewEstimator").click();
            	  }
            	  return false;
            	});

            $('#payment-estimator-form input[name=zip]').bind('keydown', mb.numbersOnly);
            
            $(form).submit(function(){
            	// validate
                $(".error").removeClass('error');
                $("#errorMsg").text("");
                $("#errorMsg2").text("");
                
            	var msrp = $(".specs.show").find("#vehicle-msrp").text().split(".")[0];
            	$("input#msrp").val(msrp);
                
            	var paySelect = $("#payment-vehicle-select").attr("value");            	
                if(paySelect == "--Select--" || paySelect == "" || paySelect.length ==0)
                {
                	$("#payment-vehicle-select").focus();                  
                    $("#errorMsg").addClass("error");
                    $(".error").text("Please select a vehicle.");
                	return false;
                }
                
            	var zip = $("#payment-form-1").find("input#zip").val();
                if(zip == "")
                {
                	$("input#zip").focus();                    
                    $("#errorMsg").addClass("error");
                    $(".error").text("Please enter your zip code.");
                	return false;
                }
                else if(zip.length != 5)
                {
                	$("input#zip").focus();                    
                    $("#errorMsg").addClass("error");
                    $(".error").text("Please enter valid zip code.");
                	return false;
                }
                

                $('#payment-estimator-form input[name=payment1]').bind('keydown', mb.numbersOnly);
                $('#payment-estimator-form input[name=payment2]').bind('keydown', mb.numbersOnly);
                $('#payment-estimator-form input[name=payment3]').bind('keydown', mb.numbersOnly);
                             
                var downPayment = $(".down-payment");              
                if($(downPayment[0]).val() == "")
                	$(downPayment[0]).val("0");
                if($(downPayment[1]).val() == "")
                	$(downPayment[1]).val("0");
                if($(downPayment[2]).val() == "")
                	$(downPayment[2]).val("0");
                
         
                for(var i=0; i < 3; i++)
                {                	
	                if (isNaN($(downPayment[i]).val()))
                {
	                	$("#errorMsg2").addClass("error");
	                	var temp = i+1;
	                	$("#errorMsg2").html("Option " + temp +  " : Please enter numbers only for down payment.");
	                	return false;
	                }
	                
	                if($(downPayment[i]).val() >= 1000000)
	                {
	                	$("#errorMsg2").addClass("error");
	                	var temp = i+1;
	                	$("#errorMsg2").html("Option " + temp +  " : The down payment plus the trade-in amount exceeds the allowed amount.<br>Please enter an amount not greater than 25% of MSRP.");
	                	return false;
	                }	                
	                }
                
                $('#payment-estimator-form .payment-rate').bind('keydown', mb.decimalsOnly);
                if($('#payment-estimator-form input[name=rate1]').val() == "")
                	$('#payment-estimator-form input[name=rate1]').val("0");
                if($('#payment-estimator-form input[name=rate2]').val() == "")
                	$('#payment-estimator-form input[name=rate2]').val("0");
                if($('#payment-estimator-form input[name=rate3]').val() == "")
                	$('#payment-estimator-form input[name=rate3]').val("0");
                
                if($("#type1").attr("value") == "Finance" || $("#type1").attr("value") == "Balloon") {
                    if($("input#rate1").val() > 99.99) {
                        $("input#rate1").focus();
                        $("input#rate1").addClass("error");
                        $("#errorMsg2").addClass("error");
                    	$("#errorMsg2").html("Option 1: Interest rate is in invalid range. Valid range: 0 to 99.99");
                        return false;
                    }
                }
                if($("#type2").attr("value") == "Finance" || $("#type2").attr("value") == "Balloon") {
                    if($("input#rate2").val() > 99.99) {
                        $("input#rate2").focus();
                        $("input#rate2").addClass("error");
                        $("#errorMsg2").addClass("error");
                    	$("#errorMsg2").html("Option 2: Interest rate is in invalid range. Valid range: 0 to 99.99");
                        return false;
                    }
                }
                if($("#type3").attr("value") == "Finance" || $("#type3").attr("value") == "Balloon") {
                    if($("input#rate3").val() > 99.99) {
                        $("input#rate3").focus(); 
                        $("input#rate3").addClass("error");
                        $("#errorMsg2").addClass("error");
                    	$("#errorMsg2").html("Option 3: Interest rate is in invalid range. Valid range: 0 to 99.99");
                        return false;
                    }
                }
                
                if($("#payment-vehicle-select").attr("value") != "--Select--")
                {
                	$('.spinner').show();     
                	$('#payment-estimator-form').css('opacity', 0.1);
                }

                var vehicleModel = $('select[name=model] option:selected').val();

                var contactDealerHref = $('#payment-estimator-footer a.btn-gray-gradient').attr("href");

				if(contactDealerHref.indexOf("?model=") == -1 ) {
					contactDealerHref += "/model-" + vehicleModel;
				}

                $('#payment-estimator-footer a.btn-gray-gradient').attr("href",contactDealerHref);

                var elements = form.find('input').add( form.find('select') );
                var params = {};
                
                elements.each( function(i) {
                    if( $(this).attr('name') != 'veh' )
                        params[ $(this).attr('name')] = $(this).val() == 'N/A' || !$(this).val() ? '' : $(this).val();
                } );
                
                if(me.vehChanged == true)
                {
                	params['type1'] = "";               	
                }
               
               params.year = $('select[name=model] option:selected').text().substring(0,4);
               //MBF accepts C300W instead of C300WZ hence changing it before passing it to MBF
               if(params.model == "C300WZ"){
            	   params.model = "C300W";
               }
				//GA Event Tag
                var GAlabel = "View Estimators";
                if (params.model != "") {
                    GAlabel += ":" + params.model;
                }
                createGAEventTag('Payment Estimator', 'Views', GAlabel);
                
                for(var j in params) mb.logger.log('====>'+ j + ' : '+ params[j]);

                $.ajax( {url:contextPath + '/json/paymentEstimator', dataType:'json', data:params, success:function(data) { 
                    // Map the namespaces
                    for( var i in data['Response'] ) {
                        if( /.*\/schema\/page$/.test(data['Response'][i]) )
                            var nsPage = i.replace(/@xmlns:?/, '') + ':';
                        if( /.*\/schema\/entity$/.test(data['Response'][i]) )
                            var nsEntity = i.replace(/@xmlns:?/, '') + ':';
                    }

                    if( data['Response'] && data['Response']['value'] ) {

                        if( data['Response']['value'][nsPage + 'referenceData'] ) {
                            var reference = data['Response']['value'][nsPage + 'referenceData'];

                            form.find('select.payment-type').empty();
                            for(var i=0; i < reference[nsEntity + 'type'].length; i++ )
                            {
                            	if(i == 2)                       
                            		form.find('select.payment-type').append( '<option value="' + reference[nsEntity + 'type'][i] + '">' + reference[nsEntity + 'type'][i] + ' Finance</option>' );
                            	else
                            		form.find('select.payment-type').append( '<option value="' + reference[nsEntity + 'type'][i] + '">' + reference[nsEntity + 'type'][i] + '</option>' );
                            	
                            	var type = (reference[nsEntity + 'type'][i]).toLowerCase();
                            	if(type == 'balloon') type = 'balloonFinance';
                            	
                            	var arrTerms = new Array();
                            	 for(var k=0; k < reference[nsEntity + type + 'Term'].length; k++ )
                            		 arrTerms.push(reference[nsEntity + type + 'Term'][k]);

                            	 financeOptionsTerms[reference[nsEntity + 'type'][i]] = arrTerms;
                               
                            }
                           /* form.find('select.payment-term').empty();
                            for(var i=0; i < reference[nsEntity + 'leaseTerm'].length; i++ )
                                form.find('select.payment-term').append( '<option value="' + reference[nsEntity + 'leaseTerm'][i] + '">' + reference[nsEntity + 'leaseTerm'][i] + ' Months</option>' );
                            */

                             
                            form.find('select.payment-miles').empty();
                            for(var i=0; i < reference[nsEntity + 'leaseMiles'].length; i++ )
                                form.find('select.payment-miles').append( '<option value="' + reference[nsEntity + 'leaseMiles'][i] + '">' + me.formatNumber(reference[nsEntity + 'leaseMiles'][i] + '000') + '</option>' );

                            $('#payment-form-2').show();
                            $("#payment-estimator-footer").show();
                            $('.payment-subheader-1').hide();
                            $('.payment-subheader-2').show();

//							mb.metrics.trackInteraction( {"WT.si_x":2,"WT.si_n":"PaymentEstimator"} );
                        }
                        
                        setTimeout(function() {

	                        if( data['Response']['value'][nsPage + 'paymentEstimateForms'] ) {
	                            var estimates = data['Response']['value'][nsPage + 'paymentEstimateForms'];
	                            for( var i=0; i < estimates.length; i++ ) {
	                            	var type = (estimates[i][nsEntity + 'type']).toLowerCase();
	                            	if(type == 'balloon') type = 'balloonFinance';
	                            	form.find('select.payment-term').eq(i).empty();
	                                for(var t=0; t < reference[nsEntity + type + 'Term'].length; t++ )
	                                {
	                                	form.find('select.payment-term').eq(i).append( '<option value="' + reference[nsEntity + type + 'Term'][t] + '">' + reference[nsEntity + type + 'Term'][t] + ' Months</option>' );
	                                }

	                                form.find('input[name=payment' + (i+1) + ']').val( estimates[i][nsEntity + 'downPayment'] );
	                                form.find('select[name=term' + (i+1) + '] option[value=' + estimates[i][nsEntity + 'term'] + ']').attr('selected', 'selected');
	                                form.find('select[name=miles' + (i+1) + '] option[value=' + estimates[i][nsEntity + 'leaseMiles'] + ']').attr('selected', 'selected');
	                                form.find('#financed' + (i+1)).text( me.formatCurrency(parseInt(estimates[i][nsEntity + 'msrp'], 10) - parseInt(estimates[i][nsEntity + 'downPayment'], 10)) );
	
	                                form.find('select[name=type' + (i+1) + '] option[value=' + estimates[i][nsEntity + 'type'] + ']').attr('selected', 'selected');
	
	                                
	                                if( estimates[i][nsEntity + 'type'] == 'Lease') {
	                                    $("input#rate"  + (i+1)).val('N/A').attr("disabled","disabled");
	                                    $("select#miles"  + (i+1)).removeAttr("disabled");
	                                    $("select#miles"  + (i+1) + ' option:selected').text($("select#miles"  + (i+1) + ' option:selected').val()+ ',000');
	                                } else {
	                                    $("input#rate"  + (i+1)).val('').removeAttr("disabled");
	                                    $("select#miles"  + (i+1)).attr("disabled",'disabled');
	                                    $("select#miles"  + (i+1) + ' option:selected').text('N/A');	                                    
	                                }
	
	                                if( estimates[i][nsEntity + 'rate'] )
	                                    form.find('input[name=rate' + (i+1) + ']').val( estimates[i][nsEntity + 'rate'] );
	
	                            }
	                            
	                            if(me.btnLabel != "")
	                            {
	                            	$(".col2 .btn-gray-gradient.track-click ").hide();
	                            	$("input#zip").attr('disabled','disabled');
	                            }
	                            if(me.zipIsValid)
	                            {
	                            	$("#payment-estimator-footer").show();
		                            $(".payment-subheader-1").hide();
		                            $(".payment-subheader-2").show();
	                            }
	                            
	                            $('.spinner').hide();
	                            $('#payment-estimator-form').css('opacity', 1);
	                        }

                        }, 500);
                        
                        if( data['Response']['value'][nsPage + 'paymentEstimateResults'] ) {
                        	
                            var results = data['Response']['value'][nsPage + 'paymentEstimateResults'];
                            for( var i=0; i < results.length; i++ ) { 
                            	form.find('#monthly' + (i+1)).text( me.formatCurrency( results[i][nsEntity + 'monthlyPayment'] ) );
                            	
                                if(form.find('#monthly' + (i+1)).text() == "" && me.btnLabel.indexOf("Calc") != -1)
                                {
                                	var temp = i+1;
                                	$("#errorMsg2").addClass("error");
                                	$("#errorMsg2").html("Option " + temp +  " : The down payment plus the trade-in amount exceeds the allowed amount.<br>Please enter an amount not greater than 25% of MSRP.");
                                }
                                
                                if(form.find('#monthly' + (i+1)).text() == "$0"){
                                	form.find('#monthly' + (i+1)).text("No Data Available");
                                }
                                else{
                                	form.find('#monthly' + (i+1)).text( me.formatCurrency( results[i][nsEntity + 'monthlyPayment'] ) );
                                }
                            }
                        }
                    }
                    //  Track "Apply for Credit" clicks
                    $('.apply-credit-track-link').click(function() {
                        var metricsParam = {
                            type : 'GA',
                            trackType : '_trackEvent',
                            category : 'outbound-apply-for-credit',
                            action : 'Apply for Credit',
                            label : 'Apply for Credit Financing:' + params.model 
                        };

                        mb.metrics.trackInteraction(metricsParam);
                    });
                    
                } , error:function (XMLHttpRequest, textStatus, errorThrown) {
                		$("#errorMsg2").addClass("error");
                		$("#errorMsg2").html("No data available for this vehicle.  Please select a different vehicle.");
	                    $('.spinner').hide();
                        $('#payment-estimator-form').css('opacity', 1);
                	} 
                });

                me.zipIsValid = true;
                me.vehChanged = false;
                return false;
            });
        }

	};

	/**
	 * initialize page styles
	 */
	var initPageStyles = function( d ) {

        mb.logger.log("mb.forms.initPageStyles");

        var section = d.getProperty("section")
            , subsection = d.getProperty("subsection")
        ;

        $(".apply-credit-footer").click(function(){
        	var params = {type:'GA',trackType:'_trackEvent',category:'outbound-apply-for-credit',action:'Apply for Credit',label:'Apply for Credit(Financing)'};
        	mb.metrics.trackInteraction(params);
        	mb.metrics.trackInteraction({type:'Atlas',action:'MBU_ApplyForCredit_Start'});
    	});
		
		 if( d.getProperty("subsection") == "owners_support"){			
				$.cookie('C_VID_CLASS_PATH', "", {path:"/mercedes/owners/videos/"});
				$.cookie('C_VID_CLASS_PATH', null, {path:"/mercedes/owners/videos/"});
		 }
        
        // Contact Us Dealers
        if( d.getProperty("section") == "contactus" && $('.vehicle-selector').length > 0 ) {
            me.initVehicleSelector();	
        }
        
        //Thinking Green
        if( d.getProperty("section") == "innovation")
        {
        	//Add GA event tag
        	$("#cta-link a").click(function(){
        		var pageLocation = $('.pp-subsection').text();
        		if(pageLocation.split(" ").length > 1)
        		{
        			pageLocation = pageLocation.split(" ")[1];        			
        		}
        		createGAEventTag('BrandHalo CTA', 'click', 'WHAT DRIVES US ('+pageLocation+')');
        	});
        }

        // Contact Us Dealer Thank You (Map)
        if( d.getProperty("section") == "contactus" )  {
        	
        	
        	if($.browser.mozilla){
        		var userAgent = navigator.userAgent.toLowerCase();
        		//Is it Firefox?
        		if(userAgent.indexOf('firefox') != -1){
	        		userAgent = userAgent.substring(userAgent.indexOf('firefox/') +8);
	        		userAgent = userAgent.substring(0,userAgent.indexOf('.'));
	        		version = userAgent;
	        		if(version == '2')
	        		{
	        			$("#contact-us .head").css({'overflow':'visible','height':'35px'});
	        			$("#contact-us #contact-messaging").css('margin-top','10px');
	        			$(".contactus #contact-us-submit .box-gray").css("padding","1px 30px 4px");
	        			$("#contact-us .head h1").css("height","33px");
	        			$("#contact-us #contact-messaging .brochure").css("top","165px");
	        			
	        		}
        		}
        	}
        	
        	if(d.getProperty("subsection") == "dealer" || d.getProperty("subsection") == "dealer-test-drive")
        	{
        		$('.head a').attr('href',$('.head a').attr('href')+"#"+$.cookie("currentBuildSection"));
        	}
        	
        	if(d.getProperty("subsection") == "dealer-thankyou" )
        	{
	            //set map icon image path
	            var iconImage = d.getProperty("contextPath") + '/images/icons/mbpushpin.png';
	            var pois = me.getPois($('.poi'));
	            var defaultZoomLevel = 10;
	            var mapWidth = 250;
	            var mapHeight = 230;
	            var myMap = new mb.Map(
	                'dealer-thankyou-map'
	                ,defaultZoomLevel
	                ,iconImage
	                ,mapWidth
	                ,mapHeight
	                ,false
	                ,pois
	            );
	            
	            if($("#contactType").val() == "MAIN_TD")
	            	createGAEventTag('Contact Us', 'Test Drive', 'Test Drive a Vehicle - Submit');
	            else
	            	createGAEventTag('Contact Us', 'Contact a Dealer', 'Contact a Dealer - Submit');
        	}
			else if(d.getProperty("subsection") == "forms-thankyou" )
			{
				//Hook up GA tags
				if($("#contactType").val() == "CU_GENERAL")
	            	createGAEventTag('Contact Us', 'General Request', 'General Requests - Submit');
				else if($("#contactType").val() == "CU_VEHICLE_INQUIRY")
	            	createGAEventTag('Contact Us', 'Vehicle Inquiry', 'Vehicle Inquiry - Submit');
				else if($("#contactType").val() == "CU_OWNERS_ASSISTANCE")
	            	createGAEventTag('Contact Us', 'Owners Assistance', 'Owners Assistance - Submit');
				else if($("#contactType").val() == "CU_CLASSIC_CENTER_CALIFORNIA")
	            	createGAEventTag('Contact Us', 'Classic Center California', 'Classic Center California - Submit');
			}
        }

		if ( d.getProperty("section") == "owners" ) {

            if ( d.getProperty("subsection") == "my-information" ) {
            	
				var node = d.getNode();
				
				//numeric field validation				
				$("input#zip").numeric();
	        	$("input#primary-number").numeric();
	        	$("input#secondary-number").numeric();
	        	
				var tabs = $('.category');
				var tabNavigation = $('<ul id="my-information-tabs" class="tabs"/>');
				tabs.each(function(){
					var label = $('legend', this).first().text();
					var tab = $('<li><a href="#'+this.id+'" rel="#'+this.id+'">'+label+'</a></li>');
					tab.appendTo(tabNavigation);
				});

				$('#my-information-form').before(tabNavigation);
				
				$('.tabs li a').click(function(e){
					e.preventDefault();
	                var tabId = $(this).attr("rel");
	                tabs.hide();
	                if(tabId == "#tab-email")
	                {
	                	$('body').addClass('esm');
	                }
	                else
	                {
	                	$('body').removeClass('esm');
	                }
	                mb.esm_widget.loadGlobalSignup();
	                
	                $('fieldset'+tabId).show();
	                $('.tabs li').removeClass("on");
	                $(this).parent().addClass("on");

				}).eq(0).click();
				
				
				$.validator.addClassRules({
					"form-zip": { 
						digits: true
						,minlength: 5
						,maxlength: 5
					}
					,"form-email": { 
						email: true
					}
				});
				
				//Setting global opt in flag
				$(".form-controls .update-profile").click(function() {
	                	if($("#tab-email .form-item input:checked").size() == 0){	                		
	                		 $('#optIn').attr("value","O");
	                	 }
	                	else{
	                		 $('#optIn').attr("value","I");
	                	}	              
				});   
                
				//Form validation
				$("#command").validate({
					rules: {
						password: {
							minlength: 6
						}
						,repassword: {
							required:  {
			 			        depends: function(element) {
							        return $("#password").val() != '';
							    }
							}
							,minlength: 6
						}
					}
			    	,messages: {
		    			monthlyPayment: "Please enter your monthly lease payment."
		    			,mileagePerYear: "Please enter your mileage allowed per year."
			    	}
			    	,errorPlacement: function(error, element) {
			    		if(error.size() > 0)
			    		{
			    			$("#error-container").addClass("error-messages");
			    			$("#error-container").html(error);
			    		}
			    	 }
		        });
            }

            if ( d.getProperty("subsection") == "update-vehicle" ) {
				var node = d.getNode();
				var year = new Date().getFullYear();

				$('#startDate').datepicker({
					buttonImage: d.getProperty("contextPath") + '/images/icons/form_calendar.png',
					buttonText: 'calendar',
					showOn: 'both',
					changeMonth: true,
					changeYear: true,
					maxDate: 0,
					minDate: '-100y',
					yearRange: '-80:+'+year
				});
				
				$('input[name="isLeased"]').click(function(){
					var val = $(this).val();
					if(val == 'L'){
						$('.lease-item').removeAttr('disabled');
					} else {
						$('.lease-item').attr('disabled', 'disabled');
					}
				});
				
				$('#warrantyLengthCode').change(function(){
					var index = this.selectedIndex;
					if(index == 0){
						$('#warrantyMileageCode').val('0');
						$('#warrantyLength').text('Warranty Expired');
						$('#warrantyMileage').text('Warranty Expired');
					} else {
						$('#warrantyLength').text(this.options[index].text);
					}
				});
				
				$('#warrantyMileageCode').change(function(){
					var index = this.selectedIndex;
					if(index == 0){
						$('#warrantyLengthCode').val('0');
						$('#warrantyLength').text('Warranty Expired');
						$('#warrantyMileage').text('Warranty Expired');
					} else {
						$('#warrantyMileage').text(this.options[index].text);
					}
				});
				
				if($('#isLeased1').attr('checked')){
					$('.lease-item').attr('disabled', 'disabled');
				}

				$.validator.addMethod('currency', function (value) { 
				    return /^(\d{1,8})(\.\d{2})?$/.test(value);
				}, "Must be in US currency format");
				$.validator.addMethod('charge', function (value) { 
				    return /^(\d{1})(\.\d{2})$/.test(value);
				}, "Must be in format 0.00");

				$("#command").validate({
					rules: {
				    	estimatedAnnualMileage: {
							required: true
							,digits: true
						}
				    	,totalMileage: {
							required: true
							,digits: true
						}
				    	,startDate: {
							required: true
							,date: true
						}
				    	,startMileage: {
							digits: true
				    	}
				    	,mileageCharge: {
							charge: true
				    	}
				    	,length: {
							digits: true
				    	}
				    	,monthlyPayment: {
							currency: true
				    	}
				    	,mileagePerYear: {
							digits: true
				    	}
					}
			    	,messages: {
		    			estimatedAnnualMileage: "Please enter your estimated annual mileage.",
		    			totalMileage: "Please enter your current mileage.",
		    			startMileage: "Please enter your odometer reading.",
		    			mileageCharge: "Please enter a valid excess mileage charge amount.",
		    			length: "Please enter your length of lease.",
		    			monthlyPayment: "Please enter your monthly lease payment.",
		    			mileagePerYear: "Please enter your mileage allowed per year."
			    	}
			    	,errorPlacement: function(error, element) {
			    		if(error.size() > 0)
			    		{
			    			$("#error-container").addClass("error-messages");
			    			$("#error-container").html(error);
			    		}
			    	 }
		        });

				//needs to be called after $.validate()
				$('.lease-item').each(function(){
					$(this).rules("add", {
	 			        required: {
		 			        depends: function(element) {
						        return $("#isLeased2").attr('checked');
						    }
			    		}
					}); 
				});

            }
		}


        if (
            (d.getProperty("section") == 'dealers' && d.getProperty("subsection") == 'email')
            ){
            
            me.wireEmail();
        }

        if ( section == 'contactus' || (section == 'vehicles' && subsection == 'configure') || (section == 'european_delivery_program' && subsection == 'configure') ) {
        	
        	
        			$("#dealer-locator-form").validate({
						rules:{zip:{required: true, digits: true, minlength: 5, maxlength: 5}}
						,messages: {
							zip : "Please enter a valid 5-digit zip code."
						}
						,errorPlacement: function(error, element) {
							if(error.size() > 0) {
								$("#error-container-dealer-zip").addClass("error-messages");
								$("#error-container-dealer-zip").empty().append(error);
							}
						}
						,submitHandler : function(form) {
                            locatorFormSubmitted(form, d.getProperty("subsection"));
	        	            return false;
	        	        }
					});
        			$(".dealer-locator-form-side").validate({
						rules:{zip:{required: true, digits: true, minlength: 5, maxlength: 5}}
						,messages: {
							zip : "Please enter a valid 5-digit zip code."
						}
						,errorPlacement: function(error, element) {
							if(error.size() > 0) {
								$("#error-container-dealer-zip").addClass("error-messages");
								$("#error-container-dealer-zip").empty().append(error);
							}
						}
						,submitHandler : function(form) {
                            locatorFormSubmitted(form, d.getProperty("subsection"));
	        	            return false;
	        	        }
					});
	        }

        if ($('.dealerInfoModule .form-dealer .dealer-locator-form-side').length) {
            
            //  Theme page with dealer module (mbrace comingsoon)

                $(".dealer-locator-form-side").validate({
                    rules:{zip:{required: true, digits: true, minlength: 5, maxlength: 5}}
                    ,messages: {
                        zip : "Please enter a valid 5-digit zip code."
                    }
                    ,errorPlacement: function(error, element) {
                        if(error.size() > 0) {
                            $('.dealerInfoModule .form-dealer .error-container-dealer-zip').addClass("error-messages");
                            $('.dealerInfoModule .form-dealer .error-container-dealer-zip').empty().append(error);
                        }
                    }
                    ,submitHandler : function(form) {
                        var metricsParam = {
                            type : 'GA',
                            trackType : '_trackEvent',
                            category : 'find_local_dealer',
                            action : 'find_local_dealer:submit_zip',
                            label : ''
                        };
                        locatorFormSubmittedInPage({
                            "form" : form
                            , "contextSelector" : '.three-col-tout-2'
                            , "callback" : 'onThemeDealerInfoFound'
                            , "metricsParam" : metricsParam
                            , "category" : d.getProperty("subsection")
                            });
                        return false;
                    }
                });
        }
        if ( section == "contactus") {

        	$(".selected-dealer .dealer-links .carat").click( 
        			function()
        			{
        				var textElements = $("#command").find("textarea").add( $("#command").find("input[type=text]"));
        				var str = "";
        				
        				textElements.each(        					
    						function(i) 
    						{	                         
	                            str += $(this).attr('id') + ":" + $(this).val() + ",";
	                        } 
    					);
        				$.cookie("contactData", str);
        			}
        	);
        	
        	var contactData = $.cookie("contactData");
        	if(contactData)
        	{
        		var tempArray = contactData.split(",");
        		var obj = {};
        		for(var i=0; i < tempArray.length; i++)
        		{
        			var formItem = tempArray[i].split(":");
        			obj[formItem[0]] = formItem[1];
        		}
        		
            	for(var t in obj) 
            	{
            		if(obj[t])
            			$("#"+t).val(obj[t]);
            	}         		
        	}
        	
        	
        	$("input#zip").numeric();
        	$("input#primary-number").numeric();
        	$("input#secondary-number").numeric();
        	
        	$(':input#topic1').attr('checked','checked');
        	$(':input.am').attr('checked','checked');
        	$(':input#optin').attr('checked','checked');
        	          
        	if ($(':input#form-topics')) {        		
        		var val = $("#selected-form-topic").text();        		
        		if (val && val != '') {
        			$("input[value=" + val + "]").attr("checked", true).attr("defaultChecked", true);
        		}
        	}
        	
        	var testdrivedate = new Date($('#test-drive-date').attr('value'));
        	$('#apt-month').attr('value',testdrivedate.getMonth()+1);
        	$('#apt-day').attr('value',testdrivedate.getDate());
        	$('#apt-year').attr('value',testdrivedate.getFullYear());
        	
        	/*
        	 *Selected date should be greater than current date. 
        	 */
        	$.validator.addMethod("customValidateDate",function(value, element) {
        		var currDate = new Date();
        		return Date.parse(value) >= Date.parse(currDate)
        	}
        	,"Enter valid Date");
        	/*
        	$.validator.addMethod("zip", function(value, element) {
        		return this.optional(element) || /^(\d{5})(-\d{4})?$/.test(value);
        	}, "Please enter a valid zip code");
			*/
        	$.validator.addMethod("properName", function(value, element) {
                return this.optional(element) || /^[a-zA-Z]+(([\'\,\.\-\ ][a-zA-Z])?[a-zA-Z]*)*$/.test(value);
            }
            , "Proper names only please");
            

        	$.validator.addMethod("middleInitial", function(value, element) {
                return this.optional(element) || /[a-zA-Z]/.test(value);
            }
            , "Proper names only please");
                
            $.validator.addMethod("address", function(value, element) {
                return this.optional(element) || /^[a-zA-Z0-9]+(([\'\,\.\-\ ][a-zA-Z0-9])?[a-zA-Z0-9]*)*$/.test(value);
            }
            , "Valid addresses only please");
            
            $.validator.addMethod('vin', function (value, element) { 
		    return this.optional(element) || /^[A-Za-z0-9]*[A-Za-z0-9]$/.test(value); 
			}, 'Please enter a valid VIN.');
                
                /*
            $.validator.addMethod("phoneUS", function(phone_number, element) {
                phone_number = phone_number.replace(/\s+/g, ""); 
            	return this.optional(element) || phone_number.length > 9 &&
            		phone_number.match(/^(1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/);
            }, "Please specify a valid phone number");

            if( $.alphanumeric ) {
                $("#command [name=firstName]").alphanumeric({allow:"-[]',._"});
                $("#command [name=lastName]").alphanumeric({allow:"-[]',._"});
                $("#command [name=address.street]").alphanumeric({allow:"-[]',._"});
                $("#command [name=address.city]").alphanumeric({allow:"-[]',._"});
                $("#command [name=address.state]").alphanumeric({allow:"-[]',._"});
                $("#command [name=address.zip]").numeric();
                $("#primary-number").numeric();
                $("#secondary-number").numeric();
                $("#comments").alphanumeric({allow:"-[]',._"});
            }
			*/
            $("#command").validate({
	            rules : {
	    			prefix : {'required': !$('#command [name=prefix]').is('.optional') }
	    			,firstName : 
	    			{
	    				required : true
	    				, properName : true
	    			}
	    			,middleName : 
	    			{
	    				required : false
	    				, middleInitial : true
	    				, maxlength : 1
	    			}
	    			,lastName : 
	    			{
	    				required : true
	    				, properName : true
	    			}
	    			,'address.street' : (
	                        !$('#command [name=address.street]').is('.optional') ?
	                        { required : true, address: true } : 
	                        { required : false, address: true }
	                )
			        ,'address.city' : (
	                        !$('#command [name=address.city]').is('.optional') ?
	                        { required : true, properName: true } : 
	                        { required : false, properName: true }
	                )
			    	,'address.state' : {'required': !$('#command [name=address.state]').is('.optional') }
			    	,'address.zip' : (
                        !$('#command [name=address.zip]').is('.optional') ?
                        { required: true, digits: true, minlength: 5, maxlength: 5 } :
                        { required: false, digits: true, minlength: 5, maxlength: 5 }
                    )
			    	,email: {
		    	       required: true
		    	       ,email: true
		    	    }
                    ,'phones[0].phoneType' : {
                    	'required': !$('#command #primary-type').is('.optional') || '#primary-number:filled'
                    }
                    ,'phones[0].number' : {
                    	'required': !$('#command #primary-number').is('.optional') || '#primary-type:filled'
                    	,digits: true
                    	, minlength : 10
                    }
                    ,'phones[1].phoneType' : {
                    	required: '#secondary-number:filled'
                    }
                    ,'phones[1].number' : {
                    	required: "#secondary-type:filled"
                        ,digits: true
                    	, minlength : 10
                    }
                    ,comments: {
                    	required: false
                    	,maxlength: 1000
                    }
                    ,vehicleIdNumber: {
                    	required: false
                    	,vin : true
                    	,maxlength: 17
                    }
                    ,testDriveDate : {
                        required : true
                        , required : "#apt-month-type:blank" && "#apt-day:blank" && "#apt-year:blank"
                        , date : true
                        ,customValidateDate : true
                    }
                    ,'vehicleModel': 'required'
                    ,'vehicleClass': 'required'
                    ,'dealerId': 'required'
	            }
		    	,messages: {
		    		prefix : "Please enter your prefix."
		    		,firstName:
	    			{
	    				required : "Please enter your first name"
	    				, properName : "Please enter a valid first name"
	    			}
	    			,middleName : 
	    			{
	    				middleInitial : "Please enter a valid middle initial"
	    			}
		    		,lastName:
	    			{
	    				required : "Please enter your last name"
	    				, properName : "Please enter a valid last name"
	    			}
		    		,email: {
                       required: "Please enter your email address"
                       ,email: "Please enter a valid email address"
                    }
			    	,'address.street': {
	                   required: "Please enter your address"
	                   ,address: "Please enter a valid address"
	                }
			    	,'address.city': {
		               required: "Please enter your city"
			           ,properName: "Please enter a valid city"
			    	}
			    	,'address.state': "Please select your state"
			    	,'address.zip': {
                       required: "Please enter a valid 5-digit zip code"
                       ,digits: "Please enter a valid 5-digit zip code"
                       ,minlength: "Please enter a valid 5-digit zip code"
                       ,maxlength: "Please enter a valid 5-digit zip code"
                    }
                    ,'phones[0].phoneType' : "Please select the home or work or mobile for primary phone number"
                    ,'phones[0].number' :
                    {
                    	required: "Please enter your primary phone number."
                    	, digits: "Please enter only numbers"
                    	, minlength : "Your phone number must contain at least 10 digits"
                    }
                    ,'phones[1].phoneType' : "Please select the home or work or mobile for secondary phone number"
                    ,'phones[1].number' : {
                    	required: "Please enter your secondary phone number"
                    	,digits: "Please enter only numbers"
                    	, minlength : "Your phone number must contain at least 10 digits"
                    }
                    ,vehicleIdNumber: {
                    	required: "Please enter your VIN"
                    	,vin: "Please enter a valid VIN"
                    	,maxlength: "VIN must not exceed 17 letters and numbers"
                    }
                    ,testDriveDate : "Please select a valid Date."
                    ,customValidateDate : "Please Enter a valid Date"
                    ,vehicleModel : "Please select a vehicle model"
                    ,vehicleClass : "Please select a vehicle class"
                    ,dealerId : "Please select a preferred dealer"
                }
		    	,errorPlacement: function(error, element) {
		    		if(error.size() > 0)
		    		{
		    			$("#error-container").addClass("error-messages");
		    			$("#error-container").append(error);
		    			
		    		}
		    	 }
            });

            if ( subsection == "dealer-test-drive") {

                $('.form-topics-test-drive input[type=radio]').eq(0).attr("checked","checked");

                $('#date-picker-icon').click(function(){
                	var zIndex=1;
                    var month = $('select[name=aptMonth]').val()
                        , day = $('select[name=aptDay]').val()
                        , year = $('select[name=aptYear]').val();

                     if($.browser.msie && ($.browser.version == '6.0'||$.browser.version == '7.0')){
	                    $('select[name=aptMonth]').css('cssText','visibility:hidden');
	                    $('select[name=aptDay]').css('cssText','visibility:hidden');
	                    $('select[name=prefix]').css('cssText','visibility:hidden');
	                    zIndex=$('.form-personal').css('z-index');
	                    $('.form-personal').css('z-index', -1);
                    }
                    
                    var currentDate = new Date(year,month - 1,day);

                    var datePickerCont = $(this).parent().children('#date-picker-container');

                    datePickerCont.datepicker({
                        minDate: '0d'
                        ,maxDate: '1y'
                        ,onSelect: function(dateText, inst) { 

                        	if($.browser.msie && ($.browser.version == '6.0'||$.browser.version == '7.0')){
        	                    $('select[name=aptMonth]').css('cssText','visibility:visible');
        	                    $('select[name=aptDay]').css('cssText','visibility:visible');
        	                    $('select[name=prefix]').css('cssText','visibility:visible');
        	                    $('.form-personal').css('z-index', zIndex);
                            }
                            
                            var selMonth = inst.selectedMonth + 1;
                            var selDay = inst.selectedDay;
                            var selYear = inst.selectedYear;

                            $('select[name=aptMonth]').val(selMonth);
                            $('select[name=aptDay]').val(selDay);
                            $('select[name=aptYear]').val(selYear);

                            $('#test-drive-date').val(selMonth + "/" + selDay + "/" + selYear);

                            datePickerCont.datepicker('destroy');
                        }
                    });

                    return false;
                });

                $('.form-topics-test-drive select').change(function(){

                    var selects = $('.form-topics-test-drive select')
                        , selectsSize = $('.form-topics-test-drive select').length
                        , dateString = '';
                    
                    $.each(selects, function(key, value){
                        dateString += $(value).val() + (key == (selectsSize - 1) ? '' : '/');    
                    });


                    $('#test-drive-date').val(dateString);

                });

            }
            
            me.setContactusFormTabs();
        }

    };
    
    /*
        Post dealer locator search and handle ajax response for a dealer locator in page (not modal)
        @param opt {
            form: object submited form
            contextSelector: string to target the form container (just for preloader displaying)
            callback: function member of me to be caled for hiding elements when dealer data arrives 
            metricsParam: object metricsParam
            category: string Category for analytics
        }
    */
    var locatorFormSubmittedInPage = function(opt) {

        //  loading mode
        mb.contactforms.enterLoadingMode(opt.contextSelector);

        if (typeof opt.metricsParam !== 'undefined' && opt.metricsParam != {}) {           
            mb.metrics.trackInteraction(opt.metricsParam);
        }
        var url = $(opt.form).attr("action") + '/modal';
        var data = $(opt.form).serialize();
        if (typeof opt.category !== 'undefined') {
            data += '&category=' + opt.category;
        }
        url += url.indexOf("?") > -1 ? "&" : "?"; 
        mb.loadFragment(url,data,function(d) {

            //  loading mode off
            mb.contactforms.exitLoadingMode(opt.contextSelector);

            var node = d.getNode();
            var id = $(node).find("#dealer-id").text();

            mb.logger.log( "inpPage dealer id: " );
            mb.logger.log( $(node) );
            mb.logger.log( id );

            var dealerResult = $(node).find('#dealer-result');
            
            if (typeof opt.callback !== 'undefined') {
                me[opt.callback]();
            }
            if ($('.dealer-locator-control-box-side').length) {
                var dealerResultSide = $(node).find('#dealer-result-side');
                $('.dealer-locator-control-box-side').html(dealerResultSide);
                mb.contactforms.modalFormHijack($('.dealer-locator-control-box-side'));
            }
            mb.contactforms.modalFormHijack(dealerResult);
            mb.metrics.wireNode($('.dealer-locator-control-box-side'));  //  binding for tracking is lost on frag loaded, rewire

        });
    };
    /*
        Post dealer locator search and handle ajax response
    */
    var locatorFormSubmitted = function(form, category) {
        //  Widgets to loading mode
        mb.contactforms.enterLoadingMode('#subnav-build .form-dealer');
        mb.contactforms.enterLoadingMode('#dealer-locator-control-box');

        var url = $(form).attr("action") + '/modal';
        var data = $(form).serialize();
        if( $('#contact-us').length > 0 )
            data += '&view=contact';
        if (typeof category !== 'undefined') {
            data += '&category=' + category;
        }
        url += url.indexOf("?") > -1 ? "&" : "?"; 
        mb.loadFragment(url,data,function(d) {

            //  loading mode off
            mb.contactforms.exitLoadingMode('#subnav-build .form-dealer');
            mb.contactforms.exitLoadingMode('#dealer-locator-control-box');

            /*  MR:
                As of BYO 1.5 redesign, I'm leaving stuff here that should be handled
                by BYO's onFragmentLoaded, but since it looks like this validator
                is invoked from other places, I find it risky to move it.
            */
            var node = d.getNode();
            var id = $(node).find("#dealer-id").text();

            mb.logger.log( "id: " );
            mb.logger.log( $(node) );
            mb.logger.log( id );

            var dealerResult = $(node).find('#dealer-result');
            
            $("#dealer-locator-control-box").html(dealerResult);
            $("#form-dealer-id").val(id);
            $("#form-dealer-name").val(id);
            //Hide BYO Summary dealer result title.
            mb.build.dealerFoundState();
            mb.build.updateChangeDealerSide();
            
            //  BYO 1.5
            if ($('.dealer-locator-control-box-side').length) {
                var dealerResultSide = $(node).find('#dealer-result-side');
                $('.dealer-locator-control-box-side').html(dealerResultSide);
            }
            if ($('.dealer-lat', $("#dealer-locator-control-box")).length > 0) {
                me.wireByoDealerMap("#dealer-locator-control-box", d.getProperty("contextPath"));
            }
            //  /BYO 1.5
            
            var metricsParam = {
                type : 'GA',
                trackType : '_trackEvent',
                category : 'find_local_dealer',
                action : 'find_local_dealer:submit_zip',
                label : ''
            };

            mb.metrics.trackInteraction(metricsParam);

            mb.contactforms.modalFormHijack(dealerResult);
            mb.metrics.wireNode($('.dealer-locator-control-box'));  //  binding for tracking is lost on frag loaded, rewire
            mb.metrics.wireNode($('.dealer-locator-control-box-side'));  //  binding for tracking is lost on frag loaded, rewire

        });
    };
    /*
    Use .dealer-lat and .dealer-loc text nodes found in DOM (restricted to domContextSel selector)
    to instanciate Mapquest in .map-dealer
    */
    me.wireByoDealerMap = function(domContextSel, contextPath) {
        //  SHOW MAP
        mb.logger.info("BYO 1.5  - Show map");
        var iconImage = contextPath + '/images/icons/mbpushpin.png';
        var defaultZoomLevel = 11;
        var maps = $('.map-dealer', $(domContextSel));
        var lat = $('.dealer-lat', $(domContextSel)).text();
        var lon = $('.dealer-lon', $(domContextSel)).text();
    
        if ($('#summary-tab .map-dealer').children().size() == 0) {
            myMap = new MQA.TileMap(maps[0],defaultZoomLevel,new MQA.LatLng(lat,lon));

            var mapSize = new MQA.Size(138,77);            
            myMap.setSize(mapSize);

            myIcon = new MQA.Icon(iconImage,43,35);
            var latLng = new MQA.LatLng(lat,lon);
            var poi = new MQA.Poi(latLng,myIcon);
            myMap.addShape(poi);
            maps.click(function() {
                var lat = $(this).siblings('.dealer-lat').text();
                var lon = $(this).siblings('.dealer-lon').text()
                var label = $(this).siblings('.dealer-name-single').text()
                var url = 'http://mapquest.com/?q=' + lat + ',' + lon + '('+ label +')';
                window.open(url);
            });
            
            MQA.EventManager.addListener(poi,"click",function() {     
                var lat = $(domContextSel).find('.dealer-lat').text();
                var lon = $(domContextSel).find('.dealer-lon').text()
                var label = $(domContextSel).find('.dealer-name-single').text()
                var url = 'http://mapquest.com/?q=' + lat + ',' + lon + '('+ label +')';
                window.open(url);
            });
        }
    };
    me.setContactusFormTabs = function ()
    {
    	var idx = 1;
        $(".vehicle-selector select").each(          	
        	function ()
        	{
        		$(this).attr("tabindex", idx);
        		idx++;
        	}
        	
        );
        
        $(".form-dealer :input").each(           	
        	function ()
        	{
        		if(this.type != "hidden")
            	{
            		$(this).attr("tabindex", idx);
            		idx++;
            	}
        	}
        	
         );
        
        $("#contact-form :input").each(
    		function ()
        	{
        		if(this.type != "hidden")
            	{
            		$(this).attr("tabindex", idx);
            		idx++;
            	}
        	}
         );
    }

    // Filter options in $subSelect based on id of selected item in $select
    me.filterVehicleSelection = function( $select, $subSelect ) {
        var className = $select.find('option:selected').attr('id');

        var $allOptions = $subSelect.data( 'allOptions' ).add(
            $('option', $subSelect).not('.default').remove()
        );

        if( className != '')
            $subSelect.append( $allOptions.filter('.' + className).remove() );

        $subSelect.data( 'allOptions', $allOptions );

        if (mb.defaultVehicleModel != null){
            $('option[value=' + mb.defaultVehicleModel + ']', $subSelect).attr('selected','selected').trigger('change');
        } else {
            $('.default', $subSelect).attr('selected','selected').trigger('change');
        }

    }
    
    me.getPois = function(poiContainers){
        var pois = new Array();
        $.each(poiContainers, function(i,v){
            pois.push({
                key : $(v).find('.key').text()
                ,lat : $(v).find('.latitude').text()
                ,lng : $(v).find('.longitude').text()
                ,title : $(v).find('.title').text()
                ,infoContent : $(v).find('.info-content-html').html()
            });
        });           
        return pois;
    };

    me.formatCurrency = function( num ) {
    	if(!num)
    	{
    		if(me.btnLabel.indexOf("Est") != -1)
    		{
	    		$("#errorMsg2").addClass("error");
	            $("#errorMsg2").text("The zip code is invalid.");
	            me.btnLabel = "";    
	            me.zipIsValid = false;
	            
	            $("#payment-form-2").hide();
                $("#payment-estimator-footer").hide();
                $(".payment-subheader-1").show();
                $(".payment-subheader-2").hide();
             }
            
            return "";
    	}
        num = num.toString().replace(/\$|\,/g,'');
        if(isNaN(num)) num = "0";
        for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
            num = num.substring(0,num.length-(4*i+3))+','+
            num.substring(num.length-(4*i+3));
        return '$' + num;
    }
    
    me.formatNumber = function( num ) {
    	if(!num)
    	{
            return "";
    	}
        num = num.toString().replace(/\$|\,/g,'');
        if(isNaN(num)) num = "0";
        for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
            num = num.substring(0,num.length-(4*i+3))+','+
            num.substring(num.length-(4*i+3));
        return  num;
    }

    me.wireEmail = function(){
        mb.logger.info("mb.forms.wireEmail()");


        $.validator.addMethod("multiemail", function(value, element) {
	        	var emails = value.split("," );
	        	valid = true;
	        	$(emails).each(function(index, element){
	        		valid = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test($.trim(element));
	        		if(!valid)
	        		{
	        			return false;        			
	        		}
	        	});
	        	return valid;
        	});

        $("#email-form:not(.email-form-container #email-form)").validate({
//        	debug: true,
            rules : {
                email : {
                    required : true
                    ,email : true
                }
		        ,recipientEmail : {
		        	multiemail: true,
		            required : true
		        }
		        ,comments: {
		            required: false,
		            maxlength: 200
		          }

        	}
	        ,messages: {
	    		email: {
	        		required: "Please enter your email address"
	               ,email: "Please enter a valid email address"
	             }
		    	,recipientEmail: {
		    		multiemail : "Please enter Valid email address",
		    		required: "Please enter the recipient's email address",
		    		email: "Please enter a valid email address"
	            }
		    	,comments: {
		    		maxlength: "Please enter no more than 200 characters"
		    	}
	        }	    	
            , submitHandler : function(form) {
                var loadUrl = $(form).attr("action");
                var data = $(form).serialize();
                var qs = loadUrl.indexOf("?") > -1 ? "&" : "?"; 
                mb.logger.log(data);
                mb.loadFragment(
                    loadUrl
                    ,data
                    ,function(doc){
                        mb.modal.show( doc.getNode(), "type2");
                        //On close of confirmation modal window clear out the email form
                        $(".email-confirmation").parent().prev("a").click(function(){
                        	$("#email-form").get(0).reset();
                        });
                    }
                    ,'POST'
                );
                return false;
            }
            ,invalidHandler: function(form, validator) {
                $.each(validator.currentElements,function(i,v){
                    $(v).not('textarea').hover(
                        function(){
                            if ($(this).hasClass('error')){
                                $(this).parent().find('h5').show();
                            }
                        }
                        ,function(){
                            $(this).parent().find('h5').hide();
                        }
                    );
                });
            }
        });
    };

	me.toggleOptions = function(e){
		var showOptins = $('input[name^="newsletterOptinInfo"]').first();
		var otherOptins = $('input[name^="newsletterOptinInfo"]').not(showOptins);
		if( showOptins.is(':checked') ){
			otherOptins.removeAttr('disabled');
		} else {
            otherOptins.attr('disabled', 'disabled');
		}
	};
    me.initVehicleSelector = function() {
        // Hide and store values
        $('#vehicle-model-select').each( function() {
            var className = $(this).find('option:selected').attr('className');
            var data = $(this).children().not('.' + className).not('.default').remove();                
            $(this).data( 'allOptions', data );
        });

        // Bind change event
        $('#vehicle-class-select').bind('change', function() {
            me.filterVehicleSelection( $(this), $('#vehicle-model-select') );
            mb.logger.log('trigger class change!');
        });

        //Hide change dealership link when on DWS
        if($.cookie('embed') == 'true')
        {
            $(".change-dealership").hide();
        }
        
        if (mb.defaultVehicleClass != null){
            me.filterVehicleSelection( $('#vehicle-class-select'), $('#vehicle-model-select') );
            $('.vehicle-selector-image').html( mb.vehicleModelImages[ mb.defaultVehicleModel ] );
        }

        // Update image on model select
        $('#vehicle-model-select').bind('change', function() {
            setTimeout( function() {
                if( mb.vehicleModelImages ) {
                    if( mb.vehicleModelImages[ $("#vehicle-model-select").val() ] )
                        $('.vehicle-selector-image').html( mb.vehicleModelImages[ $("#vehicle-model-select").val() ] );
                    else
                        $('.vehicle-selector-image').html( mb.vehicleModelImages[ 'default' ] );
                }
                mb.logger.log('trigger image change!');
            }, 1);
        });
    };
    me.onThemeDealerInfoFound = function() {
        $('.dealerInfoModule .form-dealer h3').hide();
    };
	
})(jQuery);

