/*** COPYRIGHT 2009  BY CUTSEY BUSINESS SYSTEMS LTD. - ALL RIGHTS RESERVED ***/
/* browse.js -- Browse Page Javascript                                       */
/*****************************************************************************/
/*T010003 03/07/11 JJD- Remove hash from title.                              */
/*                    - Merged versions 020004 & 020005. Added condition for */
/*                      products per page.                                   */
/*T010002 02/23/11 JJD- Reset hash when using the reset filter option.       */
/*T010001 02/09/11 JJD- Set hash when using goFilter for back button issues. */
/*T010000 05/31/10 APY- Correction for size stock checking.                  */
/*****************************************************************************/
/* 020005 02/27/11 APY- Add number of products per page/category.            */
/*                    - fix for numPages when in broken-lines mode.          */
/* 020004 08/06/10 APY- browseType offset correction for lines mode.         */
/*                    - Force scroll to top of browse when switching pages.  */
/*        01/20/11 JB - IE fix for true type font distortion.                */
/*****************************************************************************/
/* 020003 02/12/10 APY- Price Filtering fixes for inline breaking.           */
/* 020002 02/04/10 APY- Add Price Filtering.                                 */
/* 020001 01/10/10 APY- inline Break fixes, paging fixes.                    */
/* 020000 11/09/09 APY- ReWriteRule,filters,tooltip, break-inline updates.   */
/* 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 vSizeStockChecked = false; /* 020000 */
var filterOn = false; /* 020000 */

//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;

var prodPerPageDef = prodPerPage; /* 020000 */

