/*
@Author Kamenew
Globaler Ajax-Handel

@requestURL
@method POST,GET
@dataObject POST Data assoziatives Array
@callback die Callback-Methode für den jeweiligen Request
@async boolean Modus
@error Callback-Methode für Fehlerfall(optional)
@beforSend Callback-Methode um RequestHeader zu setzen(optional)
*/
function requestAjax(requestURL,method,dataObject,callback,async,error,beforeSend){
//console.log("ajax"+requestURL);
if(error == undefined)
	error = null;
if(beforeSend == undefined)
	beforeSend = null;
$.ajax({
   type: method,
   url: requestURL,
   data: dataObject,
   success: callback,
   async: async,
   beforeSend: beforeSend,
   error: error
 });
}

/* <![CDATA[ */
		function MM_findObj(n, d) { //v4.01
			var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
			d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
			if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
			for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
			if(!x && d.getElementById) x=d.getElementById(n); return x;
		}
/* ]]> */

/*
Popup Funktion

@param url	zu öffnende URL
@param name Name des Fensters
@param width Breite des Fensters
@param height Höhe des Fensters
@param top Abstand des Popups vom oberen Rand des Bildschirms
@param left Abstand des Popups vom linken Rand de Bildschirms
@param toolbar Toolbar anzeigen = yes nicht anzeigen = no
@param status Statusbar anzeigen = yes nicht anzeigen = no
@param scrollbars Scrollbalken anzeigen = yes nicht anzeigen = no
@param resize Größe des Fensters veränderbar = yes fixiert = no
*/
var win = null;
function windowOpen(url,name,width,height,top,left,toolbar,status,scrollbars,resize){
	
	//schliesse das fenster wenn es bereits geöffnet ist
	if( win != null )win.close();
	win=window.open(url,name,'"toolbar='+toolbar+',width='+width+',height='+height+',top='+top+',left='+left+',directories=no,status='+status+',scrollbars='+scrollbars+',resize='+resize+'"');
	return false;
}

/*
Zählt bei Textarea Felder die noch verfügbaren 
Zeichen runter

@param Anzahl der 
@param Anzahl der max. Zahlen
@param ID des Formularfeldes
*/
function checkLen(val,zeichen,formid) {

objLen 		= document.getElementById("objLen");
formid	= document.getElementById(formid);
	
tmpLen		= zeichen - formid.value.length;
if(tmpLen >= 0) {
svobjComment = formid.value;
} else {
formid.value = svobjComment;
tmpLen = zeichen - svobjComment.length;
}
objLen.value = tmpLen;
}

/*
Zählt bei Textarea Felder die noch verfügbaren 
Zeichen runter und zwar FÜR BELIEBIGE TEXTAREAS UND NICHT NUR FÜR DIE MIT ID objLen :-)

@param Objekt (Textarea)
@param Anzahl der max. Zahlen
@param ID des Ausgabefeldes
*/
function limitChars(obj,max,leftId) 
{
if (obj.value.length > max) {
	obj.value = obj.value.substring(0,max);
	alert("Es dürfen nicht mehr als "+max+" Zeichen eingegeben werden");
}
iZeichen = max - obj.value.length
document.getElementById(leftId).value = iZeichen >= 0 ? iZeichen : 0; 

} 

/*
Inputfields replace values

Bei Bestellformularen oder ähnlichem wird in z.b. grauer Schrift
als value z.b. Anzahl und Bestell-Nummer angezeigt.
bei einem onclick event muß dieser zurückgesetzt werden und
evtl. der Style geändert werden.

@param neue TextFarbe
@param Array mit IDs der Inputfields welche zurückgesetzt werden sollen
@param Array MaxLength
*/
var finished = 0;
function inputFieldsChangeValue(textstyle, inputFields, maxLength){

	if(finished == 1){
		
		return;
	}
	for(i = 0; i < inputFields.length; i++){
			document.getElementById( inputFields[i] ).value = '';
			document.getElementById( inputFields[i] ).style.color = textstyle;
			document.getElementById( inputFields[i] ).maxLength = maxLength[i];
	}

	finished = 1;
}

