var _isAjaxOnHash = false;
var _isHashLoaded = false;
$(document).ready(function(){
    if (jQuery.isFunction( $.historyInit )) {
      // Initialize history plugin.
      // The callback is called at once by present location.hash. 
      $.historyInit(ajaxOnHash);
    }
  
    $(".browseTabs .tab").click( function(e) {
        $(".browseTabs .tab:not(this)").removeClass("on");
        $(this).addClass("on");
    })
    initBrowsePanel();
})

// ajaxOnHash function
// This function is called when:
// 1. after calling $.historyInit();
// 2. after calling $.historyLoad();
// 3. after pushing "Go Back" button of a browser

function canRequest() {
  var lastbaurl = $.cookie("lastbaurl");
  if (lastbaurl == null) {
    return true;
  }
  return lastbaurl != "dv";
}   
    
function ajaxOnHash(hash) {
  try {
    if(hash == null || hash.length == 0) {
      // if empty and isAjaxOnHash is present
      // -> should refresh -> reload 
      if (window._isAjaxOnHash) {
        window._isAjaxOnHash = false;
        var c = canRequest();
        // delete last browse ajax
        $.cookie("lastbaurl", null, { path: "/", domain: "yesasia.com" });
        if (c) {
          window.location.reload();
        }
      }
      return;
    }
        
    if (window._isHashLoaded) {
      return;
    }
    
    var entries = hash.split(/\&/);
    var filterMap=new Array();
    for (i = 0; i < entries.length; i++) {
      e = entries[i];
      if (!e) {
        continue;
      }
      var keyValues = e.split("=");
      if (keyValues.length != 2) {
        continue;
      }
      var key = keyValues[0];
      var values = keyValues[1].split(",");
      var a = new Array();
      a.push(key);
      for (j = 0; j < values.length; j++) {
        if (values[j] != null && values[j].length > 0) {
          if (key == "q" || key == "shid") {
              a.push(decodeQuery(values[j]));
          } else {
              a.push(values[j]);
          }
        }
      }
      filterMap.push(a);
    }
  
    if (filterMap.length == 0) {
      return;
    }  
    
    // TODO: hardcoded the fom name
    window.fom = filterMap;
    
    if (canRequest()) {
      var c = $(".triggerAjaxReload").get(0).onclick;
      c.call();
    }
    
    // XXX: should update only if success
    saveCurrentWindowLocationHrefToCookie();
    
    window._isAjaxOnHash = true;
  } finally {
    window._isHashLoaded = false;
  }
}

// to be called after ajax as well
function initBrowsePanel(e) {
	var target=e? e:".browsePanel";
    $(target).find("ul.option>li>a:not(.disable)").click(function(){
        clickFilterOption($(this));
    })
    $(target).find("a.empty").click(function(){
        clickClear($(this));
    })  
    $(target).find("ul.section li a").click(function(){
        $(".browsePanel ul.section li a.on").removeClass("on")
        $(this).addClass("on")
    })
    $(target).find("ul.category li a").click(function(){
        $(this).parent("li").siblings("li").children("a.on").removeClass("on")
        $(this).addClass("on")
    })
    if (document.all && self.panelHeight) panelHeight();
    if (document.getElementById("reviews")) {addShowMenu("#reviews");}
}

function clickFilterOption(e) {
  e.toggleClass("on");
  if (e.parent("li").parent("ul").children("li").children("a.on").length) {
      e.parent("li").parent("ul").siblings("a.empty").show("fast");
  } else {
      e.parent("li").parent("ul").siblings("a.empty").hide("fast");
  }
}

function clickClear(e) {
  e.siblings("ul").children("li").children("a").removeClass("on");
  e.hide("fast");
}

function toggleEditions(e) {
    $(e).siblings(".ovlist").each(function(){
        togglePart(this,e);
    })
}

function showEditions(e){
	$(e).siblings(".ovlist").each(function(){
		togglePart(this,e);
	})		
	showContent('/panel/otheredition/OtherEdition.html',e.nextSibling);
}

