﻿vcc.elmActiveSortLink = null;
vcc.oContentXml = null;
var arScaleTypes = [1, 2.5, 5, 10, 25, 50];
var oFilterCriteria = {};
vcc.activeTransmissionType = 1;
var iDotW = 10;
var sDotImg = "/_layouts/VolvoCars.Web.Sites/Images/Showroom/model_selector_variant.gif";
var sDotImgOn = "/_layouts/VolvoCars.Web.Sites/Images/Showroom/model_selector_variant_on.gif";

document.write("<style>#loadingCompare { visibility:visible; }</style>");

vcc.initDataGrid = function() {
	vcc.oContentXml = vcc.createXmlObj(strContentXml);
	if (!vcc.oContentXml) {
		vcc.showBrowserTooOld("loadingCompare", sBrowserTooOld);
		return;
	}
	vcc.initFilterCriteria();
	var elmLink = vcc.getElementsByAttribute("class", "firstSortLink", document, "a")[0];
	elmLink.onclick.call();
	vcc.preload("tmpImg", sDotImgOn);
	elmVariantInfo = vcc.getObj("variantInfo");
	vcc.moveTo("helpDiv", vcc.getX("modelGrid"), vcc.getY("modelGrid"));
	if (iDefaultTransmission != 1)
		vcc.changeTransmissionCriteria(iDefaultTransmission);
	vcc.hide("loadingCompare");
}


vcc.initFilterCriteria = function() {
	var elmFilterDiv = vcc.getObj("filterDiv");
	var arInputs = elmFilterDiv.getElementsByTagName("input");
	for (var i=0; i<arInputs.length; i++) {
		if (!oFilterCriteria[arInputs[i].name]);
			oFilterCriteria[arInputs[i].name] = [];
		oFilterCriteria[arInputs[i].name][arInputs[i].value] = arInputs[i].checked;
	}
}

vcc.sortCarData = function(sSortOn, sLongHeader, bIsTransmissionData) {
	vcc.arDots = [];
	if (vcc.elmActiveSortLink)
		vcc.elmActiveSortLink.className = "";
	var elmLink = vcc.getObj("sortLink_" + sSortOn);
	elmLink.className = "active";
	var elmHeader = vcc.getObj("sortLongHeader");
	elmHeader.innerHTML = "<h5>" + sLongHeader + "</h5>";
	
	if (vcc.getH(elmHeader) > 20) // Check if the header has wrapped (move it if it has, please)
		vcc.moveTo(elmHeader, null, 0);
	else
		vcc.moveTo(elmHeader, null, 10);

	vcc.elmActiveSortLink = elmLink;
	
	var arModels = vcc.oContentXml.documentElement.childNodes;
	var oRange = vcc.findDataRange(arModels, sSortOn, bIsTransmissionData);	

	for (var i=0; i<5; i++) {
		var iNumber = oRange.scaleMin + (oRange.lineAmount * i);
		//if (iNumber.toLocaleString)
		//	iNumber = iNumber.toLocaleString();
		vcc.getObj("scaleNr" + (i+1)).innerHTML = "<h5>" + iNumber + "</h5>";
	}
	for (var i=0; i<arModels.length; i++) {
		vcc.arDots[i] = {};
		vcc.arDots[i].dots = [];
		vcc.arDots[i].modelCode = arModels[i].getAttribute("modelcode").toLowerCase();
		var elmCarDots = vcc.getObj("carDots_" + vcc.arDots[i].modelCode);
		if (elmCarDots) {
			elmCarDots.innerHTML = "";
			var arVariants = arModels[i].childNodes;
			for (var j=0; j<arVariants.length; j++) {
				if (bIsTransmissionData) {
					var arTransmissions = arVariants[j].childNodes;
					for (var t=0; t<arTransmissions.length; t++) {
						vcc.appendCarDot(arVariants[j], arTransmissions[t], sSortOn, oRange, elmCarDots, vcc.arDots[i].dots, true);
					}
				}
				else {
					vcc.appendCarDot(arVariants[j], arVariants[j], sSortOn, oRange, elmCarDots, vcc.arDots[i].dots);
				}
			}
		}
		vcc.arDots[i].dots.sort(vcc.sortDots);
	}
	vcc.visualizeDots();
}

