/* Mouse Coordinates Utilities -- Jason Horvath */

var mouseDoc = {
    X: 0,
    Y: 0
}

var scrollOffsets = {
    X: 0,
    Y: 0
}

function getScrollXY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  scrollOffsets.X = scrOfX; 
  scrollOffsets.Y = scrOfY;
  
}



var mouseDocX = 0;
var mouseDocY = 0;

var IE = document.all?true:false;
function getMouseXY(e) {
  getScrollXY();
  var scrOfX = scrollOffsets.X;
  var scrOfY = scrollOffsets.Y;
  if(!e) var e = window.event;
  if (IE) { 
    mouseDoc.X = e['clientX'] + scrOfX;
    mouseDoc.Y = e['clientY'] + scrOfY;
  } else {  
    mouseDoc.X = e.pageX
    mouseDoc.Y = e.pageY
  } 
  
  // document.getElementById('quick_look_trigger').innerHTML = mouseDoc.X + ' - ' + mouseDoc.Y;
}


/* Utility Objects */
var HoverArea = function() {
	
	this.Construct = {
		top: 0,
		bottom: 0,
		left: 0,
		right: 0,
		
		setArea: function(sTop, sLeft, eHeight, eWidth) {
			this.top = sTop;
			this.bottom = sTop + eHeight;
			this.left = sLeft;
			this.right = sLeft + eWidth;
		},
		
		mouseOverArea: function(x, y) {
			if ((mouseDoc.Y >= this.top) && (mouseDoc.Y <= this.bottom) && (mouseDoc.X >= this.left) && (mouseDoc.X <= this.right)) {
				return true;
			} else {
                // alert(this.top + '-' + this.bottom + '-' + this.left + '-' + this.right + ' --- ' + mouseDoc.X + '-' + mouseDoc.Y);
				return false;
			}
		}
	
	}
	
	return this.Construct;
}



function getElementLeftPos(eElement) {
   if (!eElement && this)                    // if argument is invalid
   {                                         // (not specified, is null or is 0)
      eElement = this;                       // and function is a method
   }                                         // identify the element as the method owner

   var DL_bIE = document.all ? true : false; // initialize var to identify IE

   var nLeftPos = eElement.offsetLeft;       // initialize var to store calculations
   var eParElement = eElement.offsetParent;  // identify first offset parent element

   while (eParElement != null)
   {                                         // move up through element hierarchy
      if(DL_bIE)
      {
         if(eParElement.tagName == "TD")    // if parent a table cell, then...
         {
            nLeftPos += eParElement.clientLeft; // append cell border width to calcs
         }
      }

      nLeftPos += eParElement.offsetLeft;    // append left offset of parent
      eParElement = eParElement.offsetParent; // and move up the element hierarchy
   }                                         // until no more offset parents exist
   return nLeftPos;                          // return the number calculated
}

function getElementTopPos(eElement) {
   if (!eElement && this)                    // if argument is invalid
   {                                         // (not specified, is null or is 0)
      eElement = this;                       // and function is a method
   }                                         // identify the element as the method owner

   var DL_bIE = document.all ? true : false; // initialize var to identify IE

   var nTopPos = eElement.offsetTop;       // initialize var to store calculations
   var eParElement = eElement.offsetParent;  // identify first offset parent element

   while (eParElement != null)
   {                                         // move up through element hierarchy
      if(DL_bIE)
      {
         if(eParElement.tagName == "TD")     // if parent a table cell, then...
         {
            nTopPos += eParElement.clientTop; // append cell border width to calcs
         }
      }

      nTopPos += eParElement.offsetTop;    // append top offset of parent
      eParElement = eParElement.offsetParent; // and move up the element hierarchy
   }                                         // until no more offset parents exist
   return nTopPos;                          // return the number calculated
}

var listingImgArea = new HoverArea;
var pageName = "";
function placeQuickLookButton(element, marginBottom, marginRight){
    if(!marginBottom) var marginBottom = 8;
    if(!marginRight) var marginRight = 5;
    var el = element;
    var elId = el.id;
    var trigger = document.getElementById('quick_look_trigger'); 
    var elSrc = (el.tagName == "IMG") ? el.src : "" ; 
    var product_model = parseProductModel(elSrc);
    pageName = quick_look_cat_path + product_model + ".ql";
    var elLeftPos = getElementLeftPos(el);
    var elTopPos = getElementTopPos(el);
    var elDimensions = Element.getDimensions(el);
    var elHeight = elDimensions.height;
    var elWidth = elDimensions.width;
    var triggerDimensions = Element.getDimensions(trigger);
    var triggerHeight = triggerDimensions.height;
    var triggerWidth = triggerDimensions.width;
    listingImgArea.setArea(elTopPos, elLeftPos, elHeight, elWidth);
    var element_name = 'quick_look_product_details';
    if(!product_detail_shown){
        trigger.onclick = function () { toggleQuickLookDetail(element_name, elId) }
        trigger.style.top = (elTopPos + ((elHeight - triggerHeight) - marginBottom))+"px";
        trigger.style.left = (elLeftPos + ((elWidth - triggerWidth) - marginRight))+ "px";
        trigger.style.display = 'block';
    }
    
    // trigger.innerHTML = elTopPos + ' - ' + elLeftPos + ' <=> ' + getElementTopPos(trigger) + ' - ' + getElementLeftPos(trigger);
    
}


