// =====================
// = Shop availability =
// =====================
var Adiva = {};
Adiva.Shop = {};

// ================
// = Adiva.Helper =
// ================
Adiva.Helper = {
  addEvent: function(obj, evType, fn) {
    if (obj.addEventListener){ 
      obj.addEventListener(evType, fn, false); 

      return true; 
    } else if (obj.attachEvent) { 
      var r = obj.attachEvent("on"+evType, fn); 

      return r; 
    } else { 
      return false; 
    }
  },
  isArray: function(obj) {
    if (obj.constructor.toString().indexOf('Array') == -1) {
      return false;
    } else {
      return true;
    }
  },
  yellowFade: function(el, options) {
    if (el == null) {
      return;
    }
    
    var b = 155;
    var endColorRed = 255, endColorGreen = 255, endColorBlue = 255;

    if (options != null) {
      if ((typeof options) == 'object' && options.endcolor) {
        options.endcolor = (options.endcolor.charAt(0) == '#') ? 
          options.endcolor.substring(1, options.endcolor.length): 
          options.endcolor;
        if (options.endcolor.length == 6) {
          var tmpColorRed = parseInt(options.endcolor.substring(0, 2), 16),
            tmpColorGreen = parseInt(options.endcolor.substring(2, 4), 16), 
            tmpColorBlue = parseInt(options.endcolor.substring(4, 6), 16);
          if (!isNaN(tmpColorRed) && !isNaN(tmpColorGreen) && !isNaN(tmpColorBlue)) {
            endColorRed = tmpColorRed; endColorGreen = tmpColorGreen; endColorBlue = tmpColorBlue;
          }
        }
      }
    }

    (function f() {
      el.style.background = 'rgb(' + endColorRed + ',' + endColorGreen + ','+ (b+=4) +')';

      if (b < endColorBlue) {
        setTimeout(f, 40);
      }
    })();
  },
  getFormattedDate: function(date) {
    if (!date) {
      return '';
    }
    if (typeof date != 'object') {
      return '';
    }
    if (!(date instanceof Date)) {
      return '';
    }
    
    var dateNowAsString = '';
    var yearFull = (date.getFullYear() + '').substring(2, 4);
    var day = ((date.getDate() + '').length == 1) ? ('0' + date.getDate()): (date.getDate() + '');
    var month = (((date.getMonth() + 1) + '').length == 1) ? ('0' + (date.getMonth() + 1)): ((date.getMonth() + 1) + '');
    var hours = ((date.getHours() + '').length == 1) ? ('0' + date.getHours()): (date.getHours() + '');
    var minutes = ((date.getMinutes() + '').length == 1) ? ('0' + date.getMinutes()): (date.getMinutes() + '');
    
    dateNowAsString += day + '.';
    dateNowAsString += month + '.';
    dateNowAsString += yearFull + ' ';
    dateNowAsString += hours + ':';
    dateNowAsString += minutes;

    return dateNowAsString;
  }
}


// ========================================
// = Adiva.Shop.ArticleLastUpdatedElement =
// ========================================
Adiva.Shop.ArticleLastUpdatedElement = {
  getElement: function() {
    return document.getElementById('lastUpdateOfPriceDate');
  },
  setValue: function(newTimeValue) {
    var articleLastUpdatedElement =  Adiva.Shop.ArticleLastUpdatedElement.getElement();
    
    if (!articleLastUpdatedElement) {
      return;
    }
    if (!newTimeValue) {
      return;
    }
    
    articleLastUpdatedElement.innerHTML = newTimeValue;
    // flash it
    Adiva.Helper.yellowFade(articleLastUpdatedElement, {endcolor: '#f2f2f2'});
  }
};

