/* $Header: /home/web/cvsroot/es62_heine/hv_app_shop/staticfiles/cartridge/static/default/js/application.js,v 1.14 2010/02/01 11:02:49 ootkupchyk Exp $ */


// Verfügbarkeit
availability = {


slbMessage_fr: "Livrable immédiatement",
niliMessage_fr: "Malheureusement, les stocks sont épuisés",
naliMessage_fr: ["L'article sera livré plus tard",
		"Livraison jusqu'à début janvier",
		"Livraison jusqu'à la mi-janvier",
		"Livraison jusqu'à fin janvier",
		"Livraison jusqu'à janvier",
		"Livraison en janvier",
		"Livraison jusqu'à début février",
		"Livraison jusqu'à la mi-février",
		"Livraison jusqu'à fin février",
		"Livraison jusqu'à février",
		"Livraison en février",
		"Livraison jusqu'à début mars",
		"Livraison jusqu'à la mi-mars",
		"Livraison jusqu'à fin mars",
		"Livraison jusqu'à mars",
		"Livraison en mars",
		"Livraison jusqu'à début avril",
		"Livraison jusqu'à la mi-avril",
		"Livraison jusqu'à fin avril",
		"Livraison jusqu'à avril",
		"Livraison en avril",
		"Livraison jusqu'à début mai",
		"Livraison jusqu'à la mi-mai",
		"Livraison jusqu'à fin mai",
		"Livraison jusqu'à mai",
		"Livraison en mai",
		"Livraison jusqu'à début juin",
		"Livraison jusqu'à la mi-juin",
		"Livraison jusqu'à fin juin",
		"Livraison jusqu'à juin",
		"Livraison en juin",
		"Livraison jusqu'à début juillet",
		"Livraison jusqu'à la mi-juillet",
		"Livraison jusqu'à fin juillet",
		"Livraison jusqu'à juillet",
		"Livraison en juillet",
		"Livraison jusqu'à début août",
		"Livraison jusqu'à la mi-août",
		"Livraison jusqu'à fin août",
		"Livraison jusqu'à août",
		"Livraison en août",
		"Livraison jusqu'à début septembre",
		"Livraison jusqu'à la mi-septembre",
		"Livraison jusqu'à fin septembre",
		"Livraison jusqu'à septembre",
		"Livraison en septembre",
		"Livraison jusqu'à début octobre",
		"Livraison jusqu'à la mi-octobre",
		"Livraison jusqu'à fin octobre",
		"Livraison jusqu'à octobre",
		"Livraison en octobre",
		"Livraison jusqu'à début novembre",
		"Livraison jusqu'à la mi-novembre",
		"Livraison jusqu'à fin novembre",
		"Livraison jusqu'à novembre",
		"Livraison en novembre",
		"Livraison jusqu'à début décembre",
		"Livraison jusqu'à la mi-décembre",
		"Livraison jusqu'à fin décembre",
		"Livraison jusqu'à décembre",
		"Livraison en décembre",
		"L'article sera livré avant Noël",
		"L'article sera livré avant Pâques",
		"L'article sera livré plus tard",
		"L'article sera livré plus tard",
		"L'article sera livré plus tard",
		"L'article sera livré plus tard",
		"L'article sera livré plus tard",
		"L'article sera livré plus tard",
		"L'article sera livré plus tard",
		"L'article sera livré plus tard",
		"Livraison dans une semaine",
		"Livraison dans deux semaines",
		"Livraison dans trois semaines",
		"Livraison dans quatre semaines",
		"Livraison dans cinq semaines",
		"Livraison dans six semaines",
		"Livraison dans sept semaines",
		"Livraison dans huit semaines",
		"Livraison dans neuf semaines",
		"Livraison dans dix semaines",
		"Livraison dans onze semaines",
		"Livraison dans douze semaines",
		"Livraison dans 13 semaines",
		"Livraison dans 14 semaines",
		"Livraison dans 15 semaines",
		"Livraison dans 16 semaines",
		"L'article sera livré plus tard"],


slbMessage_nl: "Direct leverbaar",
niliMessage_nl: "Dit artikel is helaas uitverkocht.",
naliMessage_nl: ["Dit artikel wordt nageleverd",
		"Levering tot begin januari",
		"Levering tot medio januari",
		"Levering tot eind januari",
		"Levering tot januari",
		"Levering in januari",
		"Levering tot begin februari",
		"Levering tot medio februari",
		"Levering tot eind februari",
		"Levering tot februari",
		"Levering in februari",
		"Levering tot begin maart",
		"Levering tot medio maart",
		"Levering tot eind maart",
		"Levering tot maart",
		"Levering in maart",
		"Levering tot begin april",
		"Levering tot medio april",
		"Levering tot eind april",
		"Levering tot april",
		"Levering in april",
		"Levering tot begin mei",
		"Levering tot medio mei",
		"Levering tot eind mei",
		"Levering tot mei",
		"Levering in mei",
		"Levering tot begin juni",
		"Levering tot medio juni",
		"Levering tot eind juni",
		"Levering tot juni",
		"Levering in juni",
		"Levering tot begin juli",
		"Levering tot midden juli",
		"Levering tot eind juli",
		"Levering tot juli",
		"Levering in juli",
		"Levering tot begin augustus",
		"Levering tot medio augustus",
		"Levering tot eind augustus",
		"Levering tot augustus",
		"Levering in augustus",
		"Levering tot begin september",
		"Levering tot medio september",
		"Levering tot eind september",
		"Levering tot september",
		"Levering in september",
		"Levering tot begin oktober",
		"Levering tot medio oktober",
		"Levering tot eind oktober",
		"Levering tot oktober",
		"Levering in oktober",
		"Levering tot begin november",
		"Levering tot midden november",
		"Levering tot eind november",
		"Levering tot november",
		"Levering in november",
		"Levering tot begin december",
		"Levering tot medio december",
		"Levering tot eind december",
		"Levering tot december",
		"Levering in december",
		"Levering tot kerst.",
		"Levering tot Pasen.",
		"Dit artikel wordt nageleverd",
		"Dit artikel wordt nageleverd",
		"Dit artikel wordt nageleverd",
		"Dit artikel wordt nageleverd",
		"Dit artikel wordt nageleverd",
		"Dit artikel wordt nageleverd",
		"Dit artikel wordt nageleverd",
		"Dit artikel wordt nageleverd",
		"Levering binnen een week",
		"Levering binnen twee weken",
		"Levering binnen drie weken",
		"Levering binnen vier weken",
		"Levering binnen vijf weken",
		"Levering binnen zes weken",
		"Levering binnen zeven weken",
		"Levering binnen acht weken",
		"Levering binnen negen weken",
		"Levering binnen tien weken",
		"Levering binnen elf weken",
		"Levering binnen twaalf weken",
		"Levering binnen 13 weken",
		"Levering binnen 14 weken",
		"Levering binnen 15 weken",
		"Levering binnen 16 weken",
		"Dit artikel wordt nageleverd"],	
	
	
slbMessage: "Sofort lieferbar",
niliMessage: "Dieser Artikel ist leider ausverkauft.",
naliMessage: ["Artikel wird nachgeliefert",
		"Lieferung bis Anfang Januar",
		"Lieferung bis Mitte Januar",
		"Lieferung bis Ende Januar",
		"Lieferung bis Januar",
		"Lieferung im Januar",
		"Lieferung bis Anfang Februar",
		"Lieferung bis Mitte Februar",
		"Lieferung bis Ende Februar",
		"Lieferung bis Februar",
		"Lieferung im Februar",
		"Lieferung bis Anfang März",
		"Lieferung bis Mitte März",
		"Lieferung bis Ende März",
		"Lieferung bis März",
		"Lieferung im März",
		"Lieferung bis Anfang April",
		"Lieferung bis Mitte April",
		"Lieferung bis Ende April",
		"Lieferung bis April",
		"Lieferung im April",
		"Lieferung bis Anfang Mai",
		"Lieferung bis Mitte Mai",
		"Lieferung bis Ende Mai",
		"Lieferung bis Mai",
		"Lieferung im Mai",
		"Lieferung bis Anfang Juni",
		"Lieferung bis Mitte Juni",
		"Lieferung bis Ende Juni",
		"Lieferung bis Juni",
		"Lieferung im Juni",
		"Lieferung bis Anfang Juli",
		"Lieferung bis Mitte Juli",
		"Lieferung bis Ende Juli",
		"Lieferung bis Juli",
		"Lieferung im Juli",
		"Lieferung bis Anfang August",
		"Lieferung bis Mitte August",
		"Lieferung bis Ende August",
		"Lieferung bis August",
		"Lieferung im August",
		"Lieferung bis Anfang September",
		"Lieferung bis Mitte September",
		"Lieferung bis Ende September",
		"Lieferung bis September",
		"Lieferung im September",
		"Lieferung bis Anfang Oktober",
		"Lieferung bis Mitte Oktober",
		"Lieferung bis Ende Oktober",
		"Lieferung bis Oktober",
		"Lieferung im Oktober",
		"Lieferung bis Anfang November",
		"Lieferung bis Mitte November",
		"Lieferung bis Ende November",
		"Lieferung bis November",
		"Lieferung im November",
		"Lieferung bis Anfang Dezember",
		"Lieferung bis Mitte Dezember",
		"Lieferung bis Ende Dezember",
		"Lieferung bis Dezember",
		"Lieferung im Dezember",
		"Artikel wird bis Weihnachten geliefert.",
		"Artikel wird bis Ostern geliefert.",
		"Artikel wird nachgeliefert",
		"Artikel wird nachgeliefert",
		"Artikel wird nachgeliefert",
		"Artikel wird nachgeliefert",
		"Artikel wird nachgeliefert",
		"Artikel wird nachgeliefert",
		"Artikel wird nachgeliefert",
		"Artikel wird nachgeliefert",
		"Lieferung in einer Woche",
		"Lieferung in zwei Wochen",
		"Lieferung in drei Wochen",
		"Lieferung in vier Wochen",
		"Lieferung in fünf Wochen",
		"Lieferung in sechs Wochen",
		"Lieferung in sieben Wochen",
		"Lieferung in acht Wochen",
		"Lieferung in neun Wochen",
		"Lieferung in zehn Wochen",
		"Lieferung in elf Wochen",
		"Lieferung in zwölf Wochen",
		"Lieferung in 13 Wochen",
		"Lieferung in 14 Wochen",
		"Lieferung in 15 Wochen",
		"Lieferung in 16 Wochen",
		"Artikel wird nachgeliefert"]
};


