function ProductFinder() {
 this.init();
 return (ProductFinder.instance = this);
}
ProductFinder.instance     = null
ProductFinder.TypeEnum    = {
 ByProduct : 'ByProduct',
 ByDisease : 'ByDisease'
};
ProductFinder.isOverProductFinderArea = function(e) {
 if (!e) e = window.event;
 
 var bIsOverProductFinderArea = false;
 var oElm   = document.getElementById('ProductFinderContainer');
 var oPos;
 
 if (e && oElm) {
  // --------------------------
  // Calculate Coordinates
  
  // Element
  oPos  = getElmAbsPosition(oElm);
  var nTop  = oPos.y;
  var nLeft  = oPos.x;
  var nRight  = nLeft + oElm.offsetWidth;
  var nBottom  = nTop + oElm.offsetHeight;
  // Event
  var nX   = e.clientX;
  var nY   = e.clientY;
  
  // Do action based upon coordinates
  bIsOverProductFinderArea = Boolean(nX >= nLeft && nX <= nRight && nY >= nTop && nY <= nBottom);
 }
 
 if (!bIsOverProductFinderArea) {
  ProductFinder.reset();
 }
 
 // Clean up
 e     = null;
 oElm    = null;
 oPos    = null;
};
ProductFinder.reset    = function() {
 var oProductContainer, oProductItems, oButton, oButton_Prod, oButton_Disease, oArrowUp, oArrowDown;
  
 oProductContainer = document.getElementById('ProductFinderProductContainer');
 oProductItems  = document.getElementById('ProductFinderProductItems');
 oButton    = document.getElementById('ProductFinderButtonMain');
 oButton_Prod  = document.getElementById('ProductFinderButtonProd');
 oButton_Disease  = document.getElementById('ProductFinderButtonDisease');
 oArrowUp   = document.getElementById('pfArrowUp');
 oArrowDown   = document.getElementById('pfArrowDown');
 
 if (oButton) {
  oButton.style.display   = 'block';
 }
 
 if (oButton_Prod && oButton_Disease) {
  oButton_Prod.style.display  = 'none';
  oButton_Disease.style.display = 'none';
 }
 
 if (oProductContainer && oProductItems) {
  oProductContainer.style.display = 'none';
  oProductItems.style.display  = 'none';
  emptyElement(oProductItems);
 }
 
 if (oArrowUp) {
  oArrowUp.style.display   = 'none';
 }
 if (oArrowDown) {
  oArrowDown.style.display  = 'none';
 }
 
 ProductFinder.prodIndex    = 1;
 ProductFinder.diseaseIndex   = 1;
 ProductFinder.currentType   = '';
 
 // Clean up
 oArrowUp   = null;
 oArrowDown   = null;
 oButton_Disease  = null;
 oButton_Prod  = null;
 oButton    = null;
 oProductItems  = null;
 oProductContainer = null;
};
ProductFinder.populate   = function(p_sTypeEnum) {
 ProductFinder.currentType  = p_sTypeEnum;
 
 var oProductContainer   = document.getElementById('ProductFinderProductContainer');
 var oProductItems    = document.getElementById('ProductFinderProductItems');
 var sTypeName     = ProductFinder.getCurrentTypeName();
 var sHTML      = '', oItem;
 
 for (var sId in ProductFinder.items) {
  oItem = ProductFinder.items[sId];
  if (oItem && oItem.type == ProductFinder.currentType) {
   sHTML     += oItem.buildHTML();
  }
 }
 oProductItems.innerHTML   = sHTML;
 oProductItems.style.top   = '';
 oProductItems.style.bottom  = '0px';
 
 
 ProductFinder[sTypeName + 'Index'] = 1;
 
 var oArrowUp     = document.getElementById('pfArrowUp');
 var oArrowDown     = document.getElementById('pfArrowDown');
 if (ProductFinder[sTypeName + 'Counter'] > 6) {
  //alert(oProductContainer.offsetHeight + ',' + oProductContainer.scrollHeight);
  
  //window.status = 'ch:' + oProductContainer.scrollHeight + ' - h:' + oProductContainer.offsetHeight + ' - t:' + oProductContainer.offsetTop;
  //oProductContainer.style.top = '-' + (oProductContainer.scrollHeight - oProductContainer.offsetHeight) + 'px';
  
  oArrowUp.style.display  = 'block';
  //oArrowDown.style.display= 'block';
 }
 
 // Clean Up
 oItem       = null;
 oArrowUp      = null;
 oArrowDown      = null;
 oProductItems     = null;
 oProductContainer    = null;
};
ProductFinder.prototype.init = function() {
 var oContainer, oButton, oButton_Prod, oButton_Disease;
 var oProductContainer, oProductItems, oArrowUp, oArrowDown;
 
 oContainer     = document.createElement('div');
 oContainer.id    = 'ProductFinderContainer';
 document.body.appendChild(oContainer);
 
 // --------------------------------
 // CONTAINER
 oContainer.onmouseout  = function(e) {
  var oTarget, oRelatedTarget;
  try
  {
   // Normalize event
   if (!e) {
    e    = window.event;
    oTarget   = e.srcElement;
    oRelatedTarget = e.fromElement;
   } else {
    oTarget   = e.target;
    oRelatedTarget = e.relatedTarget;
   }
   
   if (isChildOf(oRelatedTarget, oTarget)) {
    ProductFinder.isOverProductFinderArea(e);
   } else {
 //   ProductFinder.reset();
   }
   
  } catch (ex) {
   throw ex;
  } finally {
   // Clean up
   oTarget    = null;
   oRelatedTarget  = null;
  }
 };
 
 // --------------------------------
 // PRODUCT SCROLLER
 oArrowUp     = document.createElement('div');
 oArrowUp.id     = 'pfArrowUp';
 oArrowUp.className   = 'pfArrow';
 oContainer.appendChild(oArrowUp);
 oArrowDown     = document.createElement('div');
 oArrowDown.id    = 'pfArrowDown';
 oArrowDown.className  = 'pfArrow';
 oContainer.appendChild(oArrowDown);
 
 // --------------------------------
 // PRODUCT CONTAINER
 oProductContainer   = document.createElement('div');
 oProductContainer.id  = 'ProductFinderProductContainer';
 oContainer.appendChild(oProductContainer);
 
 oProductItems    = document.createElement('div');
 oProductItems.id   = 'ProductFinderProductItems';
 oProductContainer.appendChild(oProductItems);
 
 
 // --------------------------------
 // BUTTONS
 
 // Button: Product Finder
 oButton      = document.createElement('div');
 oButton.id     = 'ProductFinderButtonMain';
 oButton.className   = 'pfButton pfButtonOut';
 oButton.title    = 'Product Finder';
 oContainer.appendChild(oButton);
 
 // Button: By Product
 oButton_Prod    = document.createElement('div');
 oButton_Prod.id    = 'ProductFinderButtonProd';
 oButton_Prod.className  = 'pfButton pfButtonProdOver';
 oButton_Prod.title   = 'By Product';
 oContainer.appendChild(oButton_Prod);
 
 // Button: By Disease
 oButton_Disease    = document.createElement('div');
 oButton_Disease.id   = 'ProductFinderButtonDisease';
 oButton_Disease.className = 'pfButton pfButtonDiseaseOut';
 oButton_Disease.title  = 'By Disease';
 oContainer.appendChild(oButton_Disease);
 
 // --------------------------------
 // BUTTON EVENTS
 
 // Button: Product Finder
 oButton.onmouseover = function(e) { oButton.className = 'pfButton pfButtonOver'; };
 oButton.onmouseout = function(e) { oButton.className = 'pfButton pfButtonOut'; };
 oButton.onclick = function(e) {
  try
  {
   oButton.style.display   = 'none';
   oButton_Prod.style.display  = 'block';
   oButton_Disease.style.display = 'block';
   oButton_Prod.className   = 'pfButton pfButtonProdOver';
   
  } catch (ex) {
   throw ex;
  } finally {
   // Clean up
  }
 };
 
 // Button: By Product
 oButton_Prod.onmouseover = function(e) { oButton_Prod.className = 'pfButton pfButtonProdOver'; };
 oButton_Prod.onmouseout  = function(e) { oButton_Prod.className = 'pfButton pfButtonProdOut'; };
 oButton_Prod.onclick  = function(e) {
  oButton_Prod.style.display  = 'none';
  oButton_Disease.style.display = 'none';
  oProductItems.style.display  = 'block';
  oProductContainer.style.display = 'block';
  ProductFinder.populate(ProductFinder.TypeEnum.ByProduct);
 };
 
 // Button: By Disease
 oButton_Disease.onmouseover = function(e) { oButton_Disease.className = 'pfButton pfButtonDiseaseOver'; };
 oButton_Disease.onmouseout = function(e) { oButton_Disease.className = 'pfButton pfButtonDiseaseOut'; };
 oButton_Disease.onclick  = function(e) {
  oButton_Prod.style.display  = 'none';
  oButton_Disease.style.display = 'none';
  oProductItems.style.display  = 'block';
  oProductContainer.style.display = 'block';
  ProductFinder.populate(ProductFinder.TypeEnum.ByDisease);
 };
 
 // SCROLLING EVENTS
 oArrowUp.onmouseover  = function(e) { ProductFinder.scrollUp(); };
 oArrowUp.onmouseout   = function(e) { clearTimeout(ProductFinder.scrollTimer); };
 oArrowDown.onmouseover  = function(e) { ProductFinder.scrollDown(); };
 oArrowDown.onmouseout  = function(e) { clearTimeout(ProductFinder.scrollTimer); };
 
 // Clean up
 //oButton   = null;
 //oButton_Prod = null;
 //oButton_Disease = null;
};
ProductFinder.items    = {};
ProductFinder.itemCounter  = 0;
ProductFinder.prodCounter  = 0;
ProductFinder.prodIndex   = 1;
ProductFinder.diseaseCounter = 0;
ProductFinder.diseaseIndex  = 1;
ProductFinder.currentType  = '';
ProductFinder.getTypeName  = function(p_sTypeEnum) {
 var sTypeName;
 switch (p_sTypeEnum) {
  case (ProductFinder.TypeEnum.ByProduct) : {
   sTypeName = 'prod';
   break;
  }
  case (ProductFinder.TypeEnum.ByDisease) : {
   sTypeName = 'disease';
   break;
  }
  default         : {
   sTypeName = '';
   break;
  }
 }
 
 return sTypeName;
};
ProductFinder.getCurrentTypeName = function() {
 return ProductFinder.getTypeName(ProductFinder.currentType);
};
ProductFinder.scrollUp    = function() {
 var oProductItems    = document.getElementById('ProductFinderProductItems');
 var sTypeName     = ProductFinder.getCurrentTypeName();
 var bCanScrollMoreUp   = true;
 var bCanScrollDown    = true;
 var oArrowUp     = document.getElementById('pfArrowUp');
 var oArrowDown     = document.getElementById('pfArrowDown');
 
 if (sTypeName.length) {
  if (ProductFinder[sTypeName + 'Index'] <= (ProductFinder[sTypeName + 'Counter'] - 6)) {
   oProductItems.style.top = (oProductItems.offsetTop + 30) + 'px';
   ProductFinder[sTypeName + 'Index']++;
  }
 }
 
 // show/hide up/down
 bCanScrollMoreUp    = Boolean(ProductFinder[sTypeName + 'Index'] <= (ProductFinder[sTypeName + 'Counter'] - 6));
 bCanScrollDown     = Boolean(ProductFinder[sTypeName + 'Index'] > 1);
 
 oArrowDown.style.display  = (bCanScrollDown)? 'block' : 'none';
 if (!bCanScrollMoreUp) {
  oArrowUp.style.display  = 'none';
 } else {
  ProductFinder.scrollTimer = setTimeout('ProductFinder.scrollUp()', 250);
 }
 
 // Clean Up
 oProductItems     = null;
 oArrowUp      = null;
 oArrowDown      = null;
};
ProductFinder.scrollDown   = function() {
 var oProductItems    = document.getElementById('ProductFinderProductItems');
 var sTypeName     = ProductFinder.getCurrentTypeName();
 var bCanScrollUp    = true;
 var bCanScrollMoreDown   = true;
 var oArrowUp     = document.getElementById('pfArrowUp');
 var oArrowDown     = document.getElementById('pfArrowDown');
 
 if (sTypeName.length) {
  if (ProductFinder[sTypeName + 'Index'] > 1) {
   oProductItems.style.top = (oProductItems.offsetTop - 30) + 'px';
   ProductFinder[sTypeName + 'Index']--;
  }
 }
 
 // show/hide up/down
 bCanScrollUp     = Boolean(ProductFinder[sTypeName + 'Index'] <= (ProductFinder[sTypeName + 'Counter'] - 6));
 bCanScrollMoreDown    = Boolean(ProductFinder[sTypeName + 'Index'] > 1);
 
 oArrowUp.style.display   = (bCanScrollUp)? 'block' : 'none';
 if (!bCanScrollMoreDown) {
  oArrowDown.style.display = 'none';
 } else {
  ProductFinder.scrollTimer = setTimeout('ProductFinder.scrollDown()', 250);
 }
 
 // Clean Up
 oProductItems     = null;
 oArrowUp      = null;
 oArrowDown      = null;
};