/*
Katalogbestellformular

übernehme Daten des kleinen Katalogbestellformulars wenn auf weitere Produkte geklickt wurde
@param modifier
*/
function getOrderNumbers(modifier){

	//artikel 1
	if(document.getElementById( 'f1'+modifier ).value.match(/[0-9]+/) && document.getElementById( 'f2'+modifier ).value.match(/[0-9]+/)){
		document.getElementById( 'cat'+modifier ).href += '&f1='+document.getElementById( 'f1'+modifier ).value+'&f2='+document.getElementById( 'f2'+modifier ).value;
	}

	//artikel 2
	if(document.getElementById( 'f3'+modifier ).value.match(/[0-9]+/) && document.getElementById( 'f4'+modifier ).value.match(/[0-9]+/)){
		document.getElementById( 'cat'+modifier ).href += '&f3='+document.getElementById( 'f3'+modifier ).value+'&f4='+document.getElementById( 'f4'+modifier ).value;
	}
}

/*
Prüft die Bestellnummern der Katalogbestellungen ob diese >= 6 Stellen besitzt
und gibt bei einem Fehler einen Alertfenster mit einem Hinweistext aus 
*/
function checkOrderNumbers(idTag,type)
{
	////////////////////////////
	//kleines Katalogbestellformular auf Homepage
	if(type == 1){
			value = document.getElementById( 'f2'+idTag ).value;
			//wenn value gesetzt prüfe auf länge
			if(value != ''){
				//gebe eine Meldung aus
				if(value.length <= 5 ){
					alert('Bestellnummern bestehen aus 6 bis 8 Zahlen.\nBitte korrigieren Sie Ihre Angaben.');
					return false;
				}	
			}
			value = document.getElementById( 'f4'+idTag ).value;
			//wenn value gesetzt prüfe auf länge
			if(value != ''){
				//gebe eine Meldung aus
				if(value.length <= 5 ){
					alert('Bestellnummern bestehen aus 6 bis 8 Zahlen.\nBitte korrigieren Sie Ihre Angaben.');
					return false;
				}	
			}
	}else{
	////////////////////////////
	//Großes Katalogbestellformular
		//durchlaufe die schleife solage bis iTag+1 = undefined und breche schleife ab
		for(i=1;i<100;i++){
			
			if(document.getElementById( idTag+i )){
	
				value = document.getElementById( idTag+i ).value;
				//wenn value gesetzt prüfe auf länge
				if(value != ''){
					//gebe eine Meldung aus
					if(value.length <= 5 ){
						alert('Bestellnummern bestehen aus 6 bis 8 Zahlen.\nBitte korrigieren Sie Ihre Angaben.');
						return false;
					}	
				}
			}else{
				break;
			}
		}
	}
}

/**
Ersetzt die CSS Klasse eines Elementes
Wenn Objekt Class "first" tausche mit second und umgekehrt
Wird z.b. für Sys::dumpVar
@autor Markus Kamenew
@param id = id des Elements
@param first = default Klassenname
@param second = zweiter Klassenname

**/
function changeClass(id,first,secound){
	
	if( document.getElementById(id).className==first){
		document.getElementById(id).className=secound;
	}else{
		document.getElementById(id).className=first;
	}
}

/**
Generiert zufälligen Wert und prüft, ob er im übergebenen Wertebereich liegt
Wird z.b. für zufälliges Öffnen eines Popup benutzt (Sammler-Editionen)
@autor Oliver Deul
@param range = Wertebereich

**/
function my_rand(range){
	a=Math.random();
	a*=100;
	a=Math.ceil(a)
	if (a <= range)
		return true;
	else
		return false;		
}

/**
Konfiguration der Detailimagesslideshow.
@autor Oliver Deul

**/
var oMyDiv;
var isScrolling;
var DX;
var DELAY;

function initPage() {
	oMyDiv = document.getElementById( "divname" );
	isScrolling = false;
	DX = 50; 
	DELAY = 150;
};

/**
Scrollt die Slideshow nach links.
@autor Oliver Deul
@param evt = Initialisierungsparameter

**/
function scroll2Left( evt ) {
	if ( evt ) {
		isScrolling = true;
	}
	if ( isScrolling ) {
		if ( oMyDiv.scrollLeft > 0 ) {
			oMyDiv.scrollLeft -= DX;
			window.setTimeout( "scroll2Left()", DELAY );
		};
	};
};

