list_out=false;
car_li_length=143;
page_load_time=Date.parse(new Date);
blind_time=0;
car_is_animated=false;

/* OnLoad */

$(document).ready(function(){
	
	/**
	 * Erweitert JQuery's css-Funktion um ein neues Property: className:
	 * Damit lässt sich eine CSS-Klasse zu einem Element hinzufügen.
	 * Initial wurde diese Funktionalität eingeführt, weil Simple-Modal keine Möglichkeit mitliefert die
	 * CSS-Klassen für seine verwendeten Container zu definieren.
	 */
	$.cssHooks["className"] = {
	    set: function( elem, value ) {
	        $(elem).addClass(value);
		}
    };
	
	/**
	 * Das übergebene Offer-Objekt wird so erweitert, dass im c-Objekt die offerId hinterlegt wird (falls nocht nicht passiert).
	 * @param offer (in/out) ein Offer-Objekt, wie es vom Conversion-Tag- und Conversion-Element-View-Helper hinterlegt wird.
	 */
	function extendLogclickParams(offer, offerId)
	{
	    if (offer.c.length == 3) {
	        offer.c.push({}); 
	    }
		offer.c[3].offerId = offerId;
	}
	
    /**
     * Das wird für den View-Helper conversionElement benötigt:
     */
	$('body').delegate('.jsConversion, a.jsConversion > img', 'click', function(event) {
	    // event.target = The DOM element that initiated the event.
	    var target = $(event.target);

	    // für a.jsConversion > img
	    if (target.is('img') && !target.hasClass('jsConversion')) {
	        target = target.parent(); // das dazugehörige a
	    }

	    // wenn der klick conversion relevant ist, gibt es entsprechende daten dazu
	    var offerId = target.attr('id') ? priceConversionElements[target.attr('id')] : false;
	    if (offerId) {
	        var offer = priceOffers[offerId];
	        extendLogclickParams(offer, offerId);
	        logclick.apply(null, offer.c);
	        // Falls es kein a ist, hat der conversion-element-view-helper keine entsprechendes href hinterlegt,
	        // die url muss also per js verfolgt werden
	        if (!target.is('a') && offer.url) {
	            window.open(offer.url);
	        }

	        // für dieses Event müssen wir nichts mehr machen
	        event.stopPropagation();
	    }
	});

	/**
     * Das wird für den View-Helper conversionTag benötigt:
     */
    $('body').delegate('.jsConversionTag', 'click', function(event) {
        // event.target = The DOM element that initiated the event.
        var target = $(event.target);

        // gehe den DOM von target (inkl. target) aus nach oben und suche ein Element, dass Informationen liefert,
        // was als nächstes zu tun ist: entweder ignoriere den klick oder löse Conversion aus
        var infoElement = target.closest('.jsConversionTag, .jsNoConversion');

        if (infoElement.is('.jsConversionTag')) {
            // wenn der klick conversion relevant ist, gibt es entsprechende daten dazu
            var id = infoElement.attr('id');
            var offerId =  (id) ? priceConversionTags[id] : false;
            if (offerId) {
                var offer = priceConversionOffers[offerId];
                extendLogclickParams(offer, offerId);
                logclick.apply(null, offer.c);
                // Falls es kein a ist, hat der ConversionTag-View-Helper keine entsprechendes href hinterlegt,
                // Die url muss also per js verfolgt werden.
                // Die url muss auch per js verfolgt werden, falls es ein a ist, aber das a vom browser nicht verfolgt wird,
                // weil irgendwo anders event.preventDefault() gerufen wurde.
                if ((!target.is('a') || event.isDefaultPrevented()) && offer.url) {
                    window.open(offer.url);

                    // Es wurde per JS eine URL verfolgt. Hiermit wird verhindert, dass noch ein Clickout erzeugt wird, z.B.
                    // durch einen Anker, von dem das target-Element ein Kind ist.
                    event.preventDefault();
                }

                // für dieses Event müssen wir nichts mehr machen
                event.stopPropagation();
            }
        }
    });

	$("#all_categories a").click(function(e){
		e.preventDefault();
		$("#search_list div ul").css("height","100%");
		$(this).parent().remove();
	});
	sa=false;//Select-Animated
    var headSelectHeight = $('#head_select ul').css('height');
	$('#head_select div').click(function(){
		if(!sa){sa=true;
			//operaweiche...
			if($.browser.opera){
				$('#head_select ul').css('margin-left', '46px');
			}
            if (!list_out) {
                $('#head_select ul').css('height', '0%').css('display', 'inline').css('border', '1px solid #1c4fa8');
                $('#head_select ul').animate({"height" : headSelectHeight},500,function(){
                    list_out=true;sa=false;
                });
            }
            else {
				$('#head_select ul').css('border-width', '0 1px');
    			$('#head_select ul').animate({"height":"0%"},500);
	    		list_out=false;sa=false;
            }
		}
	});
	$('small.uncheck').click(function(){
		$(this).parent().find('input[type="checkbox"]').attr('checked','');
		$('#filter').submit();
	});
	$('#head_select ul li a').click(function(e){
		e.preventDefault();
		$('#head_select ul').css('border-width', '0 1px');
		$('#head_select div span').text($(this).text());
		$('input[name="category"]').val($(this).attr('rel'));

        if(list_out && !sa){sa=true;
			$('#head_select ul').animate({"height":"0%"},500);
			list_out=false;sa=false;
		};
	});
	$('.priceFilter input').focus(function(){
		if($(this).val()=="0"){$(this).val('');}
	});
	$('.priceFilter input').blur(function(){
		if($(this).val()==""){$(this).val('0');}
	});

	$('a.button_right').click(function(e){
		e.preventDefault();
		if(!$(this).hasClass('passiv') && !car_is_animated){slide_carousel($(this),"l",e);}
	});
	start_open=false;
	var sHeight = '565px';
	$('#start_cats').css({
		height: sHeight,
		overflow: 'hidden'
	});
	$('#index_slide').click(function(e){
		e.preventDefault();
		if(!start_open){
			$('#start_cats').css({"height":"auto"});
			$('#index_slide').text(lessCategories);
			start_open=true;
		}else{
			$('#start_cats').css({"height":sHeight});
			$('#index_slide').text(allCategories);
			start_open=false;
		}
	});
	$('a.button_left').click(function(e){
		e.preventDefault();
		if(!$(this).hasClass('passiv') && !car_is_animated){slide_carousel($(this),"r",e);}
	});
	if(!document.location.href.match('product')){$('#searchTerm input').trigger('focus');}
	$('#expand').click(function(){
		$(this).parent().toggleClass("less");
	});
	$('a.p_more').click(function(e){
		e.preventDefault();
		$(this).parent().find('span').append($(this).attr('rel'));
		$(this).remove();
	});
	var max_height=0;
	var i=0;
	while(i<$('div.products_4 a:not(div.afc ul li a)').length){
		if(max_height<$('div.products_4 a:eq('+i+')').height()){max_height=$('div.products_4 a:eq('+i+')').height();}
		i++;
		if(i==$('div.products_4 a:not(div.afc ul li a)').length){
			$('div.products_4 a:not(div.afc ul li a)').css('height',max_height+"px");
		};
	};
	$('#all_dep, #all_cats').mouseover(function(){
		clearTimeout(blind_time);
		$('#all_cats').show();//, #blind
	}).mouseout(function(){
		blind_time=setTimeout(function(){
			$('#all_cats').hide();//, #blind
		},300);
	});
	$('div.hide_me_at_start').hide();
	$('#filterblock li').click(function(){
		var i=$(this).find("h4 i");
		if(!$(this).hasClass('open')){
			i.html('&#9660;');
			$(this).addClass('open').find('div').slideDown(500,function(){
				$(this).parent().find('h4').one('click',function(){
					i.html('&#9658;');
					$(this).parent().find('div').slideUp(500,function(){
						$(this).parent().removeClass('open');
					});
				});
			});
		};
	});
	if($('.fixme')){
		var fw=$('.fixme').width();
		var mid=Math.round(((fw/160)+(fw/220))/2);
		if(mid>12){mid=12;}
		var aw=(((fw-(mid*50))/mid)+"").split(".")[0];
		$('.fixme a').css("width",aw+"px");
		for(var i=(mid*2);i<12;i++){
			$('.fixme a:eq('+i+')').hide();
		}
	}
    /*offerDetails der Landingpage*/
    $('a.productDetailsOpen').live('click', function() {
        $(this).text('close product details').addClass('productDetailsClose').removeClass('productDetailsOpen');
        $('#'+$(this).attr('rel')).append('<div class="loading"></div>');
    });
    $('a.productDetailsClose').live('click', function() {
        $(this).text('product details').addClass('productDetailsOpen').removeClass('productDetailsClose');
        $('#'+$(this).attr('rel')).children('div.offerDetails').remove();
        return false;
    });
    $('a.merchantDetailsOpen').live('click', function() {
        $(this).text('close merchant details').addClass('merchantDetailsClose').removeClass('merchantDetailsOpen');
        $('#'+$(this).attr('rel')).append('<div class="loading"></div>');
    });
    $('a.merchantDetailsClose').live('click', function() {
        $(this).text('merchant details').addClass('merchantDetailsOpen').removeClass('merchantDetailsClose');
        $('#'+$(this).attr('rel')).children('div.offerDetails').remove();
        return false;
    });
    $('div.offerDetails div.offerClose').live('click', function() {
        $(this).parent('div.offerDetails').remove();
    });
    $('div.offerDetails a.offerMore').live('click', function() {
        $(this).hide();
        $(this).parents('div.offerHead').nextAll('ul.productSimilarList').children('li.offerHide').show();
    });
});