/* Data structures */

/**
 * Class Bundle
 * Represents a bundle of products
 */
function Bundle() {
	this.name = null;
	this.styles = [];
	this.mainImages = new Set();
	this.mainImagesZoom = new Set();
	this.multiImages = new Set();
	this.multiImagesZoom = new Set();
	this.manufacturer = null;
	
	/* Adds a style to the bundle */
	this.addStyle = function(style) {
		if (style) // suppress null
			this.styles.push(style);
	}
	
	/* Returns a style by SKU or null, if no such style is found */
	this.getStyleBySku = function(sku) {
		for (var i = 0; i < this.styles.length; i++) {
			var style = this.styles[i];
			
			if (style.SKU == sku)
				return style;
			
			for (var j = 0; j < style.variations.length; j++) {
				if (style.variations[j].SKU == sku)
					return style;
			}
		}
		return null;
	}
	
	/* Returns a style by article no or 0, if no such style is found */
	this.getStyleIndexByArticleNo = function(articleno) {
		// search for styles (AKL...)
		if (articleno.search(/^AKL/) > -1) {
			for (var i = 0; i < this.styles.length; i++) {
				if ((this.styles[i].SKU.split("-")[0] == articleno) || (this.styles[i].SKU.split("-")[0] == articleno.split("@")[0]))
					return i;
			}
			return 0;
		}
		
		// search for styles or variations (only first 6 digits)
		for (var i = 0; i < this.styles.length; i++) {
			var style = this.styles[i];
			
			if (style.SKU.substr(0, 6) == articleno.substr(0, 6))
				return i;
			
			for (var j = 0; j < style.variations.length; j++) {
				if (style.variations[j].SKU.substr(0, 6) == articleno.substr(0, 6))
					return i;
			}
		}
		return 0;
	}
	
	/* Returns main image or empty string, if none is defined */
	this.getMainImage = function() {
		if (this.mainImages.length() > 0) {
			return this.mainImages.elementAt(0);
		}
		
		return "";
	}
	
	/* Returns main image or empty string, if none is defined */
	this.getMainImageZoom = function() {
		if (this.mainImagesZoom.length() > 0) {
			return this.mainImagesZoom.elementAt(0);
		}
		
		return "";
	}
}

