if (!window.console) {
	window.console = {
		log: function () {}
	}
}

/** Öffnet eine Produktkategorie */
function selectCategory() {
	var categoryId 		= $(this).find('input[name=CategoryID]').val();
	var categoryName 	= $(this).find('input[name=Name]').val();
	categoryName		= categoryName.replace(/ /g, '_');

	overlay.setContent('components/productDetails.php', {categoryId: categoryId});
	overlay.show();

	doTrack(categoryName);
	return false;
}

/** Öffnet ein Produkt aus der Thumbnailliste des Overlays */
function selectProduct(e) {
	// Dieses ist ein Special-Product mit einem eigenen Link --> keine weitere Aktion, Event abbrechen und Link öffnen lassen
	if ($(this).find('a').length) {
		return;
	}
	
	var container = $('#overlay .productDetails');
	var _this = $(this);
	
	container.find('.productContainer .thumblist li.selected').removeClass('selected');
	_this.addClass('selected');

	// set displayed values
	var dataFields = _this.find('input');
	var title 		= dataFields.filter('[name=Title]').val();
	var description	= dataFields.filter('[name=Description]').val();
	var footer		= dataFields.filter('[name=Footer]').val();
	var image 		= dataFields.filter('[name=ImageUrl]').val();
	var imageBig	= dataFields.filter('[name=ImageUrlBig]').val();
	var price		= dataFields.filter('[name=Price]').val();
	var models		= dataFields.filter('[name=Models]').val();
	
	description = BbCode.decode(description);

	container.find('.textContainer .priceText').html(price);
	container.find('h1.title').html(title);
	container.find('.descriptionContainer').html(description);
	container.find('.footerContainer').html(footer);
	container.find('.detailImage').attr('src', image);
	container.find('a.magnifier').attr('href', imageBig);

	modelsMenu.highlightCars(models.split(','));
	
	if (e.originalEvent) {
		doTrack('product_view');
	}
	return false;
}

/** Zeigt das große Produktbild an */
function openLargeProductImage() {
	$('#overlay .overlayFooter a').addClass('hide').filter('.back').removeClass('hide');
	$('.productImageLargeContainer img:first').attr('src', $(this).attr('href'));
	$('.productTextContainer').hide();
	$('.productDetails .footnote').addClass('hide');
	$('.productImageLargeContainer').removeClass('hide');
	return false;
}

/** Schließt das große Produktbild */
function closeLargeProductImage() {
	$('#overlay .overlayFooter a').addClass('hide').filter('.openRS').removeClass('hide');
	$('.productDetails .footnote').removeClass('hide');
	$('.productImageLargeContainer').addClass('hide');
	$('.productTextContainer').show();
	return false;
}

/** Displays the selected model and notifies other components and the service layer */
function refreshModelSelection(data) {
	data = data ? data : {};
	href = 'components/modelSelection.php';
	$('.modelSelection .content').html('');
	$.post(href, data, function(result) {
		$('.modelSelection').html(result);
		if (overlay.isOpen()) {
			overlay.setContent('components/productDetails.php', data);
		}
	});
	return false;
}

/**
  * Öffnet das overlay und zeigt das zu dem übergebenen Parametern passende Produkt an
  * Wenn ModelId = -1 --> Modelauswahl zurücksetzen
  * Wenn keine ModelId und auch aktuelle kein Fahrzeug selektiert --> Neuen Contennt mit groupTemplateId laden, falls angegeben
  */
function showProductByParams(modelId, categoryId, templateId, groupTemplateId) {
	if (!modelId || isNaN(modelId)) {
		modelId	= modelsMenu.getSelectedCarId();
	}
	
	var data = {};
	
	if (!modelId || isNaN(modelId) && groupTemplateId) {
		data = {
			categoryId: categoryId,
			templateId:	groupTemplateId
		};
		overlay.setContent('components/productDetails.php', data);
	} else {
		if (!modelId || isNaN(modelId)) {
			modelId = modelsMenu.carIDs.c30;
		}
		data = {
			modelId:	modelId,
			categoryId: categoryId,
			templateId:	templateId
		};
		refreshModelSelection(data);
	}
	
	overlay.show();
}

var sPBP = showProductByParams;
/** Aktualisiert den Inhalt der Händlerpromo-Seite */
function refreshPromo () {
	$('#tc_promo').load('components/dealerPromo.php', function(){
		if ($('#tc_promo')[0].innerHTML.length < 40) {
			$('#t_promo').hide();
			$('#t_accessories').click();
		} else {
			$('#t_promo').show();
		}
	});
}

/** Track ein Ereignis */
function doTrack (trackAction) {
	var trackActionLow = trackAction.toLowerCase();
	var campaignCode = "";
	var trackCode = false;

	switch (trackActionLow) {
		case 'home' : trackCode = 'Home'; break;						// Buttons im Hauptmenü oben
		case 'newsletter' : trackCode = 'Newsletter'; break;
		case 'volvo_partner' : trackCode = 'Volvo_partner'; break;
		case 'kontakt' : trackCode = 'Kontakt'; break;

		case 'impressum' : trackCode = 'Impressum'; break;				// Buttons im Footermenü unten
		case 'datenschutz' : trackCode = 'Datenschutz'; break;
		case 'copyright' : trackCode = 'Copyright'; break;
		case 'volvocars.de' : trackCode = 'www.volvocars.de'; break;

		case 'design' : trackCode = 'Design'; break;					// Klick auf die Produktkategorie
		case 'fahrzeugpflege' : trackCode = 'Fahrzeugpflege'; break;
		case 'infotainment' : trackCode = 'Infotainment'; break;
		case 'komfort' : trackCode = 'Komfort'; break;
		case 'klima' : trackCode = 'Klima'; break;
		case 'packen_und_laden' : trackCode = 'Packen_und_Laden'; break;
		case 'service' : trackCode = 'Service'; break;
		case 'sicherheit' : trackCode = 'Sicherheit'; break;
		case 'merchandising' : trackCode = 'Merchandising'; break;

		case 'dealersearch_search' : trackCode = 'Dealersearch_search'; break;		// Händlersuche ausführen
		case 'dealersearch_result' : trackCode = 'Dealersearch_result'; break;		// Klick auf Ergebnis in Suchliste

		case 'product_view' : trackCode = 'Product_view'; break;					// Betrachten eines Konkreten Produkts

		case 'car_select' : trackCode = 'Car_select'; break;						// Auswählen eines Fahrzeugs
		case 'car_unselect' : trackCode = 'Car_unselect'; break;					// Auswählen eines Fahrzeugs

		case 'merkzettel_store' : trackCode = 'Merkzettel_store'; break;			// Aktionen rund um den Merkzettel
		case 'merkzettel_load' : trackCode = 'Merkzettel_load'; break;
		case 'merkzettel_delete' : trackCode = 'Merkzettel_delete'; break;
		case 'merkzettel_pdf' : trackCode = 'Merkzettel_PDF'; break;
		
		default : trackCode = trackAction;
		
	}

	if (trackCode && typeof pageTracker!="undefined") {
		trackCode += '_' + campaignCode;
		pageTracker._trackPageview(trackCode);
	}
}

