/*** COPYRIGHT 2009  BY CUTSEY BUSINESS SYSTEMS LTD. - ALL RIGHTS RESERVED ***/
/* browse.js -- Browse Page Javascript                                       */
/*****************************************************************************/
/*C010104 06/22/11 APY- Preformance improvements for size stock ajax merging.*/
/*C010103 06/20/11 APY- Hide size filter until page loaded to fix IE issue.  */
/*C010102 03/03/11 APY- fix rtb save issue.                                  */
/*C010101 02/22/11 APY- Size filter Mods.                                    */
/*                    - Correction for browseProd pricing.                   */
/*C010100 12/14/10 APY- Add color swatches.                                  */
/*C010003 05/05/10 APY- AJAX pricing corrections.                            */
/*C010002 05/03/10 APY- PreSell Display Mods.                                */
/*C010001 04/27/10 APY- Fixes for paging in static mode.                     */
/*C010000 04/14/10 APY- Don't run paging for viewAll static mode.            */
/* 010002 09/09/09 APY- Create common draw program for browse products.      */
/* 010001 08/25/09 APY- Update sorting and add feature filters.              */
/* 010000 08/18/09 APY- Created.                                             */
/*****************************************************************************/

var browseProd;
var browseProdOrig; /* 010001 */
var browseSorted = false;
var sortDir = ""; /* 010001 */
var XMLPath = "browse-prod.xml";
var vToday = new Date(); /* C010002 */

//Some better error trapping for required vars
if(typeof prodPerPage == "undefined")
  var prodPerPage = 16;
if(typeof viewAllProd == "undefined")
  var viewAllProd = false;
if(typeof curBrowsePage == "undefined")
  var curBrowsePage  = 1;
if(typeof numBrowsePages == "undefined")
  var numBrowsePages = 1;
if(typeof browseImgType == "undefined")
  var browseImgType = "small";