/**
 * Class Style
 * Represents an OV style
 */
function Style() {
	this.SKU = null;
	this.parent = null;
	this.mainImages = new Set();
	this.mainImagesZoom = new Set();
	this.multiImages = new Set();
	this.multiImagesZoom = new Set();
	this.materialFlags = new Set();
	this.styleFlags = new Set();
	this.URL = null;
	this.video = null;
	this.variations = [];
	this.colors = new Set();
	this.colorSamples = [];
	this.activeColor = null;
	this.colorMapping = [];
	this.availability = null;
	this.name = null;
	this.priceNew = null;
	this.priceOld = null;
	this.priceDifference = null;
	this.hasKalUpdates = false;
	this.gender = null;
	this.manufacturer = null;
	
	/* Adds a material flag */
	this.addMaterial = function(material) {
		if (materialImageMapping[material]) // only add known material flags
			this.materialFlags.add(material);
	}
	
	/* Returns array of service flags */
	this.getServiceFlags = function() {
		var result = [];
		for (var i = 0; i < this.styleFlags.length(); i++) {
			if (styleFlagMapping[this.styleFlags.elementAt(i)])
				result.push(this.styleFlags.elementAt(i));
		}
		return result;
	}
	
	/* Determines if style is available online only */
	this.isExclusive = function() {
		return this.styleFlags.contains("exclheine");
	}
	
	/* Returns style image or fallback (bundle) */
	this.getMainImage = function() {
		if (this.mainImages.length() > 0) {
			return this.mainImages.elementAt(0);
		}
		
		return this.parent.getMainImage();
	}
	
	this.getMainImageZoom = function() {
		if (this.mainImagesZoom.length() > 0) {
			return this.mainImagesZoom.elementAt(0);
		}
		
		return this.parent.getMainImageZoom();
	}
	
	
	/* Adds a product variation to the style */
	this.addVariation = function(variation) {
		if (variation) { // suppress null
			this.variations.push(variation);
			if (variation.color && !this.colors.contains(variation.color)) { // suppress null
				this.colors.add(variation.color);
				this.colorSamples.push(variation.colorSample);
				this.colorMapping[variation.color] = variation.searchColor;
			}
		}
	}
	
	/* Creates a variation list by coloR */
	this.getVariationsByColor = function(col) {
		if (col) {
			// hack: cache the color for later use
			this.activeColor = col;
			var variationList = [];
			for (var i = 0; i < this.variations.length; i++) {
				var variation = this.variations[i];
				if (variation.color == col) {
					variationList.push(variation);
				}
			}
			return variationList;
		} else {
			if (this.variations.length > 0) {
				return this.variations;
			} else {
				var variationList = [];
				
				// create a list including one fake variation and return it
				var fakeVariation = new Variation();
				fakeVariation.SKU = this.SKU;
				fakeVariation.parent = this;
				fakeVariation.availability = this.availability;
				fakeVariation.availabilityStatement = this.availabilityStatement;
				fakeVariation.price = this.priceNew;
				fakeVariation.size = this.size;
				fakeVariation.color = this.color;				
				fakeVariation.searchColor = this.searchColor;
				fakeVariation.colorSample = this.colorSample;
				this.addVariation(fakeVariation);
				variationList.push(fakeVariation);
				return variationList;
			}
		}
	}
	
	/* Returns a product variation by SKU or null, if no such variation is found */
	this.getVariationBySku = function(sku) {
		for (var i = 0; i < this.variations.length; i++) {
			if (this.variations[i].SKU == sku)
				return this.variations[i];
		}
		return null;
	}

	/* Returns a product variation by ArticleNo or null, if no such variation is found */
	this.getVariationByArticleNo = function(articleNo) {
		for (var i = 0; i < this.variations.length; i++) {
			if (this.variations[i].SKU.substring(0,6) == articleNo.substring(0,6))
				return this.variations[i];
		}
		return null;
	}


	this.getArticleNoByColors = function(color) {
		for (var i = 0; i < this.variations.length; i++) {	
			if(this.variations[i].color == color){
				return this.variations[i].SKU.split('-')[0];
			}
		}
		return null;
	}




	/* Generates a KAL request string */
	this.toKalRequest = function() {
		var requestString = '<?xml version="1.0" encoding="utf-8"?>';
		requestString += '<tns:KALAvailabilityRequest xmlns:tns="http://www.heine.de/KAL" ';
		requestString += 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ';
		requestString += 'xsi:schemaLocation="http://www.heine.de/KAL http://www.heine.de/KAL/KALAvailabilityRequestSchema.xsd">';
		requestString += "<Articles>";
		
		if (this.variations.length > 0) {
			// iterate over product variations
			for (var i = 0; i < this.variations.length; i++) {
				requestString += this.variations[i].toKalRequest();
			}
		} else if (this.SKU) {
			var splitSKU = this.SKU.split("-");
			var articleNo = splitSKU[0];
			var promo = splitSKU[0].substr(6);
			var size = splitSKU[1];
			var company = "0";
			
			requestString += "<Article>";
			requestString += "<CompleteCatalogItemNo>" + articleNo + "</CompleteCatalogItemNo>";
			requestString += "<SizeAlphaText>" + size + "</SizeAlphaText>";
			requestString += "<Std_Promotion>" + promo + "</Std_Promotion>";
			requestString += "<CustomerCompanyID>" + company + "</CustomerCompanyID>";
			requestString += "</Article>";
		}
		
		requestString += "</Articles></tns:KALAvailabilityRequest>";
		
		return requestString;
	}
	
	this.toKalRequestHelline = function() {
		var requestString = '<?xml version="1.0" encoding="utf-8"?>';
		requestString += '<tns:KALAvailabilityRequest xmlns:tns="http://www.heine.de/KAL" ';
		requestString += 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ';
		requestString += 'xsi:schemaLocation="http://www.heine.de/KAL http://www.heine.de/KAL/KALAvailabilityRequestSchema.xsd">';
		requestString += "<Articles>";
		
		if (this.variations.length > 0) {
			// iterate over product variations
			for (var i = 0; i < this.variations.length; i++) {
				requestString += this.variations[i].toKalRequestHelline();
			}
		} else if (this.SKU) {
			var splitSKU = this.SKU.split("-");
			var articleNo = splitSKU[0];
			var promo = splitSKU[0].substr(6);
			var size = splitSKU[1];
			var company = "0";
			
			requestString += "<Article>";
			requestString += "<CompleteCatalogItemNo>" + articleNo + "</CompleteCatalogItemNo>";
			requestString += "<SizeAlphaText>" + size + "</SizeAlphaText>";
			requestString += "<Std_Promotion>" + promo + "</Std_Promotion>";
			requestString += "<CustomerCompanyID>" + company + "</CustomerCompanyID>";
			requestString += "</Article>";
		}
		
		requestString += "</Articles></tns:KALAvailabilityRequest>";
		
		return requestString;
	}
	
	
	
	
	
}

