// Öffnet ein Popup-Fenster mit einer Standardgröße.
// @param	string	url		die URL, die im Popup angezeigt werden soll
// @param	string	winName	der Fenstername
// @return	bool	false wenn das Fenster geöffnet wurde
//					true ansonsten
function openResizingPopup(url, winName) {
	var winParams = "status=0,menubar=0,scrollbars=no,resizable=no";
	var theWindow = window.open(url,winName,winParams);

	if (theWindow) {
		theWindow.focus();
		return false;
	}

	return true;
}

//hier wird das POPUP-Showroom geöffnet und angezeigt
function showroom(image, pid){
	var screenx = (screen.width-pwidth)/2;
	var screeny = (screen.height-pheight)/4;
	var showroom_popup = window.open(base_url+'index.php?id=' + page_showroom + '&tt_products=' + pid + '&image='+image,'showroom' + pid,'dependent=1,width='+pwidth+',height='+pheight+',scrollbars=yes,resizable=yes,left='+screenx+',top='+screeny+',location=0,status=0, menubar=0');
	if (showroom_popup) {
		showroom_popup.focus();
		return false;
	} else {
		return true;
	}
}

// Funktion zur Schnittmengenberechnung zweier Arrays
// TODO: Bei Entfernung AdvisedSearch/SimpleSearch kann das weg
function intersect(array1, array2) {
	var array1copy = (array1) ? array1.slice(0) : [];
	var array2copy = (array2) ? array2.slice(0) : [];

	var intersection = [];

	array1copy.sort();
	array2copy.sort();

	while (array1copy.length>0 && array2copy.length>0) {
		var val1 = array1copy.pop();
		var val2 = array2copy.pop();

		if (val1 == val2) {
			intersection.unshift(val1);
		} else {
			if (val1 == Array(val1,val2).sort().pop()) {
				array2copy.push(val2);
			} else {
				array1copy.push(val1);
			}
		}
	}
	return intersection;
}

function replaceSpecialChars(string, index){
	var anArray = [];
	anArray[0] = ["&Ouml;", "&ouml;", "&Auml;", "&auml;", "&Uuml;", "&uuml;", "&szlig;", "&quot;", "&amp;", "&nbsp;", "&acute;"];
	anArray[1] = ["Ö", "ö", "Ä", "ä", "Ü", "ü", "ß", "\"", "&", "", "\'"];
	for (var i=0; i<anArray[index].length; i++) {
		myRegExp = new RegExp(anArray[index][i],"g");
		string = string.replace(myRegExp, anArray[(index==0?1:0)][i]);
	}
	return string;
}

// Funktion zur Feststellung, ob ein Wert val in einem Array arr enthalten ist
function isElementOf(arr, val) {
	return jQuery.inArray(val, arr) >= 0;
}

// Erweitert das String-Objekt und entfernt Leerzeichen (oder andere Zeichen) vom Anfang eines Strings.
// @param	string	clist	eine Liste von Zeichen, die am Anfang des Strings gelöscht werden sollen
// @return	string	der gekürzte String
String.prototype.ltrim = function (clist) {
	if (clist) {
		return this.replace (new RegExp ('^[' + clist + ']+'), '');
	} else {
		return this.replace (/^\s+/, '');
	}
}

// Erweitert das String-Objekt und entfernt Leerzeichen (oder andere Zeichen) vom Ende eines Strings.
// @param	string	clist	eine Liste von Zeichen, die am Ende des Strings gelöscht werden sollen
// @return	string	der gekürzte String
String.prototype.rtrim = function (clist) {
	if (clist) {
		return this.replace (new RegExp ('[' + clist + ']+$'), '');
	} else {
		return this.replace (/\s+$/, '');
	}
}

// Erweitert das String-Objekt und entfernt Leerzeichen (oder andere Zeichen) vom Anfang und Ende eines Strings.
// @param	string	clist	eine Liste von Zeichen, die gelöscht werden sollen
// @return	string	der gekürzte String
String.prototype.trim = function (clist) {
	if (clist) {
		return this.ltrim (clist).rtrim (clist);
	} else {
		return this.ltrim ().rtrim ();
	}
};