/**
Scrollt die Slideshow nach rechts.
@autor Oliver Deul
@param evt = Initialisierungsparameter

**/
function scroll2Right( evt )
{
	if ( evt ) {
		isScrolling = true;
	}
	if ( isScrolling )
	{		
		oMyDiv.scrollLeft += DX;
		window.setTimeout( "scroll2Right()", DELAY );
	};
};

/**
schaltet das Scrolling aus.
@autor Oliver Deul

**/
function stopScrolling()
{
	isScrolling = false;
}

/**
Speicherbarer Warenkorb - Daten aus dem Cookie holen
**/
function getStorableCartData(){

		if( window.XMLHttpRequest ) {
          req = new XMLHttpRequest();
        } else if( window.ActiveXObject ) {
          req = new ActiveXObject( "Microsoft.XMLHTTP" );
        } else {
          return;
        }
        
        
	    req.open( "GET", '/index.html?f=cart.add&mode=sc', true );
	    req.onreadystatechange = callbackStorableCart;
	    req.send( null );

}
/*
Speicherbarer Warenkorb - Setzen der Anzeige Artikel im Warenkorb  
*/
function callbackStorableCart() {
	 if( 4 == req.readyState ) 
		if (200 == req.status){
			if (req.responseText != null && req.responseText != "0" && req.responseText != ""){
				values=req.responseText.split("|");
				if (values != null){
					if (values.length > 0)				
				    	if (document.getElementById("set_aiw") != null)
							document.getElementById("set_aiw").innerHTML = values[0];
					if (values.length > 1)
						if (document.getElementById("set_sav") != null)
							document.getElementById("set_sav").innerHTML = values[1];
				}
				if (window.location.href.indexOf('cart.wk') != -1){
					window.location.href=window.location.href;
				}	
			} 
		}
			
}

//100 milisekunden * suggestTime dann feuer
var suggestTime = 1;
var suggestCounter = 0;
var intervalObj = null;
var stopSuggestionAfterEnter = 0;
var dontRequestSuggestion = 0;
var maxCharforSuggestBox = 2;
var registerClickeventforBoxclosing = 0;
var BoxclosingonClick = 1;
var globalsuggestDiv = '';
var actualSerachphrase = '';
/*
Initalisiert die Suggestion
@textFieldId	id des Such-Inputfields
@width			breite des Vorschlagfelds
@height			höhe des Vorschlagfelds
@suggestDiv		id des Vorschlag-DIVs
@activeColor	Farbe wenn Div ausgewählt
@inactiveColor	Farbe wenn Div nicht ausgewählt
*/
function fireSuggestions(textFieldId,width,suggestDiv,activeColor,inactiveColor){

	// Globalisierung der Suggestbox
	globalsuggestDiv = suggestDiv;
	
	// aktuelle Eingabe speichern, wenn Zeichen im Suchfeld hinzugefügt oder entfernt werden:
	if (dontRequestSuggestion != 1) {
		actualSerachphrase = document.getElementById(textFieldId).value;
	}

	// registriere Clickevent zum Schliessen der Suggestbox
	if (registerClickeventforBoxclosing == 0){
		document.getElementById(suggestDiv).onmousedown = switchsuggestboxshow;
		document.onmouseup = closeSuggestorBoxEvent;
		registerClickeventforBoxclosing = 1;
	}

	suggestCounter = 0;

	//feuer pfeiltasten
	arrowKeyListener(textFieldId,suggestDiv,activeColor,inactiveColor);
		
	if(intervalObj == null)
		intervalObj = window.setInterval("suggestTimer('"+textFieldId+"','"+width+"','"+suggestDiv+"','"+activeColor+"','"+inactiveColor+"')", 100);
}