/** Funktionen des Merkzettels */
var notepad = {
	MAX_NOTES: 10,
	
	init: function () {
		$('.notepad .thumblist li').live('mouseenter ', function(){
			notepad.showMenu(this);
		}).live('mouseleave ', function(){
			notepad.hideMenu();
		});
		
		$('.notepad a.magnifier').live('click', notepad.showProduct);
		$('.notepad a.delete').live('click', notepad.removeProduct);
	},
	
	addProduct: function () {
	
		var activeElement 	= $('#overlay .productContainer .thumblist li.selected');
		var templateId		= activeElement.find('input[name=TemplateID]').val();
		var modelId			= modelsMenu.getSelectedCarId();
		var categoryId		= $('#overlay .productContainer input[name=CategoryID]').val();
		var combinedId		= modelId+'_'+templateId;
		var notes 			= $('.notepad .thumblist ul li');
	
		// process request only if notelimit of MAX_NOTES is not reached yet
		if(notes.length < notepad.MAX_NOTES) {
			var node = $('.notepad .thumblist ul input[name=CombinedID][value='+combinedId+']');
	
			// Element noch nicht auf der Merkliste
			if(node.length == 0) {
				$.post('services/addToNotepad.php', {
					ModelID: 			modelId,
					CategoryID: 		categoryId,
					TemplateID: 		templateId
				}, function () {
					notepad.refresh();
				});
			}
		}
	
		doTrack('merkzettel_store');
		return false;
	},
		
	removeProduct: function () {
		var item 		= $(this).parents('li:first');
		var modelId 	= item.find('input[name=ModelID]').val();
		var templateId 	= item.find('input[name=TemplateID]').val();
	
		$.post('services/removeFromNotepad.php', {
			ModelID: modelId,
			TemplateID: templateId
		});
	
		item.replaceWith('');
	
		var note = $('.notepad .thumblist ul li:first');
	
		if(note.length == 0) {
			notepad.refresh();
		}
	
		doTrack('merkzettel_delete');
	
		return false;
	},
	
	showProduct: function () {
		var item 		= $(this).parents('li:first');
		var modelId		= item.find('input[name=ModelID]').val();
		var categoryId 	= item.find('input[name=CategoryID]').val();
		var templateId	= item.find('input[name=TemplateID]').val();
	
		showProductByParams(modelId, categoryId, templateId);
		doTrack('merkzettel_load');
		return false;
	},
	
	showMenu: function (item) {
		item = $(item);
		var menu = item.find('.menu');
		var label = item.find('.label');
		
		if (!menu.is(':visible')) {
			notepad.hideMenu();
		}
		
		menu.show();
		label.show();
	
		return false;
	},
	
	hideMenu: function (item) {
		$('.notepad .label, .notepad .menu').hide();
		return false;
	},

	refresh: function () {
		$('.notepad').load('components/notepad.php');
	}
}

/** Funktionen der Händlersuche, Händerlanezige und Händleranfrage */
var dealer = {
	defaultFormUrl: 'components/distributorSearch.php',
	
	init: function () {
		$('.dropdownBox .selector, .dropdownBox .value').live('click', function(){
			$(this).siblings('.options:first').slideToggle();
		});
	
		// Klickevent für die Optionen im Dropdown
		$('.distributorSearch .dropdownBox .options a').live('click', function(){
			var distance = this.href.split('#')[1];
			$('.distributorSearch .dropdownBox').children('input[name=distance]').val(distance);
			$('.distributorSearch .dropdownBox').children('.value').html(distance+' km');
			
			// Dropdown schließen
			$(this).parents('.options:first').slideToggle();
			return false;
		});
	
		$('.distributorSearch .inputContainer a.submit').live('click', dealer.search);
		$('.distributorSearch .inputContainer input').live('keyup', function(event){
			// Abschicken bei Enter-Taste
			if (event.which == 13) {
				$(this).parents('.inputContainer:first').find('.submit:first').click();
			}
		});
	
		$('.searchResult .searchRow, .distributorSearch a.reset').live('click', dealer.refreshFormBox);
		
		// Händleranfrage
		$('.queryDistributor').live('click', dealer.openKontaktForm);
	},
	
	search: function () {
		var href 		= $(this).attr('href');
		var distance	= $(this).closest('.inputContainer').find('input[name=distance]').val();
		var plz 		= $(this).closest('.inputContainer').find('input[name=plz]').val();
		
		$('.distributorSearch input[name=plz]').val(plz);
		
		overlay.setContent(href, {plz: plz, distance: distance, sc:pages.isSecuritycheckPage() ? 1 : 0});
		overlay.show();
	
		doTrack('dealersearch_search');
		return false;
	},
	
	refreshFormBox: function (e, plz) {
		var resetAndSearchPLZ = (typeof plz == 'string');
		
		var href = this.href
				|| $(this).find('input[name=href]').val()
				|| (resetAndSearchPLZ ? dealer.defaultFormUrl + '?reset=1' : dealer.defaultFormUrl);
		
		var focusPLZAfterLoad = (href.indexOf('reset=1') != -1);
		var data = {};
		
		if (pages.isSecuritycheckPage()) {
			data.sc = 1;
		}
	
		// if a distributor has been selected call tracker
		if($(this).hasClass('searchRow')) {
			doTrack('dealersearch_result');
		}
		
		$.post(href, data, function(result) {
			var ds = $('.distributorSearch');
			ds.html(result);
			
			if (typeof plz == 'string') {
				// im Formular nach dem Reset gleich eine neue Suche absetzen
				ds.first().find('.plz').val(plz);
				ds.first().find('a.submit').click();
			} else {
				overlay.setContent('components/productDetails.php');
				refreshPromo();
				notepad.refresh();
				
				// Auf SC-Seiten kann das Overlay nach abgeschlossener Suche wieder geschlossen werden
				if (pages.isSecuritycheckPage()) {
					overlay.clear();
					overlay.hide();
				}
				
				if (focusPLZAfterLoad) {
					ds.first().find('.plz').focus();
				}
			}
		});
		
		sicherheitscheck.updateCube();
		
		return false;
	},
	
	/** Öffnet ein Popup mit der Händleranfrage */
	openKontaktForm: function (empty) {
		var win = window.open('./services/dealerForm.php'+(empty===true ? '?empty=true' : ''), "haendleranfrage", "width=600,height=550,status=yes,scrollbars=yes,resizable=yes");
		if (typeof win != 'undefined') {
			win.focus();
		}
		
		if (typeof empty != 'boolean') {
			return false;
		}
	}
}