// extract product model from image src string
function parseProductModel(imgSrc){
    var subStart = 0;
    var subEnd = 0;
    subStart = imgSrc.lastIndexOf("/") + 1;
    if(imgSrc.indexOf("-thumb") > -1){
        subEnd = imgSrc.indexOf("-thumb");
    }else{
        subEnd = imgSrc.indexOf("-med");
    }
    imgSrc = imgSrc.substring(subStart, subEnd);
    return imgSrc;
}


function hideElement(elementName){
    var el = document.getElementById(elementName);
    el.style.display = "none";
}


var mouseOverImage = false;
function checkMouseOverImage(e){
    if(!e) var e = window.event;
    getMouseXY(e);
    var trigger = document.getElementById('quick_look_trigger');
    mouseOverImage = listingImgArea.mouseOverArea(mouseDoc.X, mouseDoc.Y);
    if((!mouseOverImage) && (trigger.style.display == 'block')){
        trigger.style.display = 'none';
    }
}

 var cat_listing_table_id = 'catListing';
var previous_model = '';
function toggleQuickLookDetail(element_name, model, margin_top){
    
    var trigger = document.getElementById('quick_look_trigger');
    if(trigger.style.display == 'block'){ 
        trigger.style.display = 'none';
    }
    
    if(!margin_top) var margin_top = 15;
    var elDetails = document.getElementById(element_name);
    var elDetails_dimensions = Element.getDimensions(elDetails);
    var content_container = document.getElementById('container');
    var content_container_dimensions = Element.getDimensions(content_container);
    var cat_listing_dimensions = Element.getDimensions(cat_listing_table_id);
    var cat_listing_top = getElementTopPos(document.getElementById(cat_listing_table_id));
    var cat_listing_left = getElementLeftPos(document.getElementById(cat_listing_table_id));
    
    if(scrollOffsets.Y <= cat_listing_top){
        elDetails.style.top = (cat_listing_top + margin_top)+"px";
    }else{
        elDetails.style.top = (scrollOffsets.Y + margin_top)+"px";
    }
    
    
    elDetails.style.left = Math.round(((cat_listing_dimensions.width - elDetails_dimensions.width)/2) + cat_listing_left)+"px";
    var model_key = "/products/";
    model = model.substring(0,model.indexOf("listingImage"));
    if(model != previous_model){
        // elDetails.innerHTML += '<br />'+model;
        // Make AJAX Request
        new Ajax.Updater('quick_look_product_details', '/jsreq_quick_look_product.php', {method: 'get', parameters: 'products_id=' + model+'&catPath=' + categories_path, onComplete: updateQuickLookContent});
        // elDetails.innerHTML = quick_look_request.evalResponse();
        previous_model = model;
    }else{
        Effect.Combo(element_name, {duration: .4, scaleX: false, scaleContent: false});
    }
    
    
    if(product_detail_shown){
        product_detail_shown = false;
    }else{
        product_detail_shown = true;
    }
    
}



function scrollKeeper(margin_top){
    if(!margin_top) var margin_top = 15;
    getScrollXY();
    if(true){
        var cat_listing_dimensions = Element.getDimensions(cat_listing_table_id);
        var cat_listing_top = getElementTopPos(document.getElementById(cat_listing_table_id));
        var cat_listing_left = getElementLeftPos(document.getElementById(cat_listing_table_id));
        var elDetails = document.getElementById('quick_look_product_details');
            
        if(product_detail_shown && (scrollOffsets.Y >= cat_listing_top)){
            
            elDetails.style.top = (scrollOffsets.Y + margin_top)+"px";
            
        }
        if(scrollOffsets.Y == 0)  elDetails.style.top = (cat_listing_top + margin_top)+"px";
    
    }
}

function updateQuickLookContent(req){
    var quick_look_content_id = 'quick_look_product_details';
    $(quick_look_content_id).innerHTML = req.responseText;
    // track quick look page request
    if(window.s) {
        void(s.t());
        s.pageName = pageName;
        var ql_code=s.t();
        if(ql_code)document.write(ql_code);
    }
    
    Effect.Combo(quick_look_content_id, {duration: .4, scaleX: false, scaleContent: false});
    
}

// attempt to fix IE innerHTML problems
function fixTableIE() {
  elems=document.getElementsByTagName("table");
  for(i=elems.length-1;elem=elems[i];i--) {
    if(elem.className=="dimensions")
      elem.outerHTML = elem.innerHTML
  }
}


window.onload = function () { var e = window.event; document.onmousemove = checkMouseOverImage; window.onscroll = scrollKeeper; }
