/**
 * dv - Detailview-Objekt
 *
 * folgende Attribute und Methoden werden vom dv-Objekt genutzt:
 * -dv.availability.fallback_AvailabilityCode;
 * -dv.availability.fallback_AdditionalDeliveryCode;
 *
 * -dv.checkAvailabilityFromMMDB();
 * -dv.changeContentOfServiceModule(targetNode);
 * -dv.toggleDivSlider(elem);
 *
 * folgende Methoden globale JavaScript-Methoden werden aufgerufen:
 * -prepareSettings();
 * -setLandmark(params?);
 * -reset_availability();
 */
 
 /**
  *
  * Changelog Schwab
  * 
  * -replaced getAvailStr()-calls with dv.availCodeToString-call      
  *  
  *  
  */
 
 var dv = {
  /**
   * angezeigter Text, solange der AJAX-Request der Livehost-Auskunft durchgeführt wird 
   */     
  availabilityWaitText: "<b>Bitte warten ...</b>",
  
  /**
   * angezeigter Text, wenn der AJAX-Request nicht erfolgreich war 
   */       
  availabilityErrorText: "<b>Abfrage der Verf&uuml;gbarkeit z.Zt. nicht m&ouml;glich</b>",
  
  availabilityFallbackLink: '<a href="javascript:dv.checkAvailability(); setLandmark(\'page\',\'&pc=detailview_deliveryinfo\');" style="color:black;">Lieferbarkeit pr&uuml;fen</a>',
  

  /**
   * Produktreferenz 
   */         
  productRefID: 0,
  
  /**
   * Führt die Abfrage der MMDB-Lieferauskunft durch und zeigt sie in dem Objekt
   * dv.availabilityDisplay an (=HTML-Element).      
   *     
   */         
  checkAvailabilityFromMMDB: function()
  {
		$.log("Start: checkAvailabilityFromMMDB - get availability from article (MMBB)")
		$.log("availability is null = get fallback_AvailabilityCode");
		temp_av = availability;
		if ( temp_av == null ) {
			temp_av = dv.availability.fallback_AvailabilityCode;
		}
		
		colorCode=av.getColorCodingMMDB(temp_av);
    $.log("colorcode:" +colorCode);          
		$.log("set html availability");
		dv.viewAvailabilityToggle();
  	dv.availabilityDisplay.html( "<b>" + dv.availCodeToString(temp_av) + "</b>" );
		av.setColorCoding(colorCode);	  
  },
  
  /**
   * Führt die Abfrage der Livehost-Lieferauskunft durch und zeigt das Ergebnis
   * in dem Objekt dv.availabilityDisplay an (=HTML-Element).
   * Dabei wird vorbereitend für den AJAX-Request aus SKU die Artikelgröße 
   * geholt und die Artikelanzahl bestimmt. Vor abschicken des AJAX-Requests 
   * wird in dem Objekt dv.availabilityDisplay (=HTML-Element) der 
   * availabilityWaitText angezeigt.   
   *        
   */  
  checkAvailability: function(prod_ref)
  {
		$.log("Start: checkAvailability - get availability with AJAX");
		$.log("send LandMark");
		//sendLandMarkAvailability();
		
		sku = prod_ref;
		
    if(sku)
    {
  		var skuelems = sku.split("-");
  		if ( dv.availability.unit == 'stk' ) {
  			var quantity = 1;
  			var size = skuelems[1];
  		} else if ( dv.availability.unit == 'm' ) {
  			var quantity = 100;
  			var size = skuelems[1];
  		} else {
  			var quantity = 100;
  			var size = 100;
  		}
  		dv.articles[prod_ref].DeliveryText = dv.availabilityWaitText;
  		setDeliveryText();
  		$.ajax(
      {
  			type: "GET",
  	   	url: dv.availability.url,
  	   	data: { articelnr: skuelems[0],
    			        articelsize: size,
    			        articelquantity: quantity
    		      },
  		 	success: function(responseData)
        {
  		 		  $.log("AJAX Variation success ...");
  		 		  dv.articles[prod_ref].DeliveryText = responseData;
  		      setDeliveryText();
  		  },
  		  error: function()
        {
      		dv.articles[prod_ref].DeliveryText = dv.availabilityErrorText;
      		setDeliveryText();        
        } 
      });
      
    }
    else
    {
      $.log("Error: Could not get delivery-information - SKU undefined");
      article.DeliveryText = dv.availabilityErrorText;
      setDeliveryText();
    }
  },
  
  init: function()
  {
  	dv.availabilityDisplay = $('#test');
    dv.availabilityLink = $('.detailedStatus');
    dv.availabilityBackup = $('.detailedStatus');;
  },
  
  preLoadKAL: function(xml) {
        $.log("preLoadKALResponse:");
        $.ajax({
          type: "POST",
          url: window.location.protocol+"//" + window.location.host + av.initial_article_selection.KALServlet,
          processData: false,
          dataType: "xml",
          timeout: 2000,
          contentType: "application/xml; charset=UTF-8",
          data: av.initial_article_selection.kal,
          success: dv.preCreateKAL,
          error: function() 
          { 
           $.log("preLoad ERROR");
           dv.saveFallbackLinkByProductRef(dv.getProductRefID());
          }
        });  
    },
  preCreateKAL: function(xml) {
        $.log("preCreateKAL:");
      	kalResponse = xml;
      	av.KALRequestStatus=true;
      	prodref=dv.checkVariation(av.initial_article_selection.product_ref)
      	$.log("preCreateKAL: " + prodref);
      	$.log("checkProdRef: " + dv.getProductRefID());
	},
    
	checkVariation: function(product_ref) {
        $.log("checkVariation:");
  	    $.log("ProductRef:"+product_ref);
  	    
        prodref = product_ref.split('-');
        articleno = prodref[0];
        availCode = av.getAvailabilityCode(product_ref);
        //if(!availCode) return product_ref;

		/*
		  Liegt in der Response keine Verfuegbarkeit vor,
		  wird hier false zurueckgeliefert, wodurch die split-Funktion nicht aufgerufen werden kann.
		  Daher wird hier geprueft, ob avCode ein String ist.
		  Wenn nicht (ist der Typ boolean) wird der Fallback-Link mit der pre-Host-Lieferauskunft angezeigt.		
		*/
		if(typeof(availCode) == 'string') {
			avCode=availCode.split(';');
		}
        
        
        if(avCode) 
        {
	        $.log("Verfügbarkeitsinformation ist da!");       
	    	  var articles = kalResponse.getElementsByTagName( 'Article' );
	        //try {
			    for( i=0; i < articles.length; i++ ) 
	    		{
	    		  if ((articles[i].getElementsByTagName('ArticleAvailability')[0]))   
            {
	                CompleteCatalogItemNo=articles[i].getElementsByTagName('ArticleAvailability')[0].getElementsByTagName('ArticleInformation')[0].getElementsByTagName('CompleteCatalogItemNo')[0].firstChild.data;              
	              	SizeAlphaText=articles[i].getElementsByTagName('ArticleAvailability')[0].getElementsByTagName('ArticleInformation')[0].getElementsByTagName('SizeAlphaText')[0].firstChild.data;              
	              	DeliveryDesignation=articles[i].getElementsByTagName('ArticleAvailability')[0].getElementsByTagName('Availability')[0].getElementsByTagName('DeliveryDesignation')[0].firstChild.data;              
	              	DeliveryStatement=articles[i].getElementsByTagName('ArticleAvailability')[0].getElementsByTagName('Availability')[0].getElementsByTagName('DeliveryStatement')[0].firstChild.data;
	              	dv.saveDeliveryTextByProductRef(DeliveryDesignation+";"+DeliveryStatement,CompleteCatalogItemNo+"-"+SizeAlphaText+"-"+prodref[2]+"-"+prodref[3])
                  
                  if ((DeliveryDesignation == "0") && (CompleteCatalogItemNo == articleno)) 
                  {
                      //$.log("neue ProductRef:"+CompleteCatalogItemNo+"-"+SizeAlphaText+"-"+prodref[2]+"-"+prodref[3]);
	                  prodref_searchstring = CompleteCatalogItemNo+"-"+SizeAlphaText;
	                  for (articlenotmp in av.prodref_array) 
	                  {
	                  	if (articlenotmp == prodref_searchstring)
	                  	{
	                  	  if(!dv.articles.firstDeliverableProdRef) 
                  		  {
		                    $.log("neue ProductRef:"+CompleteCatalogItemNo+"-"+SizeAlphaText+"-"+prodref[2]+"-"+prodref[3]);
		                    dv.articles.firstDeliverableProdRef = av.prodref_array[articlenotmp]+"@Sheego-SheegoDe";
		                    if(sheego.detailview.productCluster)
		                    {
		                        sheego.detailview.productCluster.selectedProdRef = dv.articles.firstDeliverableProdRef;
		                        sheego.detailview.productCluster.colorChanged=true;
								sheego.detailview.productCluster.dim3ControlArray = new Array();
								sheego.detailview.productCluster.colorControlArray = new Array();
								sheego.detailview.productCluster.sizeControlArray = new Array();
								sheego.detailview.productCluster.availableColors = new Array();
								sheego.detailview.productCluster.availableOriginImageArrays = new Array();
								sheego.detailview.productCluster.availableZoomImageArrays = new Array();
								sheego.detailview.productCluster.activeImageArrayIndex = 0;
								sheego.detailview.productCluster.availableSize = new Array();
								sheego.detailview.productCluster.availableSize2nd = new Array();
								sheego.detailview.productCluster.availableOrderNumbers = new Array();
								initDetailView();
		                    }
                    
		    		       }
	                  	}
	              	   }
	              	  
                                

	          }
         
	          
			    }
			   }
           	  if(!dv.articles.firstDeliverableProdRef) 
           	  {
		          for( i=0; i < articles.length; i++ ) 
		   		  {
		    	    if ((articles[i].getElementsByTagName('ArticleAvailability')[0]))   
	                {
		                CompleteCatalogItemNo=articles[i].getElementsByTagName('ArticleAvailability')[0].getElementsByTagName('ArticleInformation')[0].getElementsByTagName('CompleteCatalogItemNo')[0].firstChild.data;              
		              	SizeAlphaText=articles[i].getElementsByTagName('ArticleAvailability')[0].getElementsByTagName('ArticleInformation')[0].getElementsByTagName('SizeAlphaText')[0].firstChild.data;              
		              	DeliveryDesignation=articles[i].getElementsByTagName('ArticleAvailability')[0].getElementsByTagName('Availability')[0].getElementsByTagName('DeliveryDesignation')[0].firstChild.data;              
		              	DeliveryStatement=articles[i].getElementsByTagName('ArticleAvailability')[0].getElementsByTagName('Availability')[0].getElementsByTagName('DeliveryStatement')[0].firstChild.data;
			          if (DeliveryDesignation == "0") 
			          {
		                      //$.log("neue ProductRef:"+CompleteCatalogItemNo+"-"+SizeAlphaText+"-"+prodref[2]+"-"+prodref[3]);
			                  prodref_searchstring = CompleteCatalogItemNo+"-"+SizeAlphaText;
			                  for (articlenotmp in av.prodref_array) 
			                  {
			                  
			                  	if (articlenotmp == prodref_searchstring)
			                  	{
			                  	  if(!dv.articles.firstDeliverableProdRef) 
		                  		  {
				                    $.log("neue ProductRef:"+CompleteCatalogItemNo+"-"+SizeAlphaText+"-"+prodref[2]+"-"+prodref[3]);
				                    dv.articles.firstDeliverableProdRef = av.prodref_array[articlenotmp]+"@Sheego-SheegoDe";
				                    if(sheego.detailview.productCluster)
				                    {
				                        sheego.detailview.productCluster.selectedProdRef = dv.articles.firstDeliverableProdRef;
				                        sheego.detailview.productCluster.colorChanged=true;
										sheego.detailview.productCluster.dim3ControlArray = new Array();
										sheego.detailview.productCluster.colorControlArray = new Array();
										sheego.detailview.productCluster.sizeControlArray = new Array();
										sheego.detailview.productCluster.availableColors = new Array();
										sheego.detailview.productCluster.availableOriginImageArrays = new Array();
										sheego.detailview.productCluster.availableZoomImageArrays = new Array();
										sheego.detailview.productCluster.activeImageArrayIndex = 0;
										sheego.detailview.productCluster.availableSize = new Array();
										sheego.detailview.productCluster.availableSize2nd = new Array();
										sheego.detailview.productCluster.availableOrderNumbers = new Array();
										initDetailView();
				                    }
		                    
				    		       }
			                  	}
			           		   }
			           }
			           /* evtl. nicht abgefangener Fall
			           else
			           {
			             dv.articles.firstDeliverableProdRef = prodref;
			             if(sheego.detailview.productCluster)
				         {
	                        sheego.detailview.productCluster.selectedProdRef = dv.articles.firstDeliverableProdRef;
							sheego.detailview.productCluster.dim3ControlArray = new Array();
							sheego.detailview.productCluster.colorControlArray = new Array();
							sheego.detailview.productCluster.sizeControlArray = new Array();
							sheego.detailview.productCluster.availableColors = new Array();
							sheego.detailview.productCluster.availableOriginImageArrays = new Array();
							sheego.detailview.productCluster.availableZoomImageArrays = new Array();
							sheego.detailview.productCluster.activeImageArrayIndex = 0;
							sheego.detailview.productCluster.availableSize = new Array();
							sheego.detailview.productCluster.availableSize2nd = new Array();
							sheego.detailview.productCluster.availableOrderNumbers = new Array();
							initDetailView();
						  }
				          
				        }*/			             
			             
			           
			           }
			           }
			           }
          if(!av.initial_article_selection.selectFirstDeliverableProduct)
          {
	            sheego.detailview.productCluster.selectedProdRef = product_ref;
							sheego.detailview.productCluster.dim3ControlArray = new Array();
							sheego.detailview.productCluster.colorControlArray = new Array();
							sheego.detailview.productCluster.sizeControlArray = new Array();
							sheego.detailview.productCluster.availableColors = new Array();
							sheego.detailview.productCluster.availableOriginImageArrays = new Array();
							sheego.detailview.productCluster.availableZoomImageArrays = new Array();
							sheego.detailview.productCluster.activeImageArrayIndex = 0;
							sheego.detailview.productCluster.availableSize = new Array();
							sheego.detailview.productCluster.availableSize2nd = new Array();
							sheego.detailview.productCluster.availableOrderNumbers = new Array();
							initDetailView();          
          }                  			   
			    setDeliveryText();
	 		/*} catch (err) {
			    return product_ref;
		    }*/
        } else {
          dv.saveFallbackLinkByProductRef(prodref_ref);
        }
 	},  
  
  availCodeToString: function(availValue)
  {
    if(availValue)
    {
    	var availCode = availValue.split(";");
    	switch(availCode[0])
    	{
    	  case "300": return "leider ausverkauft"; break;
    	  case "310": return "Artikel lieferbar,<br />l&auml;ngere Lieferzeit"; break;
    	  case "320": return "lieferbar"; break;
    	  case "330": return "Artikel lieferbar,<br />l&auml;ngere Lieferzeit"; break;
    	  default: return dv.availabilityErrorText + " (MMDB)";
      }
    }
  },
  
  availCodeToStringKAL: function(DeliveryDesignation)
  {
    if(DeliveryDesignation)
    {
    	switch(DeliveryDesignation)
    	{
    	  case "0": return "lieferbar"; break;
    	  case "1": return "leider ausverkauft"; break;
    	  case "2": return "lieferbar "; break;
    	  default: return dv.availabilityErrorText + " (KAL)";
      }
    }
  },  
  
  availStateToStringKAL: function(DeliveryStatement)
  {
	    var kal=new Array();
	    kal[1]="bis Anfang Januar";
	    kal[2]="bis Mitte Januar"; 
	    kal[3]="bis Ende Januar";  
	    kal[4]="bis Januar";       
	    kal[5]="im Januar";
	    kal[6]="bis Anfang Februar";       
	    kal[7]="bis Mitte Februar";
	    kal[8]="bis Ende Februar"; 
	    kal[9]="bis Februar";      
	    kal[10]="im Februar";       
	    kal[11]="bis Anfang M&auml;rz";  
	    kal[12]="bis Mitte M&auml;rz";   
	    kal[13]="bis Ende M&auml;rz";    
	    kal[14]="bis M&auml;rz"; 
	    kal[15]="im M&auml;rz";    
	    kal[16]="bis Anfang April"; 
	    kal[17]="bis Mitte April";  
	    kal[18]="bis Ende April";   
	    kal[19]="bis April";
	    kal[20]="im April"; 
	    kal[21]="bis Anfang Mai";   
	    kal[22]="bis Mitte Mai";    
	    kal[23]="bis Ende Mai";     
	    kal[24]="bis Mai";  
	    kal[25]="im Mai";   
	    kal[26]="bis Anfang Juni";  
	    kal[27]="bis Mitte Juni";   
	    kal[28]="bis Ende Juni";    
	    kal[29]="bis Juni"; 
	    kal[30]="im Juni";  
	    kal[31]="bis Anfang Juli";  
	    kal[32]="bis Mitte  Juli";  
	    kal[33]="bis Ende Juli";    
	    kal[34]="bis Juli"; 
	    kal[35]="im Juli";  
	    kal[36]="bis Anfang August";
	    kal[37]="bis Mitte August"; 
	    kal[38]="bis Ende August";  
	    kal[39]="bis August";       
	    kal[40]="im August";
	    kal[41]="bis Anfang September";     
	    kal[42]="bis Mitte September";      
	    kal[43]="bis Ende September";       
	    kal[44]="bis September";    
	    kal[45]="im September";     
	    kal[46]="bis Anfang Oktober";       
	    kal[47]="bis Mitte Oktober";
	    kal[48]="bis Ende Oktober"; 
	    kal[49]="bis Oktober";      
	    kal[50]="im Oktober";       
	    kal[51]="bis Anfang November";      
	    kal[52]="bis Mitte November";       
	    kal[53]="bis Ende  November";       
	    kal[54]="bis November";     
	    kal[55]="im November";      
	    kal[56]="bis Anfang Dezember";      
	    kal[57]="bis Mitte Dezember";       
	    kal[58]="bis Ende Dezember";
	    kal[59]="bis Dezember";     
	    kal[60]="im Dezember";      
	    kal[61]="bis Weihnachten";  
	    kal[62]="bis Ostern";       
	    kal[71]="innerhalb 1 Woche";   
	    kal[72]="innerhalb 2 Wochen";   
	    kal[73]="innerhalb 3 Wochen";   
	    kal[74]="innerhalb 4 Wochen";   
	    kal[75]="innerhalb 5 Wochen";  
	    kal[76]="innerhalb 6 Wochen";  
	    kal[77]="innerhalb 7 Wochen"; 
	    kal[78]="innerhalb 8 Wochen";   
	    kal[79]="innerhalb 9 Wochen";   
	    kal[80]="innerhalb 10 Wochen";   
	    kal[81]="innerhalb 11 Wochen";    
	    kal[82]="innerhalb 12 Wochen";  
	    kal[83]="innerhalb 13 Wochen";     
	    kal[84]="innerhalb 14 Wochen";     
	    kal[85]="innerhalb 15 Wochen";     
	    kal[86]="innerhalb 16 Wochen";     
	    kal[87]="zur Nachlieferung vorgesehen";   
	    return(kal[DeliveryStatement]);	  
  },
  
  setProductRefID: function(product_ref)
  {
    dv.productRefID = product_ref;
  },
  
  getProductRefID: function()
  {
    return dv.productRefID;
  },
  
  saveFallbackLinkByProductRef: function()
  {
    var RegExpAusdruck = /dv.checkAvailability\(\)/g;
    $.each(dv.articles, function(i, el)
    {
      el.DeliveryText = dv.availabilityFallbackLink.replace(RegExpAusdruck, 'dv.checkAvailability(\''+i+'\')');
      setDeliveryText();
    });
  },
  
  saveFallbackTextByProductRef: function(prod_ref, text)
  {
    var article = eval('dv.articles["'+prod_ref+'"] = {}');
    article.DeliveryText = text;
    setDeliveryText();
  },  
  
	saveDeliveryTextByProductRef: function(status,prod_ref)
	{
    var stat=status.split(';');
    var ddesignation=stat[0];
    var dstatement=stat[1];
    var hint='', msg='', ausgabe='', colorClass='', text=0, temp_i = '', temp_prod_ref='';

    $.log("saveDeliveryTextByProductRef:");

    if(ddesignation) 
    {
      msg = dv.availCodeToStringKAL(ddesignation);
      if (av.initial_article_selection.eilservice && ddesignation == 0) { hint=av.getHint24h(); }
      if ((dstatement) && (dstatement != 0)) { msg+= dv.availStateToStringKAL(dstatement);}
      colorClass =  dv.getColorClass(ddesignation);
    }
 		// Anpassungen für LieferstautsAnzeige in DV
		// Texte die länger sind als 50 Zeichen (entspricht in etwa 2 Zeilen neben dem Wort Lieferstatus) werden nicht mehr neben dem Wort angezeigt sondern als Blocktext darunter.
		// Es erfolgt hier eine Positionierung des Textes.
		/*
    <style>
    strong.detailinfoTop
    {
      display: block;
      float: none;
      clear: both;
      margin-bottom: 10px;
    }
    
    strong.detailinfoBottom (hierfür existiert bestimmt eine Klasse evtl. ".left")
    {
      float: left;
    }
    
    span#availability.detailinfoTop
    {
      float: none;
      clear: both;
    }

      
    Lieferauskunftfarben:
    .lieferbar {"#198504"}
    .lieferbarbis { "#EE9201"; }
    .ausverkauft { "#DA2031"; }
    
    </style>
    .detailedStatus 
    {
		/*var text = msg.length + hint.length;
		if ( text > 50 ) {
			$('#detailedContainer .right .detailedStatus strong').css({ display:"block", float:"none", clear:"both", marginBottom:"10px" })
			$('#detailedContainer .right .detailedStatus span#availability').css({ float:"none", clear:"both" })
		}
		else {
			$('#detailedContainer .right .detailedStatus strong').css({ float:"left" })
		}*/
		
    text = msg.length + hint.length
    if(text > 50)
    {
      
    }
    else
    {
    
    }
    ausgabe = '<b class="'+ colorClass +'">'+msg+'</b>'+hint;
    
    $.each(dv.articles, function(i, el) 
    {
      temp_i = i.split("-");
      temp_prod_ref = prod_ref.split("-");
      if((temp_i[0] + temp_i[1]) === (temp_prod_ref[0] +  temp_prod_ref[1]))
      {
        dv.articles[i].DeliveryText = ausgabe;      
      }
    });
  	

  },
  
  getColorClass: function(DeliveryDesignation) 
  {
    $.log("getColorClass Function:");
    switch(DeliveryDesignation)
    	{
    	  case "0": return 'lieferbar'; break;
    	  case "1": return 'ausverkauft'; break;
    	  case "2": return 'lieferbarbis'; break;
    	  default: return 'ausverkauft';
      }		
	}  
  
 }
 
 // JavaScript Document