function move_layer(obj_id,curr,dist,axis,container) {

	var sign = 1;
	var sign_str = "";
	if (dist<0) {
		curr = -curr;
		dist = -dist;
		sign=-1;
		sign_str = "-";
	}
	var speed = parseInt(Math.sqrt(curr * (dist - curr))/2 + .5);
	if (speed==0) {speed=1;}
	if (speed > dist-curr) {speed = dist-curr;}
	curr = curr + speed;

	var myobj = document.getElementById(obj_id);

	if (myobj == null){
		return;
	}

	if (axis == "vertical") {
		myobj.style.top = parseInt(myobj.style.top.split("px")[0]) + (speed * sign) + "px";
	} else {
		myobj.style.left = parseInt(myobj.style.left.split("px")[0]) + (speed * sign) + "px";
	}

	if (container != "") {
		var containerobj = document.getElementById(container);

		if (containerobj == null){
			return;
		}

		if (axis == "vertical") {
			containerobj.style.height = parseInt(containerobj.style.height.split("px")[0]) + (speed * sign) + "px";
		} else {
			containerobj.style.width = parseInt(containerobj.style.width.split("px")[0]) + (speed * sign) + "px";
		}
	}

	if (dist>curr) {
		setTimeout("move_layer('" + obj_id + "', " + sign_str + curr + ", " + sign_str + dist + ", '" + axis + "', '" + container + "')",50);
	}

}

$.fn.serializeObject = function(){
    var o = {};
    var a = this.serializeArray();
    $.each(a, function() {
        if (o[this.name]) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });

    return o;
};

// Berechnet die Textbreite
function textWidth(text) {
	return (text.length * 7);
}

// Belegt alle manuell gesetzten Tabindexe und sichtbaren Input-Elemente mit neu geordneten Tabindex.  
function orderTabindex() {
	var index = 1;
	var elements = ($.browser.msie ? $(':input:not(:hidden), [tabindex!="0"]') : $(':input:not(:hidden), [tabindex]'));

	elements.each(function() {
		if ($(this).attr("tabindex") || (this.tagName == "INPUT" && $(this).attr('type') != 'hidden')) {
			$(this).attr('tabindex',index++);
		}
	});
}

// Führt bei jedem kompletten Reload und jedem AJAX-Request orderTabindex() aus.
$(function() {
	if ($.browser.msie && $.browser.version == '6.0') {
		return;
	}

	setTimeout('orderTabindex()',500); // Warten bis ui-dz_selectmenu fertig ist

	$('body').ajaxComplete(function(event,request, settings){if('json' != settings.dataType){orderTabindex();}});
});