var overlay = {
	_isOpen: false,
	o:null,
	og:null,
	ajaxCallCountContent:0,
	
	init: function () {
		this.og = $('.overlayGround');
		this.o = $('#overlay');
		this.o.find('.close').live('click', $.proxy(overlay, "hide"));
		this.og.click($.proxy(overlay, "hide"));
	},
	
	clear: function () {
		var html =	'<table class="loadingAnimation centeredContent"><tr><td><img src="images/loading.gif" alt="" /></td></tr></table>';
		$('.productDetails > .content').html(html);
		$('.headline h1, .footer *', '.productDetails ').hide();
	},
	
	setContent: function (url, dataObject) {
		dataObject = (null == dataObject) ? {} : dataObject;
		overlay.clear();
		$.ajax({
			url:url,
			type:'POST',
			data: dataObject,
			success:function (data) {
				if (this.callId == overlay.ajaxCallCountContent) {	// Falls schon ein neue Request abgesetzt wurde, dann nichts machen.
					$('.productDetails').html(data);
				}
			},
			context: {callId:++this.ajaxCallCountContent},
			dataTypeString:'html'
		});
		
		return false;
	},
	
	show: function (e) {
		this._isOpen = true;
		
		if (e) {
			e.preventDefault();
		}
		
		// Muss schon sichtbar sein, da sonst kein Offset ermittelt werden kann
		this.o.show();
		this.o.removeClass('offsetHide');
		
		var windowMinY 		= $(window).scrollTop();
		var windowHeight	= $(window).height();
		var windowMaxY 		= windowMinY + windowHeight;
	
		var overlayMinY		= this.o.offset().top;
		var overlayHeight 	= this.o.height();
		var overlayMaxY		= overlayMinY + overlayHeight;
		
		var height 	= $(document).height();
		var width 	= $(document).width();
		
		// check if scrolling is needed
		// scroll if any part of the overlay is not in the visible viewport
		if((overlayMinY < windowMinY) || (overlayMaxY > windowMaxY)) {
			var scrollToY = 0;
	
			// if enough space is given. center overlay!
			if(windowHeight > (overlayHeight)) {
				centerOverlayY = parseInt((overlayHeight / 2) + overlayMinY);
				scrollToY = parseInt(centerOverlayY - (windowHeight / 2));
				scrollToY = (0 < scrollToY) ? scrollToY : 0;
			} else {
				scrollToY = overlayMinY;
			}
	
			$('html, body').animate({scrollTop: scrollToY}, 1000, 'easeOutExpo');
		}
	
		this.og.css('height', height);
		this.og.css('width', width);
		this.og.css('opacity', 0);
		this.og.show();
		this.og.animate({opacity: 0.4}, 'slow');
		
		this.o.hide();
		this.o.removeClass('offsetHide');
		this.o.fadeIn('slow', function(){});
		$('input.plz').blur();
	},
	
	hide: function (e) {
		if (e) {
			e.preventDefault();
		}
		if (this._isOpen) {
			modelsMenu.highlightCars();
			
			var pilc = this.o.find('.productImageLargeContainer');
			
			if (e && this.o.find('.close')[0] == e.target && pilc.length && !pilc.hasClass('hide')) {
				// Close-Button wurde geklickt und Detail-Bild wird angezeigt --> Detailbild schließen statt overlay
				closeLargeProductImage();
			} else {
				this._isOpen = false;
				this.og.fadeOut('slow');
				this.o.fadeOut('slow', function(){
					overlay.o.addClass('offsetHide');
				});
				$('input.plz').blur();
			}
			
		}
	},
	
	isOpen: function () {
		return this._isOpen;
	}
}

/** Kümmert sich um das Umschalten zwischen den Seiten */
var pages = {
	defaultPage: 'accessories', 
	currentPage: 'accessories',
	map: {
		accessories: 'Zubehoer',
		sc : 'Sicherheitscheck',
		promo: 'Haendlerangebote',
		newsletter: 'Newsletter',
	},
	
	init: function () {
		this.updateContentShadow();
		this.checkDeepLink();
		SWFAddress.addEventListener(SWFAddressEvent.CHANGE, $.proxy(pages, 'switchPage'));
		if (!sc_enabled) {
			this.map.sc = undefined;
		}
	},
	
	switchPage: function (e) {
		var newPageId = this.getPageId(e.path);
		if (this.currentPage != newPageId) {
			this.showPage(newPageId);
		}
	},
	
	showPage: function (pageId) {
		var skin = '';
		
		if (!$('#tc_'+pageId).length) {
			pageId = this.defaultPage;
		}
		
		this.currentPage = pageId;
		this.selectTab(pageId);
		
		switch (pageId) {
			case 'sc' : 
				skin = "orange";
				$('.notepad').hide();
				$('.accessoryOffers').hide();
				$('.modelSelection').show();
				$('.scOffers').show();
				break;
			default:
				$('.notepad').show();
				$('.accessoryOffers').show();
				$('.modelSelection').show();
				$('.scOffers').hide();
				if (pageId == 'newsletter' && typeof newsletter != 'undefined') {
					newsletter.init();
				}
		}
		
		dealer.refreshFormBox();	// Update nötig, weil beim SC nicht alle Dealer Teilnehmen
		$('.tabContent').hide();
		$('#tc_'+pageId).show();
		var catCount = document.body.className.split('cat')[1];
		document.body.className = skin + (catCount ? ' cat'+catCount : '');
		this.updateContentShadow();
	},
	
	selectTab: function (pageId) {
		$('.tabSelection li').removeClass('active');
		$('#t_'+pageId).addClass('active');
		$('.tabContent').hide();
		$('#tc_'+pageId).show();
	},
	
	getPageId: function (urlName) {
		if (urlName.indexOf('/') == 0) {
			urlName = urlName.substr(1);
		}
		for (var i in this.map) {
			if (this.map[i] == urlName) {
				return i;
			}
		}
		return this.defaultPage;
	},
	
	updateContentShadow: function () {
		var h = Math.max(0, $('#content .tabContent:visible').height() - 117);
		$('#content_shadow .center').height(h);
		h = Math.max(0, $('#rightCol').height() - 149);
		$('#rightCol_shadow .center').height(h);
	},
	
	checkDeepLink: function () {
		var p = this.getUrlParameters();
		
		if (p.TID && p.CatID) {
			var catparts = p.CatID.split(',');
			if (catparts.length < 2) {
				showProductByParams(null, catparts[0], p.TID);
			} else {
				showProductByParams(catparts[0], catparts[1], p.TID);
			}
		} else if (p.Cat && p.GroupID) {
			showProductByParams(-1, p.Cat, p.GroupID);
		} else if (p.CatID) {
			$('#catItem_' + p.CatID).click();
		}
	},
	
	getUrlParameters: function () {
		var ret = {},
			seg = window.location.search.substr(1).split('&'),
			len = seg.length,
			s;
		for (var i=0; i<len; i++) {
			if (seg[i]) {
				s = seg[i].split('=');
				ret[s[0]] = s[1];
			}
		}
		return ret;
	}, 
	
	isSecuritycheckPage: function () {
		return pages.currentPage == 'sc';
	}
}

