﻿/**
 * JQUERY Initializer
 */
//jQuery(function($)
//{

$.createSingleton('X.DealerLocator', function()
{
	this.dealerId = null;
},
{
	init: function()
	{		
		// Add form validation for the global zipcode search
        jQuery.validation.Rules.add(new jQuery.validation.rule.ConditionallyRequired("dealer-loc-city-cond-req", {inputs: "#dl-address", andOr: "and"}));
		var options =
		{
			containerQuery: '#map-directions .from-address form',
			triggerQuery: '#map-directions .from-address form .btn-orange',
			triggerHandler: function(result)
			{
				$('.err-field').removeClass('err-field');
			},
			failureHandler: function(result)
			{
				result.errors[0].srcElement.parent().addClass('err-field');
			},
			successHandler: function(result)
			{
				var address = $(':text[name=\'address\']', result.container.containerElm).val();
				var city = $(':text[name=\'city\']', result.container.containerElm).val();
				var state = $('input[name=\'state\']', result.container.containerElm).val();
				var zip = $(':text[name=\'zipcode\']', result.container.containerElm).val();
								
				X.DealerLocator.getDirections({ address: address, city: city, state: state, zip: zip });
			}
		};
		new $.validation.Group(options);
		
		$('.modal-opener[rel*=modalId:\'map-directions\']').click(function(evt)
		{
			X.DealerLocator.setDealer($.evalJSON(this.rel).dealerId);
		});

        // Dealer Locator Zip code search
        options.containerQuery = '#dealer-zip-form-data';
        options.triggerQuery = '#dealer-zip-form-data .submit:first';	
        options.successHandler = function(result) 
        { 
            $('#dealer-zip-form-data .dealer-zip-form').submit(); 
        };
        new $.validation.Group(options);

        // Dealer Locator city search
        options.containerQuery = '#dealer-city-form-data';
        options.triggerQuery = '#dealer-city-form-data .submit:first';
        options.successHandler = function(result) { $('#dealer-city-form-data .dealer-city-form').submit(); };
        new $.validation.Group(options);

        // Dealer Locator name search
        options.containerQuery = '#dealer-name-form-data';
        options.triggerQuery = '#dealer-name-form-data .submit:first';
        options.successHandler = function(result) { $('#dealer-name-form-data .dealer-name-form').submit(); };
        new $.validation.Group(options);

	},
	
	reset: function(isFullReset)
	{
		var containerElm = $('#map-directions');
		
		if (isFullReset)
		{
			$('#map-image', containerElm).attr('src', '/images/spacer.gif');
			$('.to-address', containerElm).html('<p>Loading, please wait...</p>');
		}
		$('.directions', containerElm).empty();
		
		X.LoadingManager.start('loading-map-directions');
	},
	
	setDealer: function(dealerId, byPassLoadMap)
	{
		this.dealerId = dealerId;
		
		//if (byPassLoadMap === true) { return; }
		
		X.DealerLocator.getMap();
	},
	
	getMap: function(data)
	{		
		this.reset(true);
		
		X.JsonRequestManager.call('dealer-map',
		{
			url: configUrlTemplate(serviceUrls.dealerMapHandler, this.dealerId),
			cache: false,			
			success: this.onGetMapLoad.delegate(this),
			error: function(textStatus, msg) { alert('Error loading map data. Reason: ' + msg); }
		});
	},
	
	getDirections: function(data)
	{
		this.reset(false);
		
		data = $.extend({ address: '', city: '', state: '' }, data);
		
		X.JsonRequestManager.call('dealer-map',
		{
			url: configUrlTemplate(serviceUrls.dealerDirectionsHandler, this.dealerId, data.address, data.city, data.state, data.zip),			
			success: this.onGetDirectionsLoad.delegate(this),
			error: function(textStatus, msg) { alert('Error loading map directions data. Reason: ' + msg); }
		});
	},
	
	onGetMapLoad: function(data)
	{
		var containerElm = $('#map-directions');		
		$('#map-image', containerElm).attr('src', data.DealerMapImageUrl);
		$('.to-address', containerElm).html(this._getDealerAddressHtml(data));
		X.LoadingManager.stop('loading-map-directions');
	},
	
	onGetDirectionsLoad: function(data)
	{
		if (data.Error) {
		    $('.directions', containerElm).html('<div class="err-field">'+data.Error+'</div>');
		    X.LoadingManager.stop('loading-map-directions');
		} else {		
		    var containerElm = $('#map-directions');
		    $('#map-image', containerElm).attr('src', data.MapImageUrl); //.css({ width: data.MapImageWidth+'px', height: data.MapImageHeight+'px' })
		    $('.directions', containerElm).html(this._getDirectionsHtml(data));
		    X.LoadingManager.stop('loading-map-directions');
		}
	},
	
	_getDealerAddressHtml: function(data)
	{
		var html = [];
		html[html.length] = '<span class="label">To</span>';
        html[html.length] = '<span class="dealer">' + data.DealerName + '</span>';
        html[html.length] = '<span class="address-1">' + data.DealerAddress + '</span>';
        html[html.length] = '<span class="address2">' + data.DealerCity + ', ' + data.DealerState + '</span>';
        html[html.length] = '<span class="zip">' + data.DealerZip + '</span>';

		return html.join('');
	},
	
	_getDirectionsHtml: function(data)
	{
		var driveUnits = (data.DriveUnits === 'mi')? 'Mile(s)' : 'Kilometer(s)';
		
		var html = [];
		html[html.length] = '<span class="results-summary">Estimated Time: ' + data.DriveTimeHours + ' hour(s) ' + data.DriveTimeMinutes + ' min(s)</span>';
		html[html.length] = '<span class="results-summary">Distance: ' + data.DriveDistance + ' ' + driveUnits.toLowerCase() + '</span>';
		html[html.length] = '<div class="direction label">Directions</div>';
		html[html.length] = '<div class="mileage label">' + driveUnits + '</div>';
		for (var idx = 0, len = data.DriveSteps.length, step; idx < len; idx++)
		{
			step = data.DriveSteps[idx];
			html[html.length] = '<div class="direction-step">';
			html[html.length] = '	<div class="direction">';
			html[html.length] = '		<span>' + step.Number + '</span> ' + step.Text.unencodeHTML();
			html[html.length] = '	</div>';
			html[html.length] = '	<div class="mileage">' + step.Distance + '</div>';
			html[html.length] = '</div>';
		}
		
		return html.join('');
	}
});

$(document).ready(function(evt)
{
    X.DealerLocator.init();
    
    // setup dealer search criteria tabs
	$('.search-categories a').click(function(evt)
	{
	    evt.preventDefault();
        
        var elm = $(this);
        
        $('.search-categories a').each(function(idx)
        {
            $(this).removeClass('selected');        		
        });
        $('fieldset .field-group').each(function(idx)
        {
            $(this).removeClass('selected');        		
        });	        
        elm.addClass('selected');
        var tab = elm.attr('name');

        $('fieldset .'+tab).addClass('selected');
    });
    
    // setup dealer search list/map view panes
	$('.results-view a').click(function(evt)
	{
	    evt.preventDefault();
        
        var elm = $(this);
        
        var view = elm.attr('name');
        if ($('.results').hasClass('list-view'))
        {
            $('.results').removeClass('list-view');	           	            
        }
        else
        {
            $('.results').removeClass('map-view');
        }
        $('.results-view a').removeClass('selected');        		
        
        elm.addClass('selected');
        $('.results').addClass(view);
    });
});

//});