function triggerLoading(loadarea){  
    var nW = $(loadarea).width();
    var nH = $(loadarea).height();
    var pos = nH < 5 ? "static":"absolute";
    nW = nW < 1 ? "100%":nW;
    nH = nH < 5 ? "auto":nH;
    $("#triggerloading").css({position:pos,width:nW,height:nH,display:"block"});
}

function closeLoading(){
    $("#triggerloading").css({display:"none"});
}
/*
function triggerLoading(loadarea,loading){	
	if (!$(loadarea).children(".triggerLoading").length) {	
  		$(loadarea).prepend("<div class=\"triggerLoading\">"+loading+"</div>");  	
  		$(loadarea).eq(0).each(function(){
  			var nW = this.offsetWidth+"px";
  			var nH = this.offsetHeight+"px";
  			if (this.offsetHeight < 5 ) {
  				$(loadarea).children(".triggerLoading").css("position","static");
  				nH = "auto";
	  		}
			$(loadarea).children(".triggerLoading").css({width:nW,height:nH});		
		})
	}
}*/

// update the filter options
// var filterOptionMap = new Array();
// filterOptionMap[0] = new Array(key, val 1, val 2, val 3, ...);

function clearallbrowsepanelfilters(filterOptionMap) {
  $(".browsePanel a.empty:visible").each(function(){
    clickClear($(this));
    $(this).parent().siblings(".filterkey").each(function() {
      b(filterOptionMap, $(this).html(), null, false, true, false);
    })
  })  
   
  $(".browsePanel ul.option>li>a[class=on]").each(function(){
      clickFilterOption($(this));
  })
}

function b(filterOptionMap, key, value, addOrRemove, removeAll, uniqueValue) {
  // dirty: page num key value hardcoded here
  // reset page num for non page num filter updated
  /*
  if (key != "pageNum") {
    b(filterOptionMap, "pageNum", value, addOrRemove, true, uniqueValue);
  }*/
  if (key != "pn") {
    b(filterOptionMap, "pn", value, addOrRemove, true, uniqueValue);
  }
  
  if (removeAll) {
    for (i = 0; i < filterOptionMap.length; i++) {
      if (filterOptionMap[i][0] == key) {
        filterOptionMap.splice(i, 1);
        return;
      }
    }
    return;
  }

  valArr = findByKey(filterOptionMap, key);
  if (addOrRemove) {
    if (valArr != null) {
      if (!uniqueValue) {
        for (i = 1; i < valArr.length; i++) {
          if (valArr[i] == value) {
              return;
          }
        }
      } else {
        // remove all but the key
        valArr.splice(1, valArr.length - 1);
      }
      valArr.push(value);
    } else {
      newValArr = new Array(key, value);
      filterOptionMap.push(newValArr);
    }
  } else {
    if (valArr != null) {
      for (i = 1; i < valArr.length; i++) {
        if (valArr[i] == value) {
          valArr.splice(i, 1);
          break;
        }
      }
    }
  }
}


function findByKey(filterOptionMap, key) {
  for (var i = 0; i < filterOptionMap.length; i++) {
    if (filterOptionMap[i][0] == key) {
      return filterOptionMap[i];
    }
  }
  return null;
}

function generateQueryString(filterOptionMap, valueSeparator) {
  var query = "";
  for (var i = 0; i < filterOptionMap.length; i++) {
    val = filterOptionMap[i];
    if (val.length <= 1) {
      continue;
    }
    query += "&";
    query += val[0];
    query += "=";
    for (var j = 1; j < val.length; j++) {
      if (j > 1) {
        query += valueSeparator;
      }
      if (val[0] == "q" || val[0] == "shid") {
        query += encodeQuery(val[j]);
      } else {
        query += val[j];
      }
    }
  }
  return query;
}


var _ESCAPE_MAPPINGS = new Array();
_ESCAPE_MAPPINGS[0] = new Array("-", ">>>");
_ESCAPE_MAPPINGS[1] = new Array("_", "@@@");
//_ESCAPE_MAPPINGS[2] = new Array("!", "```");
_ESCAPE_MAPPINGS[2] = new Array(".", "```");
_ESCAPE_MAPPINGS[3] = new Array(",", "~~~");