//========--------   Load   --------========\\
/******vv C010100 vv******/
var prodPriceObj;
$(document).ready(function(){

  swatchCenter();

  var vCurrTime = new Date();
  var vCurrSecs  = (((vCurrTime.getHours() * 60) + vCurrTime.getMinutes()) * 60) + vCurrTime.getSeconds();
  var vNoCache = "&nocache=" + vCurrSecs;
  var vCatSbs = getCookie("sbs" + vCatRecId);
  if(vGetPricing){
     $.ajax({
       type: "GET",
       url: appPath + "/b2c/retail-browse-price.w?styles=" + vSearchResults + "&frames=no&target=main&sponsor=" + fdmSponsor + vNoCache, 
       dataType: "xml",
       complete: function(data) {
         prodPriceObj = $.xmlToJSON(data.responseXML);
         $.each(prodPriceObj.product,function(tIdx){
            if (document.getElementById(prodPriceObj.product[tIdx].product + "Price"))
               $("#" + prodPriceObj.product[tIdx].product + "Price").html(prodPriceObj.product[tIdx].priceHTML);
         });
         getBrowse();
         $("#sizeFilterSelect").show(); /* C010103 */
         if (vCatSbs != ""){           
           var vSelIdx = -1;  /* C010101 */
           $("#sizeFilterSelect option").each(function(i){ 
             if(this.value == vCatSbs){ vSelIdx = i; return; }
           });
           if(vSelIdx != -1){ /* C010101 */
             document.getElementById('sizeFilterSelect').selectedIndex = vSelIdx;
             goFilter("size",vCatSbs,document.getElementById('sizeFilterSelect'));     
           }
         }
       }
     });
  }
  else{ 
   getBrowse();
   if (vCatSbs != ""){ 
     var vSelIdx = -1;  /* C010101 */
     $("#sizeFilterSelect option").each(function(i){ 
       if(this.value == vCatSbs){ vSelIdx = i; return; }
     });
     if(vSelIdx != -1){  /* C010101 */
       document.getElementById('sizeFilterSelect').selectedIndex = vSelIdx;
       goFilter("size",vCatSbs,document.getElementById('sizeFilterSelect'));     
     }
   }
  }
  // Delegate the more + button so it dosen't need to be hardcoded in HTML or rerun when doing filtering or paging
  $(".layoutContent").delegate(".browseSwatchMore","mouseover",function(){ 
      var $prod = $(this).closest("." + prodClass);
      if(!$prod.find(".moreOver").length){
         $prod.prepend('<div class="moreOver">' + vMoreCopy + '</div>');
         $prod.find(".moreOver").css("opacity",0.75);
      }
      $prod.find(".moreOver").show();
      $(this).addClass("moreSelected");
  });
  $(".layoutContent").delegate(".browseSwatchMore","mouseout",function(){ 
      $(this).closest("." + prodClass).find(".moreOver").hide();    
      $(this).removeClass("moreSelected");
  });

});
/******^^ C010100 ^^******/
function getBrowse(){
		var vHideClass = "";
  /***vv C010100 vv***/
  if(vGetPricing){
     $(browseProd.product).each(function(i){   
       for (j=0;j<prodPriceObj.product.length;j++){
          if(prodPriceObj.product[j].product==this.product){
             this.priceHTML = prodPriceObj.product[j].priceHTML;
             this.regPrice  = prodPriceObj.product[j].regPrice;
             this.salePrice = prodPriceObj.product[j].salePrice;
             this.saleLable = prodPriceObj.product[j].saleLable;
             /***vv C010101 vv***/
             var $prodHTML = $(this.prodHTML);
             $prodHTML.find(".browseProdPrice").html(prodPriceObj.product[j].priceHTML);
             this.prodHTML = $("<div>").append( $prodHTML.get(0) ).html();
             break;
             /***^^ C010101 ^^***/
          }
        }
      });
  }
  /***^^ C010100 ^^***/
  //Ensure results are sorted properly
  browseProd.product.sort(function(a,b){ return a.sort - b.sort });
  //Create copy of browse to revert to after filtering
  browseProdOrig = $.extend(true,{},browseProd); /* 010001 */
  //Generate Paging
  /**vv C010000 vv**/       
  /**vv C010001 vv**/       
  createPaging();
  if(viewAllProd){ gotoPage("all"); }
  /**^^ C010001 ^^**/
  /**^^ C010000 ^^**/
  //Attach/override JS filtering functions
  var vFilterMenu = $(".featFilterList");
  if (vFilterMenu.length){
    $(".featFilterLink",vFilterMenu).each(function(){ 
      $(this).attr("href","javascript:featFilter('" + $(this).attr("featDetailCode") + "');");
    });
    $(vFilterMenu).slideDown("fast");
  }  

}
//========--------   Create Paging   --------========\\
function createPaging(){
   if (browseProd.product.length > prodPerPage ){ // Only Create paging if required
     numBrowsePages = Math.ceil(browseProd.product.length/prodPerPage);
     var pagesHTML = "<ul class='pageNav'>";	

     if(curBrowsePage <= numBrowsePages && curBrowsePage != 1)
       vHideClass = "";
     else 
       vHideClass = " navHide";
     pagesHTML += "<li class='pageNavPrev" + vHideClass + "'><a class='pageNavLink' href='javascript:gotoPage(\"prev\");'>Previous</a></li>";	

     for (i=1;i<=numBrowsePages;i++){   
       if (i==curBrowsePage)
        pagesHTML += "<li class='currentPage pageNav pg"+i+"'><a class='pageNavLink' rel='"+i+"' href='javascript:gotoPage("+i+");'>"+i+"</a></li>";	
       else
        pagesHTML += "<li class='pageNav pg"+i+"'><a class='pageNavLink' rel='"+i+"' href='javascript:gotoPage("+i+");'>"+i+"</a></li>";       
     }
     
     if(curBrowsePage >= 1 && curBrowsePage != numBrowsePages)
       vHideClass = "";
     else 
       vHideClass = " navHide";
     pagesHTML += "<li class='pageNavNext" + vHideClass + "'><a class='pageNavLink' href='javascript:gotoPage(\"next\");'>Next</a></li>";	

     pagesHTML += "<li class='pageNavSpacer'>|</li>";	
     pagesHTML += "<li class='pageNavAll'><a class='pageNavLink' href='javascript:gotoPage(\"all\");'>View All</a></li>";	
     pagesHTML += "</ul>";
     $(".pageNavWrapper").html(pagesHTML);
   } // End Create Paging
   else
     $(".pageNavWrapper").html("");
}
//========--------   Go To Page   --------========\\
function gotoPage(newPage){
  var startProd;
  var endProd;
  var browseHTML = "";

  if(newPage=="next") newPage = curBrowsePage + 1;
  if(newPage=="prev") newPage = curBrowsePage - 1;

  if(newPage=="all"){ /* C010001 */
    curBrowsePage = 1;
    startProd = 0;
    endProd = browseProd.product.length - 1;
    $("li.pageNav").addClass("navHide");
    $(".pageNavNext").addClass("navHide");
    $(".pageNavPrev").addClass("navHide");
    $(".pageNavSpacer").addClass("navHide");
    $(".pageNavLink",$(".pageNavAll")).html("View Pages").attr("href","javascript:gotoPage('pages');");
    if (viewAllProd==true){ return;  } /* C010001 */
    viewAllProd = true; /* C010001 */
  }
  else if(newPage=="pages" && viewAllProd==true){
    viewAllProd = false;
    curBrowsePage = 1;
    startProd = (curBrowsePage - 1) * prodPerPage;
    endProd = curBrowsePage * prodPerPage - 1;
    if (endProd > browseProd.product.length - 1)
      endProd = browseProd.product.length - 1;
    $("li.pageNav").removeClass("navHide");
    $(".pageNavSpacer").removeClass("navHide");
    $(".pageNavLink",$(".pageNavAll")).html("View All").attr("href","javascript:gotoPage('all');");
  }
  else if(newPage!=curBrowsePage && newPage>=1 && newPage<=numBrowsePages){
     curBrowsePage = newPage;
     startProd = (curBrowsePage - 1) * prodPerPage;
     endProd = curBrowsePage * prodPerPage - 1;
     if (endProd > browseProd.product.length - 1)
       endProd = browseProd.product.length - 1;
     viewAllProd = false; /* C010101 */
  }
  for(i=startProd;i<=endProd;i++){
     if(vPerRow != 0 && i != 0 && i % vPerRow == 0)     /* C010100 */
       browseHTML += '<div style="clear:both;"></div>'; /* C010100 */
     browseHTML += browseProd.product[i].prodHTML;      /* C010100 */
  }

  //Fade Out and Back In - leave opacity above 0 to not get jump in display.
  $(".browseProd").fadeTo(100,0.01,function(){ 
     $(this).html(browseHTML).fadeTo(100,1,function(){
        //Fix for IE and TrueType font distortion when changing opacity. 
        if ($.browser.msie){ this.style.removeAttribute('filter'); }
        swatchCenter(); /* C010100 */
     }); 
  });
  if(newPage!="all"){
     $(".currentPage").removeClass("currentPage");
     $(".pg" + curBrowsePage).addClass("currentPage");
     if(curBrowsePage <= numBrowsePages && curBrowsePage != 1)
       $(".pageNavPrev").removeClass("navHide");
     else 
       $(".pageNavPrev").addClass("navHide");
     if(curBrowsePage >= 1 && curBrowsePage != numBrowsePages)
       $(".pageNavNext").removeClass("navHide");
     else 
       $(".pageNavNext").addClass("navHide");
  }

}
//========--------   Price Sorting   --------========\\
//OverRide submitSort function used in dynamic mode
function submitSort(vSort){

  var startProd;
  var endProd;
  var browseHTML = "";
  var vDir;

  if(vSort.selectedIndex > 1)
     vDir = vSort[vSort.selectedIndex].value;
  else 
    return;

  //Add sortPrice to browseProd
  if (!browseSorted){
    $(browseProd.product).each(function(i){ 
      if (this.salePrice < this.regPrice && this.salePrice > 0 )
        this.sortPrice = this.salePrice;
      else
        this.sortPrice = this.regPrice;
      this.sortOrder = i;
    });
    browseSorted = true;
  }
  //Sort based on Price
  if(vDir=="ascending"){
    browseProd.product.sort(function(a,b){ return a.sortPrice - b.sortPrice });
    sortDir = "ascending";
  }
  else if(vDir=="descending"){
    browseProd.product.sort(function(a,b){ return b.sortPrice - a.sortPrice });
    sortDir = "descending";
  }
  else{
    browseProd.product.sort(function(a,b){ return a.sort - b.sort });
    sortDir = "";
  }
   
  curBrowsePage = 1;
  $(".currentPage").removeClass("currentPage");
  $(".pg" + curBrowsePage).addClass("currentPage");
  if (viewAllProd){
    startProd = 1;
    endProd = browseProd.product.length - 1;
  }
  else{
    startProd = (curBrowsePage - 1) * prodPerPage;
    endProd = curBrowsePage * prodPerPage - 1;
  }
  if (endProd > browseProd.product.length - 1)
    endProd = browseProd.product.length - 1;
  for(i=startProd;i<=endProd;i++){
     if(vPerRow != 0 && i != 0 && i % vPerRow == 0)     /* C010100 */
       browseHTML += '<div style="clear:both;"></div>'; /* C010100 */
     browseHTML += browseProd.product[i].prodHTML;      /* C010100 */
  }
  //Fade Out and Back In - leave opacity above 0 to not get jump in display.
  $(".browseProd").fadeTo(100,0.01,function(){ 
     $(this).html(browseHTML).fadeTo(100,1,function(){
        //Fix for IE and TrueType font distortion when changing opacity. 
        if ($.browser.msie){ this.style.removeAttribute('filter'); }
        swatchCenter(); /* C010100 */
     }); 
  });

  if(curBrowsePage <= numBrowsePages && curBrowsePage != 1 && viewAllProd == false)
    $(".pageNavPrev").removeClass("navHide");
  else 
    $(".pageNavPrev").addClass("navHide");
  if(curBrowsePage >= 1 && curBrowsePage != numBrowsePages  && viewAllProd == false)
    $(".pageNavNext").removeClass("navHide");
  else 
    $(".pageNavNext").addClass("navHide");
}