// =========================================
// = Adiva.Shop.ArticleAvailabilityElement =
// =========================================
Adiva.Shop.ArticleAvailabilityElement = {
  getElement: function() {
    return document.getElementById('articleAvailability');
  },
  reset: function() {
    var element = Adiva.Shop.ArticleAvailabilityElement.getElement();
    // var element = this.getElement();

    if (!element) {
      return;
    }

    if (element.hasChildNodes()) {
      while (element.childNodes.length >= 1) {
        element.removeChild(element.firstChild);
      }
    }
  },
  displayQuery: function(callbackBackFunction) {
    Adiva.Shop.ArticleAvailabilityElement.reset();

    var element = Adiva.Shop.ArticleAvailabilityElement.getElement();

    if (!element) {
      return;
    }

    var newDivElement = window.document.createElement('div');
    // var newAElement = window.document.createElement('a');
    // newAElement.style.cursor = 'pointer';
    // newAElement.style.textDecoration = 'underline';
    // newAElement.style.fontSize = '11px';
    // newAElement.innerHTML = unescape('Online Verf%FCgbarkeit pr%FCfen');
    var newAElement = window.document.createElement('input');
    newAElement.type = 'button';
    newAElement.style.width = '170px';
    newAElement.value = unescape('Online Verf%FCgbarkeit pr%FCfen');

    Adiva.Helper.addEvent(newAElement, 'click', callbackBackFunction);

    newDivElement.appendChild(newAElement);

    element.appendChild(newDivElement);
  },
  switchToPendingRequest: function() {
    Adiva.Shop.ArticleAvailabilityElement.reset();

    var el = Adiva.Shop.ArticleAvailabilityElement.getElement();
    if (!el) {
      return;
    }

    var newDivElement = window.document.createElement('div');
    var newSpanElement = window.document.createElement('span');
    newSpanElement.style.fontSize = '12px';
    newSpanElement.innerHTML = 'Wird abgefragt, bitte warten Sie.';
    var newImgElement = window.document.createElement('img');
    newImgElement.src = '/images/6-1.gif';
    // newImgElement.src = '/images/ajax-loader.gif';
    newImgElement.style.paddingRight = '10px';

    newDivElement.appendChild(newImgElement);
    newDivElement.appendChild(newSpanElement);
    el.appendChild(newDivElement);
  },
  displayMessage: function(message) {
    Adiva.Shop.ArticleAvailabilityElement.reset();

    var el = Adiva.Shop.ArticleAvailabilityElement.getElement();
    if (!el) {
      return;
    }

    var newDivElement = window.document.createElement('div');
    var newSpanElement = window.document.createElement('span');
    newSpanElement.style.fontSize = '12px';
    newSpanElement.innerHTML = unescape(message);

    newDivElement.appendChild(newSpanElement);
    el.appendChild(newDivElement);

    Adiva.Helper.yellowFade(newDivElement);
    // Adiva.Helper.yellowFade(newDivElement, {endcolor: '#eeeeee'});
  }
};

