  
  //TODO: add client side caching
  var d = YAHOO.util.Dom;
  var objOverlayContent = null;
  var resultDataPagination = null;
  var objFilter = null;
  var articlesPerPage = 5;
  var productsPerPage = 8;
  var myLogReader; 
    
  /**
  *
  *
  */
  function showTooltip(obj){
    var theLi = YAHOO.util.Dom.getAncestorByTagName(obj, "li")
    var theDiv = YAHOO.util.Dom.getElementsByClassName ("description", "div", theLi) 
	var theDivLeft = YAHOO.util.Dom.getElementsByClassName ("descriptionLeft", "div", theLi) 
	
    if(theDiv.length > 0){
       YAHOO.util.Dom.removeClass(theDiv[0], "hide")
    }
	
	
	if(theDivLeft.length > 0){
       YAHOO.util.Dom.removeClass(theDivLeft[0], "hide")
    }
  }

  function hideTooltip(obj){
    var theLi = d.getAncestorByTagName(obj, "li")
	  var theTooltip = d.getElementsByClassName( "description" , "div" , theLi);
	  var theTooltipLeft = d.getElementsByClassName( "descriptionLeft" , "div" , theLi);
	  
	  if(theTooltip.length > 0){
		  YAHOO.util.Dom.addClass(theTooltip[0], "hide")
	  }
	  
	  if(theTooltipLeft.length > 0){
		  YAHOO.util.Dom.addClass(theTooltipLeft[0], "hide")
	  }  
  }
  
  /**
  * TODO: check if this can be removed?? If used rename appropriately
  */
  function toggleTooltips(obj, bShow){
	  if(bShow){
		  YAHOO.util.Dom.removeClass(obj, "hide");
	  }else{
		  YAHOO.util.Dom.addClass(obj, "hide");
	  }
  }
             
  function initFilterPage(){ 
	  /*
	  * Register our history code here:
	  */
	  var filterState = YAHOO.util.History.getBookmarkedState("f") || "";
    var overlayState = YAHOO.util.History.getBookmarkedState("overlay") || "";
    var sectionState = YAHOO.util.History.getBookmarkedState("s") || "";
    var bookmarkedState = YAHOO.util.History.getBookmarkedState("rd") || "";
    
    YAHOO.util.History.register("f", filterState, function (state){
        // tab states / fitler selections
        objFilter.currentlySelected = state.replace(/\-/g, '|');
        YAHOO.util.History.navigate("rd", "");
    });  
    
    /* 
    * register overlay history manager. this will be our event handler for 
    * loading a article or product into the overlay section of the filter pages
    */
    YAHOO.util.History.register("overlay", overlayState, function (state){   
      
      //load product into overlay   
      objOverlayContent.overlayId = state;
      //check to see if overlay is open and back button was tiggered
      if(objOverlayContent.visible && objOverlayContent.overlayId==""){
        objOverlayContent.filterOverlay.hide();
      } else if(!objOverlayContent.visible && objOverlayContent.overlayId != "" && objOverlayContent.state!="closing") {
        if(dataset=="products"){
        // handle loading product overlay
        
        objOverlayContent.loadOverlay();  
        objOverlayContent.onOverlayLoaded.subscribe(function() {
          this.state = "open";
          this.sectionId = YAHOO.util.History.getCurrentState("s");
          YAHOO.util.Event.addListener("backToFilter", "click", this.onBackToFilterClick, this, true);
          //set width for the overlay menu tabs
          setoverLayMenuWidth();
          this.onOverlayLoaded.unsubscribe();
		    }, objOverlayContent, true); 
              
        } else if(dataset=="articles") {
          //handle loading article overlay
          objOverlayContent.onOverlayLoaded.subscribe(function() {
            YAHOO.util.Event.addListener("backToFilter", "click", this.onBackToFilterClick, this, true);
            this.onOverlayLoaded.unsubscribe();
		        }, objOverlayContent, true); 
          objOverlayContent.loadOverlay();
        }
      }
      // this method is fired async after we close the overlay; when this happens we use
      // the state of closing to let this method know not to reopen the overlay. but after this method is complete we want to 
      // set the state back to idle to let the application know it is officially closed.
      if(objOverlayContent.state=="closing")
        objOverlayContent.state="idle";           
      
    });
    
    YAHOO.util.History.register("s", sectionState, function (state){
      objOverlayContent.sectionId = state;
      if(objOverlayContent.state=="open"){
        if(objOverlayContent.sectionId==""){
          objOverlayContent.sectionId="overview";
        } else {
          objOverlayContent.loadProductSectionControl();
        }
      }
    });
       
    YAHOO.util.History.register("rd", bookmarkedState, function (state){
      return;
    });    
     
    /*
    * this function fires on load and 
    * will need to set up all of our
    * initial states for the filter, results section and overlay
    */
    YAHOO.util.History.onReady(function(){
      var tooltip = YAHOO.widget.Tooltip;

      objOverlayContent = new YAHOO.oralb.FilterOverlay();
      objFilter = new YAHOO.oralb.Filter();
	  
	  /* sorting the currentlySelected string */
	  var currentlySelectedArr = YAHOO.util.History.getCurrentState("f").replace(/\-/g, '|').split("|");
	  currentlySelectedArr.sort();
	  var currentlySelectedSorted = "";
	  for(var i=0; i<currentlySelectedArr.length; i++){
	  	if(i == currentlySelectedArr.length-1){
			currentlySelectedSorted += currentlySelectedArr[i]		
		}else{
			currentlySelectedSorted += currentlySelectedArr[i] + "|";
	  	}
	  }
	  /* end sorting the currentlySelected string */
	  
	  objFilter.currentlySelected = currentlySelectedSorted;
      objOverlayContent.overlayId = YAHOO.util.History.getCurrentState("overlay");
      objOverlayContent.sectionId = YAHOO.util.History.getCurrentState("s");
	
      // subscribe our filter init complete method if items are selected
	  
      if(objFilter.currentlySelected!="") {
        objFilter.onInitComplete.subscribe(objFilter.setCurrentState, objFilter, true);
      }
      // subscribe to event onComplete of ProductTabs which is the last to execute after the overlay has loaded
      if(dataset == "products" && objOverlayContent.overlayId!="" && objFilter.currentlySelected!=""){ // load appropriate section
        objOverlayContent.onOverlayLoaded.subscribe(function() {
           YAHOO.util.Event.addListener("backToFilter", "click", this.onBackToFilterClick, this, true);
          this.state = "open";
          if(objOverlayContent.sectionId!="")
            objOverlayContent.loadProductSectionControl();
		    }, objOverlayContent, true); 
      } else if (dataset == "articles" && objOverlayContent.overlayId!="" && objFilter.currentlySelected!="") {
        objOverlayContent.onOverlayLoaded.subscribe(function() {
          this.state = "open";
          YAHOO.util.Event.addListener("backToFilter", "click", this.onBackToFilterClick, this, true);
        }, objOverlayContent, true); 
      }

      if(objOverlayContent.overlayId!="" && objFilter.currentlySelected!=""){ //load overlay        
        objFilter.onLoadResultDataComplete.subscribe(function(){
          objOverlayContent.state = "opening";
          this.loadOverlay();
          objFilter.onLoadResultDataComplete.unsubscribe();
        }, objOverlayContent, true);
      } else if(YAHOO.util.History.getCurrentState("rd").length>0){
      
      objFilter.onLoadResultDataComplete.subscribe(function(){
          var stateArr = YAHOO.util.History.getCurrentState("rd").split("_");
          this.currentPage = stateArr[0];
          this.currentItem = stateArr[1];
          this.loadPage(this.currentPage);      
          objFilter.onLoadResultDataComplete.unsubscribe();
        }, resultDataPagination, true);
      }
      objFilter.init();  

      objOverlayContent.noItemsFoundError = objFilter.initFilterResult.translatedText.NoItemsFoundError;
    });
    YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe");
  }

  // display the Back To Filter button
  function showBackButton() {
    d.setStyle(d.get("backToFilter"), "visibility", "visible");
    d.setStyle(d.get("backToFilter"), "display", "block");
    d.setStyle(d.get("backToFilter"), "padding", "10px 0 0px 0");
    d.setStyle(d.get("backToFilter"), "font-size", "1em");
  }
    
  function toggle(obj){
    objFilter.doToggle(obj);
  }
  
  function loadResultData(){
    objFilter.loadResultData(objFilter.currentFilterSelections.getElements(), null);
  }
     
  /**
  * @param {Object} obj : A href element user clicked on; example element id: r_f_0_0 or f_0_1
  *
  */
  function doFilter(obj){ 
    // toggle the appropriate tab if doFilter was called from the default result view and not the filter itself   

	
	try {
      if(objFilter.onGetFilterItemsDataComplete.subscribers.length > 0){
        objFilter.onGetFilterItemsDataComplete.unsubscribe (); //remove any previous events
      }
      objFilter.onGetFilterItemsDataComplete.subscribe(loadResultData, this);
      var objIdSplit = obj.id.split("_");
      if(objIdSplit.length == 4) { // user clicked from the default result section
        objFilter.getFilterItemsData(d.get("f_" + objIdSplit[2] + "_" + objIdSplit[3]));
        objFilter.doToggle(d.get("f_a_" + objIdSplit[2]));
      } else {
        // get data and update filter
        objFilter.getFilterItemsData(obj);
      }
      
      pageTracker._trackPageview(currentPath + "click/" + objFilter.currentFilterSelections.getElements());
      objFilter.onGetFilterItemsDataComplete.subscribe(loadResultData, this);
    
      // set hash values
      YAHOO.util.History.navigate("f", objFilter.currentFilterSelections.getElements().replace(/\|/g, '-'));
    } catch (err) {
      YAHOO.log("error in doFilter: " + err);
      throw("error in doFilter: " + err);
    }
	
  }

  YAHOO.util.Event.addListener(window, 'load', init);


  var loader = new YAHOO.util.YUILoader({
    base: '/app/includes/js/yui/',
    loadOptional: false,
    
    /**
    * Callback that will be executed when the loader is finished with an insert 
    */
    onSuccess: function() {
        var myLogReader = new YAHOO.widget.LogReader();
        myLogReader.hide(); // CTRL - Z
        var loggerKeyListener = new YAHOO.util.KeyListener(document, { ctrl:true, keys:90 },                               
	        {fn:myLogReader.show, 
	          scope:myLogReader, 
	          correctScope:true } ); 
	      loggerKeyListener.enable(); 
        pageTracker._trackPageview(currentPath);
        initFilterPage(); 
    },
    
    /**
    * Callback that will be executed each time a new module is loaded 
    */
    onProgress: function(o) {},
    
    /**
    * Callback that will be executed if there is a failure
    */
    onFailure: function() {}
  });
    