//========--------   Feature Filtering   --------========\\
//Will need to add featCode if allowing more than 1 refineby\\
function featFilter(detailCode){
  //Reset
  if (detailCode=="reset"){
    browseProd = $.extend(true,{},browseProdOrig);
    if(sortDir=="ascending"||sortDir=="descending")
      submitSort(document.getElementById("sortBy"));      
    createPaging();
    curBrowsePage = 0;
    gotoPage(1);
    return;
  } 
  //Filter browseProd
  browseProd = $.extend(true,{},browseProdOrig);
  browseProd.product = $(browseProd.product).filter(function(){ 
    var vFound = false;
    $(this.prodFeat).each(function(){ 
      if (this.featDetailCode==detailCode)
       vFound = true;
    });
    return vFound;
  });
  if(sortDir=="ascending"||sortDir=="descending")
    submitSort(document.getElementById("sortBy"));
  createPaging();
  curBrowsePage = 0;
  gotoPage(1);
}
/***vv 010002 vv***/
/* drawBrowseProd is no longer used - prodHTML is now output in JSON */
function drawBrowseProd(vProdIdx){
    var browseHTML = "";
    switch(browseImgType){
      case "small":  prodImage = browseProd.product[vProdIdx].imageSm; 
        break;
      case "thumb":  prodImage = browseProd.product[vProdIdx].imageTh;
        break;
      case "large":  prodImage = browseProd.product[vProdIdx].imageLg;
        break;
      default:       prodImage = browseProd.product[vProdIdx].imageSm;
    }
    browseHTML += '<div class="' + prodClass + '">';
    browseHTML += '<div class="browseImg"><a href="' + browseProd.product[vProdIdx].sLink + '" class="productLink">';
    if(prodImage == "") 
      browseHTML += '<img onerror="top.ImageError(this,\'' + browseImgType + '\');" class="' + browseImgType + '" id="img' + browseProd.product[vProdIdx].product + '" src="/missing_"' + browseImgType + '".gif"/>';
    else
      browseHTML += '<img onerror="top.ImageError(this,\'' + browseImgType + '\');" class="' + browseImgType + '" id="img' + browseProd.product[vProdIdx].product + '" src="' + prodImage + '"/>';
    browseHTML += '</a></div>';
    browseHTML += '<div class="browseProdDesc"><a href="' + browseProd.product[vProdIdx].sLink + '" class="productLink">' + browseProd.product[vProdIdx].description + '</a></div>'; 
    if (browseProd.product[vProdIdx].priceHTML)
      browseHTML += '<div class="browseProdPrice" id="' + browseProd.product[vProdIdx].product + 'price">' + browseProd.product[vProdIdx].priceHTML + '</div>';
    /***vv C010002 vv***/
    if (browseProd.product[vProdIdx].classDescription)
      browseHTML += '<div class="extProductDesc">' + browseProd.product[vProdIdx].classDescription + '</div>';
    vStreetDate = parseDate(browseProd.product[vProdIdx].streetDate);
    if (browseProd.product[vProdIdx].preSell && vStreetDate > vToday )
      browseHTML += '<div class="presellDesc">' + browseProd.product[vProdIdx].preSellDesc + '</div>' +
                    '<div class="streetDate">' + browseProd.product[vProdIdx].streetDate + '</div>';
    /***^^ C010002 ^^***/
    browseHTML += '</div>';
    return browseHTML;
}
/***^^ 010002 ^^***/
/******vv C010100 vv******/
function swapBrowseImg(vThis,newImg){
  if(!newImg) return;
  var $this = $(vThis);
  var $parent = $this.closest("." + prodClass);
  $parent.find(".swatchSelected").removeClass("swatchSelected");
  $this.addClass("swatchSelected");
  $parent.find("img.b2c_browse").attr("src",newImg);
}
function swatchCenter(){
  $(".browseSwatchOuter").each(function(){ 
    var $this = $(this);
    var vWidth = 0;
    $this.find(".browseSwatch").each(function(){ 
      vWidth += $(this).outerWidth();
    });
    $this.width(vWidth);
  });
}