browseProdOrig = $.extend(true,{},browseProd); /* 020000 */
//========--------   Load   --------========\\
function getBrowse(){
		var vHideClass = "";
  
  if (rewriteXMLPath!="")
     XMLPath = rewriteXMLPath;

  $.ajax({
    type: "GET",
    url: XMLPath,
    dataType: "xml",
    complete: function(data) {
       var prodObj = $.xmlToJSON(data.responseXML); // Save XML in JSON
       // Extend/merge the returned JSON with the Pricing JSON
       browseProd = $.extend(true,{},prodObj,prodPriceObj); 
       //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
       createPaging();


       //Attach/override JS filtering functions (old side menu 'refine by' feature filter)
       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 (viewAllProd){
     numBrowsePages = Math.ceil(browseProd.product.length/prodPerPage);
     $(".pageNavLink",$(".pageNavAll")).html("View Pages").attr("href","javascript:gotoPage('pages');");
     /***vv 020001 vv***/
     if($(".pageNavPerPage").length==0 && perPageOpts != ""){
       pagesHTML += "<ul class='pageNav'><li class='pageNavPerPage'>";
       pagesHTML += "<select class='prodPerPage' onchange='changePerPage(this.value);'>";
       pagesHTML += "<option value=''>items per page</option>";
       for (i=0;i<perPageOpts.length;i++ ){
         pagesHTML += "<option value='" + perPageOpts[i] + "'";
         if (perPageOpts[i]==prodPerPage || (perPageOpts[i] == 'all' && viewAllProd ) )
           pagesHTML += " selected";
         pagesHTML += '>' + perPageOpts[i] + '</option>'; 
       }
       pagesHTML += "</select>";
       pagesHTML += "</li></ul>";
     }
     /***^^ 020001 ^^***/
     return;
   }
   if (browseProd.product.length > prodPerPage ){ // Only Create paging if required
     numBrowsePages = Math.ceil(browseProd.product.length/prodPerPage);
     /***vv 020005 vv***/
     if(breakType=="broken-lines"){
       var lastPageOffset = getBreakOffset(numBrowsePages);
       numBrowsePages = Math.ceil( (browseProd.product.length + lastPageOffset) / prodPerPage );
     }
     /***^^ 020005 ^^***/
     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>";	
     /******vv 020000 vv******/     
     if(perPageOpts == ""){
       pagesHTML += "<li class='pageNavSpacer'>|</li>";	
       pagesHTML += "<li class='pageNavAll'><a class='pageNavLink' href='javascript:gotoPage(\"all\");'>View All</a></li>";	
     }else{
       pagesHTML += "<li class='pageNavPerPage'>";
       pagesHTML += "<select class='prodPerPage' onchange='changePerPage(this.value);'>";
       pagesHTML += "<option value=''>items per page</option>";
       for (i=0;i<perPageOpts.length;i++ ){
         pagesHTML += "<option value='" + perPageOpts[i] + "'";
         if (perPageOpts[i]==prodPerPage || (perPageOpts[i] == 'all' && viewAllProd ) )
           pagesHTML += " selected";
         pagesHTML += '>' + perPageOpts[i] + '</option>'; 
       }
       pagesHTML += "</select>";
       pagesHTML += "</li>";
     }
     /******^^ 020000 ^^******/     
     pagesHTML += "</ul>";
     
     //For some reason can't set HTML for top and bottom in a single call for IE, it ignores selected value
     $(".pageNavWrapper").each(function(){ $(this).html(pagesHTML); });

   } // End Create Paging
   else{
     /***vv 020001 vv***/
     if(perPageOpts != "" && browseProd.product.length > prodPerPageDef){
       pagesHTML = "<ul class='pageNav'><li class='pageNavPerPage'>";
       pagesHTML += "<select class='prodPerPage' onchange='changePerPage(this.value);'>";
       pagesHTML += "<option value=''>items per page</option>";
       for (i=0;i<perPageOpts.length;i++ ){
         pagesHTML += "<option value='" + perPageOpts[i] + "'";
         if (perPageOpts[i]==prodPerPage || (perPageOpts[i] == 'all' && viewAllProd ) )
           pagesHTML += " selected";
         pagesHTML += '>' + perPageOpts[i] + '</option>'; 
       }
       pagesHTML += "</select>";
       pagesHTML += "</li></ul>";
       $(".pageNavWrapper").html(pagesHTML);
     }
     else
       $(".pageNavWrapper").html("");
     /***^^ 020001 ^^***/
   }
}
//========--------   Change Per Page   --------========\\
/******vv 020000 vv******/
function changePerPage(vPerPage){
  if(vPerPage == "") return;
  if(vPerPage != "all"){
    prodPerPage = vPerPage;
    createPaging();
    curBrowsePage = 0;
    gotoPage(1);
  }
  else
    gotoPage('all');
}
/******^^ 020000 ^^******/
function getBreakOffset(vPage){
 if(breakType=="lines") return 0; /* 020001 */ /* 020004 */
 if(typeof vPage == "undefined") vPage = curBrowsePage; /* 020005 */
 vPage = (vPage<1)?1:vPage; /* 020005 */
 vOffset = 0;
 for (i=1;i<vPage;i++){ /* 020005 */
   if(browseProd.product[ (i - 1) * prodPerPage - vOffset ] != undefined &&
      browseProd.product[ (i - 1) * prodPerPage - vOffset ].product != "BREAK")
     vOffset++;
 } 
 return vOffset;
}
/******vv 020005 vv******/
function getNumBreaks(vPage){
 //Returns the number of "BREAK" products in browseProd from the begining of array to the end of specified page 
 if(breakType=="lines") return 0; 
 if(typeof vPage == "undefined") vPage = Math.ceil(browseProd.product.length/prodPerPage); //Assume total # of breaks
 vPage = (vPage<1)?1:vPage; 
 var endProd;
 var vOffset = 0;
 var breakOffset = getBreakOffset(vPage);
 var startProd = (vPage - 1) * prodPerPage - breakOffset;
 var curOffset = (breakType=="broken-lines"&&browseProd.product[startProd].product!="BREAK")?1:0;
  
 endProd = curBrowsePage * prodPerPage - 1 - breakOffset - curOffset;
 if (endProd > browseProd.product.length - 1)
   endProd = browseProd.product.length - 1;


 for(i=startProd;i<=endProd;i++){   
   if(browseProd.product[i] != undefined && browseProd.product=="BREAK")
     vOffset++;
 }    
 return vOffset;
}
/******^^ 020005 ^^******/

//========--------   Go To Page   --------========\\
function gotoPage(newPage){
  var startProd;
  var endProd;
  var breakOffset; /* 020005 */
  var browseHTML = "";

  if(newPage=="next") newPage = curBrowsePage + 1;
  if(newPage=="prev") newPage = curBrowsePage - 1;
  if(newPage==curBrowsePage){ return; }
  if(newPage=="all" && viewAllProd==false){
    viewAllProd = true;
    curBrowsePage = 1;
    startProd = 0;
    endProd = browseProd.product.length - 1;
    prodPerPage = browseProd.product.length + 1; /* 020000 */
    createPaging(); /* 020000 */
    $("li.pageNav").addClass("navHide");
    $(".pageNavNext").addClass("navHide");
    $(".pageNavPrev").addClass("navHide");
    $(".pageNavSpacer").addClass("navHide");
    if(perPageOpts == "")     /* 020000 */
      $(".pageNavLink",$(".pageNavAll")).html("View Pages").attr("href","javascript:gotoPage('pages');");
  }
  else if(newPage=="pages" && viewAllProd==true){
    viewAllProd = false;
    prodPerPage = prodPerPageDef;
    curBrowsePage = 1;
    startProd = 0; /* 020004 */
    endProd = curBrowsePage * prodPerPage - 1;
    if (endProd > browseProd.product.length - 1)
      endProd = browseProd.product.length - 1;
    createPaging();
  }
  else if(newPage!=curBrowsePage && newPage>=1 && newPage<=numBrowsePages){
     if (viewAllProd){
       viewAllProd = false;
       createPaging();
     }
     curBrowsePage = newPage;
     breakOffset = getBreakOffset();

     startProd = (curBrowsePage - 1) * prodPerPage - breakOffset;

     if(breakType=="broken-lines"){
       if(browseProd.product[startProd].product != "BREAK")
         curOffset = 1;
       else
         curOffset = 0;
     }
     else
       curOffset = 0;
      
     endProd = curBrowsePage * prodPerPage - 1 - breakOffset - curOffset;
     if (endProd > browseProd.product.length - 1)
       endProd = browseProd.product.length - 1;
  }
  var j=0; 

  for(i=startProd;i<=endProd;i++){
     if(browseProd.product[i].product != "BREAK" && i==startProd && breakType=="broken-lines"){
       browseHTML += '<div class="inlineBreak">' + browseProd.product[i].breakDesc + '</div>';
       j++;     
     }
     browseHTML += browseProd.product[i].prodHTML; /* 010002 */ /* 020000 */
     j++;
     if(vPerRow != 0 && j != 0 && j % vPerRow == 0)
       browseHTML += '<div style="clear:both;"></div>';
  }
  
  //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'); }  /* 020004 */
      addTooltips(); 
     });  /* 020000 */
  });

  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");
  }
  prodOnPage(startProd,endProd);
}
/******vv 020005 vv******/
//Display Number of products on page and total for category
function prodOnPage(startProd,endProd){
  if(typeof vShowNumProd != "undefined" && vShowNumProd){         /* T010003 */
    var numProdHTML = "";
    var vStart = 0;
    for(i=0;i<startProd;i++){   
      if(browseProd.product[i]!=undefined && browseProd.product[i].product!="BREAK")
        vStart++;
    }  
    var vEnd = vStart;
    for(i=startProd;i<=endProd;i++){   
      if(browseProd.product[i]!=undefined && browseProd.product[i].product!="BREAK")
        vEnd++;
    }  
    var vTotal = 0;
    for(i=0;i<=browseProd.product.length;i++){   
      if(browseProd.product[i]!=undefined && browseProd.product[i].product!="BREAK")
        vTotal++;
    }  
    if(breakType!="broken-lines" || (browseProd.product[startProd].product != "BREAK" && breakType=="broken-lines")){
      vStart++;  
    }
    vStart=(vStart==0&&vTotal>0&&vEnd>0)?1:vStart;
    if(!$(".prodOnPage").length){ $(".pageNavWrapper").prepend("<div class='prodOnPage'></div>"); }
    numProdHTML = "<span class='prodOnPageNum'>" + vStart + "</span> - ";
    numProdHTML += "<span class='prodOnPageNum'>" + vEnd + "</span>";
    numProdHTML += " of <span class='prodOnPageNum'>" + vTotal + "</span>";
    numProdHTML += "<span class='pagesLabel'>" + vBrowsePagesLabel + "</span>";
    $(".prodOnPage").html(numProdHTML);
  }
}
/******^^ 020005 ^^******/
//========--------   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++){
     browseHTML += browseProd.product[i].prodHTML; /* 010002 */ /* 020000 */
     if(vPerRow != 0 && (i+1) % vPerRow == 0)
       browseHTML += '<div style="clear:both;"></div>';
  }
  //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(){ addTooltips(); });  /* 020000 */
  });

  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   --------========\\