vcc.appendCarDot = function(oVariantNode, oValueNode, sSortOn, oRange, elmCarDots, arDots, bIsTransmissionData) {
	var fValueRaw = parseFloat(oValueNode.getAttribute(sSortOn).replace(/,/, "."));
	//var fValueRaw = parseFloat(oValueNode.getAttribute(sSortOn));
	var sValue = oValueNode.getAttribute(sSortOn.replace("_raw", ""));
	var fPart = (fValueRaw - oRange.scaleMin) / oRange.roundedRange;
	var iX = parseInt(fPart * 500);
	var elmLink = document.createElement("a");
	elmCarDots.appendChild(elmLink);
	elmLink.className = "carDot";
	vcc.moveTo(elmLink, iX, null, vcc.bIsRtl);
	elmLink.onmouseover = vcc.showVariantInfo;
	elmLink.onmouseout = vcc.hideVariantInfo;
	var elmCarLink = vcc.elementGetElementsByName("carLink", "a", elmCarDots.parentNode)[0];
	elmLink.href = elmCarLink.href;
	var elmImg = document.createElement("img");
	elmLink.appendChild(elmImg);
	elmImg.src = sDotImg;
	arDots.push({elmDot:elmLink, oVariantNode:oVariantNode, oValueNode:oValueNode, x:iX, bIsTransmissionData:bIsTransmissionData});
}

vcc.showVariantInfo = function() {
	vcc.clip(this, 0, 100, 12, 0);
	this.style.border = "solid 1px white";
	vcc.moveBy(this, -1, -1);
	this.firstChild.src = sDotImgOn;
	var elmInfoCell = vcc.getObj("variantInfoCell");
	var sModel = this.getAttribute("modelName");
	var sVariants = "";
	var sVariantsAttr = this.getAttribute("variantNames");
	if (sVariantsAttr) {
		var arVariants = sVariantsAttr.split("|||");
		for (var i=0; i<arVariants.length; i++) {
			sVariants += "<b>" + sModel + " " + arVariants[i] + "</b><br/>";
		}
	}
	elmInfoCell.innerHTML = sVariants;
	var sPrice = this.getAttribute("variantPrice");
	if (vcc.bShowPrice && sPrice) {
		var elmPrice = document.createElement("span");
		elmInfoCell.appendChild(elmPrice);
		elmPrice.className = "price";
		elmPrice.innerHTML = strStartingAtPrice.replace("{price}", sPrice);
	}
	elmVariantInfo.style.display = "block";
	var x = vcc.getX(this) + vcc.getX(this.parentNode) + vcc.getW(this) + 2;
	var y = (vcc.getY(this) + vcc.getY(this.parentNode)) - 12;
	if (vcc.bIsRtl)
		x -= (vcc.getW("variantInfo") + 2 + vcc.getW(this))
	vcc.moveTo(elmVariantInfo, x, y);
}

vcc.hideVariantInfo = function() {
	vcc.clip(this, 0, 100, 9, 0);
	this.style.border = "none";
	vcc.moveBy(this, 1, 1);
	this.firstChild.src = sDotImg;
	elmVariantInfo.style.display = "none";
}