// Size filtering Mods //
var vSizeStockChecked = false;
function goFilter(fType,fValue,vThis){
  //Reset
  if (fValue=="reset"){
    browseProd = $.extend(true,{},browseProdOrig);
    if(sortDir=="ascending"||sortDir=="descending")
      submitSort(document.getElementById("sortBy"));      
    createPaging();
    curBrowsePage = 0;
    gotoPage(1);
    if(fType.toLowerCase() != "size")
      $('option[value="reset"]',document.getElementById("filters")).remove();
    else 
      deleteCookie("sbs" + vCatRecId,"/",null);
    $('select',document.getElementById("filters")).val("selectedIndex",0);
    filterOn = false;
    return;
  } 
  $("#filterWait").show();
  if(fType.toLowerCase() == "size"){
     //Size Filter
     setCookie("sbs" + vCatRecId,fValue,null,"/",null,null); /* category specific shop by size value */
     if(vSizeStockChecked == false){
      checkSizeStock(fType,fValue,vThis);
      return;
     }
     /***vv C010101 vv***/
     var vSizeArray = fValue.split(",");
     browseProd = $.extend(true,{},browseProdOrig);
     browseProd.product = $(browseProd.product).filter(function(){ 
       var vFound = false;
       $(this.size).each(function(){ 
         for(i=0;i<vSizeArray.length;i++ ){
           if(this.sizeCode==vSizeArray[i] && this.inStock == "true"){ 
            vFound = true;
            return;
           }
         }
       });
       return vFound;
     });
     /***^^ C010101 ^^***/
     if(sortDir=="ascending"||sortDir=="descending")
       submitSort(document.getElementById("sortBy"));
     createPaging();
     curBrowsePage = 0;
     filterOn = true;
     gotoPage(1);
  }
  else if(fType.toLowerCase() == "price"){
     var vPriceRange = fValue.split("-");
     $(vPriceRange).each(function(i){  vPriceRange[i] = parseFloat(vPriceRange[i]); });

     browseProd = $.extend(true,{},browseProdOrig);
     browseProd.product = $(browseProd.product).filter(function(){ 
       var vFound = false;
       if(this.product == "BREAK") { return true; } 
       if(vPriceRange.length==2){
         if(this.sortPrice>=vPriceRange[0] && this.sortPrice <=vPriceRange[1])
          vFound = true;
       }else{
         if(this.sortPrice>=vPriceRange[0])
          vFound = true;
       }
       return vFound;
     });
     $('option[value="' + fValue + '"]',vThis).attr("selected",true);
     if(breakType == "broken-lines" ){
       browseProd.product = $.grep(browseProd.product,function(vProd,i){
          var vReturn = false;
          if(vProd.product == "BREAK") { 
            for (j=0;j<browseProd.product.length;j++ ){
              if(vProd.breakDesc==browseProd.product[j].breakDesc && j!=i ){
                vReturn = true;
                j = browseProd.product.length; // force exit from loop
              }
            }
            return vReturn;
          }
          else return true;
       });
     }
     else{
       browseProd.product.sort(function(a,b){ return a.breakSort - b.breakSort });
     }
     if(sortDir=="ascending"||sortDir=="descending")
       submitSort(document.getElementById("sortBy"));
     if ($('option[value="reset"]',vThis).length <= 0 )
       $(vThis).append("<option value='reset'> reset filter</option>");
     createPaging();
     curBrowsePage = 0;
     filterOn = true;
     gotoPage(1);
  }
  else{
     //Feature Filter
     browseProd = $.extend(true,{},browseProdOrig);
     browseProd.product = $(browseProd.product).filter(function(){ 
       var vFound = false;
       var vFeatCode = fValue.substring(0,fValue.indexOf(",") );
       var vDetailCode = fValue.substring(fValue.indexOf(",")+1,fValue.length );
       $(this.prodFeat).each(function(){ 
         if (this.featCode==vFeatCode && this.featDetailCode==vDetailCode)
          vFound = true;
       });
       return vFound;
     });
     if(sortDir=="ascending"||sortDir=="descending")
       submitSort(document.getElementById("sortBy"));
     if ($('option[value="reset"]',vThis).length <= 0 )
       $(vThis).append("<option value='reset'> reset filter</option>");
     createPaging();
     curBrowsePage = 0;
     filterOn = true;
     gotoPage(1);
  }
  $("#filterWait").hide();
}
function checkSizeStock(fType,fValue,vThis){
  var paramList = new Array();
  var param = "";
  var arrayIdx = 0;
  var prodFound;
  $(browseProd.product).each(function(i){ 
    if (i==0){
      paramList[arrayIdx] = this.product;
      arrayIdx++;
    }
    else{
      prodFound = false;
      $(paramList).each(function(j){
        if (paramList[j]==browseProd.product[i].product)
          prodFound = true;
      });
      if(!prodFound){
        paramList[arrayIdx] = this.product;
        arrayIdx++;
      }
    }
  });
  $(paramList).each(function(j){
    if (j==0)
      param = paramList[j];
    else
      param += "," + paramList[j];
  });
  $.ajax({
    type: "POST",
    url: appPath + "/olc/get-size-stock.w?sponsor=" + fdmSponsor,
    data: {stylelist: param},
    dataType: "xml",
    complete: function(data) {
      var prodSizeObj = $.xmlToJSON(data.responseXML); 
      /******vv C010104 vv******/
      $(prodSizeObj.product).each(function(i){
         this.size = makeAssoc("sizeCode",this.size);
      });
      prodSizeObj.product = makeAssoc("product",prodSizeObj.product);

      var prod,size;
      for(i=0;i<browseProdOrig.product.length;i++){
        if(browseProdOrig.product[i].size){
          for(j=0;j<browseProdOrig.product[i].size.length;j++){
            prod = browseProdOrig.product[i].product;
            size = browseProdOrig.product[i].size[j].sizeCode;
            if(typeof prodSizeObj.product[prod] == "object" && prodSizeObj.product[prod].size && typeof prodSizeObj.product[prod].size[size] == "object"){
               browseProdOrig.product[i].size[j].inStock = prodSizeObj.product[prod].size[size].inStock;
            }            
          }
        }
      }
      /******^^ C010104 ^^******/
      vSizeStockChecked = true;
      goFilter(fType,fValue,vThis);
    }
  });
}