/*
Timer zählt nach Ablauf des Intervals suggestCounter +1 und feuert die Anfrage
wenn suggestTime < suggestCounter

@textFieldId	id des Such-Inputfields
@width			breite des Vorschlagfelds
@suggestDiv		id des Vorschlag-DIVs
@activeColor	Farbe wenn Div ausgewählt
@inactiveColor	Farbe wenn Div nicht ausgewählt
*/
function suggestTimer(textFieldId,width,suggestDiv,activeColor,inactiveColor){
	
	suggestCounter++;

	if(suggestCounter > suggestTime){
		suggestCounter = 0;
		window.clearInterval(intervalObj);
		intervalObj = null;
		//eventkeylistener aktivieren
		document.getElementById(textFieldId).onkeydown = keyEventListener;
		
		// Suggestlist erst nach bestimmter Anzahl (maxCharforSuggestBox) an Zeichen ein- bzw. ausblenden inkl. Searchrequest
		if (document.getElementById(textFieldId).value.length <= maxCharforSuggestBox) {
			document.getElementById(suggestDiv).innerHTML = "";
			dontRequestSuggestion = 1;
		}
		//vorschlagsliste anfordern
		if(dontRequestSuggestion == 0)
			getSuggestion(textFieldId,width,suggestDiv,activeColor,inactiveColor);	
	}
}

/*
wenn außerhalb der Suggestbox geklickt wurde, diese ausblenden:
Beim Event onmouseup wird geprüft, ob der onmousedown außerhalb der Suggestbox stattgefunden hat.
Falls ja, wird Box ausgeblendet, ansonsten geht es ganz normal weiter.
*/
function closeSuggestorBoxEvent() {
	if (document.getElementById(globalsuggestDiv).innerHTML != "" && BoxclosingonClick == 1) {
		document.getElementById(globalsuggestDiv).innerHTML = "";
	}
	BoxclosingonClick = 1;
}

/*
Hilfsfunktion zum Ausblenden der Suggestbox -> closeSuggestorBoxEvent()
*/
function switchsuggestboxshow() {
	BoxclosingonClick = 0;
}

/**
/**
Autosuggestion der Suche
führt einen Ajax-Request durch und zeigt das Vorschlagsfenster an

@textFieldId	id des Such-Inputfields
@width			breite des Vorschlagfelds
@height			höhe des Vorschlagfelds
@suggestDiv		id des Vorschlag-DIVs
@activeColor	Farbe wenn Div ausgewählt
@inactiveColor	Farbe wenn Div nicht ausgewählt
*/
function getSuggestion(textFieldId,width,suggestDiv,activeColor,inactiveColor){
	//return
	if(stopSuggestionAfterEnter)
		return;
	//hole input aus suchefeld
	searchPhrase = document.getElementById(textFieldId).value;
	
	//return wenn searchphrase leer
	if(searchPhrase.length == 0)
		document.getElementById(suggestDiv).innerHTML = "";
	
	if( window.XMLHttpRequest) {
		req = new XMLHttpRequest();
	} else if( window.ActiveXObject ) {
		req = new ActiveXObject( "Microsoft.XMLHTTP" );
	} else {
		return;
	}

	// Leerzeichen mitnehmen (request::trustnoone umgehen)
	var s_searchPhrase = searchPhrase.replace(/ /g, "###");
	
	req.open( "GET", '/index.html?f=search.getsuggestions&com='+encodeURIComponent(s_searchPhrase), true );
	//hole daten
	req.onreadystatechange = function(){getSuggestionBox(width,suggestDiv,searchPhrase,textFieldId,activeColor,inactiveColor);};	
	req.send( null );
}