//Old static filtering method - no longer used
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 020000 vv******/
//========--------   Feature Filtering   --------========\\
// Need filterList Object to recreate select box after selection is made.
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);
    $('option[value="reset"]',document.getElementById("filters")).remove();
    $('select',document.getElementById("filters")).val("selectedIndex",0);
    filterOn = false;
    window.location.hash = "";                                    /* T010002 */
    return;
  } 
  if(fType.toLowerCase() == "size"){
     //Size Filter
     if(checkStock && vSizeStockChecked == false){
      checkSizeStock(fType,fValue,vThis);
      return;
     }
     browseProd = $.extend(true,{},browseProdOrig);
     browseProd.product = $(browseProd.product).filter(function(){ 
       var vFound = false;
       $(this.size).each(function(){ 
         if (this.sizeCode==fValue && this.inStock)
          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);
  }
  else if(fType.toLowerCase() == "price"){
     //price Filter  - 020002
     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; } /* 020003 */
       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;
     });
     /***vv 020003 vv***/
     $('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 });
     }
     /***^^ 020003 ^^***/
     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);
  }
  updateFilterHash(); /* T010001 */
}

/******v T010001 v******/

function updateFilterHash() {
  var newHash = "#";
  var filterVal = "";
  $.each(filterTypes,function(i) { // filterTypes defined in retail-browse.w
    filterVal = $("select[name=" + filterTypes[i] + "]").val();
    if (filterVal!="") {
      if (newHash=="#") newHash += filterTypes[i] + "+" + filterVal;
      else newHash += "_" + filterTypes[i] + "+" + filterVal;
    }
  });
  window.location.hash = newHash;
  var newTitle = document.title.split("#");                       /* T010003 */
  document.title = newTitle[0];                                   /* T010003 */
}