// Novelties Objekt
var Novelties = function(products_amount) {
	this.products_amount = products_amount;
	this.items_clearance = products_amount - 6;
	this.items_position = 0;
	this.start_position = (parseInt(products_amount / 2) - 3);
	this.img_path = 'resources/tk/img/layout/novelties/';
	
	$('#ul_novelties').width((137 * products_amount)+'px');
	this.setEvents();
	this.setStartPosition();
}
Novelties.prototype = {
	setEvents: function() {
		var self = this;
		$('.n-left-shadow, #novelties_button_left').bind({
			click: function() {self.move('prev');},
			mouseover: function(event) {self.buttonMouseEvent(event.type, 'left');},
			mouseout: function(event) {self.buttonMouseEvent(event.type, 'left');}
		});
		$('.n-right-shadow, #novelties_button_right').bind({
			click: function() {self.move('next');},
			mouseover: function(event) {self.buttonMouseEvent(event.type, 'right');},
			mouseout: function(event) {self.buttonMouseEvent(event.type, 'right');}
		});
	},
	setStartPosition: function() {
		if (this.start_position >= 1) {
			this.items_position = this.start_position;
			diff = this.start_position * -105;
			move_layer('ul_novelties', 0, diff, 'horizontal', '');
			this.buttonSwitch('left', 1);
		}
	},
	move: function(direction) {
		if (direction=='next') {
			if (!this.panelReachedEnd('right')) {
				if (this.panelReachedEnd('left')) {this.buttonSwitch('left', 1);}
				this.items_position++;
				move_layer('ul_novelties', 0, -108, 'horizontal', '');
				if (this.panelReachedEnd('right')) {this.buttonSwitch('right', 0);}
			}
		} else {
			if (!this.panelReachedEnd('left')) {
				if (this.panelReachedEnd('right')) {this.buttonSwitch('right', 1);}
				this.items_position--;
				move_layer('ul_novelties', 0, 108, 'horizontal', '');
				if (this.panelReachedEnd('left')) {this.buttonSwitch('left', 0);}
			}
		}
	},
	panelReachedEnd: function(side) {
		if (side == 'right') {
			return (this.items_position == this.items_clearance);
		} else {
			return (this.items_position == 0);
		}
	},
	buttonSwitch: function(side, stat) {
		var myobj 	= $('#novelties_button_'+side);
		var shadow	= $('#novelties_shadow_'+side);
	
		if (stat==1) {
			myobj.attr('src', this.img_path +'button_'+side+'.png').css('visibility','visible');
			shadow.css('visibility','visible');
		} else {
			myobj.attr('src', this.img_path +'button_'+side+'_off.png').css('visibility','hidden');
			shadow.css('visibility','hidden');
		}
	},
	buttonMouseEvent: function(event_type, side) {
		var button = $('#novelties_button_'+side);
		var img = 'button_'+side+'.png';

		if (event_type == 'mouseover') {
			if (button.attr('src').search("off") == -1) {
				img = 'button_'+side+'_over.png';
			}
		} else {
			if (button.attr('src').search("over") == -1) {
				img = 'button_'+side+'_off.png';
			}
		}

		button.attr('src', this.img_path + img);
	}
}

// SimilarProducts Objekt
var SimilarProducts = function() {
	this.setEvent();
}
SimilarProducts.prototype = {
	setEvent: function() {
		var self = this;
		$('#slide_navigation').click(function(){
			self.slideLeft();
		});
	},
	slideLeft: function() {
		var slider = $('#sp_slider');
		var actual_position = parseInt(slider.css('left'));
		var slider_distance = actual_position-305;
		if ((Math.abs(slider_distance)+15) > slider.width()) {
			slider_distance = 5;
		}

		slider.animate({"left": slider_distance}, 0);
	}
}