/*
Erstelle die Dropdownbox

@width 			breite des divs
@suggestDiv 	id des Divs welches per innerHTML gefüllt werden soll
@searchPhrase 	Eingabetext des Users
@searchBox 		id des Sucheingabetextfelds
@activeColor		Farbe wenn Div ausgewählt
@inactiveColor	Farbe wenn Div nicht ausgewählt
*/
function getSuggestionBox(width,suggestDiv,searchPhrase,searchBox,activeColor,inactiveColor){
	 
	if( 4 == req.readyState ) {
		
	 	if (200 == req.status){
			jsonData = JSON.parse(req.responseText);
			suggestJson = jsonData.a.rs;
			if(suggestJson.length > 0){
				
				//erstelle rexEx Object
				var regObj = new RegExp("^("+searchPhrase+")",'i');
				
				//erstelle autocomplet div
				//height:"+height+"px;
				html = "<div id=\""+suggestDiv+"inner\" style=\"position:absolute;z-index:550;margin-left:-1px;background-color:white;border:1px solid #cccccc;width:"+width+"px;overflow:auto;\">"+
				"<div style=\"text-align:right;margin-right:2px\" class=\"text06\">Suchvorschl&auml;ge<a href=\"\" onclick=\"document.getElementById('"+suggestDiv+"').innerHTML='';return false;\"></div>";
			
				
				//durchlaufe ergebnisliste aus json
				for(i = 0;i<suggestJson.length;i++){
					
					search = suggestJson[i];
					
					if(search.match(regObj)){
						//substring des textstrings
						txt = suggestJson[i].substring(0,searchPhrase.length);
						search = search.replace(txt,"<b>"+txt+"</b>");
					}
					html += "<div class=\"text18\" style=\"width:96%;padding: 1px 1px 1px 5px;cursor:pointer\" id=\"sug"+i+"\""+
					"onmouseover=\"overOut('sug"+i+"','"+activeColor+"',1)\" onmouseout=\"overOut('sug"+i+"','"+inactiveColor+"',0)\""+
					" onclick=\"fillSearchBox('"+searchBox+"','"+suggestJson[i]+"','"+suggestDiv+"')\" title=\""+suggestJson[i]+"\">"+
					""+search+"</div>";
				}
				html +="<div class='v_top_small'></div>"
				html +="</div>";
				
				//insert div
				document.getElementById(suggestDiv).innerHTML = html;
			}else{
				//insert div
				document.getElementById(suggestDiv).innerHTML = "";
			}
		}
	 }
}

/*
Setze HintergrundFarbe der divs mit suchbegriffen

@idSuggest 	id des div
@color		Hintergrundfarbe
@inOut		true aktiv false inaktiv
*/
function overOut(idSuggest,color,inOut){
	
	if(inOut)
	{
		document.getElementById(idSuggest).style.backgroundColor = color;
	}else{
		document.getElementById(idSuggest).style.backgroundColor = color;
	}
}

var eventKeyCode = "";
/*
Textfeld der Suche füllen und gleich Suche abschicken

@box 			id des Textfelds
@searchSuggest	asugewählter Suchbegriff
@suggestDiv		id des großen Vorschlags-DIV
*/
function fillSearchBox(box,searchSuggest,suggestDiv){
	
	document.getElementById(box).value = searchSuggest;
	document.getElementById(suggestDiv).innerHTML = "";
	document.getElementById(box+"Button").click();
}

/*
KeyDownUp Listener um mit Pfeiltasten zu navigieren
*/
function arrowKeyListener(searchBoxObject,suggestDiv,activeColor,inactiveColor){
	
	active = 1;
	
	suggestObj = document.getElementById(suggestDiv+"inner");
	//event
	//wenn nicht leer
	if(eventKeyCode != "" && suggestObj != ""){
		divs = suggestObj.getElementsByTagName("div");
		
		//KeyCode down
		if(eventKeyCode == "down"){
			//durchlaufe divs
			for(i = 1; i < divs.length;i++){

				if(divs[i].style.zIndex == 1){
					active = i+1;
					divs[i].style.backgroundColor = inactiveColor;
					divs[i].style.zIndex = 0;
					break;
				}
			}
			//nun aktiviere nächstes div
			if(divs.length == active){
				active = 1;
				document.getElementById(searchBoxObject).value = actualSerachphrase;
			} else {
				divs[active].style.backgroundColor = activeColor;
				divs[active].style.zIndex = 1;
				document.getElementById(searchBoxObject).value = divs[active].title;
			}
		}
		
		//KeyCode up
		if(eventKeyCode == "up"){
			if (active == 1) {
				active = divs.length-1;
			}
			//durchlaufe divs
			for(i = (divs.length-1); i > 0;i--){
	
				if(divs[i].style.zIndex == 1){
					active = i-1;
					divs[i].style.zIndex = 0;
					divs[i].style.backgroundColor = inactiveColor;
					break;
				}
				
			}
			//nun aktiviere nächstes div
			if(active == 0){
				active = divs.length-1;
				document.getElementById(searchBoxObject).value = actualSerachphrase;
			} else {
				divs[active].style.backgroundColor = activeColor;
				divs[active].style.zIndex = 1;
				document.getElementById(searchBoxObject).value = divs[active].title;
			}
		}
		//KeyCode enter
		if(eventKeyCode == "enter"){
			//ausgewähltes div
			selectedDiv = "";
			//durchlaufe divs
			for(i = 1; i < divs.length;i++){
	
				if(divs[i].style.zIndex == 1){
					selectedDiv = divs[i];
					break;
				}
			}
			
			if(selectedDiv != ""){
				document.getElementById(searchBoxObject).value = selectedDiv.title;
				document.getElementById(searchBoxObject).style.zIndex = 1;
				document.getElementById(suggestDiv).innerHTML = "";
				eventKeyCode = "";
				stopSuggestionAfterEnter = 1;
			}
		}
	}
}