vcc.visualizeDots = function() {

	// Check if the dot should be visible
	for (var t=0; t<vcc.arDots.length; t++) {
		var bModelHasDots = false;
		var arVariantDots = vcc.arDots[t].dots;
		for (var i=0; i<arVariantDots.length; i++) {
			var bShow = true;
			
			// Check if the dot has the right filter criteria to be shown, e g if the dot (representing a variant) has 5 seats and the filter criteria is set to show 5 seat variants
			categoryLoop:
			for (var sCategory in oFilterCriteria) {
				for (var sCategoryValue in oFilterCriteria[sCategory]) {
					if (arVariantDots[i].oVariantNode.getAttribute(sCategory) == sCategoryValue && !oFilterCriteria[sCategory][sCategoryValue]) {
						bShow = false;
						break categoryLoop;
					}
				}
			}
			
			// Find out the lowest price on this variant, by parsing the transmission that belong to this variant, the price is now set on the transmission.
			var arTransmissions = arVariantDots[i].oVariantNode.childNodes;
			var iLowestPrice = 0;
			var sLowestPrice;
			for (var j=0; j<arTransmissions.length; j++) {
				if (arTransmissions[j].getAttribute("type") == vcc.activeTransmissionType) {
					var iThisPrice = parseFloat(arTransmissions[j].getAttribute("msrp_raw").replace(/,/, "."));
					if (!iLowestPrice || iLowestPrice > iThisPrice) {
						iLowestPrice = iThisPrice;
						sLowestPrice = arTransmissions[j].getAttribute("msrp");
					}
				}
			}
			arVariantDots[i].oVariantNode.setAttribute("msrp_raw", iLowestPrice);
			arVariantDots[i].oVariantNode.setAttribute("msrp", sLowestPrice);

			// Check if the dot has the right type of transmission. (This only needs to be done if bShow)
			if (bShow) {
				if (arVariantDots[i].bIsTransmissionData) {
					if (arVariantDots[i].oValueNode.getAttribute("type") != vcc.activeTransmissionType)
						bShow = false;
				}
				else {
					var bShowTransmission = false;
					for (var j=0; j<arTransmissions.length; j++) {
						if (arTransmissions[j].getAttribute("type") == vcc.activeTransmissionType) {
							bShowTransmission = true;
							break;
						}
					}
					bShow = (arTransmissions.length > 0) ? (bShow && bShowTransmission) : bShow;
				}
			}
						
			var sVisible = bShow ? "block" : "none";
			if (bShow)
				bModelHasDots = true;
			arVariantDots[i].elmDot.style.display = sVisible;
		}
		
		//Check if several dots overlap. If they do, make them ONE big dot instead to make mouseover (with white border...) easier.
		for (var i=0; i<arVariantDots.length; i++) {
			arVariantDots[i].elmDot.setAttribute("modelName", arVariantDots[i].oVariantNode.parentNode.getAttribute("name"));
			var sVariantNames = arVariantDots[i].oVariantNode.getAttribute("name");
			var iVariantPrice = parseFloat(arVariantDots[i].oVariantNode.getAttribute("msrp_raw").replace(/,/, "."));
			var sVariantPrice = arVariantDots[i].oVariantNode.getAttribute("msrp");
			if (i < arVariantDots.length - 1) {
				var iDistance = arVariantDots[i+1].x - arVariantDots[i].x;
				if (iDistance < iDotW && arVariantDots[i].elmDot.style.display == "block") {
					var iFirstX = arVariantDots[i].x;
					var iLastX = iFirstX + iDotW;
					for (var j=i+1; j<arVariantDots.length; j++) {
						if (arVariantDots[j].x < iLastX && arVariantDots[j].elmDot.style.display == "block") {
							arVariantDots[j].elmDot.style.display = "none";
							iLastX = arVariantDots[j].x + iDotW;
							var sThisVariant = arVariantDots[j].oVariantNode.getAttribute("name");
							if (sVariantNames.indexOf(sThisVariant) < 0)
								sVariantNames += "|||" + sThisVariant;
							var iThisVariantPrice = parseFloat(arVariantDots[j].oVariantNode.getAttribute("msrp_raw").replace(/,/, "."));
							if (iThisVariantPrice && iVariantPrice && iThisVariantPrice < iVariantPrice) {
								sVariantPrice = arVariantDots[j].oVariantNode.getAttribute("msrp");
								iVariantPrice = iThisVariantPrice;
							}
						}
					}
					if (arVariantDots[i].elmDot.firstChild) {
						arVariantDots[i].elmDot.firstChild.width = iLastX - iFirstX;
						arVariantDots[i].elmDot.firstChild.height = iDotW;
					}
				}
			}
			arVariantDots[i].elmDot.setAttribute("variantNames", sVariantNames);
			if (sVariantPrice)
				arVariantDots[i].elmDot.setAttribute("variantPrice", sVariantPrice);
		}
		var iOpacity = bModelHasDots ? 100 : 20;
		var elmCarLayer = vcc.getObj("carModel_" + vcc.arDots[t].modelCode);
		vcc.setOpacity(elmCarLayer, iOpacity);
	}	
}

vcc.sortDots = function(a, b) {
	return a.x - b.x;
}

vcc.changeFilterCriteria = function(elmCheckbox) {
	oFilterCriteria[elmCheckbox.name][elmCheckbox.value] = elmCheckbox.checked;
	vcc.visualizeDots();
}