/* Veraltet? Slider alt */

function slide_carousel($o,d,e){
	e.preventDefault();
	var $u=$o.parent().find('div.carousel_inner ul');
	var a=parseInt($u.css("marginLeft").replace('px',''));
	if(d=="l"){t=a-car_li_length*5}else{t=a+car_li_length*5}
	t=t+"px";
	car_is_animated=true;
	$u.animate({
		"marginLeft":t
	},1500,function(){
		car_is_animated=false;
		$o.parent().find('a.button_left,a.button_right').removeClass('passiv');
		if(t=="0px"){$o.parent().find('a.button_left').addClass('passiv');}
		if(t==(($u.find('li').length*car_li_length*-1)+(5*car_li_length))+"px"){$o.parent().find('a.button_right').addClass('passiv');}
	});
}

/* Für logclick und evtl. andere Funktionen die X und Y Koordinate der Maus speichern */
var clickX = 0;
var clickY = 0;
$(document).mousemove(function(e) {
    clickX = e.pageX;
    clickY = e.pageY;
});

/**
 * Löst das Tracking von Klicks aus.
 * 
 * @param string id Ein per Pipe ('|') separierter String von Keywords, die im Stats2 getrackt werden sollen
 * @param string|float rootId eine Wurzel-Kategorie-Id
 * @param string|float subnodeId eine Kategorie-Id
 * @param object obj Mittels dieses Objekts können der Conversion-Action zusätzliche Informationen übergeben werden.
 *          Dieser Parameter wurde eingeführt, um die Parameteranzahl dieser Funktion nicht zu groß werden zu lassen.
 * @return undefined
 */