/*
Eventhandler Key up down
*/
function keyEventListener(ev){

	if(window.event){
		ev = window.event;
	}
	
	//up 38
	if(ev.keyCode == 38){
		eventKeyCode = "up";
		dontRequestSuggestion = 1;
	}
	//down 40
	else if(ev.keyCode == 40){
		eventKeyCode = "down";
		dontRequestSuggestion = 1;
	//enter 13
	}else if(ev.keyCode == 13){
		eventKeyCode = "enter";
	}else{
		eventKeyCode = "";
		dontRequestSuggestion = 0;
	}
}

/*
Prüffunktion für ISBN-Nummern aus dem Schulbuch-Bestellformular

@param string text
*/
function checkISBN(formular) {
	invalidNrs = "Ungültige ISBN-Nummer(n):\n\n";
	text = "Bitte prüfen Sie die ISBN-Nummer(n) (13 Ziffern) oder verwenden Sie die Suche (oben links) durch Eingabe des Autors bzw. Titels.";
	var count = 0;
	isbns = formular.elements["b[]"];
	anzahl = isbns.length;
	for (var i=0; i<anzahl; i++) {
		isbn = isbns[i].value;
		if (isbn!="") {
			if(isValidISBN(isbn)==false) {
				count++;
				invalidNrs = invalidNrs+isbn+"\n";
			}
		}
	}
	if (count>0) {
		alert(invalidNrs+"\n"+text);
		return false;
	} else {
		return true;
	}
}

