(function ($) {
	// add custom validation methods
	$.validator.addMethod('state', function (value, el) {
		return this.optional(el) || /^([a-z]|[A-Z]){2}$/.test(value);
	}, 'Please enter a valid two-character state code.');
	
	$.validator.addMethod('phone', function (value, el, params) {
		return this.optional(el) || /^[01]?[- .]?\(?[2-9]\d{2}\)?[- .]?\d{3}[- .]?\d{4}$/.test(value);
	}, 'Please enter a valid US or Canadian phone number.');
	
	$.validator.addMethod('email', function (value, el, params) {
		return this.optional(el) || /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/.test(value);
	}, 'Please enter a valid email address.');
	
	$.validator.addMethod('postalCode', function (value, el) {
		return this.optional(el) || /^((\d{5}-\d{4})|(\d{5})|([A-Z]\d[A-Z]\s\d[A-Z]\d))$/.test(value);
	}, 'Please enter a valid US or Canadian postal code.');
	
	$.validator.addMethod('dependsOn', function (value, el, params) {
		return ($(params.el).val() !== params.being) || $(el).is(':filled');
	}, 'This field is required.');
	
	// add custom validation rules
	$.validator.addClassRules({
		name: {
			required: true,
			rangeLength: [3, 24]
		},
		phoneDependent: {
			dependsOn: {
				el: '#method',
				being: 'phone'
			},
			phone: true
		},
		emailDependent: {
			dependsOn: {
				el: '#method', 
				being: 'email'
			},
			email: true
		},
		address: {
			required: true,
			rangeLength: [3, 24]
		},
		city: {
			required: true,
			rangeLength: [3, 24]
		},
		state: {
			required: true,
			state: true
		},
		postalCode: {
			required: true,
			postalCode: true
		},
		password: {
			required: true,
			minLength: 5
		},
		password2: {
			required: true,
			minLength: 5,
			equalTo: '#password'
		}
	});
	// revalidate phone & email fields if contact method is changed by user
	$('#phoneMethod, #emailMethod').change(function () {
		validator.element('#phone');
		validator.element('#email');
	});
	// jQuery prototype plugins
	$.fn.extend({
		attachQuickTimeMovie: function (movieUrl) {
			// TODO:  rewrite in jQuery
			return $(this).each(function () {
				if(navigator.userAgent.indexOf('MSIE') !== -1) {
					var self = this;
					setTimeout(function () {
						self.innerHTML = [
							'<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" width="320" height="240" codebase="http://www.apple.com/qtactivex/qtplugin.cab"><param name="src" value="',
							movieUrl,
							'"><param name="autoplay" value="true"><param name="controller" value="false"></object>'
						].join('');
					}, 100);
				} else {
					this.innerHTML = '';
					var movie = document.createElement('embed');
					movie.type = 'video/quicktime';
					movie.src = movieUrl;
					movie.width = '400';
					movie.height = '301';
					movie.autoplay = 'true';
					movie.controller = 'false';
					this.appendChild(movie);
				}
			});
		}
	});
})(jQuery);
jQuery(function ($) {
	// detect IE7
	var msie7 = $.browser.msie && ($.browser.version === '7.0');
	// tabs
	$('.ddcTabs').tabs();
	// disabled paging links when no more pages
	$('a.ddcPrevPageDisabled, a.ddcNextPageDisabled').click(function () { return false; });
	// add class to actions on hover and click
	$('.ddcActions li').hover(function () {
		$(this).addClass('hover');
	}, function () {
		$(this).removeClass('hover').removeClass('click');
	}).mousedown(function () {
		$(this).addClass('click');
	}).mouseup(function () {
		$(this).removeClass('click');
	});
	// form validation, default values
	$('form.ddcForm').each(function () {
		// default value
		$('input[default], textarea[default]').each(function () {
			if (!$(this).val() && ($(this).val() !== $(this).attr('default'))) {
				$(this).val($(this).attr('default')).addClass('default').focus(function () {
					if ($(this).val() === $(this).attr('default'))
						$(this).removeClass('default').val('');
				}).blur(function () {
					if (!$(this).val() || ($(this).val() === $(this).attr('default')))
						$(this).val($(this).attr('default')).addClass('default');
				});
			}
		});
		$(this).submit(function () {
			$('input[default], textarea[default]').each(function () {
				var self = this;
				if ($(this).val() === $(this).attr('default')) {
					$(this).val('');
					setTimeout(function () {
						$(self).addClass('default').val($(self).attr('default'));
					}, 500);
				}
			});
		});
		// form validation
		$(this).validate();
	});
	// payment calculator
	var calculatePayment = function (price, rate, term, trade) {
		var loanPrice = price - (typeof trade === 'number' ? trade : 0);
		var monthlyRate = rate / 1200;
		var payment = (monthlyRate + (monthlyRate / (Math.pow(1 + monthlyRate, term) - 1))) * loanPrice;
		return ((typeof payment === 'number') && !isNaN(payment) && payment > 0) ? payment : -1;
	};
	var getPrice = function () { return ($('.price p > em').text().substr(1).replace(/\,/, '')); };
	var getRate = function () { return $('#rate').val(); };
	var getTrade = function () { return $('#trade').val(); };
	var getTerm = function () { return $('#term').val(); };
	var format = function (value) {
		return '$' + (((isNaN(parseFloat(value)) ? 0.00 : parseFloat(value)) < 0) ? '-' : '') + (function (s) { return (s === (s=s.replace(/^(.*\s)?([-+\u00A3\u20AC]?\d+)(\d{3}\b)/, '$1$2,$3')) ? s : arguments.callee(s)); })((parseInt((Math.abs((isNaN(parseFloat(value)) ? 0.00 : parseFloat(value))) + .005) * 100) / 100).toString());
	}
	var updatePayment = function () {
		var payment = format(calculatePayment(+getPrice(), +getRate() || 0.1, +getTerm(), +getTrade()));
		$('#ddcCalc .payment').text((payment !== '$-1') ? payment : 'Call');
	};
	$('#rate, #trade, #term').change(updatePayment).change();
	setInterval(updatePayment, 1000);
	// photo switching
	$('.ddcPrimaryVehicleImage img').load(function () { $(this).show(); });
	$('.ddcVehicleThumbs img').click(function () {
		$('.ddcPrimaryVehicleImage .movie').hide();
		$('.ddcPrimaryVehicleImage img').hide().attr('src', $(this).attr('src').replace(/thumb_/, ''));
		$('.enlarge a').attr('href', $(this).attr('src').replace(/thumb_/, ''));
	});
	// spins
	var showSpin = function () {
		var spinUrl = $('a', this).attr('href');
		$('.ddcPrimaryVehicleImage img').hide();
		$('.ddcPrimaryVehicleImage .movie').hide().attachQuickTimeMovie(spinUrl).show();
		return false;
	};
	$('<div />').addClass('movie').prependTo('.ddcPrimaryVehicleImage');
	$('.exteriorSpin, .interiorSpin').click(showSpin);
	
	// printing
	$('li.print').click(function () {
		window.print();
		return false;
	});
	// hide spin buttons if no spins
	if ($('li.exteriorSpin').attr('href') === '')
		$('li.exteriorSpin').hide();
	if ($('li.interiorSpin').attr('href') === '')
		$('li.interiorSpin').hide();
});