//AdvisedSearchNavi Objekt
AdvisedSearchNavi = function(categories, brand_cat_comb, cat_brand_comb) {
	this.search_field_value	= 'Artikelname';
	
	if ($('#navi_search').val() == '') {
		$('#navi_search').css('color', '#808080').val(this.search_field_value);
	} else {
		$('#navi_search').css('color', '#000')
	}

	this.categories = categories;
	this.brand_cat_comb = brand_cat_comb;
	this.cat_brand_comb = cat_brand_comb;
	
	this.init();

	this.setEvents();
}
AdvisedSearchNavi.prototype = {
	init: function() {
		this.setBrandSelect();
		this.fillCategorySelect();
		this.checkCategorySelect($('#brand_id').val());
		this.checkBrandSelect($('#category_id').val());
	},
	fillCategorySelect: function(brand_id) {
		var self = this;
		var selected_category_id = $('#category_id').val();
		
		$('#category_navi').append($('<option />', {value: 0, innerHTML: '-- alle Kategorien --'}));
		
		var category_changed = false;

		$.each(this.categories, function(key, value) {
			var selected = false;
			if (selected_category_id == value['category_id'] || value['selected']) {
				selected = true;
				category_changed = true;
				if (value['selected']) {
					// initial gesetztes selected zurücksetzen
					value['selected'] = false;
				}
			}

			var attr = {value: value['category_id'],
						selected: selected,
						innerHTML: value['display_title']};
			if (value['parent_uid'] == 0) {
				attr.id = 'opt_cat_navi_' + value['category_id'];
				attr.label = value['display_title'];
				$('#category_navi').append($('<optgroup />', attr));
			} else {
				$('#opt_cat_navi_' + value['parent_uid']).append($('<option />', attr));
			}
		});

		$('#category_navi').dz_selectmenu({
			base_class_suffix:'navi',
			width: 140,
			menu_click_action: function(id, entry){self.changeCategory(entry);},// Aktion bei Auswahl einer Kategorie
			select_click_action: 'click focus blur',
			tabindex: 3
		});
		
		if (category_changed == false) {
			$('#category_id').val(0);
		}
	},
	setBrandSelect: function() {
		var self = this;
		var navi_brand_select = $('#brand_navi').dz_selectmenu({
			base_class_suffix	:'navi',
			menu_click_action	: function(id, entry){self.changeBrand(entry);},// Aktion bei Auswahl einer Marke
			select_click_action	: 'click focus blur'
		});
		$('#brands_placeholder').replaceWith(navi_brand_select);
	},
	setEvents: function() {
		var self = this;

		$('#navi_search').bind({
			focus: function() {
					if ($(this).val() == self.search_field_value) {
						$(this).val('').css('color', '#000');
						$('#search_string').val('');
					}
				},
			blur: function() {self.checkSearchField(self);},
			keyup: function(event) {
				if (event.keyCode==13) {
					$('#output').hide();
				} else if ((event.keyCode != 38) && (event.keyCode !=40))	{
					self.getAutosuggestResults(self, this.value);
				}
			},
			keydown: function(event) {
				self.setAutosuggestFocus(event);
				if (event.keyCode == 13) {self.submitNaviSearch(self);}
			}
		});
		// Suchergebnisse nicht verstecken wenn auf UL geklickt, sondern Aktion des LI-Elements ausführen
		$('#output').click(function(event) {
			$(this).hide();
			$('#navi_search').focus();
			self.submitNaviSearch(self);
			event.stopPropagation();
		});
		
		// Suchergebnisse des Autosuggest verstecken wenn wo anders geklickt
		$('body').click(function() {
			$('#output').hide();
		});
		
		$('#search_submit>input').bind({
			mouseup: function() {this.style.margin='0';},
			mousedown: function() {this.style.margin='1px 0 0 1px';}
		});
		$('#search_submit>input,.search-text').bind({
			click: function(){self.submitNaviSearch(self);},
			keydown: function(e){if(e.keyCode=='13'){self.check_and_submit(self);}}
		});
		$('#search_navi').submit(function(){
			if ($('#navi_search').val() == self.search_field_value) {
				$('#search_string').val('');
			} else {
				$('#search_string').val($('#navi_search').val());
			}
		});
	},
	check_and_submit: function(self){
		if ($('#navi_search').val() == self.search_field_value) {
			$('#search_string').val('');
		} else {
			$('#search_string').val($('#navi_search').val());
		}

		$('#advised_search_navi').submit();
	},
	changeCategory: function(element) {
		var cat_id = $(element).attr('name');
		
		this.checkBrandSelect(cat_id);
		$('#category_id').val(cat_id);
	},
	changeBrand: function(element) {
		var brand_id = element.attr('name');

		this.checkCategorySelect(brand_id);
		$('#brand_id').val(brand_id);
	},
	checkSearchField: function(self) {
		var search	= $('#navi_search');
		if (search.val() == '') {
			search.val(self.search_field_value).css('color', '#808080');
		}
	},
	checkBrandSelect: function(cat_id){
		var brands = this.getIdCombArray(cat_id, this.cat_brand_comb);
		$('#brand_navi li').each(function(k,val){
			var brand_id = $(val).attr('name');
			if (brand_id == 0 || cat_id == 0|| jQuery.inArray(parseInt(brand_id), brands) >= 0) {
				$(val).css('display', 'block');
			} else {
				$(val).css('display', 'none');
			}
		});
	},
	checkCategorySelect: function(brand_id){
		var self = this;
		var cats = this.getIdCombArray(brand_id, this.brand_cat_comb);
		$('#category_navi li').each(function(k,val){
			var cat_id = $(val).attr('name');
			if (cat_id == 0 || ((brand_id == 0 || jQuery.inArray(cat_id, cats) >= 0)
				&& typeof(self.cat_brand_comb[cat_id]) != 'undefined')) {
				$(val).css('display', 'block');
			} else {
				$(val).css('display', 'none');
			}
		});
	},
	getIdCombArray:function(id, combination){
		var comb = [];
		if (typeof(combination[id]) === 'object') {
			for (var val in combination[id]) {
				comb.push(combination[id][val]);
			}
		} else if (typeof(combination[id]) === 'array') {
			comb = combination[id];
		}
		return comb;
	},
	getAutosuggestResults: function(self, element_value) {
		if (element_value.length < 3) {
			$('#output').hide();
			return false;
		}

		var url_navi = 'typo3conf/ext/tt_products/pi/ajax/autosuggest_article.php';
		var request_data = {
			'param': element_value,
			'vendor': $('[name="advised_search_navi"] #brand_id').val(),
			'category': $('[name="advised_search_navi"] #category_id').val()
		};

		jQuery.get(url_navi, request_data, function(data) {
			self.showResultNavi(data);
		});
	},
	showResultNavi: function(data) {
		// hier schreiben wir unsere vorschläge rein
		var output = $('#output');
		// alle bisherigen Elemente loeschen
	    output.html('');

	    if (typeof(data) != 'string' || data == '') {
	    	output.hide();
	    	return false;
	    }

		// Elemente entsprechend der Markierung extrahieren
		var elements = data.split('/element/');
		var dropdown_width = output.outerWidth();

		for (var key in elements) {
			if (elements[key] == '') {
				continue;
			}

			// neues Element anlegen
			var txt = replaceSpecialChars(elements[key],0);
			var str_length = textWidth(txt)+5;
			
			if (str_length > dropdown_width) {
				dropdown_width = str_length;
			}

			var newelem = $('<li/>',{
				id: 'suggest_'+txt.replace(' ','_'),
				html: '<a>'+txt+'</a>',
				name: key
			});

			output.append(newelem);
		}

		// height des Ausgabefeldes berechnen
		var height = ((elements.length -1) * 15);
		if (!$.browser.msie) {
			height = (height > 200 ? 200 : height);
			dropdown_width = dropdown_width - 2;
		} else if ($.browser.msie && height > 180) {
			height = 180;
		}

		output.css({
			height: height,
			width: dropdown_width,
			display: 'block'
		});

		// Events der Suchergebnisse
		$('#output li').bind({
			mouseover: function() {$(this).addClass('ui-dz_selectmenu_navi_menu_hover');},
			mouseout: function() {$(this).removeClass('ui-dz_selectmenu_navi_menu_hover');},
			click: function() {$('[name="advised_search_navi"] #article_name,#navi_search').val($(this).text());}
		});
	},
	setAutosuggestFocus: function(event) {
		if ((event.keyCode == 40) || (event.keyCode == 38 )) {
			var index = parseInt($('#output li.ui-dz_selectmenu_navi_menu_hover').attr('name'));

			index = (index)? index: 0;

			// alle hover entfernen
			$('#output li').removeClass('ui-dz_selectmenu_navi_menu_hover');

			if (event.keyCode==40) {
				// DOWN
				index++;
			} else if (event.keyCode==38) {
				// UP
				index--;
			}

			var ul			= $('#output');
			var selected	= $('#output li:nth-child('+index+')');
			selected.addClass('ui-dz_selectmenu_navi_menu_hover');

			$('[name="advised_search_navi"] #article_name,#navi_search').val(selected.text());

			var offset = 0;
			if (selected.position()) {
				if (selected.position().top + selected.height() > ul.height()) {
					offset = (selected.height() * (index));
					if (!$.browser.msie) {
						offset -= selected.position().top;
					} else {
						offset -= (ul.height() - index);
					}
					ul.scrollTop( offset );
				}

				if ((selected.position().top  < 0)) {
					if (!$.browser.msie) {
						offset = (selected.height() * (index)) + selected.position().top;
					} else {
						offset = (selected.height()+1) * (index-1);
					}
					ul.scrollTop( offset );
				}
			}
		}
	},
	submitNaviSearch: function(self) {
		var input	= $('[name="advised_search_navi"] #article_name');
		var search	= $('#navi_search');
		if (search.val() != self.search_field_value) {
			input.val(search.val());
		} else {
			input.val('');
		}

		document.advised_search_navi.submit();
	}
}