/**
 * Class Variation
 * Represents a product variation
 */
function Variation() {
	this.SKU = null;
	this.parent = null;
	this.mainImages = new Set();
	this.mainImagesZoom = new Set();
	this.multiImages = new Set();
	this.multiImagesZoom = new Set();
	this.size = null;
	this.color = null;
	this.searchColor = null;
	this.colorSample = null;
	this.dim3 = null;
	this.availability = null;
	
	/* Generate KAL request string */
	this.toKalRequest = function() {
		var requestString = "";
		var splitSKU = this.SKU.split("-");
		var articleNo = splitSKU[0];
		var promo = splitSKU[0].substr(6);
		var size = splitSKU[1];
		var company = "0";
		
		requestString += "<Article>";
		requestString += "<CompleteCatalogItemNo>" + articleNo + "</CompleteCatalogItemNo>";
		requestString += "<SizeAlphaText>" + size + "</SizeAlphaText>";
		requestString += "<Std_Promotion>" + promo + "</Std_Promotion>";
		requestString += "<CustomerCompanyID>" + company + "</CustomerCompanyID>";
		requestString += "</Article>";
		
		return requestString;
	}

	this.toKalRequestHelline = function() {
		var requestString = "";
		var splitSKU = this.SKU.split("-");
		var articleNo = splitSKU[0];
		var promo = splitSKU[0].substr(6);
		var size = this.originalSize;
		var company = "0";
		
		requestString += "<Article>";
		requestString += "<CompleteCatalogItemNo>" + articleNo + "</CompleteCatalogItemNo>";
		requestString += "<SizeAlphaText>" + size + "</SizeAlphaText>";
		requestString += "<Std_Promotion>" + promo + "</Std_Promotion>";
		requestString += "<CustomerCompanyID>" + company + "</CustomerCompanyID>";
		requestString += "</Article>";
		
		return requestString;
	}


	/* Returns article image or fallback (style) */
	this.getMainImage = function() {
		if (this.mainImages.length() > 0) {
			return this.mainImages.elementAt(0);
		}
		
		return this.parent.getMainImage();
	}
	
	/* Returns article image or fallback (style) */
	this.getMainImageZoom = function() {
		if (this.mainImagesZoom.length() > 0) {
			return this.mainImagesZoom.elementAt(0);
		}
		
		return this.parent.getMainImageZoom();
	}
	
}

/**
 * Class KalRequest
 * Encapsulates an XML request to KAL (using jQuery)
 */
function KalRequest() {
	this.xhr = null;
	this.sender = null;
	
	/* Initiates a KAL request and calls the appropriate handlers. sender must
	 * be able to respond to the "onKalSuccess" and "onKalError" messages. */
	this.initiate = function(sender, kalUrl, kalData) {
		this.sender = sender;
		this.xhr = jQuery.ajax({
			type: "POST",
			url: kalUrl,
			processData: false,
			dataType: "xml",
			timeout: 2000,
			contentType: "application/xml; charset=UTF-8",
			data: kalData,
			success: sender.onKalSuccess,
			error: sender.onKalError
		});
	}
	
	this.cancel = function() {
		if (this.xhr.readyState < 4) {
			this.xhr.abort();
		}
	}
}



/**
 * Determine delivery designation by sku from an AJAX XML response
 */
function getDeliveryDesignation(xml, sku) {
		var splitSKU = sku.split("-");
		var articleNo = splitSKU[0];
		var size = splitSKU[1];
		var allArticles = xml.getElementsByTagName('Article');

		try {
			for (var i = 0; i < allArticles.length; i++) {
				var itemNo = allArticles[i].getElementsByTagName("CompleteCatalogItemNo")[0].childNodes[0].nodeValue;
				var itemSize = allArticles[i].getElementsByTagName("SizeAlphaText")[0].childNodes[0].nodeValue;
				if (articleNo == itemNo && size == itemSize) {
					var designationString = allArticles[i].getElementsByTagName("DeliveryDesignation")[0].childNodes[0].nodeValue;
					return parseInt(designationString);
				}
			}
		} catch (err) {
			return null;
		}
}

function getDeliveryStatement(xml, sku) {
	var splitSKU = sku.split("-");
	var articleNo = splitSKU[0];
	var size = splitSKU[1];
	var allArticles = xml.getElementsByTagName('Article');

	try {
		for (var i = 0 ; i < allArticles.length ; i++) {
			var itemNo = allArticles[i].getElementsByTagName("CompleteCatalogItemNo")[0].childNodes[0].nodeValue;
			var itemSize = allArticles[i].getElementsByTagName("SizeAlphaText")[0].childNodes[0].nodeValue;
			if (articleNo == itemNo && size == itemSize) {
				return allArticles[i].getElementsByTagName("DeliveryStatement")[0].childNodes[0].nodeValue;
			}
		}
	} catch (err) {
		return false;
	}
}





/**
 * Class Set
 * Represents a set of objects (i.e. does not contain duplicates).
 */