/*
Prüffunktion für ISBN-10 und ISBN-13 Nummern

@param string isbn
*/
function isValidISBN(isbn) {
	// Eliminieren eventueller Bindestriche und Leerzeichen
	isbn = isbn.replace(/-/g, "");
	isbn = isbn.replace(/\s/g, "");
	// Format überprüfen

	if (isbn.search(/^\d{9}[\dx]$/i)!=-1) {
		isbnart = 10;
	}
	else if (isbn.search(/^\d{13}$/i)!=-1) {
		isbnart = 13;
	}
	else{
		return false;
	}

	arrIsbn = new Array(isbnart);
	for (i=0; i<isbnart; i++) {
		arrIsbn[i] = isbn.charAt(i);
	}
	if (arrIsbn[isbnart-1].toLowerCase() == "x") arrIsbn[isbnart-1] = 10;
	// Prüfsumme ermitteln
	if (isbnart == 10){
		summe = 0;
		for (i=0; i<10; i++) {
			summe += arrIsbn[i]*(10-i);
		}
		if ((summe%11)!=0)
			return false;
	}
	else if (isbnart == 13){
		summe = 0;
		for (i=0; i<12; i++) {
		//Der Multiplikator für dei einzelnen Ziffern ist abwechselnd 1 und 3
			$next_mult = 2*(i%2)+1;
	//		alert (arrIsbn[i]*$next_mult);
			summe += arrIsbn[i]*$next_mult;

		}
	//	alert (summe);
		prueffziffer = 10 - (summe%10);
	//	alert (prueffziffer);
		if ((prueffziffer == 10)&&(arrIsbn[12])!= 0){
			return false;
		}
		else if (prueffziffer != arrIsbn[12]) {
			return false;
		}

	}
	return true;
}



	//Speichern der Zahlart PayPal und anfordern der Url f�r Saferpay
	function getPayPal(){
	 
		if( window.XMLHttpRequest ) {
	          req = new XMLHttpRequest();
	     } else if( window.ActiveXObject ) {
	          req = new ActiveXObject( "Microsoft.XMLHTTP" );
	     } else {
	          return;
	     }
	   
		 req.open( "GET", '/index.html?f=cart.controller&step=paypal', true );
	
		 req.onreadystatechange = showPayPal;
		   
		 req.send( null );
	}
	
	function showPayPal(){
		if( 4 == req.readyState ){ 
			if (200 == req.status){
				if (req.responseText != null)
					window.location.href=req.responseText;
					
			}
		}
	}
	
	Tracking = function(){

		function setTrackingsOrderId(article,qed,source){
			if (source != ''){
				setTrackingInformation(article,source);
				if (cm_tracking_enabled)
					cmCreateConversionEventTag(article, 1,'Suche_Product_Bestellnummer', 1 );
			}
			if (qed != true){
				searchTrackLogging(article,qed);
			}
			
		}
		
		function setSearchTrackings(article,qed,type,tracking,linktype,source){
		    
			var source=source;
			var categorie='';
			var information='';
			if (linktype == 'wklink'){
				if(tracking == '1'){
				    
				    if(type == 'article') this.source='se.wk';
				    if (source == 'seeker') this.source = 'se.wksek';
				    if (source == 'crossselling') this.source  = 'se.wkxsel';
					information=setTrackingInformation(article,this.source);
				}
				
			   if (cm_tracking_enabled){
			        categorie='Suche_Direct_Cart';
			        if (source == 'seeker') categorie='StoebernSuche_Direct_Cart';
			        if (source == 'crossselling') categorie = 'Suche_Xsell_Direct_Cart';
			        if (existTrackingSourceArticle(information,article,this.source) == true){
						cmCreateConversionEventTag(article, 1,categorie, 1 );
					}
			   }
			}else if (linktype == 'detail'){
			    if(qed != '')	searchTrackLogging(article,qed);
				if(tracking == '1'){
				    if(type == 'article') this.source='se.art';
				    if (source == 'seeker') this.source = 'se.sek';
				    if (source == 'crossselling') this.source  = 'se.xsel';
				  
					setTrackingInformation(article,this.source);
				}
			}
			
		}
		
		//Aufruf Function-Controller f�r Search Loganalyzer
		function searchTrackLogging(id,qed){
			var req = getAjaxReq();
			 req.open( "GET", '/index.html?f=search.track&qed='+qed+'&rand='+Math.random(), true );
		     req.send(null);
		}
		
		
		/**
		Setzt ein Cookie mit der Quelle f�r Tracking
		*/
		
		function setTrackingInformation(article,source) {
			var expires = new Date();
			var information = '';
			information = getCookie('tracking_source');	
			information=setTrackingArticle(information,article, source);
		     
			expires = new Date(expires.getTime() + (5400000)); 
			document.cookie = 'tracking_source='+escape(information)+';expires='+expires.toGMTString()+';path=/;';
			return information;
		}
		
		
		/**
		Tracking-Informationen im Cookie erg�nzen
		*/
		function setTrackingArticle(information,article, source){
			var skip = false;
			var content;
			var listtype;
			var element;
			var listelements;
			var count=0;
			var listexists = false;
			var sourcetype = source.split('.');
			
			if (information != ''){
				if (existTrackingArticle(information,article,source) == true)
					return information;
			}
			
			//Cookie leer
			if (information == ''){
				information=source+'_'+article;
				return information;
			}
			
			//Verschiedene Listen
			content = information.split('~-~');
			
			information='';
			
			count=0;
			//Anzahl ermitteln
			for (var i=0; i<content.length;i++){
				listtype=content[i].split('_');
		
			 	if (listtype[0].indexOf(source) != -1){
			 		element=listtype[1].split('~');
			 		count=count+element.length;
			 	}
			}
			
			//Anzahl 10 pro Trackingart �berschritten
			if (count >= 10){
				for (var i=0; i<content.length;i++){
					listtype=content[i].split('_');
				 	if (listtype[0].indexOf(source) != -1){
				 		element=listtype[1].split('~');
				 		element.shift();
		
				 	
					 	listelements='';
				   		for (var j=0; j<element.length;j++){
				   		   if (listelements == '')
				   		   	 listelements=element[j];
				   		   else
				   		   	 listelements=listelements+'~'+element[j];
				   		} 
					 	content[i]=listtype[0]+'_'+listelements;	   	
				 	break;
				 	}
				 }
			}
			
			count=0;
			//Ermitteln, welche Liste zu erg�nzen ist
			for (var i=0; i<content.length;i++){
			   listtype=content[i].split('_');
			   
			   if (listtype[0]==source){
			   		element=listtype[1].split('~');
		
			   		listelements='';
			   		for (var j=count; j<element.length;j++){
			   		   if (listelements == '')
			   		   	 listelements=element[j];
			   		   else
			   		   	 listelements=listelements+'~'+element[j];
			   		} 	
			   		listelements=listelements+'~'+article;	
			   		content[i]=listtype[0]+'_'+listelements;
			   		listexists = true;
			   }  	 
			}
			
			
			for (var i=0; i<content.length;i++){
				if (information == '')
					information=content[i];
				else
					information=information+'~-~'+content[i];
			}
			
			// Liste noch nicht vorhanden
			if (listexists == false)
				information=information+'~-~'+source+'_'+article;
			
				
			return information;
		}
		
		/**
		Pr�fen, ob der Tracking-Artikel bereits existiert
		*/
		function existTrackingArticle(information,article,source){
		
			var content = information.split('~-~');
			var element = null;
			var sourcetype = source.split('.');
			
			for (var i=0; i<content.length;i++){
			 	listtype=content[i].split('_');
		
			 	if (listtype[0].indexOf(sourcetype[0]+'.') != -1){
			 		element=listtype[1].split('~');
			 		for (var j=0; j<element.length; j++)
			 			if (element[j] == article)
			 				return true;
			 	}
			}
			return false;
		}
		
		/**
		Pr�fen, ob der Tracking-Artikel bereits existiert
		*/
		function existTrackingSourceArticle(information,article,source){

			var content = '';
			var element = null;
			var sourcetype = '';
			
			if (source != undefined && information != undefined && information != null){
			    content=information.split('~-~');
				sourcetype=source.split('.');
			
				for (var i=0; i<content.length;i++){
				 	listtype=content[i].split('_');
			        if (listtype[0] == source){
				 		element=listtype[1].split('~');
				 		for (var j=0; j<element.length; j++)
				 			if (element[j] == article)
				 				return true;
				 	}
				}
			}
			return false;
		}
		
		
		return {
			setTrackingsOrderId : setTrackingsOrderId,
			setSearchTrackings : setSearchTrackings,
			searchTrackLogging : searchTrackLogging,
			setTrackingInformation : setTrackingInformation,
			setTrackingArticle : setTrackingArticle,
			existTrackingArticle : existTrackingArticle,
			existTrackingSourceArticle : existTrackingSourceArticle
			};

	}();
	
	
/*******************************
** handling externer JS-Aufrufe(load am ende der Datei)
*******************************/
if (!this.extJSData){
	extJSData = {
		//datenpool speichert methoden und parameter object
		dataQueue : new Object(),
		debug : false,
		
		//füge eine methode und deren parameter zum Daten-Pool hinzu
		addExternalMethod: function(functionName,params){
			//if(extJSData.debug)console.log("add: "+functionName);
			extJSData.dataQueue[functionName]=params;
		},
		//lade am ende der Seite die zuvor geadded methoden
		loadExternalMethods: function(){
			$(document).ready(function() {
				for (var functionName in extJSData.dataQueue) {
	  				$.globalEval(functionName+"();");
	  				//if(extJSData.debug)console.log("loaded "+functionName+"();");
				}
			});
			
		},
		//liefert für jede methode die zuvor geadded wurde das parameter object
		getParamsForMethod: function(key){
			return extJSData.dataQueue[key];
		}
	}
}

extJSData.loadExternalMethods();