/**
 * av - Article-Variation-Object
 *
 * folgende Attribute und Methoden werden vom dv-Objekt genutzt:
 * -dv.availability.fallback_AvailabilityCode;
 * -dv.availability.fallback_AdditionalDeliveryCode;
 *
 * -dv.checkAvailabilityFromMMDB();
 * -dv.changeContentOfServiceModule(targetNode);
 * -dv.toggleDivSlider(elem);
 *
 * folgende Methoden globale JavaScript-Methoden werden aufgerufen:
 * -prepareSettings();
 * -setLandmark(params?);
 * -reset_availability();
 */
 
 /**
  * Changelog Schwab
  * 
  * -added method "loadArticleVariationFrame" for loading variations in the 
  *  iframe
  * -added av-color-properties 
  * -added counter-property for different texts if the article is "lieferbar"
  * -added method "loadArticleVariationSuccess" to be callable from other
  *  methods
  * -added method "loadArticleVariationFrame" for loading the article-variations            
  *  in an iframe
  * -added method "show24hServicePopup" for opening the 24h-service-popup
  * 
  *    
  * -changed method getColorCoding(availStr) for matching the deliverycodes 
  *  of dv.availCodeToString     
  * -changed method "handleAvailabilityCode"; removed parameter "product_ref";
  *  product_ref is now received with the method dv.getProductRefID()
  * -changed method "displayDeliveryStatus" to show all KAL-statuses
  * -changed method "setColorCoding" to work properly with the iframe
  * -changed getColorCoding-methods because of different availabilitycodes in
  *  comparison to otto.de
  *  
  * there are some unused methods which can be important if the iframe will be
  * replaced by an ajax-request
  * 
  * currently unused methods:
  * -loadArticleVartion
  * -loadArticleVartionKAL
  * -show24hServiceReiter
  * -resizeSelectBoxes
  * -debounceButtons
  * -enableButtons
  *               
  */   