function Set() {
	this.elements = [];
	this.add = function(obj) {
		if (!this.contains(obj)) {
			this.elements.push(obj);
		}
	}
	this.insertFirst = function(obj) {
		if (!this.contains(obj)) {
			this.elements.unshift(obj);
		}
	}
	this.each = function(func) {
		for (var i = 0; i < this.elements.length; i++) {
			func(this.elements[i]);
		}
	}
	this.length = function() {
		return this.elements.length;
	}
	this.sort = function() {
		this.elements.sort();
	}
	this.elementAt = function(index) {
		return this.elements[index];
	}
	this.contains = function(element) {
		for (var i = 0; i < this.elements.length; i++) {
			if (this.elements[i] == element)
				return true;
		}
		return false;
	}
}

/**
 * Class SizeTable
 * Represents a matrix containing availability flags per size and product 
 * variation
 */
function SizeTable() {
	
	this.rows = [];
	this.sizeSet = new Set();
	this.dim3Set = new Set();
	
	this.addRow = function(row) {
		this.rows.push(row);
	}
	
	this.initWithVariationList = function(variationList) {
		this.rows = [];
		this.sizeSet = new Set();
		this.dim3Set = new Set();

		for (var i = 0; i < variationList.length; i++) {
			var size = variationList[i].size;
			if (!size)
				size = "";
			this.sizeSet.add(size);
			
			var dim3 = variationList[i].dim3;
			if (!dim3)
				dim3 = "";
			this.dim3Set.add(dim3);
			
			if (this.rows[size]) {
				var row = this.rows[size];
				row[dim3] = variationList[i].availability;
			} else {
				this.rows[size] = [];
				this.rows[size][dim3] = variationList[i].availability;
			}
			
		}
		
		this.sizeSet.sort();
		this.dim3Set.sort();
	}
	
	
	
	this.toHTML = function() {
		var html = "<table cellpadding=\"2\" cellspacing=\"1\" border=\"0\" id=\"viewporttabledata\">";
		html += "<tr><td class=\"viewporttitle\" width=\"50\" style=\"border-right:1px dotted #a3a3a1;\">";
		html += "Gr&ouml;&szlig;e";
		html += "</td><td class=\"viewporttitle\" colspan=\"3\" align=\"left\" width=\"100%\">";
		html += "Varianten";
		html += "</td></tr>";
		
		for (var i = 0; i < this.sizeSet.length(); i++) {
			if ((i % 2) != 0)
				html += "<tr class=\"odd\">";
			else
				html += "<tr class=\"even\">";
			
			var size = this.sizeSet.elementAt(i);
			html += "<td class=\"viewportdatasize\">" + size + "</td>";
			
			for (var j = 0; j < this.dim3Set.length(); j++) {
				var dim3 = this.dim3Set.elementAt(j);
				if (this.rows[size][dim3] != undefined) {
					html += "<td>" + dim3 + "<img class=\"viewPortDeliveryIcon\" src=\"" + webRoot + "/imagesOnline/xpack/" + availabilityMapping[this.rows[size][dim3]] + "\"></td>";
				} else {
					html += "<td></td>";
				}
			}
			
			html += "</tr>";
		}
		
		
		html += "</table>";
		return html;
	}
}

/* Mapping hashes */

/**
 * Mapping search colors to image file names
 */
function getSearchColor(color, size){
	return searchColorMapping[color] ? searchColorMapping[color].replace(/{size}/, size) : "";
}