function logclick(id, rootId, subnodeId, obj)
{
    if (document.getElementById('Price_ConversionTracking') != undefined) {

        var url = BASE_URL + 'index/conversion/id/' + id + '/';
        if (rootId > 0) {
            url = url + 'root/' + rootId + '/';
        }
        if (subnodeId > 0) {
            url = url + 'subnode/' + subnodeId + '/';
        }
        url += 'keyword/' + getKeyword() + '/';
        url += 'x/' + clickX + '/';
        url += 'y/' + clickY + '/';
        
        if (obj) {
            for (var prop in obj) {
                if (obj.hasOwnProperty(prop)) {
                    url = url + prop + '/' + obj[prop] + '/';
                }
            }
        }
        
        // mache den resultierenden Request uncachebar für Browser
        url += ('?r=' + Math.round(Math.random() * 99999999));
        
        document.getElementById('Price_ConversionTracking').src = url;
    }
}

/**
 * Holt das Keyword aus der URL.
 */
function getKeyword()
{
    var urlSplittet = location.href.split('/');
    var max = urlSplittet.length;
    var keyword = '';
    for (var i=0; i<max; i++) {
        if (urlSplittet[i] == 'query') {
            keyword = urlSplittet[i+1];
            break;
        }
    }

    return keyword;
}