var Selectmenu = function(element, width, base_class_suffix, menu_click_action, select_click_action) {
	this.element = element;
	this.width = width;
	this.base_class_suffix = base_class_suffix;
	this.menu_click_action = this.registerClickAction(menu_click_action);
	this.select_click_action = select_click_action;
}
Selectmenu.prototype = {
	prepareOptions: function() {
		for (var key in this.element.options) {
			if (this.element.options[key].selected) {
				this.element.status = jQuery.extend({}, this.element.options[key]);
			}
		}
	},
	prepareFilterOptions: function() {
		for (var key in this.element.options) {
			if (this.element.options[key].counter) {

				if (this.element.options[key].selected) {
					this.element.status = jQuery.extend({}, this.element.options[key]);
				}

				this.element.options[key].value += ' ('+this.element.options[key].counter+')';

			} else if (this.element.options[key].key == 'default') {
				if (this.element.options[key].selected) {
					this.element.status = jQuery.extend({}, this.element.options[key]);
					this.element.status.value = 'nach '+ this.element.options[key].value;
				}

				this.element.options[key].value += (this.element.options[key].selected) ? ' - Alle' : ' - Filter entfernen';
			}
		}
	},
	buildSelectMenu: function() {
		var obj = {
			element: this.element,
			width: this.width,
			base_class_suffix: this.base_class_suffix,
			menu_click_action: this.menu_click_action,
			select_click_action: this.select_click_action
		};
		$('#'+this.element.id).dz_selectmenu(obj);
	},
	setEvent: function() {
		var self = this;
		$('body').click(function() {
			$('#'+self.element.id+' ul').css('display', 'none');
		});
	},
	registerClickAction: function(click_action) {
		switch (click_action) {
			case 'switch_page':
				return function(id, entry){
					if (id == 'page_bottom') {
						scrollTo(0,0);
					}
		
					$('#begin_at').val(entry.attr('name'));
					$('#load_form').val('false');
					$('#navi_changed').val('true');
		
					getArticle('browse', search_name);
				};
			case 'default':
				return function(id, entry){
					$('#'+ id +' input').val(entry.attr('name'));
					$('#load_form').val('false');
					$('#navi_changed').val('true');
		
					getArticle('browse', search_name);
				};
			default:
				return '';
		}
	},
	getSelectmenu: function() {
		this.prepareOptions();
		this.buildSelectMenu();
		this.setEvent();
	},
	getFilterSelectmenu: function() {
		this.prepareFilterOptions();
		this.buildSelectMenu();
		this.setEvent();
	}
}

function getBrandSelectmenu() {
	var navi_brand_select = $('#nb-select').dz_selectmenu({
		base_class_suffix	:'navi',
		width				: 136,
		dropdown_width		:136,
		menu_click_action	: function(id, entry, index) { // Aktion bei Auswahl einer Marke
			if (index != 0) {
				document.location.href= base_url + entry.attr('name');
			}
		},
		select_click_action	: 'click focus blur'
	});

	$('#nb-select-placeholder').replaceWith(navi_brand_select);
}

function changeFilterHeight() {
	var sum_width = 0;
	$('#housecolor, #brand, #product_type, #designated_use, #material, #gender').each(function(key, value){
		sum_width += $(value).outerWidth(true);
	});

	if (sum_width > $('#filter_row').width()) {
		$('#filter_row').height('32');
	}
}
