/*
 * typhoon.js
 * $Revision: 1.88 $
 *
 */
 
addEvent(window, "load", initSearch);

function Suggest(input, button, conf) {
    // max amount of items to display
    var maxAmount = 10;
    // valid this reference even in subfunctions
    var self = this;
    // the xmlhttprequest
    var req = null;
    // the input field with the search-text
    var input = input;
    // the search button next to the input-field
    var search_button = button;
    // the config object
    var config = conf;
    // the div to display the search-results inside
    var searchResultDiv = document.getElementById('res');

    // the divs to display the pagers in
    var topPagerDiv = document.getElementById('top_pager');
    var bottomPagerDiv = document.getElementById('bottom_pager');

    // all items
    var all = new Array();
    // last answer
    var lastAnswer = null;
    var lastRequest = null;
    var page = null;
	var loading = document.getElementById('loading');
    var log = new logger(0);
    var isIE = false;
    var xmlHttp = new BuchXmlHttp();
    var handle = function(event) {
        window.suggest.handle(event);
    }
    var startTime = new Date();
    var endTime = new Date();

    /*
     * declare public methods here
     */
    self.handle = handleEvent;
    self.show = showSuggestions;
    self.submit = submitSelection;
    self.switchSuggest = switchSuggest;
    self.page = getPage;

    // initialize the suggestion layer
    init();

    /*
     * wird am Anfang aufgerufen, initialisiert alles
     */
    function init() {
        input.value="";
        input.setAttribute("autocomplete", "off", 0);
        input.focus();
        addEvent(search_button, "click", handle);
        //addEvent(input, "keyup", handle);
    	// beim return druecken soll doch bitte nicht das form.submit ausgeloest werden.
    	input.onkeypress = function(event) { var realEvent = (window.event) ? window.event : event; if (realEvent.keyCode == 13) window.suggest.handle(event) };
        if (window.ActiveXObject) {
            isIE = true;
        }
    
        if ( window.location.href.indexOf('qs=') > -1 ) {
            var splitted = window.location.href.split('qs=');
            var searchString = decodeURI( splitted[1] );
            searchString = searchString.replace( /#/g, '' );
            searchString = searchString.replace( /%23/g, '#' );
            searchString = searchString.replace( /\+/g, ' ' );
            input.value = searchString;
            self.handle( null );
        }
    }

    // for entity conversion
    function entity(str) {
	var entityElement = document.createElement("div");
        entityElement.innerHTML = str;
        return entityElement.innerHTML;
    }

    function showSuggestions() {

		showLoadingImg();
		if (req != null && req.readyState && req.readyState == 4) {
            if (req.status && req.status != null && req.status == 200) {
                if (req.responseXML != null) {
         		    // IE-Hack: Wenn der Server den Content bei lï¿½geren
                    // Antworten aufsplittet, wird der MimeType nicht mehr 
                    // korrekt gesetzt, und req.responseXML enthï¿½t nicht
    		        // das von uns erwartete XML-Dokument. Dies kann man
                    // sich dann jedoch selber erzeugen:
                    if (isIE) {
                        req.responseXML.loadXML(req.responseText);
                    }
                    // nur wenn sich die Antwort unterscheidet oder 0 artikel
                    // geliefert wurden, mssen wir die Anzeige updaten
                    if (lastAnswer != req.responseText || req.responseXML.getElementsByTagName("book").length == 0) {
                        var results = createContainer("results");
                        setBooks(results, req.responseXML);
                        setSearchResults(results);
                        lastAnswer = req.responseText;
						setPager( req.responseXML );
                        endTime = new Date();
                        setTimeInfo( req.responseXML );
						hideLoadingImg();
                        // calls lightbox init function again
                        window.setTimeout( "initialize();", 20 ); 
                        document.body.style.cursor='auto';
                    }
                    req = null;
		    
                    //alert(searchResultDiv.innerHTML);
                }
            }
	        else {
	           log.info("There was a problem retrieving the XML data:\n" + req.statusText);
            }
        }
    }

    function setTimeInfo( xml ) {
        var total = getTextContentFromNode( xml.getElementsByTagName("count")[0] );
        var layer = document.getElementById('qd');
		var newNode = document.createTextNode( total + " Ergebnisse (" + (endTime.getTime()-startTime.getTime())/1000.0 + " Sekunden)");
        if (layer.firstChild != null) {
            layer.replaceChild(newNode, layer.firstChild);
        } else {
            layer.appendChild(newNode);
        }
		// links in der Zeile das Wort Suchergebnisse setzen
        var labelSuchergebnisse = document.getElementById('labelSuchergebnisse');
		var newNode1 = document.createTextNode("Suchergebnisse");
        if (labelSuchergebnisse.firstChild != null) {
            labelSuchergebnisse.replaceChild(newNode1, labelSuchergebnisse.firstChild);
        } else {
            labelSuchergebnisse.appendChild(newNode1);
        }
        
    }
    
    function setSearchResults(resultsDiv) {
        if (searchResultDiv.firstChild == null) {
            searchResultDiv.appendChild(resultsDiv);
        }
        else {
            searchResultDiv.replaceChild(resultsDiv, searchResultDiv.firstChild);
        }
	window.scrollTo( 0, 0 );
        document.getElementById('hr').setAttribute("class","hrvis",0);
    }

    //browser fork
    function getTextContentFromNode(element) {
	if ( element == null ) return "";
        try {
            if (element.textContent) return element.textContent;
        }
        catch(e) {
        }
        if (element.text) return element.text;
        var children = element.childNodes;
        var result = "";
        for (var i = 0; i < children.length; i++) {
            var node = children[i];
            if ((node.nodeType >= 3) && (node.nodeType <= 6)) {
                result += node.nodeValue;
            }
            else if (node.nodeType == 1) {
                result += textContent(node);
            }
        }
        // Workaround for konqueror : it can't set element.textContent for some reason, while it doesn't support it... so we use element.text...
        element.text = result;
        return result;
    }

    // erzeugt ein span mit class=<tag> und inhalt des ersten tags
    
	function createSpan(tag, xml) {
    
        	var max_stringlength	=	80;
        	
        	switch (config.mnd) {
        		case 3:
        		case 6:
        		case 7:
        		case 8:
        		case 9:
        		case 13:
        		case 15:
        		case 18:
        			var currencySymbol = 'CHF';
        			break;
        		default:
        			var currencySymbol = 'CHF';
        			break;
        	}
    
        var el = xml.getElementsByTagName(tag)[0];
        if (el) {
            value = getTextContentFromNode(el);
        }
        else {
            value = "";
        }
        // sonderfall preis
        if (value != "" && tag == "price") {
            while (value.length < 3) {
                value = "0" + value;
            }
            if (currencySymbol == 'CHF') {
                value = value.substring(0,value.length - 2) + "." + value.substring(value.length - 2, value.length);
                value = currencySymbol + " " + value;
            }
	    else {
                value = value.substring(0,value.length - 2) + "," + value.substring(value.length - 2, value.length);
                value = entity(currencySymbol) + " " + value;
            }
        }
		
        // sonderfall productType
        if (value != "" && tag == "producttype") {
            value = "[" + value + "]";
        }
		
		if (value != "" && tag == "publisher") {
            value = value + " - ";
        }

        // sonderfall description
        if (value != "" && tag == "subtitle" && value.length > 200) {
            value = value.substring(0, 200) + "...";
        }
		
		if (value != "" && tag == "publisher") {
            value = value + " - ";
        }

        // sonderfall titel
        if (value != "" && tag == "title" && value.length > max_stringlength) {
            value = value.substring(0, max_stringlength) + "...";
            // + "&euro;"
        }
        var element = createNode("span", value);
        element.className = tag;
        return element;
    }

    function createLink(tag, xml, artikelId) {
    
        	var max_stringlength	=	80;
        	
        var el = xml.getElementsByTagName(tag)[0];
        if (el) {
            value = getTextContentFromNode(el);
        }
        else {
            value = "";
        }

        // sonderfall titel
        if (value != "" && tag == "name" && value.length > max_stringlength) {
            value = value.substring(0, max_stringlength) + "...";
        }
        var element = createNode("a", value);
        element.className = tag;
		element.setAttribute("href", "/pd/prod_"  + artikelId + ".html" , 0);
        element.setAttribute("class", "lbOn" );

        if ( isIE ) {
            /*
            for some odd reason IE doesn't see the lb0n classed objects when
            lightbox initialize is called, but he displays them.
            So we init lighbox directly here:
            */

            new lightbox( element );

        }

        return element;
    }

    function createShoppingCartLink( xml, artikelId, linkAsImage ) {
        var el = xml.getElementsByTagName("title")[0];
        if (el) {
            title = getTextContentFromNode(el);
        }
        else {
            title = "";
        }

        var el = xml.getElementsByTagName("price")[0];
        if (el) {
            price = getTextContentFromNode(el);
        }
        else {
            price = 0.0;
        }

        var linkNode =  document.createElement("a");
        linkNode.setAttribute("href", "javascript:addToCart(\"" + artikelId + "\", \"" +  title + "\", \"" + price + "\" );");

		if(linkAsImage){
	        var imageNode = document.createElement("img");
	        imageNode.setAttribute( "src", "warenkorb.png" );
	        imageNode.setAttribute( "width", "100" );
	        imageNode.setAttribute( "height", "30" );
			  imageNode.setAttribute( "border", "0" );
	        imageNode.setAttribute( "alt", "Artikel in den Warenkorb legen" );
	
	        linkNode.appendChild( imageNode );
		}
		else{
			linkNode.appendChild(document.createTextNode("in den Warenkorb"));
		}

        return linkNode; 
    }
	 
	function showLoadingImg() {
		loading.style.display = 'block';
	}
	function hideLoadingImg() {
		window.setTimeout("loading.style.display = 'none'", 650);
	}
	

    function createContainer(classname) {
        var ele = document.createElement("div");
        ele.className = classname;
        return ele;
    }
    
    function createImg(xml) {
        var imageUrlElement = xml.getElementsByTagName("image")[0];
        var content = getTextContentFromNode(imageUrlElement);
        var element = document.createElement("img");
        if (imageUrlElement != null && content != null && content != "") {
            element.setAttribute("src", content , 0);
        }
        else {
            element.setAttribute("src", "http://media.libri.de/shop/images/no_coverscan_medium.jpg", 0);
	    element.setAttribute("alt", "Leider kein Bild vorhanden", 0);
	    element.setAttribute("title", "Leider kein Bild vorhanden", 0);
        }

        return element;
    }

    function createNoResults() {
        var container = createContainer("noresults");
        container.appendChild(document.createTextNode("Die Suche nach '" + input.value + "' ergab leider keine Ergebnisse."));
        return container;
    }

    function setPager( xml ) {
        var total = getTextContentFromNode( xml.getElementsByTagName("count")[0] );
        pages = Math.round( total / maxAmount );

        var left_border = 0;
        var right_border = pages;

        if ( page > 10 ) {
            left_border = page - 10;
        }

        right_border = page + 10 > pages ? pages : page + 10;

        if ( right_border - left_border > 20  ) {
                left_border -= page;
        }

        if ( topPagerDiv != null ) {
            if ( topPagerDiv.firstChild != null ) {
                topPagerDiv.removeChild( topPagerDiv.firstChild );
            }

            var container = createContainer("pager");        
    
            if ( page > 0 ) {
                container.appendChild( createLeftPager( page - 1 ) );
                container.appendChild( document.createTextNode( " " ) );
            }

            for ( i = left_border; i < right_border; i++ ) {
               container.appendChild( createNewPagerLink( i ) );
               container.appendChild( document.createTextNode( " " ) );
            }

            if ( page < pages - 1) {
                container.appendChild( createRightPager( page + 1 ) );
            }

            topPagerDiv.appendChild( container );
        }

        if ( bottomPagerDiv != null ) {
            if ( bottomPagerDiv.firstChild != null ) {
                bottomPagerDiv.removeChild( bottomPagerDiv.firstChild );    
            }

            var container = createContainer("pager");        

            if ( page > 0 ) {
               container.appendChild( createLeftPager( page - 1 ) );
               container.appendChild( document.createTextNode( " " ) );
            }

            for ( i = left_border; i < right_border; i++ ) {
               container.appendChild( createNewPagerLink( i ) );
               container.appendChild( document.createTextNode( " " ) );
            }
            
            if ( page < pages - 1 ) {
                container.appendChild( createRightPager( page + 1 ) );
            }

            bottomPagerDiv.appendChild( container );
        }
    }

    function createNewPagerLink( index ) {
        var element = createNode("a",  ""+ ( index + 1 ) );
        element.setAttribute("href", "javascript:window.suggest.page(" + i + ")");

        if ( index == page ) {
            element.setAttribute("class", "currentElement" );
        }

        return element; 
    }

    function createLeftPager( pos ) {
        var linkNode =  document.createElement("a");
		var zurueckText = document.createTextNode("<< zurück");
        linkNode.appendChild( zurueckText );
		
		linkNode.setAttribute("class", "zurueckButton");
        linkNode.setAttribute("href", "javascript:window.suggest.page(" + pos + ")");

        var imageNode = document.createElement("img");
        imageNode.setAttribute( "src", "links.png" );
        imageNode.setAttribute( "alt", "Zur&uuml;ck" );
		  imageNode.setAttribute( "border", "0" );
		  
		  
        //linkNode.appendChild( imageNode );
        return linkNode;
    }

    function createRightPager( pos ) {
        var linkNode =  document.createElement("a");
		var weiterText = document.createTextNode("weiter >>");
        linkNode.appendChild( weiterText );
        linkNode.setAttribute("href", "javascript:window.suggest.page(" + pos + ")");
		linkNode.setAttribute("class", "weiterButton");
		  
        var imageNode = document.createElement("img");
        imageNode.setAttribute( "src", "rechts.png" );
        imageNode.setAttribute( "alt", "Zurück" );
		  imageNode.setAttribute( "border", "0" );

        //linkNode.appendChild( imageNode );
        return linkNode;

    }

    function setBooks(father, xml) {
			var books = xml == null ? null : xml.getElementsByTagName("article");
			// do not display more items than allowed
			var maxBooks = books == null ? 0 : (books.length > maxAmount) ? maxAmount : books.length;
			
			all = new Array();
			if (maxBooks == 0) {
				all[0] = createNoResults();
				father.appendChild(all[0]);
			} else {
				for (var i = 0; i < maxBooks; i++) {
					
				var artikelId = getTextContentFromNode(books[i].getElementsByTagName("articleid")[0]);
										  
				// Container fÃ¼r alles
				var trElement = createContainer("suchergebnisZeile");						  
				
					// Bild erzeugen
					var elImg = createImg(books[i]);
					// Container fÃ¼r Artikelvorschaubild
					var coverImgDiv = document.createElement("span");
					coverImgDiv.className =  "artikelBild";
					// Bild in Container packen
					coverImgDiv.appendChild(elImg);
					// BildContainer packen
					trElement.appendChild(coverImgDiv);
					
					
					// Artikeldetails zusammenbauen
					var artikelDetails = createContainer("artikelDetails");
						
						// Typ des Artikels
						var priceContainer = createContainer("priceContainer");	

						var elProductType = createSpan("producttype", books[i]);
						var elAuthor = createSpan("author", books[i]);
						var elTitle = createLink("title", books[i], artikelId);
						var titleContainer = createContainer("title");
							titleContainer.appendChild(elTitle);
					
						var descriptionPublisherContainer = createContainer("descriptionPublisherContainer")

							var elDescription = createSpan("subtitle", books[i]);
						
							var elPublisher = createSpan("publisher", books[i]);
					
					// Titel des Artikels
					artikelDetails.appendChild(elProductType);

					artikelDetails.appendChild(elAuthor);

					artikelDetails.appendChild(titleContainer);
						
						// die Artikelbeschreibung
						descriptionPublisherContainer.appendChild(elPublisher);
						descriptionPublisherContainer.appendChild(elDescription);
					
					artikelDetails.appendChild(descriptionPublisherContainer);
					
					// Preis des Artikels
					var elPrice = createSpan("price", books[i]);
					var elOnlinePriceLabel = document.createElement("span");
				        elOnlinePriceLabel.className = "onlinePriceLabel";
						elOnlinePriceLabel.appendChild(document.createTextNode("Online Preis"));	
					
					
					// priceContainer.appendChild(elProductType);
					priceContainer.appendChild(elPrice);
					priceContainer.appendChild(elOnlinePriceLabel);
					var elOnlinePriceLabel = document.createElement("span");
					
					var shoppingCartLink = document.createElement("span");
				        shoppingCartLink.className = "shoppingCartLink";
						shoppingCartLink.appendChild(createShoppingCartLink( books[i], artikelId, false ));	
					
					priceContainer.appendChild(shoppingCartLink);
					
					var clearElement = createContainer("clear");
					
					artikelDetails.appendChild(priceContainer);
					artikelDetails.appendChild(clearElement)
					trElement.appendChild(artikelDetails);
					
					father.appendChild(trElement);
					all[i] = trElement;
				}
			}
    }

    function createNode(tag, content) {
        var newEl = document.createElement(tag);
        var newElContent = document.createTextNode(content);
        newEl.appendChild(newElContent);
        return newEl;
    }

    // self is called from html
    function getSuggestions(word) {
        //showLoadingImg();
		if (word.length < 1) {
            lastAnswer = null;
            var results = createContainer("results");
			/* 
			 * rausgenommen, da sonst bei der Eingabe von Return, 
			 * ohne Suchanfrage der Ergebniscontainer gelÃ¶scht wÃ¼rde und nur 
			 * der Pager angezeigt werden wÃ¼rde  	
			 * 
			 * setSearchResults(results);
			 */
			document.getElementById('hr').setAttribute("class","hrvis",0);
            return;
        }
        if (lastRequest != null && word == lastRequest) {
            return;
        }
        if (req != null) {
          // req.abort();
        }
        if (config.tkn == "") {
            // no token, no request
            return;
        } else {
            req = xmlHttp.createReq();
	        if (req != null) {
                
            	    // Mindestens der Firefox setzt bei chunked-messages
                // den MimeType nicht korrekt... deshalb setzen wir
                // den hier hart.
                if (req.overrideMimeType) {
    	               req.overrideMimeType("text/xml");
                }
		if ( word.match(/^[0-9][-0-9]+\w?$/) ) {
			word = word.replace(/-/g, '' );
		}

    
                var url = "/typhoon/s/" + config.mnd + "/" + config.sid + "/" + encodeURI(word);
    
                xmlHttp.openReq(req, url, self.show);
                req.setRequestHeader("TYTOKEN", config.tkn);
                xmlHttp.sendReq(req);
                startTime = new Date();
                // this broke somehow:
                //document.body.style.cursor='wait';
                lastRequest = word;
            }
        }
    }

    function getPagedSuggestions( word, page ) {
        if (word.length < 1) {
            lastAnswer = null;
            var results = createContainer("results");
            setSearchResults(results);
            document.getElementById('hr').setAttribute("class","hrhid",0);
            return;
        }
        if (req != null) {
          // req.abort();
        }
        if (config.tkn == "") {
            // no token, no request
            return;
        } else {
            req = xmlHttp.createReq();
	        if (req != null) {
                
            	// Mindestens der Firefox setzt bei chunked-messages
                // den MimeType nicht korrekt... deshalb setzen wir
                // den hier hart.
                if (req.overrideMimeType) {
    	               req.overrideMimeType("text/xml");
                }
		if ( word.match(/^[0-9][-0-9]+\w?$/) ) {
			word = word.replace(/-/g, '' );
		}


    
                var url = "/typhoon/s/" + config.mnd + "/" + config.sid + "/" + encodeURI(word) + "?p=" + page + "&ps=" + maxAmount ;

            
    
                xmlHttp.openReq(req, url, self.show);
                req.setRequestHeader("TYTOKEN", config.tkn);
                xmlHttp.sendReq(req);
                startTime = new Date();
                //document.body.style.cursor='wait';
                lastRequest = word;
            }
        }
    }

    function getPage( number ) {
        page = number;
        getPagedSuggestions( input.value, number );
    }

    function handleEvent(event) {
        page = 0;
        getSuggestions(input.value);
    }

    function submitSelection() {
        hideLayer();
        var element = all[selected];
        if ((typeof element != 'undefined') && (element.artikel)) {
            window.location.href = config.url + "/ID" + element.artikel + ".html";
        }
        else {
            input.form.submit();
        }
    }
	
    function getEvent(event) {
        return (window.event) ? window.event : event;
    }

    function getEventTarget(event) {
        var realEvent = getEvent(event); 
        return (realEvent.target) ? realEvent.target : realEvent.srcElement;
    }

    function switchSuggest(isSuggest) {
        page = 0;
        if ( bottomPagerDiv.firstChild != null ) {
                bottomPagerDiv.removeChild( bottomPagerDiv.firstChild );    
        }
        removeEvent(search_button, "click", handle);
        removeEvent(input, "keyup", handle);
    	if (isSuggest) {
	        addEvent(input, "keyup", handle);
            handle(null);
            search_button.style.display = 'none';
            // document.getElementById('suggestTipp').style.display = "block"; 			
            // window.setTimeout("document.getElementById('suggestTipp').style.display = 'none'" , 5500 ); 			
        } else {
            addEvent(search_button, "click", handle);
            search_button.disabled = false;
		  	//document.getElementById('suggestTipp').style.display = 'none';
        }
        /*input.value = "";
        if (searchResultDiv.firstChild != null) {
            searchResultDiv.removeChild(searchResultDiv.firstChild);
        }*/
		document.getElementById('hr').setAttribute("class","hrvis",0);
        input.focus();
    }
}


// funktioniert nur im firefox, landet da auf der konsole.
// dann muss man da nicht mit den alerts rumbasteln
function logger(debugmode) {
    if (window.dump) {
        var console = window;
        var debug = debugmode;
    }
    else {
        var debug = -1;
    }
    this.info = function (message) {
        if (debug >= 0) console.dump("INFO: " + message + "\n");
    }
    this.warning = function (message) {
        if (debug >= 1) console.dump("WARNING: " + message + "\n");
    }
    this.error = function (message) {
        if (debug >= 2) console.dump("ERROR: " + message + "\n");
    }
}

// initialisiert, wenn moeglich, die search-funktionalitaet
function initSearch() {
    var search_input = document.getElementById("qs");
    var search_button = document.getElementById("qb");
    var sugCnf = new tyCnf('hiEORZZk2Z472', 1, 'mhm7m26qq71.fdc61', 'http://www.karstadt.de/produktAnzeigen.do');
    window.suggest = new Suggest(search_input, search_button, sugCnf);
    
	// auf der Suchergebnisseite gleich auf den TypeAhead Modus wechseln...
	window.suggest.switchSuggest(true);
	
	/*
    var suggestRadio = document.getElementById("qtv");
    suggestRadio.disabled = false;
    addEvent(suggestRadio, "click", function(event) {
        window.suggest.switchSuggest(true);
    });
    var searchRadio = document.getElementById("qts");
    addEvent(searchRadio, "click", function(event) {
        window.suggest.switchSuggest(false);
    });
    searchRadio.checked = true;
    */
}

function tyCnf(tknstr, mndint, sidstr, urlstr) {
    this.tkn = tknstr;
    this.mnd = mndint;
    this.sid = sidstr;
    this.url = urlstr;
}

function addEvent(elm, evType, fn, useCapture)
// addEvent and removeEvent
// cross-browser event handling for IE5+,  NS6 and Mozilla
// By Scott Andrew
{
  if (elm.addEventListener){
    elm.addEventListener(evType, fn, useCapture);
    return true;
  } else if (elm.attachEvent){
    var r = elm.attachEvent("on"+evType, fn);
    return r;
  } else {
    // wer auch immer die untere Zeile hat einkommentiert gelassen, sollte darber nochmal nachdenken...
    // alert("Handler could not be added");
  }
}

function removeEvent(elm, evType, fn, useCapture)
// addEvent and removeEvent
// cross-browser event handling for IE5+,  NS6 and Mozilla
// By Scott Andrew
{
  if (elm.removeEventListener){
    elm.removeEventListener(evType, fn, useCapture);
    return true;
  } else if (elm.detachEvent){
    var r = elm.detachEvent("on"+evType, fn);
    return r;
  } else {
    // wer auch immer die untere Zeile hat einkommentiert gelassen, sollte darber nochmal nachdenken...
    // alert("Handler could not be removed");
  }
}