/** Funktionen des Ausklappmenüs bei der Fahrzeugauswahl */
var modelsMenu = {
	openDelay		: 250,
	closeDelay		: 50,
	openDuration	: 250,
	closeDuration	: 100,
	openTimeoutID	: -1,
	closeTimeoutID	: -1,
	isOpen			: false,
	nextCar			: '',
	currentCar		: '',
	flyout			: null,
	
	carIDs : {},	// stellt die Beziehung zwischen dem Modelnamen und der ID des Models her. Wird in der index.php von PHP-Seite befüllt
					// bsp: {c30:167, c70:168, ... }
	texte : {
		_850:'Der Volvo 850',
		c30:'Steigen Sie in den voll konfigurierbaren Volvo C30. Erleben Sie, wie seine Leistungsmerkmale Ihren Fahrspaß maximieren werden.',
		c70:'Er ist ein Hardtop-Coupé und ein offenes Cabrio zugleich. Ob mit Verdeck oder ohne, die beeindruckende Funktionsvielfalt des Volvo C70 wird Sie begeistern.',
		s40:'Leistung und modernes Design gehören beim Volvo S40 zum Standard. Tauchen Sie ein in eine Welt der technischen Details, die eine Fahrt mit diesem Auto zum reinsten Vergnügen machen.',
		s60:'Atemberaubendes Design und sportliche Fahrdynamik - das ist der Volvo S60.',
		s70:'Der Volvo S70',
		s80:'Unterwegs durch Stadtlandschaften oder auf versteckten Landstraßen, der Volvo S80 strebt in jedem Detail nach Schönheit.',
		v40:'Der Volvo V40',
		v50:'Neben seinem leistungsstarken T5 Motor hat der geräumige Volvo V50 Kombi noch jede Menge mehr zu bieten.',
		v60:'Der neue Volvo V60 - Der Sportkombi.',
		v70:'Der Volvo V70 überzeugt durch eine harmonische Verbindung aus sportlicher Fahrkultur und familienfreundlicher Ausstattung.',
		xc60:'Jeder Volvo XC60 ist mit der City Safety Technologie ausgestattet. Doch das ist längst nicht alles.',
		xc70:'Es zählt der Weg und das Ziel. Der Volvo XC70 weckt die Reiselust in uns allen.',
		xc90:'Erleben Sie den Volvo XC90 von allen Seiten und Sie werden verstehen, warum man mit diesem Auto jeden Freund mitnehmen möchte.'
	},
	
	links : {
		_850:[
		],
		c30:[
			  {name:'360 Grad', url:'http://www.volvocars.com/de/all-cars/volvo-c30/model-animations/pages/'}
			 ,{name:'Volvo C30 Designen', url:'http://www.volvocars.com/de/all-cars/volvo-c30/pages/style-your-c30.aspx'}
			 ,{name:'5 Highlights', url:'http://www.volvocars.com/de/all-cars/volvo-c30/pages/5-things.aspx'}
			 ,{name:'Galerie', url:'http://www.volvocars.com/de/all-cars/volvo-c30/pages/the-gallery.aspx'}
			 ,{name:'Welcher Volvo C30?', url:'http://www.volvocars.com/de/all-cars/volvo-c30/which/pages/'}
			 ,{name:'Details & Preise', url:'http://www.volvocars.com/de/all-cars/volvo-c30/details/pages/'}
			 ,{name:'Volvo C30 Angebote', url:'http://www.volvocars.com/de/all-cars/volvo-c30/pages/offers.aspx'}
		],
		c70:[
			  {name:'360 Grad', url:'http://www.volvocars.com/de/all-cars/volvo-c70/model-animations/pages/'}
			 ,{name:'Volvo C70 Designen', url:'http://www.volvocars.com/de/all-cars/volvo-c70/pages/style-your-c70.aspx'}
			 ,{name:'5 Highlights', url:'http://www.volvocars.com/de/all-cars/volvo-c70/pages/5-things.aspx'}
			 ,{name:'Galerie', url:'http://www.volvocars.com/de/all-cars/volvo-c70/pages/the-gallery.aspx'}
			 ,{name:'Welcher Volvo C70?', url:'http://www.volvocars.com/de/all-cars/volvo-c70/which/pages/'}
			 ,{name:'Details & Preise', url:'http://www.volvocars.com/de/all-cars/volvo-c70/details/pages/'}
			 ,{name:'Volvo C70 Angebote', url:'http://www.volvocars.com/de/all-cars/volvo-c70/pages/offers.aspx'}
		],
		s40:[
			  {name:'Volvo S40 Designen', url:'http://www.volvocars.com/de/all-cars/volvo-s40/pages/style-your-s40.aspx'}
			 ,{name:'5 Highlights', url:'http://www.volvocars.com/de/all-cars/volvo-s40/pages/5-things.aspx'}
			 ,{name:'Galerie', url:'http://www.volvocars.com/de/all-cars/volvo-s40/pages/the-gallery.aspx'}
			 ,{name:'Welcher Volvo S40?', url:'http://www.volvocars.com/de/all-cars/volvo-s40/which/pages/'}
			 ,{name:'Details & Preise', url:'http://www.volvocars.com/de/all-cars/volvo-s40/details/pages/'}
			 ,{name:'Volvo S40 Angebote', url:'http://www.volvocars.com/de/all-cars/volvo-s40/pages/offers.aspx'}
		],
		s60:[
			  {name:'5 Highlights', url:'http://www.volvocars.com/de/all-cars/volvo-s60/pages/5-things.aspx'}
			 ,{name:'Galerie', url:'http://www.volvocars.com/de/all-cars/volvo-s60/pages/the-gallery.aspx'}
			 ,{name:'Welcher Volvo S60?', url:'http://www.volvocars.com/de/all-cars/volvo-s60/which/pages/default.aspx'}
			 ,{name:'Details & Preise', url:'http://www.volvocars.com/de/all-cars/volvo-s60/details/pages/default.aspx'}
			 ,{name:'Den volvo S60 erleben', url:'http://www.volvocars.com/de/all-cars/volvo-s60/Pages/5-things.aspx?hub'}
			 ,{name:'Volvo S60 Angebote', url:'http://www.volvocars.com/de/all-cars/volvo-s60/pages/offers.aspx'}
		],
		s70:[
		],
		s80:[
			  {name:'360 Grad', url:'http://www.volvocars.com/de/all-cars/volvo-s80/model-animations/pages/'}
			 ,{name:'Volvo S80 Designen', url:'http://www.volvocars.com/de/all-cars/volvo-s80/pages/style-your-s80.aspx'}
			 ,{name:'5 Highlights', url:'http://www.volvocars.com/de/all-cars/volvo-s80/pages/5-things.aspx'}
			 ,{name:'Galerie', url:'http://www.volvocars.com/de/all-cars/volvo-s80/pages/the-gallery.aspx'}
			 ,{name:'Welcher Volvo S80?', url:'http://www.volvocars.com/de/all-cars/volvo-s80/which/pages/'}
			 ,{name:'Details & Preise', url:'http://www.volvocars.com/de/all-cars/volvo-s80/details/pages/'}
			 ,{name:'Volvo S80 Angebote', url:'http://www.volvocars.com/de/all-cars/volvo-s80/pages/offers.aspx'}
		],
		v40:[
		],
		v50:[
			  {name:'Volvo V50 Designen', url:'http://www.volvocars.com/de/all-cars/volvo-v50/pages/style-your-v50.aspx'}
			 ,{name:'5 Highlights', url:'http://www.volvocars.com/de/all-cars/volvo-v50/pages/5-things.aspx'}
			 ,{name:'Galerie', url:'http://www.volvocars.com/de/all-cars/volvo-v50/pages/the-gallery.aspx'}
			 ,{name:'Welcher Volvo V50?', url:'http://www.volvocars.com/de/all-cars/volvo-v50/which/pages/'}
			 ,{name:'Details & Preise', url:'http://www.volvocars.com/de/all-cars/volvo-v50/details/pages/'}
			 ,{name:'Volvo V50 Angebote', url:'http://www.volvocars.com/de/all-cars/volvo-v50/pages/offers.aspx'}
		],
		v60:[
			  {name:'5 Highlights', url:'http://www.volvocars.com/de/all-cars/volvo-v60/pages/5-things.aspx'}
			 ,{name:'Galerie', url:'http://www.volvocars.com/de/all-cars/volvo-v60/pages/the-gallery.aspx'}
			 ,{name:'Welcher Volvo V60?', url:'http://www.volvocars.com/de/all-cars/volvo-v60/which/pages'}
			 ,{name:'Details & Preise', url:'http://www.volvocars.com/de/all-cars/volvo-v60/details/pages'}
			 ,{name:'Angebote', url:'http://www.volvocars.com/de/all-cars/volvo-v60/pages/offers.aspx'}
			 ,{name:'Den Volvo V60 erleben', url:'http://www.volvocars.com/de/all-cars/volvo-v60/pages/hub.aspx'}
			 ,{name:'Volvo V60 Allradtest', url:'http://www.volvocars.com/de/all-cars/volvo-v60/pages/ams-test.aspx'}
			 ,{name:'Volvo V60 Plug-in-Hybrid', url:'http://www.volvocars.com/de/all-cars/volvo-v60/pages/v60-hybrid.aspx'}
		],
		v70:[
			  {name:'360 Grad', url:'http://www.volvocars.com/de/all-cars/volvo-v70/model-animations/pages/'}
			 ,{name:'Volvo V70 Designen', url:'http://www.volvocars.com/de/all-cars/volvo-v70/pages/style-your-v70.aspx'}
			 ,{name:'5 Highlights', url:'http://www.volvocars.com/de/all-cars/volvo-v70/pages/5-things.aspx'}
			 ,{name:'Galerie', url:'http://www.volvocars.com/de/all-cars/volvo-v70/pages/the-gallery.aspx'}
			 ,{name:'Welcher Volvo V70?', url:'http://www.volvocars.com/de/all-cars/volvo-v70/which/pages/'}
			 ,{name:'Details & Preise', url:'http://www.volvocars.com/de/all-cars/volvo-v70/details/pages/'}
			 ,{name:'Volvo V70 Angebote', url:'http://www.volvocars.com/de/all-cars/volvo-v70/pages/offers.aspx'}
		],
		xc60:[
			  {name:'360 Grad', url:'http://www.volvocars.com/de/all-cars/volvo-xc60/model-animations/pages/'}
			 ,{name:'Volvo XC60 Designen', url:'http://www.volvocars.com/de/all-cars/volvo-xc60/pages/style-your-xc60.aspx'}
			 ,{name:'5 Highlights', url:'http://www.volvocars.com/de/all-cars/volvo-xc60/pages/5-things.aspx'}
			 ,{name:'Galerie', url:'http://www.volvocars.com/de/all-cars/volvo-xc60/pages/the-gallery.aspx'}
			 ,{name:'Welcher Volvo XC60?', url:'http://www.volvocars.com/de/all-cars/volvo-xc60/which/pages/'}
			 ,{name:'Details &amp; Preise', url:'http://www.volvocars.com/de/all-cars/volvo-xc60/details/pages/'}
			 ,{name:'Volvo XC60 Angebote', url:'http://www.volvocars.com/de/all-cars/volvo-xc60/pages/offers.aspx'}
		],
		xc70:[
			  {name:'360 Grad', url:'http://www.volvocars.com/de/all-cars/volvo-xc70/model-animations/pages/'}
			 ,{name:'Volvo XC70 Designen', url:'http://www.volvocars.com/de/all-cars/volvo-xc70/pages/style-your-xc70.aspx'}
			 ,{name:'5 Highlights', url:'http://www.volvocars.com/de/all-cars/volvo-xc70/pages/5-things.aspx'}
			 ,{name:'Galerie', url:'http://www.volvocars.com/de/all-cars/volvo-xc70/pages/the-gallery.aspx'}
			 ,{name:'Welcher Volvo XC70?', url:'http://www.volvocars.com/de/all-cars/volvo-xc70/which/pages/'}
			 ,{name:'Details &amp; Preise', url:'http://www.volvocars.com/de/all-cars/volvo-xc70/details/pages/'}
			 ,{name:'Volvo XC70 Angebote', url:'http://www.volvocars.com/de/all-cars/volvo-xc70/pages/offers.aspx'}
		],
		xc90:[
			  {name:'360 Grad', url:'http://www.volvocars.com/de/all-cars/volvo-xc90/model-animations/pages/'}
			 ,{name:'Volvo XC90 Designen', url:'http://www.volvocars.com/de/all-cars/volvo-xc90/pages/style-your-xc90.aspx'}
			 ,{name:'5 Highlights', url:'http://www.volvocars.com/de/all-cars/volvo-xc90/pages/5-things.aspx'}
			 ,{name:'Galerie', url:'http://www.volvocars.com/de/all-cars/volvo-xc90/pages/the-gallery.aspx'}
			 ,{name:'Welcher Volvo XC90?', url:'http://www.volvocars.com/de/all-cars/volvo-xc90/which/pages/'}
			 ,{name:'Details &amp; Preise', url:'http://www.volvocars.com/de/all-cars/volvo-xc90/details/pages/'}
			 ,{name:'Volvo XC90 Angebote', url:'http://www.volvocars.com/de/all-cars/volvo-xc90/pages/offers.aspx'}
		]
	},
	
	init:function () {
		this.flyout = $('#flyout');
		this.flyout.bind('mouseover', jQuery.proxy(modelsMenu, 'open')).bind('mouseout', jQuery.proxy(modelsMenu, 'close'));
		this.flyout.find('.faker').bind('mouseover', jQuery.proxy(modelsMenu, 'close'));
		this.flyout.find('.car').bind('click', jQuery.proxy(modelsMenu, 'selectCar'));
		this.flyout.find('.top').bind('click', jQuery.proxy(modelsMenu, 'selectCar'));
		this.flyout.find('#btnSelectCar').bind('click', jQuery.proxy(modelsMenu, 'selectCar'));

		$('.modelSelection .clearSelection').live('click', jQuery.proxy(modelsMenu, 'clearSelection'));
		
		$('.modelSelection .model').live('mouseover', function(){
			var src = $(this).find('img:first').attr('src');
			var model = src.substring(src.lastIndexOf('/')+1,src.lastIndexOf('_'));
			modelsMenu.open(model);
		}).live('mouseout', jQuery.proxy(modelsMenu, 'close')).live("click", jQuery.proxy(modelsMenu, 'selectCar'));
	},
	
	open: function (car) {
		window.clearTimeout(this.openTimeoutID);
		window.clearTimeout(this.closeTimeoutID);
		
		this.nextCar = (typeof car == 'string') ? car : this.currentCar;
		if (parseInt(this.nextCar, 10).toString() == this.nextCar) {
			this.nextCar = '_' + this.nextCar;
		}
		
		if (this.nextCar != this.currentCar) {
			if (!this.isOpen) {
				this.openTimeoutID = window.setTimeout("modelsMenu.doOpen()", this.openDelay)
			} else {
				this.doClose(true);
			}
		}
	},
	
	close: function (e) {
		window.clearTimeout(this.openTimeoutID);
		window.clearTimeout(this.closeTimeoutID);
		if (this.isOpen) {
			if (e && $(e.target).hasClass('faker')) {
				this.doClose();
			} else {
				this.closeTimeoutID = window.setTimeout("modelsMenu.doClose()", this.closeDelay)
			}
		}
	},
	
	doOpen: function  () {
		var thumb, pos;
		
		this.isOpen = true;
		this.currentCar = this.nextCar;
		
		thumb = jQuery('.modelSelection .thumblist .model_' + this.currentCar);
		pos = thumb.offset();
		
		this.flyout[0].className = this.currentCar;
		this.flyout.css({
			top  : pos.top - 6,
			left : pos.left - 51
		});
		
		if (isIE) {
			this.flyout.show();
		} else {
			this.flyout.fadeIn(this.openDuration);
		}
		
		var l = this.links[this.currentCar].length;
		var s = '';
		for (var i=0; i<l; i++) {
			s+= '<a href="'+this.links[this.currentCar][i].url+'" target="_blank">'+this.links[this.currentCar][i].name+'</a><br />';
		}
		
		$('.rangeContainer div.model').css('background', '');
		$('.mThumb_'+this.carIDs[this.currentCar]).css('background', '#fff');
		this.flyout.find('h1').html(this.currentCar.toUpperCase().replace(/_/g,''));
		this.flyout.find('p').html(this.texte[this.currentCar]);
		this.flyout.find('.flyoutLinks').html(s);
	},
	
	doClose: function (reOpen) {
		window.clearTimeout(this.openTimeoutID);
		window.clearTimeout(this.closeTimeoutID);
		
		$('.rangeContainer div.model').css('background', '');
		
		this.isOpen = false;
		this.currentCar = '';
		if (reOpen) {
			if (isIE) {
				this.flyout.hide();
				this.open(this.nextCar);
			} else {
				this.flyout.fadeOut(this.closeDuration, function () { modelsMenu.open(modelsMenu.nextCar);});
			}
		} else {
			if (isIE) {
				this.flyout.hide();
			} else {
				this.flyout.fadeOut(this.closeDuration);
			}
		}
	},
	
	selectCar: function (e) {
		var car = this.currentCar ? this.currentCar : this.nextCar;
		refreshModelSelection({ modelId:this.carIDs[car.replace(/_/g,'')] });
		doTrack('car_select');
		this.doClose();
		return false;
	},
	
	clearSelection: function (e) {
		if (this.isCarSelected()) {
			refreshModelSelection({ reset:1 });
			doTrack('car_unselect');
			this.doClose();
			overlay.hide();
		}
		return false;
	},
	
	getSelectedCarId: function () {
		return $('.modelSelection .currentModel').html();
	},
	
	isCarSelected: function () {
		return this.getSelectedCarId().length > 0;
	},
	
	highlightCars: function (models) {
		if (!this.isCarSelected()) {
			
			var modelThumbs = $('.modelSelection .model');
			if (typeof models == "undefined" || !models.length || !overlay.isOpen()) {
				modelThumbs.css('opacity', 1);
			} else {
				modelThumbs.css('opacity', 0.2);
				for (var i=0; i<models.length; i++) {
					modelThumbs.filter('.mThumb_'+models[i]).css('opacity', 1);
				}
			}
		}
	}
}