/**
 * Löst das Tracking eines Klicks auf ein Google-Ad-For-Search aus.
 * @return undefined
 */
function logAfs()
{
    logclick('google', 0, 0, {type:'s'});
}

/**
 * Löst das Tracking eines Klicks auf ein Google-Ad-For-Content aus.
 * @return undefined
 */
function logAfc()
{
    logclick('google', 0, 0, {type:'c'});
}

/* Slider neu  - wie PVG */

jQuery(document).ready(function(){

	//ie6 + ie7
	if(jQuery.browser.msie && (jQuery.browser.version == '6.0' || jQuery.browser.version == '7.0') ){
		//slider ist leer, weil keine breite vorhanden war
		jQuery('.slider_container div').eq(2).css('width', '95%');
		jQuery('.slider_container div').eq(2).css('overflow', 'hidden');
	}
});

function slider_function(id,sliderhoehe){
	var i = 0, cl=1, slide = 0, akt_pos = null, akt_seite = 1;
	var sicht_bereich = jQuery(id+ " .slider_container").width()-30;
	var li_size = jQuery(id+ " li").width();
	var li_anzahl = jQuery(id+ " li").length;
	var sicht_li = Math.floor(sicht_bereich/115);
	var li_size_neu = Math.ceil(sicht_bereich/sicht_li);
	var ul_size = li_anzahl*li_size;
    var sicht_li_real = Math.floor(sicht_bereich/120);
	var seiten = Math.floor(li_anzahl/sicht_li_real) + ((li_anzahl % sicht_li_real) ? 1 : 0);

	jQuery(id+ " ul").css({left: (0)}, 200);

	/* prev und next buttons einblenden */

	jQuery(id+ " .prev").css("display", "block");
	jQuery(id+ " .next").css("display", "block");
	jQuery(id+ " ul").css("margin-left", "0px");

	/*li Element auf neue breite setzen*/

	jQuery(id+ " li").css("width", li_size_neu);
	jQuery(id+ " ul").css("width", li_size_neu * li_anzahl + (24 * li_anzahl));

	jQuery(id+ " .prev").css({opacity:0.3});
	if(akt_seite >= seiten)
		jQuery(id+ " .next").css({opacity:0.3});
	else
		jQuery(id+ " .next").css({opacity:1});

	jQuery(id+" .next").click(function(){
		akt_pos = jQuery(id+ " .slider_container").width()-30;
		if (akt_seite <= seiten-1) {
			slide = -akt_seite*akt_pos;
			jQuery(id + " ul").animate({left: (slide)}, 1000);
			jQuery(id+ " .prev").css({opacity:1});
			akt_seite++;
			if(akt_seite >= seiten )
				jQuery(id+ " .next").css({opacity:0.3});
		}
	});

	jQuery(id+" .prev").click(function(){
		akt_pos = jQuery(id+ " .slider_container").width()-30;
		if (akt_seite >= 2) {
			akt_seite--;
			slide = slide + akt_pos;
			jQuery(id + " ul").animate({left: (slide)}, 1000);
			jQuery(id+ " .next").css({opacity:1});
			if(akt_seite == 1)
				jQuery(id+ " .prev").css({opacity:0.3});
		}
	});
	jQuery(id+" .slider_container").css("height",sliderhoehe+"px");
}

function closeOverlay() {
    $.modal.close();
}

// AB HIER TEILE AUS DEM UNISTER KIT

// Plugin - Input beim fokussieren leeren



$.fn.focusClear = function() {
    return this.each(function() {
        $(this)
            .addClass('idleField')
            .bind('focus blur', function(event) {
                var element = this;
                $(element).toggleClass('focusField idleField');
                if (event.type === 'focus' && element.value === element.defaultValue) {
                    element.value = '';
                } else if ($.trim(element.value) === '') {
                    element.value = element.defaultValue;
                }
        });
    });
};

$(function () {
    $('form input.jsFocusClear').focusClear();
});

// Search Validation Click

$(function () {
    var searchInput = $('form input.jsSearch')[0];
    $('form button.jsSearchSubmit, form input.jsSearchSubmit')
        .bind('click', function (event) {
            if(searchInput.value == searchTerm || searchInput.value == searchAttention) {
              searchInput.value = searchAttention;
              setTimeout(function() {
                  searchInput.value = searchTerm;
              }, 2000);
              return false;
            }
        });
});