var searchColorMapping = [];
searchColorMapping['full colour'] = "bunt_{size}.gif";
searchColorMapping['bunt'] = "bunt_{size}.gif";
searchColorMapping['silberfarben'] = "silberfarben_{size}.gif";
searchColorMapping['jaune'] = "gelb_{size}.gif";
searchColorMapping['limpide'] = "transparent_{size}.gif";
searchColorMapping['incolore'] = "farblos_{size}.gif";
searchColorMapping['coloris or'] = "goldfarben_{size}.gif";
searchColorMapping['metaal'] = "chrom_{size}.gif";
searchColorMapping['wit'] = "weiss_{size}.gif";
searchColorMapping['multicolor'] = "bunt_{size}.gif";
searchColorMapping['transparant'] = "transparent_{size}.gif";
searchColorMapping['kleurloos'] = "farblos_{size}.gif";
searchColorMapping['and'] = "diverse_{size}.gif";
searchColorMapping['violett'] = "lila_{size}.gif";
searchColorMapping['stein'] = "grau_{size}.gif";
searchColorMapping['Farb-set'] = "bunt_{size}.gif";
searchColorMapping['col. or'] = "goldfarben_{size}.gif";
searchColorMapping['lilas'] = "lila_{size}.gif";
searchColorMapping['zwart'] = "schwarz_{size}.gif";
searchColorMapping['paars'] = "lila_{size}.gif";
searchColorMapping['zilverkleur'] = "silberfarben_{size}.gif";
searchColorMapping['zilverkleurig'] = "silberfarben_{size}.gif";
searchColorMapping['lichtpink'] = "rosa_{size}.gif";
searchColorMapping['gr&uuml;n'] = "gruen_{size}.gif";
searchColorMapping['lila'] = "lila_{size}.gif";
searchColorMapping['rouge'] = "rot_{size}.gif";
searchColorMapping['en couleur d\'or'] = "goldfarben_{size}.gif";
searchColorMapping['multicolore'] = "bunt_{size}.gif";
searchColorMapping['blauw'] = "blau_{size}.gif";
searchColorMapping['roze'] = "rot_{size}.gif";
searchColorMapping['natuur'] = "natur_{size}.gif";
searchColorMapping['farb-set'] = "bunt_{size}.gif";
searchColorMapping['natur'] = "natur_{size}.gif";
searchColorMapping['gold'] = "goldfarben_{size}.gif";
searchColorMapping['rosa'] = "rosa_{size}.gif";
searchColorMapping['bleu'] = "blau_{size}.gif";
searchColorMapping['en couleur argent'] = "silberfarben_{size}.gif";
searchColorMapping['grisonnant'] = "grau_{size}.gif";
searchColorMapping['gris'] = "grau_{size}.gif";
searchColorMapping['groen'] = "gruen_{size}.gif";
searchColorMapping['goudkleur'] = "goldfarben_{size}.gif";
searchColorMapping['naturelkleur'] = "natur_{size}.gif";
searchColorMapping['ecru'] = "beige_{size}.gif";
searchColorMapping['khaki'] = "gruen_{size}.gif";
searchColorMapping['blau'] = "blau_{size}.gif";
searchColorMapping['schwarz'] = "schwarz_{size}.gif";
searchColorMapping['wei&szlig;'] = "weiss_{size}.gif";
searchColorMapping['grau'] = "grau_{size}.gif";
searchColorMapping['gelb'] = "gelb_{size}.gif";
searchColorMapping['diverse'] = "diverse_{size}.gif";
searchColorMapping['blanc'] = "weiss_{size}.gif";
searchColorMapping['nature'] = "natur_{size}.gif";
searchColorMapping['rose'] = "rosa_{size}.gif";
searchColorMapping['de toute nature'] = "natur_{size}.gif";
searchColorMapping['bleu ciel'] = "blau_{size}.gif";
searchColorMapping['oranje'] = "orange_{size}.gif";
searchColorMapping['andere'] = "diverse_{size}.gif";
searchColorMapping['alu-kleurig'] = "chrom_{size}.gif";
searchColorMapping['rot'] = "rot_{size}.gif";
searchColorMapping['hellblau'] = "blau_{size}.gif";
searchColorMapping['farblos'] = "farblos_{size}.gif";
searchColorMapping['bronzefarben'] = "goldfarben_{size}.gif";
searchColorMapping['noir'] = "schwarz_{size}.gif";
searchColorMapping['brun'] = "braun_{size}.gif";
searchColorMapping['col. nature'] = "natur_{size}.gif";
searchColorMapping['marron'] = "braun_{size}.gif";
searchColorMapping['col. Or'] = "goldfarben_{size}.gif";
searchColorMapping['col. argent'] = "silberfarben_{size}.gif";
searchColorMapping['naturel'] = "natur_{size}.gif";
searchColorMapping['grijs'] = "grau_{size}.gif";
searchColorMapping['rood'] = "rot_{size}.gif";
searchColorMapping['Farb-Set'] = "bunt_{size}.gif";
searchColorMapping['goldfarben'] = "goldfarben_{size}.gif";
searchColorMapping['chrom'] = "chrom_{size}.gif";
searchColorMapping['coloris argent'] = "silberfarben_{size}.gif";
searchColorMapping['vert'] = "gruen_{size}.gif";
searchColorMapping['violet'] = "lila_{size}.gif";
searchColorMapping['col. Argent'] = "silberfarben_{size}.gif";
searchColorMapping['gris argent'] = "silberfarben_{size}.gif";
searchColorMapping['chrome'] = "chrom_{size}.gif";
searchColorMapping['bruin'] = "braun_{size}.gif";
searchColorMapping['multicolour'] = "bunt_{size}.gif";
searchColorMapping['braun'] = "braun_{size}.gif";
searchColorMapping['transparent'] = "transparent_{size}.gif";
searchColorMapping['beige'] = "beige_{size}.gif";
searchColorMapping['orange'] = "orange_{size}.gif";
searchColorMapping['pink'] = "rosa_{size}.gif";
searchColorMapping['silber'] = "silberfarben_{size}.gif";
searchColorMapping['color&eacute;'] = "bunt_{size}.gif";
searchColorMapping['col. agent'] = "silberfarben_{size}.gif";
searchColorMapping['&eacute;cru'] = "beige_{size}.gif";
searchColorMapping['geel'] = "gelb_{size}.gif";

/**
 * Mapping delivery designation to availability icons
 */
function getAvailabilityMapping(designation) {
	return availabilityMapping[designation] ? availabilityMapping[designation] : "";
}

var availabilityMapping = [];
availabilityMapping[0] = "sofort_lieferbar.gif";
availabilityMapping[1] = "leider_ausverkauft.gif";
availabilityMapping[2] = "wird_nachgeliefert.gif";

/**
 * Mapping material flag to text
 */ 
function getMaterialTextMapping(material){
	return materialTextMapping[material] ? materialTextMapping[material] : "";
}

var materialTextMapping = [];
materialTextMapping['Leder'] = "Echtes<br>Leder";
materialTextMapping['Stretch'] = "Stretch";
materialTextMapping['wool'] = "Woolmark";
materialTextMapping['Seide'] = "Seide";
materialTextMapping['Baumwolle'] = "Reine<br>Baumwolle";
materialTextMapping['Federkern'] = "Federkern";
materialTextMapping['Fsc'] = "FSC";
materialTextMapping['Nanotexfabrics'] = "Nano-Technologie";
materialTextMapping['Reissverschluss'] = "Rei&szlig;verschluss";

function getDetailViewMaterialTextMapping(material, currentLocale){
	
	var materialDetailViewTextMapping = [];
	materialDetailViewTextMapping['Leder'] = 	getLocByDomain("loc54", currentLocale);
	materialDetailViewTextMapping['Stretch'] = 	getLocByDomain("loc55", currentLocale);
	materialDetailViewTextMapping['wool'] = 	getLocByDomain("loc56", currentLocale);
	materialDetailViewTextMapping['Seide'] = 	getLocByDomain("loc57", currentLocale);
	materialDetailViewTextMapping['Baumwolle'] = 	getLocByDomain("loc58", currentLocale);
	materialDetailViewTextMapping['Federkern'] = 	getLocByDomain("loc59", currentLocale);
	materialDetailViewTextMapping['Fsc'] = 		getLocByDomain("loc60", currentLocale);
	materialDetailViewTextMapping['Nanotexfabrics'] = getLocByDomain("loc61", currentLocale);
	materialDetailViewTextMapping['Reissverschluss'] = getLocByDomain("loc62", currentLocale);
	materialDetailViewTextMapping['cmia'] = 	getLocByDomain("loc54a", currentLocale);

	return materialDetailViewTextMapping[material] ? materialDetailViewTextMapping[material] : "";
}




/**
 * Mapping material flag to icon
 */
function getMaterialImageMapping(material){
	return materialImageMapping[material] ? materialImageMapping[material] : "";
}