_ESCAPE_MAPPINGS[4] = new Array("&", "<<<");
_ESCAPE_MAPPINGS[5] = new Array("=", ";;;");
_ESCAPE_MAPPINGS[6] = new Array("?", "><>");

function encodeQuery(str) {
  var eStr = encodeURI(str);
  for (var i = 0; i < _ESCAPE_MAPPINGS.length; i++) {
    eStr = eStr.replace(_ESCAPE_MAPPINGS[i][0], _ESCAPE_MAPPINGS[i][1]);
  }
  return eStr;
}

function decodeQuery(str) {
  var dStr = decodeURI(str);
  for (var i = 0; i < _ESCAPE_MAPPINGS.length; i++) {
    dStr = dStr.replace(_ESCAPE_MAPPINGS[i][1], _ESCAPE_MAPPINGS[i][0]);
  }
  return dStr;
}

function triggerFilter2(currentCount, wicketAjaxFunc, BROWSE_FILTER_TRIGGER, delayInMs) {
  setTimeout(function() { 
    if (currentCount == BROWSE_FILTER_TRIGGER.count) { 
      var h = generateQueryString(window.fom, ',');
      window._isHashLoaded = true;
      window._isAjaxOnHash = true;
      if (jQuery.browser.msie || window.IS_CS) {
        $.historyLoad(h);
      } else {
        $.historyAddHistory2(h);
      }
      eval(wicketAjaxFunc); 
    } 
  }, delayInMs);
}

function triggerFilter3(currentCount, wicketAjaxUrlPrefix, BROWSE_FILTER_TRIGGER, delayInMs) {
  //setTimeout(function() { 
    //if (currentCount == BROWSE_FILTER_TRIGGER.count) { 
      var h = generateQueryString(window.fom, ',');
      window._isHashLoaded = true;
      window._isAjaxOnHash = true;
      if (jQuery.browser.msie || window.IS_CS) {
        $.historyLoad(h);
      } else {
        $.historyAddHistory2(h);
      }
      
      // XXX: should update only if success
      saveCurrentWindowLocationHrefToCookie();
      
      //eval(wicketAjaxFunc); 
      //wicketAjaxGet(wicketAjaxUrlPrefix + h, null , function() { showAjaxError(); }.bind(this));
      wicketAjaxGet(wicketAjaxUrlPrefix + h, function() { closeLoading(); }.bind(this) , function() { showAjaxError(); }.bind(this));
      
      if (navigator.userAgent.indexOf("Windows 98") >= 0) {
        // fix for windows 98 never end
        setTimeout(function() {
          window.focus();
        }, 2000);
        setTimeout(function() {
          window.focus();
        }, 5000);
        setTimeout(function() {
          window.focus();
        }, 8000);
        setTimeout(function() {
          window.focus();
        }, 13000);
        setTimeout(function() {
          window.focus();
        }, 18000);
        setTimeout(function() {
          window.focus();
        }, 23000);
        setTimeout(function() {
          window.focus();
        }, 30000);
        setTimeout(function() {
          window.focus();
        }, 40000);
        setTimeout(function() {
          window.focus();
        }, 50000);
        setTimeout(function() {
          window.focus();
        }, 60000);
      }
      
      
    //} 
  //}, delayInMs);
}

function doWicketAjax(wicketAjaxUrlPrefix) {
/*
  wicketAjaxGet('../../../?wicket:interface=:6:contentBlock:panel.browsepanel:contents:2:content:container:filterPanels:0:filterPanel:container:content:filterOptions:filters:2::IActivePageBehaviorListener:0:3&wicket:ignoreIfNotActive=true' + generateQueryString(fom, ','), 
    null , function() { showAjaxError(); }.bind(this));
    */
 wicketAjaxGet(wicketAjaxUrlPrefix + generateQueryString(window.fom, ','), 
    null , function() { showAjaxError(); }.bind(this));
}

function saveCurrentWindowLocationHrefToCookie() {
  // XXX: should update only if success
  // XXX: refactor to have common func to write cookie by js
  //$.cookie("lasturl", window.location.href, { path: "/", domain: "yesasia.com" });
  var _h = window.location.href;
  //if (_h.indexOf("shid") < 0) {
    $.cookie("lastbaurl", _h, { path: "/", domain: "yesasia.com" });
  //}
  //alert('finish writing... : ' + window.location.href + ' . .... ' + $.cookie("lastbaurl"));
}