var sicherheitscheck = {
	lastPrices: {},
	
	updateCube : function () {
		$.post('services/getScPrices.php', {r:Math.random()}, $.proxy(this, 'embedCubeFlash'), 'text');
	},
	
	embedCubeFlash: function (result) {
		var swfUrl = result;
		var param = {menu:"false", wmode:"transparent"};
		var flashvars = {}
		swfobject.embedSWF(swfUrl, "sc_cube", "320", "249", "9.0.0", "", flashvars, param, {});
	}
}

var reifenAuswahl = {
	rs					: null,
	productListBackup	: null,
	items				: {},
	filterOptions		: {},
	overlay				: null,
	
	init: function () {
		this.overlay			= $('#overlay');
		this.rs					= this.overlay.find(".reifenSelektor");
		this.productListBackup	= $(this.overlay.find('.thumblist').html());
		this.items				= {};
		this.filterOptions		= {hersteller:[], felgengroesse:[], felgenart:[] };
		
		this.rs.find('a.selectAll').click($.proxy(this, "selectAll"));
		this.rs.find('a.showTires').click($.proxy(this, "setFilter"));
		this.overlay.find('.footer .openRS').unbind().click($.proxy(this, 'open'));
		
		this.parseData();
		this.open(null, true);
	},
	
	open: function (e, instant) {
		if (instant) {
			this.rs.show();
		} else {
			if (e) {
				e.preventDefault();
			}
			this.rs.fadeIn(300);
		}
		this.overlay.find('.overlayFooter a').addClass('hide');
		modelsMenu.highlightCars();
	},
	
	close: function () {
		this.rs.fadeOut(300);
		this.overlay.find('.overlayFooter a').addClass('hide').filter('.openRS').removeClass('hide');
	},
	
	parseData: function () {
		var keyHersteller = 'Reifenbezeichnung';
		var subKeyFelgenGroesse = 'Felgendimensionen';
		var keyFelgengroesse = ' x ';
		this.productListBackup.find("li").each(
			function (i, item) {
				item = $(item)
				var pos;
				var tmp;
				var itemData = {
					id: item.find('input[name=TemplateID]').val(),
					hersteller: '',
					felgengroesse: [],
					felgenart:''
				}
				
				var description = item.find('input[name=Description]').val().replace(/(<([^>]+)>)/ig," ").replace(/\s+/g," ");
				var title = item.find('input[name=Title]').val();
				
				// Hersteller
				if ((pos = description.indexOf(keyHersteller)) != -1){
					pos += keyHersteller.length + 1;
					itemData.hersteller = description.substring(pos, description.indexOf(' ', pos))
				}
				
				if ($.trim(itemData.hersteller) && $.inArray(itemData.hersteller, reifenAuswahl.filterOptions.hersteller) == -1) {
					reifenAuswahl.filterOptions.hersteller.push(itemData.hersteller);
				}
				
				// Felgengröße
				pos = description.indexOf(subKeyFelgenGroesse);
				while ((pos = description.indexOf(keyFelgengroesse,pos)) != -1) {
					pos += keyFelgengroesse.length;
					tmp = parseInt(description.substring(pos, description.indexOf(' ', pos)), 10).toString(10);
					itemData.felgengroesse.push(tmp);
					if ($.inArray(tmp, reifenAuswahl.filterOptions.felgengroesse) == -1) {
						reifenAuswahl.filterOptions.felgengroesse.push(tmp);
					}
				}
				
				// Felgenart
				if (title.indexOf('Stahl') != -1) {
					itemData.felgenart = 'Stahl';
				} else {
					itemData.felgenart = 'Leichtmetall';
				}
				
				if ($.inArray(itemData.felgenart, reifenAuswahl.filterOptions.felgenart) == -1) {
					reifenAuswahl.filterOptions.felgenart.push(itemData.felgenart);
				}
				
				reifenAuswahl.items[itemData.id] = itemData;
			}
		);
		
		this.appendForm();
	},
	
	appendForm: function () {
		this.filterOptions.hersteller.sort();
		this.filterOptions.felgengroesse.sort();
		this.filterOptions.felgenart.sort();
		
		var code, name, i, currentFilter, suffix;
		
		for (var group in this.filterOptions) {
			name = group+'_alle';
			code  = '<span class="alle"><input type="checkbox" name="'+name+'" id="rs_cb_'+name+'" class="alle"><label for="rs_cb_'+name+'">Alle</label></span>';
			currentFilter = this.filterOptions[group];
			suffix = group=='felgengroesse' ? ' Zoll' : '';
			for (i=0; i<currentFilter.length; i++) {
				name = group+'_'+currentFilter[i];
				code += '<span><input type="checkbox" name="rs_cb_'+name+'" id="rs_cb_'+name+'" value="'+currentFilter[i]+'"><label for="rs_cb_'+name+'">'+currentFilter[i]+suffix+'</label></span>';
			}
			
			this.rs.find('.row.'+group+' p').html(code);
		}
		
		this.rs.find('input').not('.alle').click($.proxy(this, "checkAllRow")).end().filter('.alle').click($.proxy(this, "selectAllRow"));
	},
	
	selectAll: function (e) {
		e.preventDefault();
		this.rs.find('input').attr('checked', true);
		this.rs.find('a.showTires').click();
	},
	
	selectAllRow: function (e) {
		this.hideError();
		var cbAll = $(e.target);
		cbAll.closest('.row').find('input').attr('checked', cbAll.attr('checked'));
	}, 
	
	checkAllRow: function (e) {
		this.hideError();
		var cbs = $(e.target).closest('.row').find('input');
		var cbAlle = cbs.filter('.alle');
		cbs = cbs.not('.alle');
		cbAlle.attr('checked', (cbs.length==cbs.filter(':checked').length));
	},
	
	setFilter: function (e) {
		e.preventDefault();
		var items = this.getFilterdItems();
		var i,l = items.length;
		var code = '';
		
		if (l) {
			for (var i=0; i<l; i++ ) {
				code += '<li>'+this.productListBackup.find('input[name=TemplateID][value='+items[i]+']').closest("li").html()+'</li>';
			}
			
			this.overlay.find('.productContainer .thumblist').html('<ul>'+code+'</ul>');
			carousel.init();
			this.close();
			this.overlay.find('.productContainer .thumblist li').first().click();
		} else {
			this.showError();
		}
	},
	
	getFilterdItems: function () {
		var i, tmp, filter, fitsFilter;
		var selected = {
			hersteller : 	this.rs.find(".row.hersteller input:checked"),
			felgengroesse : this.rs.find(".row.felgengroesse input:checked"),
			felgenart : 	this.rs.find(".row.felgenart input:checked")
		}
		
		for (i in selected) {
			if (!selected[i].length || selected[i].filter('.alle').length) {
				delete selected[i];
			} else {
				tmp = [];
				selected[i].each(function (i, f) {tmp.push($(f).val())});
				selected[i] = tmp;
			}
		}
	
		tmp = [];
		for (i in this.items) {
			fitsFilter = true;
			for (filter in selected) {
				if ($.isArray(this.items[i][filter])) {
					if ($.grep(this.items[i][filter], function (e) {return $.inArray(e, selected[filter]) != -1}).length == 0) {
						fitsFilter = false;
						break;
					}
				} else {
					if ($.inArray(this.items[i][filter], selected[filter]) == -1) {
						fitsFilter = false;
						break;
					}
				}
			}
			
			if (fitsFilter) {
				tmp.push(i);
			}
		}
		
		return tmp;
	},
	
	showError: function () {
		this.rs.find('.message').removeClass('hide');
	},
	
	hideError: function () {
		this.rs.find('.message').addClass('hide');
	}
}