//Update Admin Input with new 'sortable' values
function saveSortVal(){
  var vSortList = "";
  var vPostArray = new Array();
  var vPostSort;
  $(".sortBreak").each(function(){
    var vTemp = $(this).sortable('toArray').toString();
    if(vSortList==""&&vTemp!="")
       vSortList = vTemp;
    else if(vSortList!=""&&vTemp!="")
      vSortList += "," + vTemp;
  });
  vPostArray = vSortList.split(",");
  $(vPostArray).each(function(i){ 
    $("input[name='" + vPostArray[i] + "Sort']").val( (i+1)*10 );
  });
}
/******^^ C010100 ^^******/
//Date Parsing Functions
var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
function LZ(x){return(x<0||x>9?"":"0")+x}
function isDate(val,format){var date=getDateFromFormat(val,format);if(date==0){return false;}return true;}
function compareDates(date1,dateformat1,date2,dateformat2){var d1=getDateFromFormat(date1,dateformat1);var d2=getDateFromFormat(date2,dateformat2);if(d1==0 || d2==0){return -1;}else if(d1 > d2){return 1;}return 0;}
function formatDate(date,format){format=format+"";var result="";var i_format=0;var c="";var token="";var y=date.getYear()+"";var M=date.getMonth()+1;var d=date.getDate();var E=date.getDay();var H=date.getHours();var m=date.getMinutes();var s=date.getSeconds();var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;var value=new Object();if(y.length < 4){y=""+(y-0+1900);}value["y"]=""+y;value["yyyy"]=y;value["yy"]=y.substring(2,4);value["M"]=M;value["MM"]=LZ(M);value["MMM"]=MONTH_NAMES[M-1];
  value["NNN"]=MONTH_NAMES[M+11];value["d"]=d;value["dd"]=LZ(d);value["E"]=DAY_NAMES[E+7];value["EE"]=DAY_NAMES[E];value["H"]=H;value["HH"]=LZ(H);if(H==0){value["h"]=12;}else if(H>12){value["h"]=H-12;}else{value["h"]=H;}value["hh"]=LZ(value["h"]);if(H>11){value["K"]=H-12;}else{value["K"]=H;}value["k"]=H+1;value["KK"]=LZ(value["K"]);value["kk"]=LZ(value["k"]);if(H > 11){value["a"]="PM";}else{value["a"]="AM";}value["m"]=m;value["mm"]=LZ(m);value["s"]=s;value["ss"]=LZ(s);
  while(i_format < format.length){c=format.charAt(i_format);token="";while((format.charAt(i_format)==c) &&(i_format < format.length)){token += format.charAt(i_format++);}if(value[token] != null){result=result + value[token];}else{result=result + token;}}return result;}