/******^ T010001 ^******/

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: siteContent.appPath + "/olc/get-size-stock.w?sponsor=" + siteContent.fdmSponsor,
    data: {stylelist: param},
    dataType: "xml",
    complete: function(data) {
      var prodSizeObj = $.xmlToJSON(data.responseXML); 
      $(browseProdOrig.product).each(function(i){ 
        $(browseProdOrig.product[i].size).each(function(j){
          $(prodSizeObj.prodSize).each(function(k){
             if(browseProdOrig.product[i].product == this.product && 
                browseProdOrig.product[i].colorCode == this.colorCode &&
                browseProdOrig.product[i].size[j].sizeCode == this.sizeCode)
             browseProdOrig.product[i].size[j].inStock = this.inStock == "true" ? true : false; /* T010000 */
          });
        });
      });
      vSizeStockChecked = true;
      goFilter(fType,fValue,vThis);
    }
  });
}

var showSizeChart=false;
function sizeChart(){
 if(!showSizeChart){
  document.getElementById("sizeChart").className="sizeChartDisplay";
  var vX=findPosX(document.getElementById("sizeChartImg"))+20;
  var vY=findPosY(document.getElementById("sizeChartImg"))+30;
  document.getElementById("sizeChart").style.left=vX;
  document.getElementById("sizeChart").style.top=vY;
  showSizeChart=true;
 }
 else if(showSizeChart){
  document.getElementById("sizeChart").className="sizeChartDefault";
  showSizeChart=false;
 }
}