var carousel = {
	init: function (selectedIndex) {
		if (!selectedIndex || isNaN(selectedIndex)) {
			selectedIndex = 1;
		}
		var list = $('#overlay .productContainer .thumblist ul');
		list.jcarousel({
			scroll: 3,
			start: selectedIndex,
			itemFirstInCallback: function(carousel, li, index, action){
				var count	= carousel.size();
				var last	= ((index + 5) > count) ? count : (index + 5);
				$('#overlay .productContainer .pagingTexts').find('.minPage').text(index).end().find('.maxPage').text(last).end().find('.totalPage').text(count);
			}
		});
		list.find('li:nth-child('+selectedIndex+')').click();
	}
}

KomplettradKonf = {
	
	show: function (link) {
		var modelName = $('span.currentModelName').html(),
			src = 'http://www.volvocars.com/de/sales-services/service/aftersales/pages/komplettradkonfigurator.aspx?model=' + modelName,
			RKT = $('#reifenKonfTeaser');
			
		if (modelName == 'S60') {
			src += 'from2010';
		}
		
		RKT.remove();
		RKT = $('<div style="position:absolute;left:10px; top:1px; z-index:10;" id="reifenKonfTeaser"><a href="'+src+'" target="_blank"><img src="images/pool/reifen_konfigurator_teaser.jpg" width="520" height="236" alt="" /></a></div>');
		$('#overlay .productDetails .content').append(RKT);
		
		$('.jcarousel-list li').die('click.produktChange').live('click.produktChange', this.hide).removeClass('selected');
		$(link).closest('li').addClass('selected');
	},
	
	hide: function (e) {
		if (!e || !$(e.currentTarget).find('a').is('.reifenKonfLink')) {
			$('#reifenKonfTeaser').remove();
			$('.jcarousel-list li').die('click.produktChange');
		}
	}
}