function _isInteger(val){var digits="1234567890";for(var i=0;i < val.length;i++){if(digits.indexOf(val.charAt(i))==-1){return false;}}return true;}
function _getInt(str,i,minlength,maxlength){for(var x=maxlength;x>=minlength;x--){var token=str.substring(i,i+x);if(token.length < minlength){return null;}if(_isInteger(token)){return token;}}return null;}
function getDateFromFormat(val,format){val=val+"";format=format+"";var i_val=0;var i_format=0;var c="";var token="";var token2="";var x,y;var now=new Date();var year=now.getYear();var month=now.getMonth()+1;var date=1;var hh=now.getHours();var mm=now.getMinutes();var ss=now.getSeconds();var ampm="";while(i_format < format.length){c=format.charAt(i_format);token="";while((format.charAt(i_format)==c) &&(i_format < format.length)){token += format.charAt(i_format++);}
  if(token=="yyyy" || token=="yy" || token=="y"){if(token=="yyyy"){x=4;y=4;}if(token=="yy"){x=2;y=2;}if(token=="y"){x=2;y=4;}year=_getInt(val,i_val,x,y);if(year==null){return 0;}i_val += year.length;if(year.length==2){if(year > 70){year=1900+(year-0);}else{year=2000+(year-0);}}}else if(token=="MMM"||token=="NNN"){month=0;for(var i=0;i<MONTH_NAMES.length;i++){var month_name=MONTH_NAMES[i];if(val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase())
  {if(token=="MMM"||(token=="NNN"&&i>11)){month=i+1;if(month>12){month -= 12;}i_val += month_name.length;break;}}}if((month < 1)||(month>12)){return 0;}}else if(token=="EE"||token=="E"){for(var i=0;i<DAY_NAMES.length;i++){var day_name=DAY_NAMES[i];if(val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()){i_val += day_name.length;break;}}}else if(token=="MM"||token=="M"){month=_getInt(val,i_val,token.length,2);
  if(month==null||(month<1)||(month>12)){return 0;}i_val+=month.length;}else if(token=="dd"||token=="d"){date=_getInt(val,i_val,token.length,2);if(date==null||(date<1)||(date>31)){return 0;}i_val+=date.length;}else if(token=="hh"||token=="h"){hh=_getInt(val,i_val,token.length,2);if(hh==null||(hh<1)||(hh>12)){return 0;}i_val+=hh.length;}else if(token=="HH"||token=="H"){hh=_getInt(val,i_val,token.length,2);if(hh==null||(hh<0)||(hh>23))
  {return 0;}i_val+=hh.length;}else if(token=="KK"||token=="K"){hh=_getInt(val,i_val,token.length,2);if(hh==null||(hh<0)||(hh>11)){return 0;}i_val+=hh.length;}else if(token=="kk"||token=="k"){hh=_getInt(val,i_val,token.length,2);if(hh==null||(hh<1)||(hh>24)){return 0;}i_val+=hh.length;hh--;}else if(token=="mm"||token=="m"){mm=_getInt(val,i_val,token.length,2);if(mm==null||(mm<0)||(mm>59)){return 0;}i_val+=mm.length;}else if(token=="ss"||token=="s"){ss=_getInt(val,i_val,token.length,2);
  if(ss==null||(ss<0)||(ss>59)){return 0;}i_val+=ss.length;}else if(token=="a"){if(val.substring(i_val,i_val+2).toLowerCase()=="am"){ampm="AM";}else if(val.substring(i_val,i_val+2).toLowerCase()=="pm"){ampm="PM";}else{return 0;}i_val+=2;}else{if(val.substring(i_val,i_val+token.length)!=token){return 0;}else{i_val+=token.length;}}}if(i_val != val.length){return 0;}if(month==2){if( ((year%4==0)&&(year%100 != 0) ) ||(year%400==0) ){if(date > 29){return 0;}}else{if(date > 28){return 0;}}}
  if((month==4)||(month==6)||(month==9)||(month==11)){if(date > 30){return 0;}}if(hh<12 && ampm=="PM"){hh=hh-0+12;}else if(hh>11 && ampm=="AM"){hh-=12;}var newdate=new Date(year,month-1,date,hh,mm,ss);return newdate.getTime();}