ProductFinder.prototype.addItem   = function(p_sTypeEnum, p_sProdId, p_sLabel, p_sHref) {
 ProductFinder.items[p_sProdId]  = new ProductFinderItem(p_sTypeEnum, p_sProdId, p_sLabel, p_sHref);
 ProductFinder.itemCounter++;
 
 switch (p_sTypeEnum) {
  case (ProductFinder.TypeEnum.ByProduct) : {
   ProductFinder.prodCounter++;
   break;
  }
  case (ProductFinder.TypeEnum.ByDisease) : {
   ProductFinder.diseaseCounter++;
   break;
  }
  default         : {
   break;
  }
 }
};
// -----------------------
function ProductFinderItem(p_sTypeEnum, p_sProdId, p_sLabel, p_sHref) {
 this.id  = p_sProdId  || '';
 this.type = p_sTypeEnum || '';
 this.label = p_sLabel  || '';
 this.href = p_sHref  || '#';
  
 return this;
}
ProductFinderItem.prototype.buildHTML   = function() {
return '<div id="ProductFinderItem' + this.id + '" class="pfItem pfItemOut" title="' + this.label + '" onmouseover="this.className=\'pfItem pfItemOver\';" onmouseout="this.className=\'pfItem pfItemOut\';"><a href=' + this.href + ' class=ProductFinderButton>' + this.label + '</a></div>';
};

// ProductFinderItem.prototype.buildHTML = function() {
// return '<div id="ProductFinderItem' + this.id + '" class="pfItem pfItemOut" title="' + this.label + '" onmouseover="this.className=\'pfItem pfItemOver\';" onmouseout="this.className=\'pfItem pfItemOut\';">' + this.label + '</div>';
// };