var av =  {
	/**
	 * Farbeinstellungen fuer die Lieferbarkeitszustände 
	 */
	 colorBuyable: "#198504", //gruen, lieferbar
	 colorBuyableSoon: "#EE9201", //gelb, lieferbar in xx
   colorSold: "#DA2031", //rot, ausverkauft
   
   /**
    * Zeitinformation bei Status lieferbar an/aus
    * Bsp.: bei Bestellung in den nächsten xx Std. xx Min. ...    
    */
  counter: true,       
   
	/**
	 * dient zur Speicherung der Anzahl der Request-Retries
	 */
  KALRetry: 0,

	/**
	 *  speichert, ob der KAL-Request erfolgreich war
	 */
  KALRequestStatus: false,


	loadArticleVariationSuccess: function(responseData){
	      var product_ref = dv.getProductRefID();
		 		$.log("AJAX Variation success ...");
	   		$("#dvArticleSelection").html(responseData);
				$.log("KALRequestStatus: "+av.KALRequestStatus);
				$.log("Use KAL Request: "+av.initial_article_selection.usekal);
                if (av.initial_article_selection.usekal) {
             	   if (av.KALRetry > 2) {
             	      
	            	    av.displayDeliveryStatusFallback();
		            } else {
    					if (!av.KALRequestStatus) {
						  av.loadKALResponse();
						  av.KALRetry+=1;
						} else {
						  $.log('KAL Request already done');
						  av.handleAvailabilityCode();
						}
					}
				} else {
				    dv.checkAvailabilityFromMMDB();
				}
	},


	/**
	 * Ruft bei nicht gelungenem KAL-Request der Funktion loadKALResponse eine Fallback-Funktion
	 * auf.
	 */
	noKALResponse: function() {
      $.log("noKALResponse:");
 	  	av.displayDeliveryStatusFallback();
	},
	
	/**
	 * Unterteilt die Produktreferenz-Nummer in Artikel-Nummer und Größe.
	 * Danach wird die kalresponse(gefüllt in Funktion createKAL) abgearbeitet und
	 * in folgende Inforamationen unterteilt:
	 *   CompleteCatalogItemNo
	 *   SizeAlphaText
	 *   DeliveryDesignation
	 *   DeliveryStatement
	 *   
	 *   Beispiel der KALResponse:
	 *   	 
	 *   <Articles>
   *     <Article>
   *       <ArticleAvailability>
   *         <ArticleInformation>
   *            <CompleteCatalogItemNo>357457Y</CompleteCatalogItemNo>
   *            <SizeAlphaText>32</SizeAlphaText>
   *            <Std_Promotion>Y</Std_Promotion>
   *            <CustomerCompanyID>0</CustomerCompanyID>
   *         </ArticleInformation>
   *         <Availability>
   *            <DeliveryDesignation>0</DeliveryDesignation>
   *            <DeliveryStatement>0</DeliveryStatement>
   *            <Stock>1</Stock>
   *         </Availability>
   *       </ArticleAvailability>
   *     </Article>
   *     <...>
   *   </Articles>   
   *         
	 * 
	 * @param product_ref - Produktreferenz-Nummer
	 *
	 * @returns false, wenn die Verarbeitung der kalresponse fehltschlägt
	 * @returns DeliveryDesignation + DeliveryStatement wenn, die Verarbeitung der kalresponse korrekt durchläuft
	 */
	getAvailabilityCode: function(product_ref) {
        $.log("getAvailabilityCode:");
        prodref=product_ref.split('-');
        articleno=prodref[0];
        size=prodref[1];
    	  var articles = kalResponse.getElementsByTagName( 'Article' );
        try {
		    for( i=0; i < articles.length; i++ )
    		{
    		  if (articles[i].getElementsByTagName('ArticleAvailability')[0]) {
    		        //<CompleteCatalogItemNo>408515Y</CompleteCatalogItemNo>
              	CompleteCatalogItemNo=articles[i].getElementsByTagName('ArticleAvailability')[0].getElementsByTagName('ArticleInformation')[0].getElementsByTagName('CompleteCatalogItemNo')[0].firstChild.data;

                //<SizeAlphaText>32</SizeAlphaText>
              	SizeAlphaText=articles[i].getElementsByTagName('ArticleAvailability')[0].getElementsByTagName('ArticleInformation')[0].getElementsByTagName('SizeAlphaText')[0].firstChild.data;

                //<DeliveryDesignation>0</DeliveryDesignation>
              	DeliveryDesignation=articles[i].getElementsByTagName('ArticleAvailability')[0].getElementsByTagName('Availability')[0].getElementsByTagName('DeliveryDesignation')[0].firstChild.data;
                
                //<DeliveryStatement>0</DeliveryStatement>              	
              	DeliveryStatement=articles[i].getElementsByTagName('ArticleAvailability')[0].getElementsByTagName('Availability')[0].getElementsByTagName('DeliveryStatement')[0].firstChild.data;
   		    	  if (SizeAlphaText == size && CompleteCatalogItemNo == articleno) {
 		        		return DeliveryDesignation+";"+DeliveryStatement;
	    		  }
              }
		    }
 		} catch (err) {
		    return false;
	    }
	    return false;
	},
	/**
	 * Prüft, ob die kalresponse korrekt verarbeitet wurde.
	 *
	 * Ist sie nicht korrekt verarbeitet worden, wird eine Fallback-Funktion zum Anzeigen
	 * der Lieferauskunft genutzt.
	 *
	 * Ist sie korrekt verarbeitet worden, wird Funktion zur Anzeige der KAL-Lieferauskunft
	 * aufgerufen.
	 *
	 * @param product_ref - Produktreferenz-Nummer
	 */
	handleAvailabilityCode: function() 
  {
      $.log("handleAvailabilityCode:");
      var product_ref = dv.getProductRefID();
   		var availabilityCode=av.getAvailabilityCode(product_ref);
   		if (!availabilityCode)  {
   		  $.log("handleAvailabilityCode: availabilityCode = FALLBACK")
   		  av.displayDeliveryStatusFallback();
   		} else {
   		  $.log("handleAvailabilityCode: availabilityCode = "+ availabilityCode)
   		  av.displayDeliveryStatus(availabilityCode,product_ref);
   		}
	},

	/**
	 * Der im Parameter status übergebener Wert wird zuerst in eine Bezeichnung und einen Messagecode
	 * unterteilt. Danach wird der Fallback-Liefercode(MMDB) in einer zusätzlichen Variablen gespeichert.
	 *
   * Wenn die Bezeichnung den Wert 0 beinhaltet, wird die eine Variable mit der Nachricht "lieferbar"
	 * erzeugt. Weiterhin wird unter Prüfung der initialen Artikel-Werte der Eilservice überprüft und ggf.
	 * die Funktion zur Vorbereitung der Eilservice-Anzeige aufgerufen.
	 * Zusätzlich wird eine Farbe gesetzt, sowie ein Landmark geschrieben.
	 *
	 * Enthält die Bezeichnung nicht den Wert 0, wird der Fallback-Liefercode überprüft und ggf. eine Variable
	 * mit einer anderen Lieferbarkeits-Nachricht gefüllt. Zusätzlich wird auch hier ein Farbcode gesetzt.
	 *
	 * Ansonsten wird auch der Fallback-Liefercode genutzt, um eine Lieferbarkeits-Nachricht in einer Variablen
	 * zu speichern, eine Farbcode sowie ein Landmark gesetzt.
	 *
	 * Zum Schluss wird der Colorcode dieses Objektes gesetzt.
	 *
	 * @param status - semikolon-separierter String
	 * @param product_ref - Produktreferenz-Nummer
	 */
	displayDeliveryStatus: function(status,product_ref) {
        $.log("displayDeliveryStatus:");
        var stat=status.split(';');
        var ddesignation=stat[0];
        var dstatement=stat[1];
        var hint='';
        
        if (ddesignation) 
        {
          msg = dv.availCodeToStringKAL(ddesignation);
          if (av.initial_article_selection.eilservice && ddesignation == 0) { hint=av.getHint24h(); }
          if ((dstatement) && (dstatement != 0)) { msg+= dv.availStateToStringKAL(dstatement);}
          colorCode =  av.getColorCoding(ddesignation);

          /* Tracking */
          $.log("Landmark KAL Start");
          setLandmark("AutoPage", "&pc=availability_kal&lieferstatus=" + msg + "&liefercode="+status+"&productref="+product_ref);
          $.log("Landmark KAL Ende");
          
        }
              
		//$("#availability").html('<p id="checkAvailability"><b>'+msg+'</b>'+hint+'</p>');
		dv.viewAvailabilityToggle();
		


		dv.availabilityDisplay.html('<b>'+msg+'</b>'+hint);
    $.log("av.setColorCoding");
		av.setColorCoding(colorCode);
	},
	
	
	/**
	 * Setzt die Schriftfarbe für <b>- und <span>-Tags im HTML-Tag mit id="checkAvailability"
	 *
	 * @param color - CSS-Farbangabe
	 */
	setColorCoding: function(col) {
    $.log("setColorCoding Function:");
    dv.availabilityDisplay.find('b').css({ color: col});
    dv.availabilityDisplay.find('span').css({ color: col});
	},
	
	/**
	 * Gibt eine Farbe auf Basis des KAL-Lieferbarkeitsstatuses zurück
	 *
	 * @param DeliveryDesignation - KAL-Lieferbarkeitsstatus (0,1,2)
	 *
	 * @returns String, hexadezimale Farbe
	 * 
	 * @see dv.availCodeToString   	 
	 */
	getColorCoding: function(DeliveryDesignation) 
  {
    $.log("getColorCoding Function:");
		var params = DeliveryDesignation.split(";");
    switch(params[0])
    	{
    	  case "0": return av.colorBuyable; break;
    	  case "1": return av.colorSold; break;
    	  case "2": return av.colorBuyableSoon; break;
    	  default: return av.colorSold;
      }		
	},
	
	/**
	 * Gibt eine Farbe auf Basis des MMDB-Lieferbarkeitcodes zurück
	 *
	 * @param availStr - Lieferbarkeitscode
	 *
	 * @returns String, hexadezimale Farbe
	 */
	getColorCodingMMDB: function(availStr) 
  {
    $.log("getColorCodingMMDB Function:");
		var params = availStr.split(";");
    switch(params[0])
    	{
    	  case "300": return av.colorSold; break;
    	  case "310": return av.colorBuyableSoon; break;
    	  case "320": return av.colorBuyable; break;
    	  case "330": return av.colorBuyableSoon; break;
    	  default: return av.colorBuyableSoon;
      }		
	},
	
   
	/**
	 * Ermittelt clientseitig das aktuelle Datum und verrechnet es mit der Serverzeit.
	 * Danach wird eine gewisse Zeit addiert und überprüft, in welchem Tag wir uns nun
	 * befinden. Sind wir in einem Samstag oder Sonntag angelangt wird weitere Zeit addiert.
	 * Danach wird der Wochentag als Zahl in einen String umgewandelt.
	 * ...
	 *
	 *
	 * @returns String mit der Eilservice Nachricht
	 */
	getHint24h: function() {
        var d = new Date();
        var ld = new Date();
        var highnoon = new Date();
        var ordertime = new Date();

        actTime = serverTime+(d.getTime()-clientTime);
    		d.setTime(actTime);
    		highnoon.setTime(actTime);
    		ld.setTime(actTime+129720000);
        lday = ld.getDay();
        weekend=false;
        if (lday==0) {
          ld.setTime(actTime+302520000);
          weekend=true;
        } else if (lday==1) {
          ld.setTime(actTime+216120000);
          weekend=true;
        }
        ldayString = av.getWochentag(ld.getDay());

        highnoon.setHours(12);
        highnoon.setMinutes(0);
        highnoon.setSeconds(0);
        timediff = (highnoon.getTime()-120000)-actTime;
        if (timediff < 0)
           timediff = timediff+24*3600000;
        ordertime.setTime(timediff-3600000);
        if (ordertime.getMinutes() < 10 )
           minutes = "0"+ordertime.getMinutes();
        else
           minutes = ordertime.getMinutes();
        if(av.counter)
        {
          if (weekend)
              return ' - bei Bestellung im <a class="popupOpener popDetails" href="'+ av.initial_article_selection.popup24h +'">24-Stunden-Service</a> erfolgt <span class="lieferbar">die Lieferung am '+ldayString+'.</span>';
          else
              return ' - bei Bestellung in den n&auml;chsten <span style="white-space: nowrap" class="lieferbar">'+ordertime.getHours()+' Std. '+minutes+' Min.</span> mit <a class="popupOpener popDetails" href="'+ av.initial_article_selection.popup24h +'">24-Stunden-Service</a> erfolgt die <span class="lieferbar">Lieferung am '+ldayString+'.</span>';
        }
        else
          return ' - im <a class="popupOpener popDetails lieferbar" href="'+ av.initial_article_selection.popup24h +'">24-Stunden-Service</a> erhalten Sie Ihre Ware noch schneller'              
    },
    
  
	/**
   * Wandelt einen Wochentag als Zahl in den Namen des Wochentags um
   *
	 * @param day - Wochentag als Zahl (Date-Objekt)
	 *
	 * @returns String Wochentag als Name
	 */
	getWochentag: function(day) {
        if (day == 2)
          return 'Dienstag';
        else if (day == 3)
          return 'Mittwoch';
        else if (day == 4)
          return 'Donnerstag';
        else if (day == 5)
          return 'Freitag';
        else if (day == 6)
          return 'Samstag';
    },

  /**
   * Vergrößert die HTML-Elemente mit der CSS-Klasse (class="articleSelect")
   * je nach größe des Attributes "offsetwidth" der Select-Box
   *
	 */
	resizeSelectBoxes: function() {
		$.log("Start: resizeSelectBoxes ...");
		sboxes = $(".articleSelect");
		for ( i=0; i < sboxes.length; i++ ) {
			if ( sboxes[i].offsetWidth < 175 ) {
				sboxes[i].style.width = "175px";
			} else if ( sboxes[i].offsetWidth > 275 ) {
				sboxes[i].style.width = "275px";
			}
		}
	},

  /**
   * Setzt für alle HTML-Elemente mit der CSS-Klasse (class="toDebounce") das
   * "Backup"-Attribut "js" mit dem Wert des Attributes "href" und entfernt
   * schließlich das "href"-Attribut.
	 */
	debounceButtons: function() {
		$.log("Buttons entprellen ...")
		$(".toDebounce").each(function(i) {
			$(this).attr("js", $(this).attr("href"));
			$(this).removeAttr("href");
		});
	},
  /**
   * Setzt für alle HTML-Elemente mit der CSS-Klasse (class="toDebounce") das
   * "href"-Attribut mit dem Wert des "Backup"-Attributes "js" und entfernt
   * schließlich das "js"-Attribut.
	 */
	enableButtons: function() {
		$.log("Buttons wieder freigeben ...")
		$(".toDebounce").each(function(i) {
			$(this).attr("href", $(this).attr("js"));
			$(this).removeAttr("js");
		})
	},

  /**
   * Erstellt ein <textarea>-HTML-Element und in seinem Inhalt alle
   *   "<" => "&lt;"
   *   ">" => "&gt;"
   *
   * @returns String mit ersetzten Entitaeten
	 */
	html_entity_decode: function(str) {
		$.log("html_entity_decode");
		var ta = document.createElement("textarea");
  		ta.innerHTML = str.replace(/</g,"&lt;").replace(/>/g,"&gt;");
  		toReturn = ta.value;
  		ta = null;
  		return toReturn;
  },
  	
  /**
   * Tritt ein ungewöhnlicher Fehler bei KAL auf, so dass die eine Fallback-
   * Methode aufgerufen werden muss, werden Produktreferenz, Lieferstatus und
   * Lieferzeit an ein Trackingpixel übergeben.
   */
  trackKALError: function()
  {
    var product_ref = dv.getProductRefID();
    var params = 'ProductRef=' + product_ref;
    var url = 'http://web.schwab.de/track/kal_schwab.php?';
    var tracking = url + params;

    $('#kalTracker').attr('src',tracking);
  }
  	
}