function parseDate(val){var preferEuro=(arguments.length==2)?arguments[1]:false;generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d');monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d');dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M');var checkList=new Array('generalFormats',preferEuro?'dateFirst':'monthFirst',preferEuro?'monthFirst':'dateFirst');var d=null;for(var i=0;i<checkList.length;i++)
  {var l=window[checkList[i]];for(var j=0;j<l.length;j++){d=getDateFromFormat(val,l[j]);if(d!=0){return new Date(d);}}}return null;}

/******vv C010104 vv******/
/**********
 * Simulate an associative array
 * Allows much faster merging of JSON objects by key
 * orig: products[0].product == "styleCode"
 * assoc: products["styleCode"] == copy of orig products[0]
 * so you can check: typeof products[vStyleCode] == "object" 
 */
function makeAssoc(vKey,vArr){
  if(typeof vArr == "undefined") return;
  var newKey;
  var newArr = {};
  for(var i=0; i<vArr.length; i++) { 
    newKey = vArr[i][vKey]; 
    newArr[ newKey ] = $.extend(true,{},vArr[i]); 
  }
  var size = 0, key;
  for(key in newArr){
    if (newArr.hasOwnProperty(key)) size++;
  }
  newArr.length = size;
  return newArr;
}
/******^^ C010104 ^^******/