var BbCode = {
	decode: function (s) {
		s = s.replace(/\[b\](.*)\[\/b\]/ig, "<strong>$1</strong>");
		s = s.replace(/\[i\](.*)\[\/i\]/ig, "<em>$1</em>");
		s = s.replace(/\[br\]/ig, "<br />");
		return s;
	}
}

/** Initialisierung */
$(function(){

	// Mouseevents der Produktkategorien (muss in JS sein, weil ggf über einen "Faker" aufgerufen)
	$('#tc_accessories .content').click(selectCategory);
	$('.productDetails .magnifier').live('click', openLargeProductImage);
	$('.productDetails .back').live('click', closeLargeProductImage);
	$('.productDetails .links .noteProduct').live('click', notepad.addProduct);
	$('.productDetails .productContainer .thumblist li').live('click', selectProduct);
	$('.jcarousel-prev, .jcarousel-next').live('mousedown', function (e) {e.preventDefault();});

	/** faker wegen der überlagernden Bilder */
	$('#faker1').click(function() {window.location.hash = $('.tabSelection a:last').attr('href');});

	$('#faker3').bind('mouseover', function(){
		$('#tc_accessories .descriptionContainer:last').addClass('hover');
	}).bind('mouseout', function(){
		$('#tc_accessories .descriptionContainer:last').removeClass('hover');
	}).click(function() {$('#tc_accessories .content:last').click();});
	
	overlay.init();
	modelsMenu.init();
	dealer.init();
	notepad.init();
	refreshPromo();
	pages.init();
});

/**
Deeplinks:
?GroupID=20&Cat=180		--> Link auf eine allgemeines Product (kein Fahrzeug ausgewählt)
?TID=12345&CatID=12		--> Öffnet das Overlay mit der übergebenen Categorie und selectiert das Produkt
?TID=12345&CatID=34,12	--> Öffnet das Overlay mit der übergebenen Categorie und selectiert das Produkt, wählt zusätzlich das Fahrzeug aus
?Cat=180				--> Öffnet einfach nur die Kategorie
*/