// ========================================
// = Adiva.Shop.OnlineArticleAvailability =
// ========================================
// fuer die detail Ansicht
Adiva.Shop.OnlineArticleAvailability = {
  processingRequest: false,
  messageDataNotAvailable: 'Derzeit sind leider keine Daten verf%FCgbar',
  messageTimeOut: 'Server Timeout, bitte versuchen Sie es sp%E4ter erneut',
  messageAvailability: 'Verf%FCgbar sind ',
  availabilityUrl: '/de/availability.jsp',


  decideAboutAvailabilityButton: function() {
    var inventoryMessage = Adiva.Shop.ShopService.getInventoryMessageContent();

    if (inventoryMessage === '' || inventoryMessage === null) {
      return;
    }
    Adiva.Shop.ArticleAvailabilityElement.displayQuery(Adiva.Shop.OnlineArticleAvailability.getAvailability);
  },
  
  getAvailability: function() {
    var article = Adiva.Shop.ShopService.getInventoryMessageContent();

    // pre ajax call
    Adiva.Shop.ArticleAvailabilityElement.switchToPendingRequest();
    Adiva.Shop.OnlineArticleAvailability.processingRequest = true;

    // Timeout for X sec
    setTimeout('Adiva.Shop.OnlineArticleAvailability.handleTimeout()', 60000);

    var availabilityRequest = new AjaxObject(Adiva.Shop.AvailabilityService.url, 
      Adiva.Shop.OnlineArticleAvailability.processAvailabilityRequestData);

    availabilityRequest.update('sku='+article);
  },
  
  processAvailabilityRequestData: function(responseText, responseStatus) {
    if (Adiva.Shop.OnlineArticleAvailability.processingRequest == false) {
      // timed out
      return;
    }

    Adiva.Shop.OnlineArticleAvailability.processingRequest = false;
    // process ajax response
    //
    if (responseStatus == 200) {
      if (responseText == '' || responseText == null) {
        Adiva.Shop.ArticleAvailabilityElement.displayMessage(
          Adiva.Shop.OnlineArticleAvailability.messageDataNotAvailable
        );
        return;
      }
      
      // von json zurueck parsen
      var response = eval("(" + responseText + ")");
      
      if (response == null) {
        Adiva.Shop.ArticleAvailabilityElement.displayMessage(
          Adiva.Shop.OnlineArticleAvailability.messageDataNotAvailable
        );
        return;
      }
      
      var number = parseInt(response.availability);
      if (isNaN(number)) {
        // fehler
        Adiva.Shop.ArticleAvailabilityElement.displayMessage(
          Adiva.Shop.OnlineArticleAvailability.messageDataNotAvailable
        );
        return;
      }

      number = Adiva.Shop.AvailabilityService.calculateAvailability(
        number, 
        Adiva.Shop.ShopService.getCurrentLocalAvailability()
      );
      
      Adiva.Shop.ArticleAvailabilityElement.displayMessage(
        Adiva.Shop.OnlineArticleAvailability.messageAvailability + number
      );
      
      // Aktuallisierung Zeit updaten
      var currentTime = Adiva.Helper.getFormattedDate(new Date());
      if (currentTime.length > 0) {
        Adiva.Shop.ArticleLastUpdatedElement.setValue(currentTime);
      }
    } else {
      // fehler,
      Adiva.Shop.ArticleAvailabilityElement.displayMessage(
        Adiva.Shop.OnlineArticleAvailability.messageDataNotAvailable
      );
    }
  },
    
  handleTimeout: function() {
    if (Adiva.Shop.OnlineArticleAvailability.processingRequest == false) {
      // request already procesed, so do nothing
      return;
    }
    // signal that request failed
    Adiva.Shop.OnlineArticleAvailability.processingRequest = false;
    // display time out message
    Adiva.Shop.ArticleAvailabilityElement.displayMessage(
      Adiva.Shop.OnlineArticleAvailability.messageTimeOut
    );
  }
};

Adiva.Shop.AvailabilityService = {
  url: '/de/availability.jsp',
  
  calculateAvailability: function(currentOnlineAvailability, actualAvailability) {
    actualAvailability = actualAvailability || 0;

    return (actualAvailability > currentOnlineAvailability) ? currentOnlineAvailability: actualAvailability;
  }
};

Adiva.Shop.OnlineArticlesAvailability = {
  processing: {},
  
  getAvailability: function(articleSku) {
    if (articleSku == null) {
      return;
    }
    
    Adiva.Shop.OnlineArticlesAvailability.processing[articleSku] = true;
    setTimeout('Adiva.Shop.OnlineArticlesAvailability.handleTimeout()', 60000);
    
    var availabilityRequest = new AjaxObject(Adiva.Shop.AvailabilityService.url, 
      Adiva.Shop.OnlineArticlesAvailability.processRequestData);

    availabilityRequest.update('sku='+articleSku);
  },
  
  handleTimeout: function(articleSku) {
    if (Adiva.Shop.OnlineArticlesAvailability.processing[articleSku] == false) {
      return;
    }
    Adiva.Shop.OnlineArticlesAvailability.processing[articleSku] = false;
  },
  
  processRequestData: function(responseText, responseStatus) {
    if (responseStatus != 200) {
      return;
    }
    if (responseText == '' || responseText == null) {
      return;
    }
    
    var response = eval("(" + responseText + ")");
    
    if (response == null) {
      return;
    }
    
    var number = parseInt(response.availability);;
    if (isNaN(number)) {
      return;
    }
    
    var currentAvailableElement = document.getElementById('current_avail_' + response.sku);
    if (currentAvailableElement == null) {
      return;
    }
    currentAvailable = parseInt(currentAvailableElement.innerHTML);
    if (isNaN(currentAvailable)) { currentAvailable = 0; }
    
    number = Adiva.Shop.AvailabilityService.calculateAvailability(
      number, 
      currentAvailable
    );
    
    var displayIntoElement = document.getElementById('refresh_availability_' + response.sku);
    if (displayIntoElement) {
      displayIntoElement.innerHTML = number;
      currentAvailableElement.style.display = 'none';
    }
  }
};
