var LANG = 'pl' || 'de-AT';
//var LANG = LANG || 'pl'; // 'pl' = 'en'
// sanitizing LANG
LANG = LANG.toLowerCase();
var sepPosition = LANG.indexOf('-'); // changing from IETF long language code to short code (e.g. de-AT -> de OR en-UK -> en
if(sepPosition > -1) {
	LANG = LANG.substr(0, sepPosition);
}


var productnavigator = {}; // Productnavigator
(function($) {

(function(pn) { 

(function() { // refinement tree methods
pn.targetServerScript = '/banner/produkte/finder/aspx/get.aspx';

pn.refinementTree = {}; 

pn.refinementTree.preselectedCategory = null;

pn.refinementTree.preselectCategory = function(preselectedCategory) {
	pn.refinementTree.preselectedCategory = preselectedCategory;
	$(window).one("productfinder.categoryselection.load", function () {
		pn.refinementTree.selectCategory(preselectedCategory);
	});
}

pn.refinementTree.selectCategory = function(selectedCategory) {
	if (selectedCategory !== null) {
		$("#categorySelection .selectionForm .item .id").each(function () {
			var id = parseInt($(this).text());
			if (id === selectedCategory) {
				var target = $(this).parent();
				target.siblings().removeClass('selected');
				target.addClass('selected');
				
				pn.refinementTree.loadManufacturerSelection();
			}
		});
	}
}

pn.refinementTree.loadCategorySelection = function() {
	var categoryRenderer = pn.createDivRenderer('#categorySelection .selectionForm');
	var rendererFunc = categoryRenderer.render;

	if(typeof(pn.refinementTree.preselectedCategory) !== null) {
		rendererFunc = function(data) {
			categoryRenderer.render(data);
			// select preselectedCategory
			pn.refinementTree.selectCategory(pn.refinementTree.preselectedCategory);
		};
	}

	$.getJSON(pn.targetServerScript, { jsonpcallback: '?', querysubject: 'categories', lang: LANG }, function () {
		rendererFunc.apply(this, arguments);
		$(window).trigger("productfinder.categoryselection.load");
	});
};

pn.refinementTree.loadManufacturerSelection = function() {
	var manufacturerRenderer = pn.createDivRenderer('#manufacturerSelection .selectionForm');
	var categoryValue = $('#categorySelection .selectionForm .selected .id').text();
	if(categoryValue !== "") {
		$.getJSON(pn.targetServerScript,
				{
					jsonpcallback: '?', 
					querysubject: 'manufacturers',
					category: categoryValue
				},
				manufacturerRenderer.render);
	}
	
	$('#typeSelection .selectionForm').empty();
	pn.clearResultWindow();
	$('#manufacturerFilter').textFilterElements('#manufacturerSelection .selectionForm div');
};

pn.refinementTree.loadTypeSelection = function() {
	var typeRenderer = pn.createDivRenderer('#typeSelection .selectionForm');
	
	var categoryValue = $('#categorySelection .selectionForm .selected .id').text();
	var manufacturerValue = $('#manufacturerSelection .selectionForm .selected .id').text();
	
	if(categoryValue !== "" && manufacturerValue !== "") {
		$.getJSON(pn.targetServerScript, 
			{ 
                jsonpcallback: '?', 
				querysubject: 'types',
				category: categoryValue,
				manufacturer: manufacturerValue
			},
			typeRenderer.render);
	}
		
	pn.clearResultWindow();
	$('#typeFilter').textFilterElements('#typeSelection .selectionForm div');
};

pn.refinementTree.loadResult = 	function() {
	var resultUpdater = pn.createResultTableRenderer('#result');
	var typeidValue = $('#typeSelection  .selectionForm .selected .id').text();
	if(typeidValue !== "") {
		$.getJSON(pn.targetServerScript,
			{ jsonpcallback: '?', querysubject: 'batteries', typeid: typeidValue },
			resultUpdater.render);
		};
	}
}) ();

(function() { // refinement form methods
pn.refinementForm = {};

pn.refinementForm.loadAvailableOptionValuesFromBackend = function(targetId, parameterName) {
	var renderer = pn.createOptionRenderer(targetId, 'value');
	$.getJSON(pn.targetServerScript, { jsonpcallback: '?', querysubject: 'availablevalues', parameter: parameterName }, function(data) {
			renderer.render(data);
			$(targetId).prepend('<option></option>');
		});
};

pn.refinementForm.loadOptions = function() {
	$('#refinementForm select').each( function () {
		pn.refinementForm.loadAvailableOptionValuesFromBackend('#' + this.id, this.name);
	} );
};

pn.refinementForm.resetOptions = function() {
	$("#refinementForm option:empty").each(function() {
		this.selected = 'selected';
	});
};


pn.refinementForm.loadResult = function() {
	var isOptionSelected = false;
	$('#refinementForm select').each(function() {
		if($(this).val() !== '') {
			isOptionSelected = true;
		}
	});
	if(isOptionSelected) {
		var resultUpdater = pn.createResultTableRenderer('#result', 'battery');
		$.getJSON(pn.targetServerScript + '?' + $('#refinementForm form').serialize(),
			{ jsonpcallback: '?', querysubject: 'batteries' },
			resultUpdater.render );
	}
};

}) ();

(function() { // refinement search methods
pn.refinementSearch = {};
pn.refinementSearch.filteredCategoryId = "";
pn.refinementSearch.loadResult = function (typeLabel) {
	if(typeof(typeLabel) === 'undefined') {
		typeLabel = $('#termTextbox').val();
	}
	
	if(typeLabel.length > 0) {
		var termResultUpdater = pn.createResultTableRenderer('#result', 'battery');
		$.getJSON(pn.targetServerScript,
			{ jsonpcallback: '?', querysubject: 'batteries', typefragment: typeLabel, category: pn.refinementSearch.filteredCategoryId },
			termResultUpdater.render );
	}
};

}) ();

(function() { // refinement custom methods
pn.refinementCustom = {};

pn.refinementCustom.hideFilter = function() {
	$('#refinements, #helpHint, #resultHeader').css('display', 'none');
};

pn.refinementCustom.preselectCategory = function(categoryId) {
	$("#refinements > ul").tabsClick(1);
	pn.refinementTree.loadCategorySelection(categoryId);
};

pn.refinementCustom.preselectType = pn.refinementSearch.loadResult;

pn.refinementCustom.preselectVariation = function(variationLabel) {
	var resultUpdater = pn.createResultTableRenderer('#result', 'battery');
	$.getJSON(pn.targetServerScript,
		{ jsonpcallback: '?', querysubject: 'batteries', variation: variationLabel },
		resultUpdater.render );
};

}) ();

(function() { // init data renderers
pn.clearResultWindow = function() {
	$('#result').empty();
	$('#resultArea').hide();
};

pn.createRenderer = function(target) {
	var that = {};
	that.target = $(target);

	that.render = function(data) {};
	
	return that;	
};

pn.createElementRenderer = function(target, elementType, isFormElement) {
	isFormElement = isFormElement || false;
	var that = pn.createRenderer(target);
	that.render = function(data) {	
		that.target.empty();
		$(data).each(function(i) {
			if(this.name !== "") {
				var option = $(elementType);
				option.text( this.name );
				if(isFormElement) {
					option.attr('value', this.id);
				} else {
					option.append('<span class="id" style="display: none">' + this.id + '</span>');
					option.click(function(event) {
						var target = $(this);
						target.siblings().removeClass('selected');
						target.addClass('selected');
					});
				}
				that.target.append(option);
			}
		});
		pn.refinementForm.resetOptions();
	};
	return that;
};

pn.createOptionRenderer = function(target) {
	return pn.createElementRenderer(target, '<option>', true);
};

pn.createDivRenderer = function(target) {
	return pn.createElementRenderer(target, '<div class="item" />');
};

pn.createResultTableRenderer = function(target) {
	var that = pn.createRenderer(target);

	that.render = function(data) {
	    var capacityDe = "Kapazität K20 (Ah)";
	    var capacityEn = "Capacity K20 (Ah)";
	    if (data[0]["variation"] !== undefined && data[0]["variation"].indexOf("Bike Bull") === 0) {
	        capacityDe = "Kapazität K10 (Ah)";
	        capacityEn = "Capacity K10 (Ah)";
	    }
		var localNames = {};
		localNames.de = { 
							'variation': 'Produktvariante',
							'type': 'Type',
							'voltage': 'Nennspannung',
							'capacity': capacityDe,
							'colddischarge': 'Kälteprüfstrom EN (A)',
							'layout': 'Schaltung',
							'terminal': 'Anschlußpol',
							'maxlength': 'Max. Länge (mm)',
							'maxwidth': 'Max. Breite (mm)',
							'boxheight': 'Max. Kastenhöhe (mm)',
							'totalheight': 'Max. Gesamthöhe (mm)',
							'miscellaneous': 'Batteriemerkmale',
							'baseholddown': 'Bodenleiste'
						};
		localNames.en = { 
							'variation': 'Productvariation',
							'type': 'Type',
							'voltage': 'Voltage',
							'capacity': capacityEn,
							'colddischarge': 'Colddischarge EN (A)',
							'layout': 'Layout',
							'terminal': 'Terminal',
							'maxlength': 'Max. length (mm)',
							'maxwidth': 'Max. width (mm)',
							'boxheight': 'Max. boxheight (mm)',
							'totalheight': 'Total height (mm)',
							'miscellaneous': 'Miscellaneous',
							'baseholddown': 'Baseholddown'
						};
        localNames[LANG] = { 
                            'variation': "Wariant produktu", 
                            'type': "Typ", 
                            'voltage': "Napięcie znamionowe (V)", 
                            'capacity': "Pojemność K20 (Ah)", 
                            'colddischarge': "Prąd rozruchowy EN (A)", 
                            'layout': "Podłączenie", 
                            'terminal': "Bieguny", 
                            'maxlength': "Maks. długość (mm)", 
                            'maxwidth': "Maks. szerokość (mm)", 
                            'boxheight': "Maks. wysokość obudowy (mm)", 
                            'totalheight': "Maks. wysokość całkowita (mm)", 
                            'miscellaneous': "Charakterystyka akumulatora", 
                            'baseholddown': "Mocowanie" }; 
						
		// convert xml to map										 
		var batteryMap = {};									
		$(data).each(function() {
			for(var key in this) if(this.hasOwnProperty(key)) {
				batteryMap[key] = batteryMap[key] || [];
				batteryMap[key].push(this[key]);
			}
		});
		
		// init for table outputs
		var rowCounter = 0;
		var row;
		var cell;
		
		// output first label column
		var fixedContent = $('<div />');
		fixedContent.attr("id", "fixedContent");
		
		var labelTable =  $('<table />');
		labelTable.addClass("labels");
	
		for(var a in localNames[LANG]) if(batteryMap.hasOwnProperty(a) && batteryMap[a] !== undefined) {
		
		    row = $('<tr />');			
			cell = $('<td />');
			
			cell.text(localNames[LANG][a]);
		    cell.addClass('localname');
			row.append(cell);
			if(rowCounter % 2 === 0) {
				row.addClass('evenRow');
			} else {
				row.addClass('oddRow');
			}
			row.addClass(a);
			labelTable.append(row);
			rowCounter++;
		}
		
		// convert map to html table
		var scrollContent = $('<div />');
		scrollContent.attr("id", "scrollContent");
		
		var resultTable = $('<table />');
		resultTable.addClass("contents");
		
		rowCounter = 0;
		for(var a in localNames[LANG]) if(batteryMap.hasOwnProperty(a) && batteryMap[a] !== undefined) {
			row = $('<tr />');
			
			cell = $('<td />');
			cell.text(localNames[LANG][a]);
			cell.addClass('localname');
			//row.append(cell);
			
			for(var b in batteryMap[a]) if(batteryMap[a].hasOwnProperty(b)) {
				cell = $('<td />');
				//only render layout image, if battery variation is "Bike Bull"
				//check if elem to render is layout -> display layout-image
				//layout image name = type name
				//TODO: change == to equivalent "like"
				if (batteryMap["variation"][b].indexOf("Bike Bull") === 0) {
				    if (a == "layout") {
				        type = batteryMap["type"][b].replace(/ /, "");
				        cell.html('<div id="img-' + type + '" class="layoutImage"><img src="/banner/images/products/finder/layouts/small/' + type + '.jpg" alt="' + type + '" /></div>');
				    } else if (a == "totalheight" && batteryMap["boxheight"][b] !== undefined) {
				        //totalheight and boxheight are the same
				        cell.text(batteryMap["boxheight"][b]);
				    } else {
				        cell.text(batteryMap[a][b]);
				    }
				} else {
				    cell.text(batteryMap[a][b]);
				}
				row.append(cell);
			}

			
			if(rowCounter % 2 === 0) {
				row.addClass('evenRow');
			} else {
				row.addClass('oddRow');
			}
			row.addClass(a);
			resultTable.append(row);
			rowCounter = rowCounter + 1;
		}
		scrollContent.append(resultTable);
		fixedContent.append(labelTable);
		that.target.empty().append(fixedContent);
		that.target.append(scrollContent);
		
		$('#resultArea').show();
		
		
		//set height for both tabels .labels / .contents
        for (var i=0; i <= $('.contents tr').size(); i++) {
            var height = $('.contents tr:nth-child(' + i + ')').height();
            if (height < 26) {
                height = 26;
                //$('.contents tr:nth-child(' + i + ') td').height(height);
            }
            $('.labels tr:nth-child(' + i + ') td').height(height);
        }  
	};
	return that;
};
}) ();

}) (productnavigator);

}) (jQuery);