function addTooltips(){

  var vTipSelector;
  for (i=0;i<browseProd.product.length;i++ ){
   if(browseProd.product[i].prodTip != ""){
      vTipSelector = "#" + browseProd.product[i].product + browseProd.product[i].colorCode;
     $(vTipSelector).data('tipCopy',browseProd.product[i].prodTip)
                    .tooltip({ tip: '#tooltip',
                               effect: 'slide',
                               events: {  
                                 def: "mouseenter,mouseleave", //  for an element  
                                 input: "focus,blur", // for all input elements  
                                 widget: "focus mouseover,blur mouseout", // select, checkbox, radio, button  
                                 tooltip: "mouseenter,mouseleave" // the tooltip element  
                               }, 
                               predelay: 250,
                               offset: [100,20],
                               onBeforeShow: function(){ 
                                  var vToolTip = this.getTrigger().data('tipCopy');
                                  $("#tooltip").html( vToolTip ); 
                               }
     });
   }
  }
}
/***vv 020002 vv***/
function drawPriceFilter(){

  var vFilterList = vPriceFilters.split(",");
  if(vFilterList.length==0||vPriceFilters=="") return;
  var vHTML = '<select class="browseFilter" id="priceFilter" onchange="if(this.value!=\'\')goFilter(\'price\',this.value,this)">'; /* 020003 */
  vHTML +=  '<option class="selectTitle" value="" selected>Price Range</option>';
  for (i=0;i<vFilterList.length;i++ ){ 
    var vPriceRange = vFilterList[i].split("-");
    var vFound = false;
    $(browseProd.product).each(function(){
       if(vPriceRange.length==2){
         if(this.sortPrice>=vPriceRange[0] && this.sortPrice<=vPriceRange[1])
           vFound = true;
       }else{
         if(this.sortPrice>=vPriceRange[0])
           vFound = true;
       }
       if(vFound) return vFound; 
    });
    if(vFound){      
      vHTML +=  "<option value='" + vFilterList[i] + "'";
      if(vFilterList[i]==vPriceFilterValue)
       vHTML += " selected ";
      vHTML += ">";
      if(vPriceRange.length==2 && vPriceRange[0] == 0)
        vHTML += vPriceRange[1] + " and under";
      else if(vPriceRange.length==1)
        vHTML += vFilterList[i] + " and up";
      else
        vHTML += vFilterList[i];
      vHTML += "</option>";
    }
  }
  vHTML += '</select>';

  var $filters = $("#filters");
  if ($filters.html()=="")
   vHTML = "Filter By: " + vHTML;  
  $filters.append(vHTML);
  if(vPriceFilterValue!=""){
   browseProdOrig.product.sort(function(a,b){ return a.sortPrice - b.sortPrice });
   goFilter('price',vPriceFilterValue,document.getElementById('priceFilter'));
  }
}
/***^^ 020002 ^^***/
$(document).ready(function(){ 
  browseProd.product.sort(function(a,b){ return a.sort - b.sort });
  /***vv 020000 vv***/
  if(breakType=="broken-lines"){
    browseProd.product.sort(function(a,b){ return a.breakSort - b.breakSort });
    vLastBreak = "";
    for (i=0;i<browseProd.product.length;i++ ){
       if(browseProd.product[i].breakDesc != vLastBreak){
         vLastBreak = browseProd.product[i].breakDesc;
         tmpProduct = { prodHTML : '<div class="inlineBreak">' + vLastBreak + '</div>',
                        breakDesc : browseProd.product[i].breakDesc,
                        breakSort : browseProd.product[i].breakSort,
                        sort : browseProd.product[i].sort,
                        prodTip : "",
                        product : 'BREAK' };
         browseProd.product.splice(i,0,tmpProduct);
       }
    }
    browseProdOrig = $.extend(true,{},browseProd); 
    createPaging();
  }
  /***^^ 020000 ^^***/
  drawPriceFilter(); /* 020002 */
  /***vv 020003 vv***/
  var vFilterList = vPriceFilters.split(",");
  if(vFilterList.length>0&&vPriceFilters!="")
   $(".fdm4sidemenu a[rel]").each(function(){    
     $(this).attr("href","javascript:goFilter('price','" + $(this).attr("rel") + "',document.getElementById('priceFilter'));");
   });
  /***^^ 020003 ^^***/
  /******vv 020005 vv******/
  var curOffset = 0;
  var startProd = 0;
  if(breakType=="broken-lines"){
    if(browseProd.product[startProd] && browseProd.product[startProd].product != "BREAK")
      curOffset = 1;
    else
      curOffset = 0;
  }
  var endProd = curBrowsePage * prodPerPage - 1 - curOffset;
  prodOnPage(startProd,endProd);
  /******^^ 020005 ^^******/
  addTooltips();
  $("#sizeChartLink").attr("href","javascript:sizeChart();");
});

/* jquery.tools 1.1.2 - The missing UI library for the Web
 * [tools.tooltip-1.1.3, tools.tooltip.slide-1.0.0, tools.tooltip.dynamic-1.0.1]
 * Copyright (c) 2009 Tero Piirainen
 * http://flowplayer.org/tools/
 * Dual licensed under MIT and GPL 2+ licenses
 * http://www.opensource.org/licenses
 */