function updateCompareCookie(cookieName, chkBox, spearator, prodId, maxProdCount, path, domain){
    if (chkBox.checked) {
        appendProdIdToCompareCookie(cookieName, spearator, prodId, path, domain);
    } else {
        removeProdIdFromCompareCookie(cookieName, spearator, prodId, path, domain);
    }
    
    if (countProdIdInCompareCookie(cookieName, spearator) >= maxProdCount) {
        $("input[@name='"+chkBox.name+"']").each(function() {           
            if (this.checked == false) {
                this.disabled = true;
            }
        });
    } else {
        $("input[@name='"+chkBox.name+"']").each(function() {           
            if (this.checked == false) {
                this.disabled = false;
            }
        });
    }
}

function appendProdIdToCompareCookie(cookieName, spearator, prodId, pPath, pDomain) {
  var prodIds = $.cookie(cookieName);

  if (prodIds == null) {
    if (pPath == null) {
    $.cookie(cookieName, prodId + spearator, { path: '/' });
    } else {
    $.cookie(cookieName, prodId + spearator, { path: pPath, domain: pDomain });
    }
  } else {
    if (!isProdIdExistInCompareCookie(cookieName, prodId)) {
        if (pPath == null) {
        $.cookie(cookieName, prodIds + prodId + spearator, { path: '/' });
        } else {
        $.cookie(cookieName, prodIds + prodId + spearator, { path: pPath, domain: pDomain });
        }
    }
  }
}   

function removeProdIdFromCompareCookie(cookieName, spearator, prodId, pPath, pDomain) {
  if (isProdIdExistInCompareCookie(cookieName, prodId)) {
    var prodIds = $.cookie(cookieName);
    prodIds = prodIds.replace(prodId + spearator,"");

    if (prodIds.length == 0) {
        if (pPath == null) {
        $.cookie(cookieName, null, { path: '/' }); // delete cookie
        } else {
        $.cookie(cookieName, null, { path: pPath, domain: pDomain }); // delete cookie
        }
    }
    else {
        if (pPath == null) {
        $.cookie(cookieName, prodIds, { path: '/' });
        } else {
        $.cookie(cookieName, prodIds, { path: pPath, domain: pDomain });
        }
    }
  }
}   

function isProdIdExistInCompareCookie(cookieName, prodId) {
  var prodIds = $.cookie(cookieName);

  if (prodIds == null) {
    return false;
  }
  
  return (prodIds.indexOf(prodId) > -1);
}   

function countProdIdInCompareCookie(cookieName, spearator) {
  var prodIds = $.cookie(cookieName);

  if (prodIds == null) {
    return 0;
  }

  var count = 0;

  for (i=0;i<prodIds.length;i++) {
    if (prodIds.charAt(i) == spearator) {
        count++;
    }
  }

  return count;
}

function hideProductContainer(cookieName, spearator, obj){
    //Hide the LI Element       
    $(obj).parent().hide();
    
    //Use JQuery to locate the close button and trigger the click
    //event to close the panel
    if (countProdIdInCompareCookie(cookieName, spearator) == 0) {
        $(obj).parent().parent().parent().next(".closebutton").click();
    }
}

//Update the checked/unchecked and enabled/disabled status of checkboxes
//when user click the remove button
function updateChkBoxStatus(cookieName, spearator, chkBoxName, removeProdId,
    maxProdCount){
    $("input[@name='"+chkBoxName+"']").each(function() {
        if (removeProdId == this.value) {
            this.checked = false;
        }
    });
    
    if (countProdIdInCompareCookie(cookieName, spearator) >= maxProdCount) {
        $("input[@name='"+chkBoxName+"']").each(function() {            
            if (this.checked == false) {
                this.disabled = true;
            }
        });
    } else {
        $("input[@name='"+chkBoxName+"']").each(function() {            
            if (this.checked == false) {
                this.disabled = false;
            }
        });
    }
}       
    