// Banner ausrichten und einblenden

function bannerAlign(id, tagChildren, command, adjustmentX, adjustmentY) {
    var banner = $('#' + id),
        bannerCheck = banner.find(tagChildren).length,
        bannerHeight, magnet, magnetCheck, magnetHeight, magnetPosition;

    if (bannerCheck) {
        magnet = $('div.js' + id + 'Magnet');
        magnetCheck = magnet.length;
        if (magnetCheck) {
            banner.show();
            magnetPosition = magnet.position();
            if (magnetPosition.top) {
                banner.css('top', magnetPosition.top + 'px');
            }
            if (magnetPosition.left) {
                banner.css('left', magnetPosition.left + 'px');
            }

            // Platzhalter einfügen

            if (command == 'displace') {
                bannerHeight = banner.outerHeight();
                magnetHeight = magnet.outerHeight();

                // IE6 und IE7 möchten CSS-Anweisungen getrennt haben

				magnet.css('height', bannerHeight + 'px');
				magnet.css('width', '1px');
            }
            if (command == 'adjust') {
                if (adjustmentX) {
                        banner.css('left', magnetPosition.left + adjustmentX + 'px');
                }
                if (adjustmentY) {
                        banner.css('top', magnetPosition.top + adjustmentY + 'px');
                }
            }
        }
    }
}

// Banner scrollt mit, merkt sich jedoch die Ausgangsposition

function bannerScrollTop(id, topMinimum) {
    var banner = $('#' + id),
        bannerCheck = banner.length,
        bannerTop, bannerTopNew, bannerTopOriginal, bannerHeight, documentHeight, documentHeightOriginal, windowScrollTop;

    if (bannerCheck) {
        bannerTop = banner.position().top;
        bannerTopOriginal = banner.data('bannerTopOriginal');
        bannerHeight = banner.outerHeight();
        windowScrollTop = $(window).scrollTop();
        documentHeight = $(document).height();
        documentHeightOriginal = $(document).data('documentHeightOriginal');

        // Originalwerte speichern

        if (typeof(bannerTopOriginal) == 'undefined') {
            banner.data('bannerTopOriginal', bannerTop);
        }
        if (typeof(documentHeightOriginal) == 'undefined') {
            $(document).data('documentHeightOriginal', documentHeight);
        }

        // Banner Top setzen

        if (bannerTop < bannerTopOriginal) {
            bannerTopNew = bannerTopOriginal;
            banner.css('position', 'absolute');

        // Originale Banner Position erreicht bzw. übersprungen

        } else if ((windowScrollTop + topMinimum + bannerHeight) < documentHeightOriginal && (windowScrollTop + topMinimum) > bannerTopOriginal) {

            // Anweisung für IE6 da er kein position:fixed kann

            if (kit.browser.msie6) {
                bannerTopNew = windowScrollTop + topMinimum;
                banner.css('position', 'absolute');
            } else {
                bannerTopNew = topMinimum;
                banner.css('position', 'fixed');
            }
        }

        // Banner ausrichten

        banner.css('top', bannerTopNew);
    }
}

// Banner zentrieren

function bannerCenter(id, target)
{
    var banner = $('#' + id),
        target = $('#' + target),
        bannerCheck = banner.length,
        targetCheck = target.length,
        bannerLeft, bannerWidth, targetLeft, targetWidth;

    if (bannerCheck && targetCheck) {
		bannerWidth = banner.width();
		targetWidth = target.width();
        targetLeft = target.offset().left;
		bannerLeft = (targetWidth-bannerWidth)/2+targetLeft;
        if(bannerLeft) {
            banner.css('position', 'absolute').css('left', bannerLeft);
        }
    }
}

// wrapper inklusive Banner zentrieren

function wrapperCenter(id, banner) {
    var wrapper = $('#' + id),
        banner = $('#' + banner),
		window = $(window),
        bannerCheck = banner.length,
        wrapperCheck = wrapper.length,
        bannerWidth, windowWidth, wrapperMargin, wrapperWidth;

	if (bannerCheck && wrapperCheck) {
		windowWidth = window.width();
		wrapperWidth = wrapper.width();
		bannerWidth = banner.width();
		wrapperMargin = (windowWidth - wrapperWidth) /2 - bannerWidth/2;
        wrapper.css('margin', '0 ' + wrapperMargin + 'px');
    }
}

