
Array.prototype.contains = function (element) {
for (var i = 0; i < this.length; i++) {
if (this[i] == element) {
return true;
}
}
return false;
};

viewerModel = {
//  debug : true,
  listener : new Array(),
  warrantyListener : new Array(),
  items : new Array(),
  selectedItem : null,
  selectedWarranty : null,
  /** maskEvents: Wenn true, so sollen keine Events geschmissen werden */
  maskEvents : false,
  setItem : function(item, context){
    if (! (item instanceof Item))
      item = this.getItemById(item);
    this.selectedItem = item;
    if (item && !this.maskEvents) {
      for(var i = 0; i < this.listener.length; i++) {
        this.listener[ i ].notify(item, context);
      }
    }
  },
  setWarranty : function(warranty){
	  this.selectedWarranty = warranty;
	  if (!this.maskEvents) {
		  for(var i = 0; i < this.warrantyListener.length; i++) {
		        this.warrantyListener[ i ].notifyWarrantyChange(warranty);
		  }
	  }
  },
  addListener : function(listener){
    this.listener.push(listener);
  },
  addWarrantyListener : function(listener){
	    this.warrantyListener.push(listener);
	  },
  isSelectedItemAvailable : function() {
	return this.selectedItem != null && this.selectedItem.available;   
  },	  
  registerItem : function(item){
//	  if (this.debug)
//	    console.debug(item);
    this.items[item.id] = item;
  },
  getItemById : function(itemId){
    return this.items[itemId];
  },
   getSelectedItemId : function(){
	    if (this.selectedItem == null) {
	    	return null;
	    }
	    return this.selectedItem.id;
	  },
	/**
	 * Löscht die Items Felder und wirft dabei KEIN Event.
	 */  
    clearItemsWithoutEvent : function(){
		 this.selectedItem = null;
		 this.items = new Array();
    }
};



function Item(id) {
  this.id = id;
  this.name = '';
  this.price = '';
  this.oldPrice = '';
  this.color = '';
  this.plainColor = '';
  this.availability = '';
  this.comboBoxAvailability = '';
  this.savedPercentage = '';
  this.savedAmount = '';
  this.artNo = '';
  this.img = '';
  this.vari = new Array();
  this.maxOrderAmount = 0;
}
/*
 * Weitere ausgaben auf der firebug console;
 * siehe: http://getfirebug.com/console.html
 */
// console.debug("why");

function getAvailability(){
  var itemId = $('#formItemId').val();
  $('#availabilityCheck').addClass('hidden');

  var availabilityWait = $('#availabilityWait');
  availabilityWait.removeClass('hidden');

  $.ajax({
    url: shop.baseUrl+'itemAvailability',
    data: ({itemId: itemId}),
    dataType:'json',
    success: function (data) {
      var status = data.status;
      if (status != null) {
        var availabilityText = $('#availabilityText');
        availabilityWait.addClass('hidden');
        availabilityText.removeClass("hidden");
        availabilityText.css("font-weight", "bold");
        if (status == 'AVAILABLE') {
          availabilityText.css("color", "green");
          availabilityText.html(textAV1);
        } else if (status == 'LATER_AVAILABLE') {
          availabilityText.css("color", "#EE9201");
          availabilityText.html(textAV3);
        } else if (status == 'NOT_AVAILABLE') {
          availabilityText.css("color", "red");
          availabilityText.html(textAV2);
        }
        if (data.displayDeliveryStatement != null) {
          availabilityText.html(data.displayDeliveryStatement);
        }
      }
    }
  });
  return false;
}

var knownSizes = new Object();
knownSizes['XXS'] = 0;
knownSizes['XS'] = 2;
knownSizes['S'] = 4;
knownSizes['M'] = 6;
knownSizes['L'] = 8;
knownSizes['XL'] = 10;
knownSizes['XXL'] = 12;
knownSizes['XXXL'] = 14;
knownSizes['3XL'] = 14;
knownSizes['XXXXL'] = 16;
knownSizes['4XL'] = 16;

function getSizeRank(size) {
  var rank = knownSizes[size];
  if(rank != null && rank != undefined)
    return rank;
  
  firstSpace = size.indexOf(' ');
  firstParen = size.indexOf('(');
  if (firstSpace == -1 && firstParen == -1) {
    return null;
  }
  
  end = firstParen == -1 ? firstSpace : firstSpace == -1 ? firstParen : Math.min(firstSpace, firstParen);
  var key = size.substring(0, end);
  rank = knownSizes[key];
  if (rank != null) {
    return rank + 1;
  }

  return null;
    
}

$.fn.sortSizeOptions = function()
{
  var s = this.selectedValues();
  this.each(
    function()
    {      
      if(this.nodeName.toLowerCase() != "select") {
        return;
      }
      // get options
      var o = this.options;
      // get number of options
      var oL = o.length;
      // create an array for sorting
      var sA = [];
      // loop through options, adding to sort array
      for(var i = 0; i<oL; i++)
      {
        sA[i] = {
          v: o[i].value,
          t: o[i].text
        };
      }
      // sort items in array
      sA.sort(
        function(o1, o2)
        {
          o1t = o1.t.toUpperCase(), o2t = o2.t.toUpperCase();
          // if options are the same, no sorting is needed
          if(o1t == o2t) return 0;
          
          rank1 = getSizeRank(o1t);
          rank2 = getSizeRank(o2t);
          if (rank1 == null && rank2 == null) 
            return o1t < o2t ? -1 : 1;
          if (rank1 != null && rank2 != null) {
            return rank1 < rank2 ? -1 : 1;
          }
          return rank1 == null ? 1 : -1;
        }
      );
      // change the options to match the sort array
      for(var i = 0; i<oL; i++)
      {
        o[i].text = sA[i].t;
        o[i].value = sA[i].v;
      }
    }
  ).selectOptions(s,true);
  return this;
};
