var CORE = function () {
	return {};
}();

CORE.Utils = function () {
	var that = arguments.callee.prototype;
	that.getJson = function (settings, callback) {
		if (arguments[0].constructor != Object) settings = {};
		if (!settings.data) settings.data = '';
		if (!settings.url) return alert('No url provided.');
		if (!settings.dataType) settings.dataType = 'json';
		$.ajax({
			type: 'POST',
			url: settings.url,
			data: 'ajax=1&' + settings.data,
			dataType: settings.dataType,
			timeout: 15 * 1000, // quit trying after 5 secs
			success: function (data) {
				if (callback) callback(data);
			},
			error: function (xhr, status, error) {
				if (settings.error) {
					settings.error();
				} else {
					alert(status);
				}
			},
			complete: function () {
				if (settings.complete) settings.complete();
			}
		});
	};
	that.getCookie = function (name) {
		var i,x,y,ARRcookies=document.cookie.split(";");
		for (i=0;i<ARRcookies.length;i++) {
			x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
			y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
			x=x.replace(/^\s+|\s+$/g,"");
			if (x==name) return unescape(y);
		}
	};
	that.setCookie = function (name, value, exdays) {
		var exdate = new Date();
		exdate.setDate(exdate.getDate() + exdays);
		var val = escape(value) + ((exdays==null) ? "" : "; expires=" + exdate.toUTCString());
		document.cookie = name + "=" + val;
	}
	that.inArray = function (valOrArray, arr) {
		var i = arr.length;
		while (i--) if (arr[i] == valOrArray) return true;
		return false;
	};
	that.arrayIntersect = function (a1, a2) {
		var res = [];
		var i = a1.length;
		var j;
		while (i--) {
			j = a2.length;
			while (j--) {
				if (a1[i] == a2[j]) res.push(a1[i]);
			}
		}
		return res;
	};
	that.arrayDiff = function (a1, a2) {
		var res = [];
		var i = a1.length;
		var j, isMatch;
		while (i--) {
			j = a2.length;
			isMatch = false;
			while (j--) if (a1[i] == a2[j]) isMatch = true;
			if (!isMatch) res.push(a1[i]);
		}
		return res.reverse();
	};
	that.fixButton = function (isValid, button) {
		var isDisable = true;
		var opacity = 0.7;
		if (isValid) {
			isDisable = false;
			opacity = 1;
		}
		button.attr('disabled', isDisable).css('opacity', opacity);
	};
	that.prepareFormPop = function (link) {
		window.location.hash = '';
		var href = link.attr('href');
		var url = (/#scheduleTestDrive/.test(href)) ? '/shopping-tools/schedule-test-drive' : '/shopping-tools/get-quote';
		var vars = href.split(',');
		if (vars.length > 1) url += '?dealerCode=' + vars[1];
		var popup = new CORE.Popup('', false);
		popup.open(CORE.wwwroot + url, function () {
			var mainForm = new CORE.FormHandler({
				selector: '#mainForm',
				isHaltOnSuccess: true,
				callback: function () {
					$('#mainForm').fadeOut(function () {
						var container = $(this);
						container.find('#success').remove();
						container.empty().prepend('<div id="success">Thanks! Your information has been successfully submitted.</div>').fadeIn(function () {
							setTimeout(function () {
								popup.close();
							}, 2000);
						});
					});
				}
			});
			var dealerForm = new CORE.FindDealerForm('#findDealerForm');
		});
	};
};


CORE.Slider = function () {
	var that = arguments.callee.prototype;
	var opts = (arguments[0].constructor == Object) ? arguments[0] : {};
	if (!opts.selector) opts.selector = arguments[0];
	opts.stripeSelector = '.content';
	var posX = null;
	var objW = null;
	var shiftVal = 212;
	function init() {
		var container = $(opts.selector).find(opts.stripeSelector);
		if (container.length > 0) {
			posX = parseInt(container.css('left').replace('px', ''), 10);
			objW = shiftVal * container.find('a').length + 10;
			$(document).click(function (e) {
				var target = $(e.target);
				if (target.hasClass('prev')) {
					e.preventDefault();
					shift('prev');
				} else if (target.hasClass('next')) {
					e.preventDefault();
					shift('next');
				}
			});
			var a = container.find('a');
			a.each(function () {
				showCaption($(this));
			});
			adjustNav();
		}
	}
	function showCaption(obj) {
		var alt = obj.find('img').attr('alt');
		if (alt.length > 0) {
			var caption = obj.append('<div class="caption"><div class="text">' + alt + '</div><div class="bg"></div></div>').find('.caption').hide().fadeIn();
			caption.find('.bg').height(caption.height());
		}
	}
	function hideCaption(obj) {
		obj.find('.caption').fadeOut(function () {
			$(this).remove();
		});
	}
	function shift(direction, callback) {
		var time = 500;
		var moveX = (direction == 'next') ? -shiftVal : shiftVal;
		if (canBeMoved(direction)) {
			posX += moveX;
			var obj = $(opts.selector).find(opts.stripeSelector);
			obj.animate({
				left: '+=' + moveX
			}, time, function() {
				adjustNav();
				if (callback) callback();
			});
		}
	}
	function adjustNav() {
		var container = $(opts.selector);
		var prev = container.find('.prev').removeClass('active').css('cursor', 'default');
		var next = container.find('.next').removeClass('active').css('cursor', 'default');
		if (canBeMoved('prev')) {
			prev.addClass('active').css('cursor', 'auto');
		}
		if (canBeMoved('next')) {
			next.addClass('active').css('cursor', 'auto');
		}
	}
	function canBeMoved(direction) {
		var result = true;
		if (direction == 'next' && posX + objW <= 667) {
			return false;
		} else if (direction == 'prev' && posX >= 21) {
			return false;
		}
		return result;
	}
	init();
};

CORE.TopGallery = function () {
	var that = arguments.callee.prototype;
	var opts = (arguments[0].constructor == Object) ? arguments[0] : {};
	if (!opts.selector) opts.selector = arguments[0];
	if (!opts.urls) opts.urls = [];
	if (!opts.index) opts.index = 0;
	if (!opts.delay) opts.delay = 5;
	that.timer = null;
	var imgSelector = '#topPromoImg';
	var contentSelector = '#topPromoContent';
	var navSelector = '#topPromoNav';
	var headerSelector = '#topPromoSide';
	var isMouseOver = false;
	function init() {
		that.play();
		var main = $('#wrapper3');
		main.prepend(makeNav()).find(navSelector).css('left', parseInt(((main.width() - $(navSelector).width()) / 2) + 132, 10) + 'px');
		$(document).click(function (e) {
			var target = $(e.target);
			if (/#slide[0-9]+/.test(target.attr('href'))) {
				e.preventDefault();
				var index = target.attr('href').replace('#slide', '');
				that.show(index);
			}
		});
	}
	function addHover(obj) {
		obj.unbind('hover');
		obj.hover(function () {
			isMouseOver = true;
			that.stop();
		}, function () {
			isMouseOver = false;
			that.play();
		});
	}
	that.show = function (i, callback) {
		that.stop();
		var nav = $(navSelector).find('.wrapper');
		nav.find('a').removeClass('active');
		nav.find('a').eq(i).addClass('active');
		//alert(i + ' ' + nav.find('a').eq(i).attr('href'));
		if (opts.urls[i]) {
			var url = opts.urls[i];
			$.ajax({
				type: 'GET',
				url: url,
				//data: 'ajax=1',
				//dataType: 'json',
				timeout: 5 * 1000, // quit trying after 5 secs
				success: function (data) {
					opts.index = i;
					var timing = 1000;
					data = $('<div>' + data + '</div>');
					var oldImg = $(imgSelector);
					var oldContent = $(contentSelector);
					//var oldHeader = $(headerSelector);
					if (oldContent.length > 0) {
						oldContent.unbind('hover');
						oldContent.fadeOut(timing);
					}
					oldImg.fadeOut(timing, function () {
						oldImg.remove();
						oldContent.remove();
						//oldHeader.remove();
					});
					var newImg = data.find(imgSelector);
					var newContent = data.find(contentSelector);
					//var newHeader = data.find(headerSelector);
					if (newContent.length > 0) {
						$('#wrapper3').prepend(newContent);
						newContent.fadeIn(timing, function () {
							addHover(newContent);
						});
					}
					
					$('#wrapper1').prepend(newImg);
					newImg.fadeIn(timing, function () {
						if (callback) callback();
					});
					//$('.txtPromo').attr('src', newHeader.attr('src'));
					//$('.txtPromo').fadeIn(timing);
					
				},
				error: function (xhr, status, error) {
					alert(status + ' ' + error + ' ' + url);
				},
				complete: function () {
					
				}
			});
		}
		//window.location.hash = 'showing' + i;
	};
	that.nextIndex = function (i) {
		var num = opts.urls.length;
		return (i < num - 1) ? i + 1 : 0;
	};
	that.wait = function () {
		that.stop();
		if (!isMouseOver) {
			that.timer = setTimeout(function () {
				that.show(that.nextIndex(opts.index), that.wait);
			}, opts.delay * 1000);
		}
	};
	that.stop = function () {
		if (that.timer) clearTimeout(that.timer);
	};
	that.play = function () {
		//window.location.hash = 'playing' + index;
		that.show(opts.index, that.wait);
	};
	function makeNav() {
		var html = '';
		html += '<div id="' + navSelector.replace('#', '') + '"><div class="wrapper">';
		var cssClass = 'first';
		for (var i = 0; i < opts.urls.length; i++) {
			cssClass += (i == opts.index) ? ' active' : '';
			html += '<a href="#slide' + i + '" class="' + cssClass + '"></a>';
			cssClass = '';
		}
		html += '</div></div>';
		return html;
	}
	init();
};

CORE.Gallery = function () {
	var that = arguments.callee.prototype;
	var opts = (arguments[0].constructor == Object) ? arguments[0] : {};
	if (!opts.selector) opts.selector = arguments[0];
	opts.popSelector = '#galleryPop';
	opts.overlaySelector = '#pageOverlay';
	opts.isCloseOnClickOut = true;
	opts.transitionTime = 0.2; // secs
	that.currentIndex = 0;
	init();
	function init() {
		var gallery = $(opts.selector);
		if (gallery.length > 0) {
			gallery.find('img').closest('a').each(function () {
				$(this).append('<div class="zoomer"></div>');
			});
			$(document).click(function (e) {
				var target = $(e.target);
				if (target.hasClass('thumb')) {
					e.preventDefault();
					that.open(target.attr('href'), target);
					that.currentIndex = gallery.find('a:visible').index(target);
				} else if (target.parent().hasClass('thumb')) {
					e.preventDefault();
					that.open(target.parent().attr('href'), target.parent());
					that.currentIndex = gallery.find('a:visible').index(target.parent());
				} else if (target.hasClass('galleryPrev')) {
					e.preventDefault();
					prev();
				} else if (target.hasClass('galleryNext')) {
					e.preventDefault();
					next();
				} else if (target.hasClass('galleryClose')) {
					close();
				}
			});
			$(document).keyup(function(e) {
				if (e.keyCode == 27) { // esc
					close();
				}
			});
			$(window).bind('resize scroll', function () {
				position();
			});
			checkboxSetup();
		}
	}
	function checkboxSetup() {
		var container = $('#content');
		container.find('.types input').click(function () {
			var val = $(this).val();
			var thumbs = container.find('.thumb');
			if (val == 0) {
				thumbs.show();
			} else {
				thumbs.hide();
				thumbs.filter('.type' + val).show();
			}
		});
	}
	function next() {
		show(that.currentIndex + 1);
	}
	function prev() {
		show(that.currentIndex - 1);
	}
	function show(index) {
		var gallery = $(opts.selector);
		var total = gallery.find('img').closest('a:visible').length;
		if (index >= 0 && index < total) {
			var pop = $(opts.popSelector);
			var obj = gallery.find('img').closest('a:visible').eq(index);
			var url = obj.attr('href') + '?random=' + (new Date()).getTime();
			pop.find('.image').attr('src', url).load(function () {
				pop.find('.preloader').remove();
				pop.find('.wrapper').empty().append('<strong>' + decode(obj.attr('title')) + '</strong><div class="description">' + decode(obj.find('img').attr('alt')) + '</div>');
				position();
				that.currentIndex = index;
				var nextButton = pop.find('.galleryNext').show();
				var prevButton = pop.find('.galleryPrev').show();
				if (index >= total - 1) {
					nextButton.hide();
				} else if (index == 0) {
					prevButton.hide();
				}
			});
		}
	}
	function position() {
		var pop = $(opts.popSelector);
		var overlay = $(opts.overlaySelector);
		if (pop.length > 0) {
			var w = $('body').width();
			var h = $(document).height();
			var popW = pop.width();
			var popH = pop.height();
			pop.css({
				left: Math.floor($(window).scrollLeft() + ($(window).width() - popW) / 2) + 'px',
				top: Math.floor($(window).scrollTop() + ($(window).height() - popH) / 2) + 'px'
			});
			overlay.width(w);
			overlay.height(h);
		}
	}
	function makePop() {
		$(opts.popSelector + ', ' + opts.overlaySelector).remove();
		$('body').append('<div id="' + opts.popSelector.replace('#', '') + '"><div class="content"><div class="wrapper"></div></div><a href="" class="galleryPrev"></a><a href="" class="galleryNext"></a><a href="" class="galleryClose"></a></div><div id="' + opts.overlaySelector.replace('#', '') + '"></div>');
		var pop = $(opts.popSelector).hide();
		pop.find('.galleryClose').click(function (e) {
			e.preventDefault();
			close();
		});
		var overlay = $(opts.overlaySelector).css('opacity', 0.8).hide().click(function (e) {
			e.preventDefault();
			if (opts.isCloseOnClickOut) close();
		});
	}
	function close() {
		var pop = $(opts.popSelector).remove();
		$(opts.overlaySelector).fadeOut(opts.transitionTime * 1000, function () {
			$(this).remove();
		});
	}
	that.open = function(url, obj) {
		makePop();
		var pop = $(opts.popSelector).fadeIn(opts.transitionTime * 1000).append('<div class="preloader"></div>');
		if (obj) pop.find('.wrapper').empty().append('<strong>' + decode(obj.attr('title')) + '</strong><div class="description">' + decode(obj.find('img').attr('alt')) + '</div>');
		$(opts.overlaySelector).fadeIn(opts.transitionTime * 1000);
		url += '?random=' + (new Date()).getTime();
		//setTimeout(function () {
		var img = pop.prepend('<img src="' + url + '" border="0" alt="" class="image" />').find('.image');
		position();
		img.attr('src', url).load(function () {
			pop.find('.preloader').remove();
			position();
			var total = $(opts.selector).find('img').closest('a:visible').length;
			var nextButton = pop.find('.galleryNext').show();
			var prevButton = pop.find('.galleryPrev').show();
			if (that.currentIndex >= total - 1) {
				nextButton.hide();
			} else if (that.currentIndex == 0) {
				prevButton.hide();
			}
		});
		//}, 2000);

	}
	function decode(str) {
		return unescape(str).replace(/[+]+/g, ' ');
	}
};

CORE.Map = function () {
	var that = arguments.callee.prototype;
	var opts = (arguments[0].constructor == Object) ? arguments[0] : {};
	if (!opts.selector) opts.selector = '#map';
	if (!opts.markerSelector) opts.markerSelector = '#mbMarker';
	if (!opts.zoom) opts.zoom = 2;
	if (!opts.lat) opts.lat = 40;
	if (!opts.lng) opts.lng = -101;
	var utils = new CORE.Utils();
	that.map = null;
	that.markers = [];
	that.activeMarker = null;
	that.highestZ = 5000;
	that.isMarkerSliding = false;
	that.addMarkers = function (markers) {
		if (that.map != null) {
			for (var i = 0; i < markers.length; i++) addMarker(markers[i], i);
		} else {
			setTimeout(function () {
				that.addMarkers(markers);
			}, 100);
		}
	};
	function addMarker(markerOpts, key) {
		
		var website = "";
		if(markerOpts.siteID == 1){
			var marker = new MQA.Poi({lat: markerOpts.lat, lng: markerOpts.lng});
			var icon = new MQA.Icon(CORE.wwwroot + '/images/sprinter_dealer_mb.png', 44, 58);
			marker.setIcon(icon);
			marker.setIconOffset({x: -22, y: -60});
			website = "www.mbsprinterusa.com/";
			marker.siteID = 1;
		}else{
			var marker = new MQA.Poi({lat: markerOpts.lat, lng: markerOpts.lng});
			var icon = new MQA.Icon(CORE.wwwroot + '/images/sprinter_dealer_fl.png', 113, 58);
			marker.setIcon(icon);
			marker.setIconOffset({x: -56, y: -60});
			website = "www.freightlinersprinterusa.com/";
			marker.siteID = 2;
		}
		

		//var marker = new MQA.HtmlPoi({lat: markerOpts.lat, lng: markerOpts.lng});
		marker.key = key;
		that.highestZ = that.highestZ + key;
		marker.zIndex = that.highestZ;
		marker.title = markerOpts.title;
		

		//marker.setInfoTitleHTML(markerOpts.title);
		marker.titleVisible = false;
		marker.dealerCode = markerOpts.code;
		var html = '<strong class="title">' + markerOpts.title + '</strong>';
		html += '<div class="address">';
		if (markerOpts.address) html += markerOpts.address + '<br />';
		if (markerOpts.city && markerOpts.state) html += markerOpts.city + ', ' + markerOpts.state;
		if (markerOpts.zip) html += ' ' + markerOpts.zip;
		html += '</div>';
		if (markerOpts.phone) html += '<div class="phones">Phone: ' + markerOpts.phone;
		if (markerOpts.fax) html += '<br />Fax: ' + markerOpts.fax;
		html += '</div>';
		if (markerOpts.mileage) html += '<div class="mileage">' + markerOpts.mileage + ' mi</div>';
		html += '<div class="buttons">';
		html += '<a href="http://' + website + '#getQuote,' + escape(marker.dealerCode) + '" class="button external">Get a Quote</a>';
		html += '<a href="http://' + website + '#scheduleTestDrive,' + escape(marker.dealerCode) + '" class="button external">Request a Test Drive</a>';
		if (markerOpts.website) html += '<a href="http://' + markerOpts.website + '" target="_blank" class="button external">Visit Dealer Site</a>';
		html += '</div>';
		
		marker.setInfoContentHTML('<div class="mapOverlay">' + html + '</div>');
		marker.setRolloverContent('<div></div>'); // empty html not to show hover
		//marker.toggleInfoWindow();
		that.map.addShape(marker);
		MQA.EventManager.addListener(marker, 'mouseover', function (e) {
			showMarker(e.srcObject);
		});
		MQA.EventManager.addListener(marker, 'mouseout', function (e) {
			hideMarker(e.srcObject);
		});
		MQA.EventManager.addListener(marker, 'click', function (e) {
			showMarkerInfo(e.srcObject.key);
		});
		that.markers[key] = marker;
		return marker;
	}
	function showMarker(marker) {
		if (!that.isMarkerSliding && (marker != that.activeMarker || !isInfoWinOpen())) {
			closeWindow();
			that.isMarkerSliding = true;
			marker.zIndex = that.highestZ + 1;
			marker._applyZIndex();
			var point = that.map.llToPix(marker.latLng);
			if(marker.siteID == '1'){//Mercedes
				var html = '<div id="' + opts.markerSelector.replace('#', '') + '" style="z-index: ' + that.highestZ + '; left: ' + (point.x) + 'px; top: ' + (point.y - 60) + 'px;"><strong>' + marker.title + '</strong></div>';
			}else{ //Freightliner
				var html = '<div id="' + opts.markerSelector.replace('#', '') + '" style="z-index: ' + that.highestZ + '; left: ' + (point.x + 40) + 'px; top: ' + (point.y - 60) + 'px;"><strong>' + marker.title + '</strong></div>';
			}
			var obj = $(opts.selector).find('div').eq(1).find('div').eq(0).prepend(html);
			obj.css('z-index', that.highestZ);
			obj = obj.remove(opts.markerSelector).find(opts.markerSelector);
			
			var container = obj.find('strong');
			var w = container.innerWidth();
			container.css({left: -w + 'px'});
			obj.width(w);
			var time = 200;
			container.animate({
				left: '+=' + (w + 30)
			}, time, function() {
				that.isMarkerSliding = false;
			});
		}
	}
	function hideMarker(marker) {
		if (marker) {
			var time = 200;
			var obj = $(opts.selector).find(opts.markerSelector);
			var container = obj.find('strong');
			var w = container.outerWidth();
			container.animate({
				left: '-=' + w
			}, time, function() {
				marker.zIndex = that.highestZ - 1;
				marker._applyZIndex();
				obj.remove();
			});
		}
	}
	function showMarkerInfo(key) {
		if (that.markers[key]) {
			$(opts.markerSelector).hide();
			var marker = that.markers[key];
			that.activeMarker = marker;
			if (opts.type == 'dealers') {
				var html = $('<div class="stuff">' + marker.infoContentHTML + '</div>');
				marker.setInfoContentHTML(html.html());
			}
			
			//var point = that.map.llToDisplay(marker.latLng);
			//that.map.slideMapToPoint(point.x, point.y);
			that.map.setCenter(marker.latLng);
			//that.map.panToLatLng(marker.latLng); - does not work any more
			marker.toggleInfoWindow();
			
			setTimeout(function () {
				var button = $(opts.selector).find('.mapOverlay .button');
				if (button.length > 0) {
					button.click(function (e) {
						var target = $(e.target);
						if (!target.hasClass('external')) {
							e.preventDefault();
							utils.prepareFormPop(target);
						}
					});
				}
			}, 500);
		}
		$('.mqabasicwnd').parent().parent().css('z-index', 30000);
		$( 'html, body' ).animate( { scrollTop: 0 }, 0 );
	}
	function addZoomControll() {
		MQA.withModule('largezoom', function() {
			that.map.addControl(
				new MQA.LargeZoom(), 
				new MQA.MapCornerPlacement(MQA.MapCorner.TOP_RIGHT, new MQA.Size(5,30))
			);
		});
	}
	function addViewControll() {
		MQA.withModule('viewoptions', function() {
			that.map.addControl(
				new MQA.ViewOptions(),
				new MQA.MapCornerPlacement(MQA.MapCorner.BOTTOM_RIGHT, new MQA.Size(5,30))
			);
		});
	}
	function closeWindow() {
		if (isInfoWinOpen()) {
			that.activeMarker.toggleInfoWindow();
			that.activeMarker = null;
		}
	}
	that.makeMyDealer = function (dealerCode) {
		var utils = new CORE.Utils();
		var url = CORE.wwwroot + '/find-dealer/make-my-dealer?dealerCode=';
		utils.getJson({
			url: url + dealerCode
		}, function (data) {
			if (that.myDealerCode) {
				$('#dealer' + that.myDealerCode).replaceWith('<a href="' + url + that.myDealerCode + '" id="dealer' + that.myDealerCode + '" class="makeMyDealer">Make My Dealer</a>');
			}
			$('#dealer' + dealerCode).replaceWith('<span id="dealer' + dealerCode + '">This is My Dealer</span>');
			that.myDealerCode = dealerCode;
			if (isInfoWinOpen()) {
				var html = $(opts.selector).find('.mqabasicwnd').find('.makeMyDealer');
				if (that.activeMarker.dealerCode == dealerCode) {
					html.replaceWith('<span class="makeMyDealer">This is My Dealer</span>');
				} else {
					html.replaceWith('<a href="javascript:window.mqMap.makeMyDealer(\'' + that.activeMarker.dealerCode + '\')" class="makeMyDealer">Make My Dealer</a>');
				}
			}
		});
	}
	function isInfoWinOpen() {
		return $(opts.selector).find('.mqabasicwnd').length > 0;
	}
	function init() {
		var id = opts.selector.replace('#', '');
		var container = $('#wrapper3').prepend('<div id="' + id + '" style="width: ' + opts.width + 'px; height: ' + opts.height + 'px; left: 0; top: 0; position: absolute; z-index: 11;"><div class="wrapper"></div></div>').find(opts.selector);
		MQA.EventUtil.observe(window, 'load', function() {
			that.map = new MQA.TileMap(document.getElementById(id), opts.zoom, {lat: opts.lat, lng: opts.lng}, id);
			addZoomControll();
			//addViewControll();
			container.css({position: 'absolute', 'z-index': 11});
			MQA.EventManager.addListener(that.map, 'click', function (e) {
				if (isInfoWinOpen()) closeWindow();
			});

			var map = $(opts.selector);
			map.find('img[src=http://api.mqcdn.com/sdk/js/v6.1.0/images/mqlogo.gif]').remove();
			map.find('img[src=http://api.mqcdn.com/sdk/js/v6.1.0/images/scales/scalebar.gif]').remove();
		});
		$(document).click(function (e) {
			var target = $(e.target);
			if (target.hasClass('dealer')) {
				e.preventDefault();
				var key = target.attr('href').replace(/[^0-9]*/, '');
				showMarkerInfo(key);
			} else if (target.hasClass('makeMyDealer') && target.attr('href') != null) {
				e.preventDefault();
				that.makeMyDealer(target.attr('id').replace('dealer', ''));
			} else if (target.hasClass('.button')) {
				//e.preventDefault();
				//that.makeMyDealer(target.attr('id').replace('dealer', ''));
			}
		});
	}
	init();
};

CORE.Popup = function (selector, isCloseOnClickOut, closeCallback) {
	var that = arguments.callee.prototype;
	var popID = 'popup';
	var overlayID = 'pageOverlay';
	var body = $('body');
	var pop, overlay;
	var transitionTime = 0.2; // secs
	init();
	function init() {
		$(selector).click(function (e) {
			e.preventDefault();
			that.open($(this).attr('href'));
		});
		$('#' + popID).find('.close').live('click', function (e) {
			e.preventDefault();
			that.close();
		});
		$(document).keyup(function(e) {
			if (e.keyCode == 27) { // esc
				that.close();
			}
		});
		$(window).bind('resize scroll', function () {
			position();
		});
	}
	function prepare() {
		$('#' + popID + ', #' + overlayID).remove();
		body.append('<div id="' + popID + '"></div><div id="' + overlayID + '"></div>');
		pop = $('#' + popID);
		overlay = $('#' + overlayID);
		overlay.css('opacity', 0.8);
		pop.hide();
		overlay.hide();
		overlay.click(function (e) {
			e.preventDefault();
			if (isCloseOnClickOut) that.close();
		});
	}
	function position() {
		if (pop) {
			var w = body.width();
			var h = $(document).height();
			var popW = pop.width();
			var popH = pop.height();
			pop.css({
				left: Math.floor($(window).scrollLeft() + ($(window).width() - popW) / 2) + 'px',
				top: Math.floor($(window).scrollTop() + ($(window).height() - popH) / 2) + 'px'
			});
			overlay.width(w);
			overlay.height(h);
		}
	}
	that.close = function () {
		pop = $('#' + popID);
		overlay = $('#' + overlayID);
		overlay.fadeOut(transitionTime * 1000);
		if (pop.find('object').length == 0) { // with plugins (flash, java)
			pop.fadeOut(transitionTime * 1000, function () {
				pop.remove();
				overlay.remove();
				if (closeCallback) closeCallback();
			});
		} else { // without plugins
			pop.remove();
			overlay.fadeOut(transitionTime * 1000, function () {
				overlay.remove();
				if (closeCallback) closeCallback();
			});
		}
	}
	that.open = function (url, callback) {
		prepare();
		position();
		overlay.fadeIn(transitionTime * 1000);
		pop.fadeIn(transitionTime * 1000);
		pop.append('<div class="preloader">loading...</div>');
		$.ajax({
			type: 'GET',
			url: url,
			data: 'ajax=1',
			error: function(xhr, status, error) {
				alert('Ajax error has occurred.');
				that.close();
			},
			success: function(data) {
				pop.html(data);
				var close = $(data).find('.close');
				if (close.length == 0) pop.append('<a href="" class="close"><span>Close</span></a>');
				position();
				if (callback) callback();
			},
			complete: function () {
				pop.find('.preloader').remove();
			}
		});
	}
};

CORE.FormHandler = function () {
	var that = arguments.callee.prototype;
	if (arguments.length == 0) return alert('No parameters specified.');
	var opts = {};
	if (arguments[0].constructor == Object) {
		opts = arguments[0];
	} else {
		opts.selector = arguments[0];
	}
	opts.buttonSelector = ':input[type=submit]';
	if (!opts.errorFieldSelector) opts.errorFieldSelector = '.errorFld';
	if (!opts.errorMsgSelector) opts.errorMsgSelector = '.errorMarker';
	if (!opts.errorSummarySelector) opts.errorSummarySelector = '.errorSummary';
	if (!opts.antirobotFieldSelector) opts.antirobotFieldSelector = '.noErrors';
	if (!opts.isHaltOnSuccess) opts.isHaltOnSuccess = false;
	if (!opts.isHideButton) opts.isHideButton = false;
	init();
	function checkErrors (frm, fld, callback) {
		var url = frm.attr('action');
		var utils = new CORE.Utils();
		var isSubmit = (fld) ? 0 : 1;
		if (!fld) { // submit button clicked
			clearErrors();
			if (opts.isHideButton) {
				frm.find(opts.buttonSelector).hide().after('<div id="processing">Please wait, processing...</div>');
			} else {
				utils.fixButton(false, frm.find(opts.buttonSelector));
			}
		} else { // field lost focus
			clearErrors(fld);
		}
		utils.getJson({
			url: frm.attr('action'),
			data: frm.serialize() + '&isSubmit=' + isSubmit,
			error: function () {
				if (callback) callback();
				$('#jsError').remove();
				var button = frm.find(opts.buttonSelector).after('<div id="jsError" class="error">Unexpected AJAX error occurred.</div>');
				utils.fixButton(true, button);
			}
		}, function (data) {
			if (data != true) { // got errors
				if (callback) callback();
				var errors = data;
				if (!fld) { // check all fields
					//summaryFld.html('<div class="one"><div class="two"><strong>Please fix the following errors:</strong><ul></ul></div></div>');
					for (var errorFieldName in errors) showError(errors, errorFieldName);
					if (opts.isHideButton) {
						$('#processing').remove();
						$(opts.buttonSelector).show();
					} else {
						utils.fixButton(true, frm.find(opts.buttonSelector));
					}
					isSubmitting = false;
				} else { // check one field
					showError(errors, fld.attr('name'));
				}
			} else { // no error
				if (!fld) {
					frm.append('<input type="hidden" name="jsSuccess" value="1" />');
					if (!opts.isHaltOnSuccess) {
						frm.submit();
					} else if (opts.callback) {
						utils.fixButton(true, frm.find(opts.buttonSelector));
						opts.callback();
					}
				}
			}
		});
		function showError(errors, errorFieldName) {
			var error = errors[errorFieldName];
			if (error) {
				if (!error.length) { // error is object (zend way)
					for (var i in error) {};
					error = error[i];
				}
				if (errorFieldName != 'error') { // field error
					var fld = frm.find(':input[name=' + errorFieldName + ']');
					if (fld) {
						if (!fld.is('[type=radio], [type=checkbox]')) fld.addClass(opts.errorFieldSelector.substr(1));
						fld.closest('.row').find(opts.errorMsgSelector).html(error);
					}
					//fld.after('<span class="' + opts.errorMsgSelector.substr(1) + '">' + error + '</span>');
				} else { // error summary
					frm.find(opts.errorSummarySelector).html(error);
				}
			}
		}
		function clearErrors(fld) {
			var msgObj;
			if (fld) {
				msgObj = fld.closest('.row').find(opts.errorMsgSelector);
			} else {
				fld = frm.find(opts.errorFieldSelector);
				msgObj = frm.find(opts.errorMsgSelector + ', ' + opts.errorSummarySelector);
			}
			msgObj.html('&nbsp;');
			fld.removeClass(opts.errorFieldSelector.substr(1));
		}
	}
	function init() {
		$(document).ready(function () {
			var utils = new CORE.Utils();
			var frm = $(opts.selector);
			frm.submit(function (e) {
				frm = $(this);
				var isValid = frm.find(':input[name=jsSuccess]').length;
				if (!isValid) { //frm.find(':input[name=' + opts.antirobotFieldSelector.substr(1) + ']').length == 0) {
					isSubmitting = true;
					e.preventDefault();
					checkErrors(frm, null);
				}
			});
			frm.find(':input[type!=submit]').not('.optional').blur(function (e) {
				if (!isSubmitting) {
					var fld = $(this);
					checkErrors(fld.closest('form'), fld);
				}
			});
			frm.append('<input type="hidden" name="' + opts.antirobotFieldSelector.substr(1) + '" value="secret" />');
		});
	}
};

CORE.FindDealerForm = function () {
	var that = arguments.callee.prototype;
	if (arguments.length == 0) return alert('No parameters specified.');
	var opts = {};
	if (arguments[0].constructor == Object) {
		opts = arguments[0];
	} else {
		opts.selector = arguments[0];
	}
	opts.buttonSelector = ':input[type=submit]';
	if (!opts.resultsSelector) resultsSelector = '.results';
	if (!opts.dealerSelector) opts.dealerSelector = '.dealerSelector';
	if (!opts.antirobotFieldSelector) opts.antirobotFieldSelector = '.noErrors';
	if (!opts.isHideButton) opts.isHideButton = false;
	var isSubmitting = false;
	init();
	function selectDealer(code, link) {
		var frm = $(opts.selector);
		var links = frm.find(opts.dealerSelector).show();
		if (link) link.hide();
		$('form').find(':input[name=dealerCode]').val(code);
	}
	function init() {
		$(document).ready(function () {
			var frm = $(opts.selector);
			frm.submit(function (e) {
				e.preventDefault();
				frm = $(this);
				var utils = new CORE.Utils();
				var button = frm.find(opts.buttonSelector);
				utils.fixButton(false, button);
				utils.getJson({
					url: frm.attr('action'),
					dataType: 'text',
					data: frm.serialize()
				}, function (data) {
					if (data) { // got errors
						frm.find(resultsSelector).html(data);
					} else { // no error
						
					}
					utils.fixButton(true, button);
					frm.find(opts.dealerSelector).click(function (e) {
						e.preventDefault();
						var obj = $(this);
						selectDealer(obj.attr('title'), obj);
					});
				});
			});
		});
	}
};