var materialImageMapping = [];
materialImageMapping['Leder'] = "mat_ico_lether.gif";
materialImageMapping['Stretch'] = "mat_ico_stretch.gif";
materialImageMapping['wool'] = "mat_ico_wollmark.gif";
materialImageMapping['Seide'] = "mat_ico_silk.gif";
materialImageMapping['Baumwolle'] = "mat_ico_cotton.gif";
materialImageMapping['Federkern'] = "mat_ico_federkern.gif";
materialImageMapping['Fsc'] = "mat_ico_fsc.gif";
materialImageMapping['Nanotexfabrics'] = "mat_ico_nanotexfabrics.gif";
materialImageMapping['Reissverschluss'] = "mat_ico_reissverschluss.gif";
materialImageMapping['cmia'] = "mat_ico_cmia.gif";

function getStyleFlagMapping(styleFlag){
	return styleFlagMapping[styleFlag] ? styleFlagMapping[styleFlag] : "";
}

var styleFlagMapping = [];
styleFlagMapping['flag24h'] = "serv_ico_24h_service.gif";
styleFlagMapping['rugmark'] = "icon_rugmark.gif";
styleFlagMapping['kGR'] = "ico_kgr.gif";
styleFlagMapping['hang'] = "serv_ico_haengeversand.gif";
styleFlagMapping['truck'] = "serv_ico_liefern_moebel.gif";
styleFlagMapping['trcka'] = "serv_ico_liefern_moebel.gif";
styleFlagMapping['trckb'] = "serv_ico_liefern_moebel.gif";

function getStyleFlagImageMapping(styleFlag, currentLocale){
	
	var styleFlagImageMapping = [];
	
	styleFlagImageMapping['flag24h'] = 	getLocByDomain("loc63", currentLocale);
	styleFlagImageMapping['rugmark'] = 	getLocByDomain("loc64", currentLocale);
	styleFlagImageMapping['kGR'] = 		getLocByDomain("loc65", currentLocale);
	styleFlagImageMapping['hang'] = 	getLocByDomain("loc66", currentLocale);
	styleFlagImageMapping['truck'] = 	getLocByDomain("loc67", currentLocale);
	styleFlagImageMapping['trcka'] = 	getLocByDomain("loc67", currentLocale);
	styleFlagImageMapping['trckb'] = 	getLocByDomain("loc67", currentLocale);

	return styleFlagImageMapping[styleFlag] ? styleFlagImageMapping[styleFlag] : "";
}



function getManufacturerMapping(manufacturer) {
	return manufacturerMapping[manufacturer] ? manufacturerMapping[manufacturer] : "";
}