//  YAHOO.util.Event.prototype.eventExists(elementId){
//    return YAHOO.util.Event.getEvent(handler, element) != null ? true : false;
//  }  
    
  function init(){
    if(dataset=="articles"){
      loader.require("connection","yahoo-dom-event","container","animation","history","json", "Filter", "FilterOverlay", "Pagination", "dragdrop", "logger"); 
    }else{
      loader.require("connection","yahoo-dom-event","container","animation","history","json", "Filter", "FilterOverlay", "Pagination", "Products", "dragdrop", "logger"); /*, "dragdrop", "logger"*/
      loader.addModule({
        name: "Products",
        type: "js", 
        fullpath: "/app/includes/js/products.js"
      });
    }
    loader.addModule({
      name: "Filter",
      requires: ['history'],
      type: "js", 
      fullpath: "/app/includes/js/oralb/filter/Filter.js"
    });
    loader.addModule({
      name: "FilterOverlay",
      requires: ['history', 'Filter'],
      type: "js", 
      fullpath: "/app/includes/js/oralb/filter/FilterOverlay.js"
    });
    loader.addModule({
      name: "Pagination",
      requires: ['history', 'Filter'],
      type: "js", 
      fullpath: "/app/includes/js/oralb/filter/Pagination.js"
    });
    loader.insert();
}