(function($) { 

	var instances = [];
	
	// static constructs
	$.tools = $.tools || {};
	
	$.tools.tooltip = {
		version: '1.1.3',
		
		conf: { 
			
			// default effect variables
			effect: 'toggle',			
			fadeOutSpeed: "fast",
			tip: null,
			
			predelay: 0,
			delay: 30,
			opacity: 1,			
			lazy: undefined,
			
			// 'top', 'bottom', 'right', 'left', 'center'
			position: ['top', 'center'], 
			offset: [0, 0],			
			cancelDefault: true,
			relative: false,
			oneInstance: true,
			
			
			// type to event mapping 
			events: {
				def: 			"mouseover,mouseout",
				input: 		"focus,blur",
				widget:		"focus mouseover,blur mouseout",
				tooltip:		"mouseover,mouseout"
			},			
			
			api: false
		},
		
		addEffect: function(name, loadFn, hideFn) {
			effects[name] = [loadFn, hideFn];	
		} 
	};
	
	
	var effects = { 
		toggle: [ 
			function(done) { 
				var conf = this.getConf(), tip = this.getTip(), o = conf.opacity;
				if (o < 1) { tip.css({opacity: o}); }
				tip.show();
				done.call();
			},
			
			function(done) { 
				this.getTip().hide();
				done.call();
			} 
		],
		
		fade: [
			function(done) { this.getTip().fadeIn(this.getConf().fadeInSpeed, done); },  
			function(done) { this.getTip().fadeOut(this.getConf().fadeOutSpeed, done); } 
		]		
	};   

	function Tooltip(trigger, conf) {

		var self = this, $self = $(this);
		
		trigger.data("tooltip", self);
		
		// find the tip
		var tip = trigger.next();
		
		if (conf.tip) {
			
			tip = $(conf.tip);
			
			// multiple tip elements
			if (tip.length > 1) {
				
				// find sibling
				tip = trigger.nextAll(conf.tip).eq(0);	
				
				// find sibling from the parent element
				if (!tip.length) {
					tip = trigger.parent().nextAll(conf.tip).eq(0);
				}
			} 
		} 				
		
		/* calculate tip position relative to the trigger */  	
		function getPosition(e) {	
			
			// get origin top/left position 
			var top = conf.relative ? trigger.position().top : trigger.offset().top, 
				 left = conf.relative ? trigger.position().left : trigger.offset().left,
				 pos = conf.position[0];

			top  -= tip.outerHeight() - conf.offset[0];
			left += trigger.outerWidth() + conf.offset[1];
			
			// adjust Y		
			var height = tip.outerHeight() + trigger.outerHeight();
			if (pos == 'center') 	{ top += height / 2; }
			if (pos == 'bottom') 	{ top += height; }
			
			// adjust X
			pos = conf.position[1]; 	
			var width = tip.outerWidth() + trigger.outerWidth();
			if (pos == 'center') 	{ left -= width / 2; }
			if (pos == 'left')   	{ left -= width; }	 
			
			return {top: top, left: left};
		}		

		
		// event management
		var isInput = trigger.is(":input"), 
			 isWidget = isInput && trigger.is(":checkbox, :radio, select, :button"),			
			 type = trigger.attr("type"),
			 evt = conf.events[type] || conf.events[isInput ? (isWidget ? 'widget' : 'input') : 'def']; 
		
		evt = evt.split(/,\s*/); 
		if (evt.length != 2) { throw "Tooltip: bad events configuration for " + type; }
				
		trigger.bind(evt[0], function(e) {
			
			// close all instances
			if (conf.oneInstance) {
				$.each(instances, function()  {
					this.hide();		
				});
			}
				
			// see if the tip was launched by this trigger
			var t = tip.data("trigger");			
			if (t && t[0] != this) { tip.hide().stop(true, true); }			
			
			e.target = this;
			self.show(e); 
			
			// tooltip close events
			evt = conf.events.tooltip.split(/,\s*/);
			tip.bind(evt[0], function() { self.show(e); });
			if (evt[1]) { tip.bind(evt[1], function() { self.hide(e); }); }
			
		});
		
		trigger.bind(evt[1], function(e) {
			self.hide(e); 
		});
		
		// ensure that the tip really shows up. IE cannot catch up with this.
		if (!$.browser.msie && !isInput && !conf.predelay) {
			trigger.mousemove(function()  {					
				if (!self.isShown()) {
					trigger.triggerHandler("mouseover");	
				}
			});
		}

		// avoid "black box" bug in IE with PNG background images
		if (conf.opacity < 1) {
			tip.css("opacity", conf.opacity);		
		}
		
		var pretimer = 0, title = trigger.attr("title");
		
		if (title && conf.cancelDefault) { 
			trigger.removeAttr("title");
			trigger.data("title", title);			
		}						
		
		$.extend(self, {
				
			show: function(e) {
				
				if (e) { trigger = $(e.target); }				

				clearTimeout(tip.data("timer"));					

				if (tip.is(":animated") || tip.is(":visible")) { return self; }
				
				function show() {
					
					// remember the trigger element for this tip
					tip.data("trigger", trigger);
					
					// get position
					var pos = getPosition(e);					
					
					// title attribute					
					if (conf.tip && title) {
						tip.html(trigger.data("title"));
					} 				
					
					// onBeforeShow
					e = e || $.Event();
					e.type = "onBeforeShow";
					$self.trigger(e, [pos]);				
					if (e.isDefaultPrevented()) { return self; }
			
					
					// onBeforeShow may have altered the configuration
					pos = getPosition(e);
					
					// set position
					tip.css({position:'absolute', top: pos.top, left: pos.left});					
					
					// invoke effect
					var eff = effects[conf.effect];
					if (!eff) { throw "Nonexistent effect \"" + conf.effect + "\""; }
					
					eff[0].call(self, function() {
						e.type = "onShow";
						$self.trigger(e);			
					});					
					
				}
				
				if (conf.predelay) {
					clearTimeout(pretimer);
					pretimer = setTimeout(show, conf.predelay);	
					
				} else {
					show();	
				}
				
				return self;
			},
			
			hide: function(e) {

				clearTimeout(tip.data("timer"));
				clearTimeout(pretimer);
				
				if (!tip.is(":visible")) { return; }
				
				function hide() {
					
					// onBeforeHide
					e = e || $.Event();
					e.type = "onBeforeHide";
					$self.trigger(e);				
					if (e.isDefaultPrevented()) { return; }
					
					effects[conf.effect][1].call(self, function() {
						e.type = "onHide";
						$self.trigger(e);		
					});
				}
				 
				if (conf.delay && e) {
					tip.data("timer", setTimeout(hide, conf.delay));
					
				} else {
					hide();	
				}			
				
				return self;
			},
			
			isShown: function() {
				return tip.is(":visible, :animated");	
			},
				
			getConf: function() {
				return conf;	
			},
				
			getTip: function() {
				return tip;	
			},
			
			getTrigger: function() {
				return trigger;	
			},
			
			// callback functions			
			bind: function(name, fn) {
				$self.bind(name, fn);
				return self;	
			},
			
			onHide: function(fn) {
				return this.bind("onHide", fn);
			},

			onBeforeShow: function(fn) {
				return this.bind("onBeforeShow", fn);
			},
			
			onShow: function(fn) {
				return this.bind("onShow", fn);
			},
			
			onBeforeHide: function(fn) {
				return this.bind("onBeforeHide", fn);
			},

			unbind: function(name) {
				$self.unbind(name);
				return self;	
			}			

		});		

		// bind all callbacks from configuration
		$.each(conf, function(name, fn) {
			if ($.isFunction(fn)) { self.bind(name, fn); }
		}); 		
		
	}
		
	
	// jQuery plugin implementation
	$.prototype.tooltip = function(conf) {
		
		// return existing instance
		var api = this.eq(typeof conf == 'number' ? conf : 0).data("tooltip");
		if (api) { return api; }
		
		// setup options
		var globals = $.extend(true, {}, $.tools.tooltip.conf);		
		
		if ($.isFunction(conf)) {
			conf = {onBeforeShow: conf};
			
		} else if (typeof conf == 'string') {
			conf = {tip: conf};	
		}

		conf = $.extend(true, globals, conf);
		
		// can also be given as string
		if (typeof conf.position == 'string') {
			conf.position = conf.position.split(/,?\s/);	
		}
		
		// assign tip's only when apiement is being mouseovered		
		if (conf.lazy !== false && (conf.lazy === true || this.length > 20)) {	
				
			this.one("mouseover", function(e) {	
				api = new Tooltip($(this), conf);
				api.show(e);
				instances.push(api);
			}); 
			
		} else {
			
			// install tooltip for each entry in jQuery object
			this.each(function() {
				api = new Tooltip($(this), conf); 
				instances.push(api);
			});
		} 

		return conf.api ? api: this;		
		
	};
		
}) (jQuery);
/*************************************************/
(function($) { 

	// version number
	var t = $.tools.tooltip;
	t.plugins = t.plugins || {};
	
	t.plugins.dynamic = {
		version: '1.0.1',
	
		conf: {
			api: false,
			classNames: "top right bottom left"
		}
	};
		
	/* 
	 * See if element is on the viewport. Returns an boolean array specifying which
	 * edges are hidden. Edges are in following order:
	 * 
	 * [top, right, bottom, left]
	 * 
	 * For example following return value means that top and right edges are hidden
	 * 
	 * [true, true, false, false]
	 * 
	 */
	function getCropping(el) {
		
		var w = $(window); 
		var right = w.width() + w.scrollLeft();
		var bottom = w.height() + w.scrollTop();		
		
		return [
			el.offset().top <= w.scrollTop(), 						// top
			right <= el.offset().left + el.width(),				// right
			bottom <= el.offset().top + el.height(),			// bottom
			w.scrollLeft() >= el.offset().left 					// left
		]; 
	}
	
	/*
		Returns true if all edges of an element are on viewport. false if not
		
		@param crop the cropping array returned by getCropping function
	 */
	function isVisible(crop) {
		var i = crop.length;
		while (i--) {
			if (crop[i]) { return false; }	
		}
		return true;
	}
	
	// scrollable mousewheel implementation
	$.fn.dynamic = function(conf) {
		
		var globals = $.extend({}, t.plugins.dynamic.conf), ret;
		if (typeof conf == 'number') { conf = {speed: conf}; }
		conf = $.extend(globals, conf);
		
		var cls = conf.classNames.split(/\s/), orig;	
			
		this.each(function() {		
				
			if ($(this).tooltip().jquery)  {
				throw "Lazy feature not supported by dynamic plugin. set lazy: false for tooltip";	
			}
				
			var api = $(this).tooltip().onBeforeShow(function(e, pos) {				

				// get nessessary variables
				var tip = this.getTip(), tipConf = this.getConf();  

				/*
					We store the original configuration and use it to restore back to the original state.
				*/					
				if (!orig) {
					orig = [
						tipConf.position[0], 
						tipConf.position[1], 
						tipConf.offset[0], 
						tipConf.offset[1], 
						$.extend({}, tipConf)
					];
				}
				
				/*
					display tip in it's default position and by setting visibility to hidden.
					this way we can check whether it will be on the viewport
				*/
				$.extend(tipConf, orig[4]);
				tipConf.position = [orig[0], orig[1]];
				tipConf.offset = [orig[2], orig[3]];
				
				tip.css({
					visibility: 'hidden',
					position: 'absolute',
					top: pos.top,
					left: pos.left
					
				}).show(); 
				
				// now let's see for hidden edges
				var crop = getCropping(tip);		
								
				// possibly alter the configuration
				if (!isVisible(crop)) {
					
					// change the position and add class
					if (crop[2]) { $.extend(tipConf, conf.top);		tipConf.position[0] = 'top'; 		tip.addClass(cls[0]); }
					if (crop[3]) { $.extend(tipConf, conf.right);	tipConf.position[1] = 'right'; 	tip.addClass(cls[1]); }					
					if (crop[0]) { $.extend(tipConf, conf.bottom); 	tipConf.position[0] = 'bottom';	tip.addClass(cls[2]); } 
					if (crop[1]) { $.extend(tipConf, conf.left);		tipConf.position[1] = 'left'; 	tip.addClass(cls[3]); }					
					
					// vertical offset
					if (crop[0] || crop[2]) { tipConf.offset[0] *= -1; }
					
					// horizontal offset
					if (crop[1] || crop[3]) { tipConf.offset[1] *= -1; }
				}  
				
				tip.css({visibility: 'visible'}).hide();
		
			});
			
			// restore positioning
			api.onShow(function() {
				var c = this.getConf(), tip = this.getTip();				
				c.position = [orig[0], orig[1]];
				c.offset = [orig[2], orig[3]];				
			});
			
			// remove custom class names and restore original effect
			api.onHide(function() {
				var tip = this.getTip(); 
				tip.removeClass(conf.classNames);
			});
				
			ret = api;
			
		});
		
		return conf.api ? ret : this;
	};	
	
}) (jQuery);