var manufacturerMapping = [];
manufacturerMapping['ALESSI'] = "mnf_ico_alessi.gif";
manufacturerMapping['JANKURTZMÖBEL'] = "mnf_ico_jankurtzmoebel.gif";
manufacturerMapping['KOZIOL'] = "mnf_ico_koziol.gif";
manufacturerMapping['STELTON'] = "mnf_ico_stelton.gif";
manufacturerMapping['LEVI\'S®'] = "mnf_ico_Levis.gif";
manufacturerMapping['Villeroyboch'] = "mnf_ico_Villeroyboch.gif";
manufacturerMapping['TRIUMPH'] = "mnf_ico_Triumph.gif";
manufacturerMapping['SPEIDEL'] = "mnf_ico_Speidel.gif";
manufacturerMapping['MC'] = "mnf_ico_MC.gif";
manufacturerMapping['SCHIESSER'] = "mnf_ico_Schiesser.gif";
manufacturerMapping['PULSAR'] = "mnf_ico_Pulsar.gif";
manufacturerMapping['PIONEER'] = "mnf_ico_Pioneer.gif";
manufacturerMapping['PICHlER'] = "mnf_ico_Pichler.gif";
manufacturerMapping['PICARD'] = "mnf_ico_Picard.gif";
manufacturerMapping['PANA'] = "mnf_ico_Pana.gif";
manufacturerMapping['NINA VON C'] = "mnf_ico_Nina_von_C.gif";
manufacturerMapping['NATURANA'] = "mnf_ico_Naturana.gif";
manufacturerMapping['Leonardo'] = "mnf_ico_Leonardo.gif";
manufacturerMapping['KONPLOTT'] = "mnf_ico_Konplott.gif";
manufacturerMapping['KANGAROOS®'] = "mnf_ico_Kangaroos.gif";
manufacturerMapping['KangaROOS®'] = "mnf_ico_Kangaroos.gif";
manufacturerMapping['S. OLIVER'] = "mnf_ico_sOliver.gif";
manufacturerMapping['INGERSOLL'] = "mnf_ico_Ingersoll.gif";
manufacturerMapping['H.I.S.'] = "mnf_ico_HIS.gif";
manufacturerMapping['HATTRIC'] = "mnf_ico_Hattric.gif";
manufacturerMapping['GUESS'] = "mnf_ico_Guess.gif";
manufacturerMapping['GÖTZ'] = "mnf_ico_Goetz.gif";
manufacturerMapping['GLENETTE'] = "mnf_ico_Glenette.gif";
manufacturerMapping['FOSSIL'] = "mnf_ico_Fossil.gif";
manufacturerMapping['FLEURESSE'] = "mnf_ico_fleuresse.gif";
manufacturerMapping['BUGATTI'] = "mnf_ico_Bugatti.gif";
manufacturerMapping['THE BODY WRAP'] = "mnf_ico_Body_Wrap.gif";
manufacturerMapping['ASA'] = "mnf_ico_ASA.gif";
manufacturerMapping['TOGETHER'] = "mnf_ico_Together.gif";
manufacturerMapping['ESPRIT'] = "mnf_ico_Esprit.gif";
manufacturerMapping['MAIDENFORM'] = "mnf_ico_Maidenform.gif";
manufacturerMapping['CITIZEN'] = "mnf_ico_Citizen.gif";
manufacturerMapping['inhome'] = "mnf_ico_inhome.gif";
manufacturerMapping['BETTY BARCLAY'] = "mnf_ico_Betty_Barclay.gif";
manufacturerMapping['BRENNET'] = "mnf_ico_brennet.gif";
manufacturerMapping['ESTELLA'] = "mnf_ico_Estella.gif";
manufacturerMapping['HAFLINGER'] = "mnf_ico_haflinger.gif";
manufacturerMapping['JAMIE OLIVER'] = "mnf_ico_JamieOliver.gif";
manufacturerMapping['KLEINE WOLKE'] = "mnf_ico_KleineWolke.gif";
manufacturerMapping['LAURA GIORDANI'] = "mnf_ico_LauraGiordani.gif";
manufacturerMapping['NEXTIME'] = "mnf_ico_NeXtime.gif";
manufacturerMapping['REINHARD'] = "mnf_ico_reinhard.gif";
manufacturerMapping['MADOC'] = "mnf_ico_madoc.gif";
manufacturerMapping['ROECKL'] = "mnf_ico_Roeckl.gif";
manufacturerMapping['SCHLAFGUT'] = "mnf_ico_Schlafgut.gif";
manufacturerMapping['TIMEX'] = "mnf_ico_Timex.gif";
manufacturerMapping['AKIN TEKSTIL'] = "mnf_ico_akin_tekstil.gif";
manufacturerMapping['Designer by Heine'] = "mnf_ico_designer.gif";
manufacturerMapping['Ashleybrooke_mode'] = "mnf_ico_designer.gif";
manufacturerMapping['Beatricehympendahl'] = "mnf_ico_designer.gif";
manufacturerMapping['SINGH S. MADAN'] = "mnf_ico_designer.gif";
manufacturerMapping['Christan'] = "mnf_ico_designer.gif";
manufacturerMapping['Rickcardona'] = "mnf_ico_designer.gif";
manufacturerMapping['SABINE BECHER'] = "mnf_ico_designer.gif";
manufacturerMapping['SIMONE HERTWIG'] = "mnf_ico_designer.gif";
manufacturerMapping['CHRISTOPH IRNICH'] = "mnf_ico_designer.gif";
manufacturerMapping['LARENS²'] = "mnf_ico_designer.gif";
manufacturerMapping['ESTHER LORBER'] = "mnf_ico_designer.gif";
manufacturerMapping['YVETTE RIES'] = "mnf_ico_designer.gif";
manufacturerMapping['ANNITA TOZZI'] = "mnf_ico_designer.gif";
manufacturerMapping['LINEA TESINI'] = "mnf_ico_designer.gif";
manufacturerMapping['Lineatesini'] = "mnf_ico_designer.gif";
manufacturerMapping['Isabellavonahn'] = "mnf_ico_designer.gif";
manufacturerMapping['LAURREN PRIEUR'] = "mnf_ico_designer.gif";
manufacturerMapping['JANA KELLER'] = "mnf_ico_designer.gif";
manufacturerMapping['MAGDALENA SCHAFFRIN'] = "mnf_ico_designer.gif";
manufacturerMapping['SCHÜTZ'] = "mnf_ico_designer.gif";
manufacturerMapping['CAROLINE PICCOT'] = "mnf_ico_designer.gif";
manufacturerMapping['SANDRO POZZI'] = "mnf_ico_designer.gif";
manufacturerMapping['FAIRTRADE'] = "mnf_ico_Fairtrade.gif";
manufacturerMapping['BARBARA'] = "mnf_ico_barbara.gif";
manufacturerMapping['ALBA MODA RED'] = "mnf_ico_alba_red.gif";
manufacturerMapping['ALBA MODA GREEN'] = "mnf_ico_alba_green.gif";
manufacturerMapping['ALBA MODA WHITE'] = "mnf_ico_alba_white.gif";
manufacturerMapping['ALBA MODA'] = "mnf_ico_alba_moda.gif";
manufacturerMapping['BLOMUS'] = "mnf_ico_Blomus.gif";
manufacturerMapping['IBENA'] = "mnf_ico_Ibena.gif";
manufacturerMapping['WENKO'] = "mnf_ico_Wenko.gif";
manufacturerMapping['Dekowe'] = "mnf_ico_Dekowe.gif";
manufacturerMapping['PICHLER'] = "mnf_ico_Pichler.gif";
manufacturerMapping['GIESSWEIN'] = "mnf_ico_Giesswein.gif";
manufacturerMapping['GRUND'] = "mnf_ico_Grund.gif";
manufacturerMapping['S.OLIVER'] = "mnf_ico_sOliver.gif";
manufacturerMapping['ROSAMUNDE PILCHER COLLECTION'] = "mnf_ico_Rosamunde_Pilcher.gif";
manufacturerMapping['APART'] = "mnf_ico_Apart.gif";
manufacturerMapping['BRAUN'] = "mnf_ico_Braun.gif";
manufacturerMapping['KRUPS'] = "mnf_ico_Krups.gif";
manufacturerMapping['GAGGIA'] = "mnf_ico_Gaggia.gif";
manufacturerMapping['AEG ELECTROLUX'] = "mnf_ico_Aeg_Electrolux.gif";
manufacturerMapping['BODUM®'] = "mnf_ico_Bodum.gif";
manufacturerMapping['BOSCH'] = "mnf_ico_Bosch.gif";
manufacturerMapping['SAECO'] = "mnf_ico_Saeco.gif";
manufacturerMapping['IRISETTE'] = "mnf_ico_Irisette.gif";
manufacturerMapping['PHILIPS'] = "mnf_ico_Philips.gif";
manufacturerMapping['LEONARDO'] = "mnf_ico_Leonardo.gif";
manufacturerMapping['ADIDAS PERFORMANCE'] = "mnf_ico_Adidas_Performance.gif";
manufacturerMapping['BRUNO BANANI'] = "mnf_ico_Bruno_Banani.gif";
manufacturerMapping['RUSSELL HOBBS'] = "mnf_ico_RusselHobbs.gif";
manufacturerMapping['GEOX']="mnf_ico_Geox.gif";
manufacturerMapping['LLOYD']="mnf_ico_Lloyd.gif";
manufacturerMapping['ED HARDY']="mnf_ico_Edhardy.gif";
manufacturerMapping['EDDIE BAUER']="mnf_ico_eddie_bauer.gif";
manufacturerMapping['CODELLO']="mnf_ico_codello.gif";
manufacturerMapping['GARDEUR']="mnf_ico_gardeur.gif";