/**
 * Mergt Objekt o2 in Objekt o1.
 * @param o1
 * @param o2
 * @return void
 */
function mergeObject(o1, o2)
{
    for (key in o2) {
        o1[key] = o2[key];
    }
}
/**
 * Diese Methode wird von den Popup-View-Helpern verwendet. 
 * Methode zum Anzeigen eines asynchron befüllten Popups.
 * 
 * @param string url An diese Url wird ein Request gesendet. Das HTML der Antwort wird in einem Popup angezeigt.
 * @param object options
 */
function ajaxPopup(url, options)
{
	options = mergePopupOptions(options, { 
		onShow : function (dialog) {
			$(options.popupContentWrapper).html('<div class="loading"></div>');
			$.ajax({
		        url: url,
		        success: function(data)
		        {
		            if (data.length > 10) {
		            	$(options.popupContentWrapper).html(data);
		                if (options.complete) {
		                	options.complete.call();
		                }
		            }
		        }
		    });
		}
	});
	openPopup(options);
}

/**
 * Diese Methode wird von den Popup-View-Helpern verwendet.
 * 
 * @param options containerId .. Die Id des Containers mit statischen Inhalt, der im Popup angezeigt werden soll.
 */
function staticPopup(containerId, options)
{
	options = mergePopupOptions(options, {
		onShow : function (dialog) {
			if (options.popupContentWrapper) {
				$(options.popupContentWrapper).append($('#' + containerId).children());
			}
		},
		onClose : function(dialog) {
			if (options.popupContentWrapper) {
				$('#' + containerId).append($(options.popupContentWrapper).children());
			}
			$.modal.close();
		}
	});
    openPopup(options);
}

/**
 * Öffnet ein Popup unter Nutzung des JQuery-Plugins modal.
 * 
 * @param object options Optionen für das Popup.
 */
function openPopup(options)
{
	$(options.popupWrapper).modal(options.modal);
}

/**
 * Das übergebene Objekt wird mehrstufig gemergt und zurückgegeben:
 * 
 * 1. Falls in options eine Eigenschaft jsOptionsObject gesetzt ist wird
 *    dessen Inhalt mit options gemergt. 
 * 2. Danach werden die Default-Popup-Optionen mit options gemergt, falls es die Defaults gibt (popupOptions.defaults).
 * 3. Danach werden die übergebenen Modal-Callback-Funktionen mit den schon definierten Modal-Callbacks
 *    gemergt. Ist z.B. die Funktion modal.onShow im Options-Array und im übergebenen Objekt modalFns
 *    definiert, wird im gemergten Objekt eine Funktion angelegt, die beide Funktionen ruft. Die Funktion im 
 *    übergebenen Objekt modalFns wird vor der Funktion gerufen, die im options-Object definiert ist.
 * 
 * @param object options
 * @param object modalFns Callback-Funktionen für 
 * @returns object fertig gemergtes options-Objekt
 */
function mergePopupOptions(options, modalFns)
{
	// merge mit jsOptionsObject
	if (options.jsOptionsObject) {
		options = $.extend(true, options, options.jsOptionsObject);
		delete options.jsOptionsObject;
	}
	
	// merge mit Defaults, falls es sie gibt
	if (popupOptions.defaults) {
		options = $.extend(true, {}, popupOptions.defaults, options);
	}
	
	// "merge" Modal-Callback-Funktionen
	if (modalFns) {
		for (var fn in modalFns) {
			if (modalFns.hasOwnProperty(fn) && fn) {
				if (options.modal[fn]) {
					// ersetze die callback-funktion mit einer Funktion die beide Funktionen ruft
					// Funktioniert nur, wenn beide sich nicht auf this verlassen, da beide Funktionen
					// im globalen Scope laufen
					(function(fn1, fn2) {
						options.modal[fn] = function() { 
							fn1.apply(null, arguments); fn2.apply(null, arguments);
						};
					})(modalFns[fn], options.modal[fn]);
				} else {
					// einfach überschreiben
					options.modal[fn] = modalFns[fn];
				}
			}
		}
	}
	return options;
}