vcc.changeTransmissionCriteria = function(iType) {
	vcc.activeTransmissionType = iType;
	vcc.visualizeDots();
}

vcc.findDataRange = function(arModels, sSortOn, bIsTransmissionData) {

	// Find out max/min value (and range) for the scale
	var oMinMax = {}
	oMinMax.min = null;
	oMinMax.max = null;
	for (var i=0; i<arModels.length; i++) {
		var arVariants = arModels[i].childNodes;
		for (var j=0; j<arVariants.length; j++) {
			if (bIsTransmissionData) {
				var arTransmissions = arVariants[j].childNodes;
				for (var t=0; t<arTransmissions.length; t++) {
					vcc.getSortValue(oMinMax, arTransmissions[t], sSortOn);
				}
			}
			else {
				vcc.getSortValue(oMinMax, arVariants[j], sSortOn);
			}
		}
	}
	var iSafeMax = oMinMax.max * 1.1; // We don't want to have a dot at the absolute right side of the scale, would look ugly and almost be on top of the filter criteria
	var iRange = iSafeMax - oMinMax.min;
	
	// Find out the rounded range
	var bSubOne = (iRange < 1);
	var iFactor = 1;
	var bRangeFound = false;
	var iRoundedRange = 1;
	while (!bRangeFound) {
		for (var i=0; i<arScaleTypes.length-3; i++) {
			if ((iRange >= (arScaleTypes[i] * iFactor) && iRange < (arScaleTypes[i+1] * iFactor)) || oMinMax.min == oMinMax.max == arScaleTypes[i] * iFactor) {
				bRangeFound = true;
				iRoundedRange = arScaleTypes[i+1] * iFactor;
				break;
			}
		}
		if (bSubOne)
			iFactor /= 10;
		else
			iFactor *= 10;
	}

	// Find the start value for the scale
	var iLineAmount = iRoundedRange / 5;
	var iScaleMin = oMinMax.min - (oMinMax.min % iLineAmount);
	var iScaleMax = iScaleMin + iRoundedRange;
	
	// If possible, avoid having a variant on the startpoint of the scale
	if (oMinMax.min == iScaleMin && (iScaleMin >= 0 && iScaleMin - iLineAmount > 0) && (iScaleMax - iLineAmount) > oMinMax.max) {
		iScaleMin -= iLineAmount;
		iScaleMax -= iLineAmount;
	}

	return {max:oMinMax.max, min:oMinMax.min, range:iRange, roundedRange:iRoundedRange, lineAmount:iLineAmount, scaleMin:iScaleMin, scaleMax:iScaleMax};
}

vcc.getSortValue = function(oMinMax, oNode, sSortOn) {
	var sValue = oNode.getAttribute(sSortOn);
	if (sValue)
	    sValue = sValue.replace(/,/, "."); // Fix certain cultures, e g Sweden
	if (sValue && !isNaN(sValue)) {
		var iValue = parseFloat(sValue);
		oMinMax.min = (oMinMax.min == null || oMinMax.min > iValue) ? iValue : oMinMax.min;
		oMinMax.max = (oMinMax.max == null || oMinMax.max < iValue) ? iValue : oMinMax.max;
	}
}

vcc.showHelp = function() {
	/*vcc.getObj('helpSort').style.height = (vcc.getH('sortTabs') - 6) + "px";
	vcc.moveTo('helpDiv', null, vcc.getY('modelGrid'));
	vcc.moveTo('helpModels', null, vcc.getH('sortTabs') + 4);
	vcc.moveTo('helpFilter', null, vcc.getH('sortTabs') + 4);
	vcc.moveTo('helpTransmission', null, vcc.getH('sortTabs') + 4 + vcc.getH('helpFilter') + 6);*/
	
	vcc.show('helpDiv');
}

vcc.hideHelp = function() {
	vcc.hide('helpDiv'); 
	if (vcc.elmActiveSortLink && vcc.elmActiveSortLink.click) // Neccessary to avoid stupid render bug in IE6
		vcc.elmActiveSortLink.click();
}

vcc.pngBgsToFix = ["model_selector_bottom.png", "model_selector_right_bg.png"];

vcc.addEvent(window, "load", "vcc.fixIePng");
vcc.addEvent(window, "load", "vcc.initDataGrid");