/*************************************************/
(function($) { 

	// version number
	var t = $.tools.tooltip;
	t.effects = t.effects || {};
	t.effects.slide = {version: '1.0.0'}; 
		
	// extend global configuragion with effect specific defaults
	$.extend(t.conf, { 
		direction: 'up', // down, left, right 
		bounce: false,
		slideOffset: 10,
		slideInSpeed: 200,
		slideOutSpeed: 200, 
		slideFade: !$.browser.msie
	});			
	
	// directions for slide effect
	var dirs = {
		up: ['-', 'top'],
		down: ['+', 'top'],
		left: ['-', 'left'],
		right: ['+', 'left']
	};
	
	/* default effect: "slide"  */
	$.tools.tooltip.addEffect("slide", 
		
		// show effect
		function(done) { 

			// variables
			var conf = this.getConf(), 
				 tip = this.getTip(),
				 params = conf.slideFade ? {opacity: conf.opacity} : {}, 
				 dir = dirs[conf.direction] || dirs.up;

			// direction			
			params[dir[1]] = dir[0] +'='+ conf.slideOffset;
			
			// perform animation
			if (conf.slideFade) { tip.css({opacity:0}); }
			tip.show().animate(params, conf.slideInSpeed, done); 
		}, 
		
		// hide effect
		function(done) {
			
			// variables
			var conf = this.getConf(), 
				 offset = conf.slideOffset,
				 params = conf.slideFade ? {opacity: 0} : {}, 
				 dir = dirs[conf.direction] || dirs.up;
			
			// direction
			var sign = "" + dir[0];
			if (conf.bounce) { sign = sign == '+' ? '-' : '+'; }			
			params[dir[1]] = sign +'='+ offset;			
			
			// perform animation
			this.getTip().animate(params, conf.slideOutSpeed, function()  {
				$(this).hide();
				done.call();		
			});
		}
	);  
	
})(jQuery);	
		
/***^^ 020000 ^^***/

