function GetAbsoluteTop(elem) {
	var top = 0;
	while(elem.offsetParent) { top += elem.offsetTop; elem = elem.offsetParent;	}
	return top;
}

function GetAbsoluteLeft(elem) {
	var left = 0;
	while(elem.offsetParent) { left += elem.offsetLeft; elem = elem.offsetParent; }
	return left;
}

function ElemsOverlap(elemA, elemB) {
	var la,lb,ta,tb,wa,wb,ha,hb;
	la = GetAbsoluteLeft(elemA);  lb = GetAbsoluteLeft(elemB);
	ta = GetAbsoluteTop(elemA);   tb = GetAbsoluteTop(elemB);
	wa = elemA.offsetWidth;       wb = elemB.offsetWidth;
	ha = elemA.offsetHeight;      hb = elemB.offsetHeight;

	if(wa == 0 || wb == 0 || ha == 0 || hb == 0) return false;

	if(lb > la) {
		if((lb - la) >= wa) return false;
	} else if(lb < la) {
		if((la - lb) >= wb) return false;
	}

	if(tb > ta) {
		if((tb - ta) >= ha) return false;
	} else if(lb < la) {
		if((ta - tb) >= hb) return false;
	}

	return true;
}

function OpenWindow(url, args, target) {
	if(null == target) target = "_blank";
	var w = window.open(url, target, args);
	ABLFrame.Control.Focus();
	w.focus();
	return w;
}

function EscapeQueryTerms(qts) {
	return qts.replace(/"/g, "\\\"");
}

function SetPluginElementVisible(elem, visible) {
	elem = D_Elem(elem);
	if(UA_SAFARI) {
		elem.style.left = visible ? "0" : "8000px";
	} else if(UA_MSIE) {
	
		elem.style.display = visible ? "block" : "none";
		
		
	} else {
		elem.style.visibility = visible ? "visible" : "hidden";
	}
}


/**
 * Simple crossbrowser onDOMReady functionality
 * 
 * usage:
 * onDOMReady(function() {
 * 	myFunction();
 * });
 */
var onDOMReadyQueue = [];	

var onDOMReady = function(fn) {
	onDOMReadyQueue.push(fn);
	
	var init = function() {
		if ( arguments.fired ) return;
		arguments.fired = true;

		for (var i = 0; i < onDOMReadyQueue.length; i++) {
			var cb = onDOMReadyQueue.pop();
			cb();
		}

	};

	if (document.addEventListener) {
		document.addEventListener("DOMContentLoaded", init, false);
	}

	/*@cc_on @*/
	/*@if (@_win32)
	   document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
		var script = document.getElementById("__ie_onload");
	   script.onreadystatechange = function() {
		   if (this.readyState == "complete")
		   	init();
		}
	/*@end @*/

	if ( /WebKit/i.test(navigator.userAgent) ) {
	    var _timer = setInterval(function() {
	        if ( /loaded|complete/.test(document.readyState) )
				clearInterval(_timer);
	            init();
	    }, 10);
	}

	window.onload = init;
}



/////////////////////////////////////////////////
function syndeticsPlaceTOC()
{
   // See if there is a syndetics toc placeholder in sideinfo, if there is use it.
   // Otherwise, shove it at the end of the sideinfo div.
   if (D_ElemUnsafe('syndetics_toc'))
   {
      if (D_ElemUnsafe('syndetics_sideinfo'))
      {
         D_Elem('syndetics_sideinfo').appendChild(D_ElemUnsafe('syndetics_toc'));
      }
      else if (D_ElemUnsafe('sideinfo'))
      {
        D_Elem('sideinfo').appendChild(D_ElemUnsafe('syndetics_toc'));
      }
      
      // Make it visible.
      D_ElemUnsafe('syndetics_toc').style.display = "block";
   }
}

function xIsbnPlaceElements()
{
   // 1. Attempt to place any toc entry.
   if (D_ElemUnsafe('sideinfo') && D_ElemUnsafe('xisbn_toc'))
   {
     D_Elem('sideinfo').appendChild(D_ElemUnsafe('xisbn_toc'));
   }
   
   // Make it visible.
   if (D_ElemUnsafe('xisbn_toc'))
      D_ElemUnsafe('xisbn_toc').style.display = "block";
      
   // 2. Attempt to place the mini refine.
   if (D_ElemUnsafe('sideinfo'))
   {
     D_Elem('sideinfo').appendChild(D_ElemUnsafe('xisbn_minirefine'));
   }
   
   // Make it visible.
   D_ElemUnsafe('xisbn_minirefine').style.display = "block";
}

function forceReflow () {
    var res = ABLFrame.Content.GetResultDocument();

    if (UA_MSIE) {
        ABLFrame.document.body.style.overflow = "auto";
        ABLFrame.document.body.style.overflow = "hidden";
        if (res) {
            var rp = D_ElemUnsafe('resultpage', res);
            if (rp) {
                rp.style.overflow = "auto";
                rp.style.overflow = "hidden";
            }
        }
    }
		
		if (UA_MOZ) {
			if (res) {
				res.body.style.paddingBottom = "1px solid white";
				res.body.style.paddingBottom = "";
			}
		}
}

var Util = { 
	Cookie: { // ripped part of md cookie code
		Read: function(name){
			var nameEQ = name + "=";
			var ca = document.cookie.split(';');
			for (var i = 0; i < ca.length; i++) {
				var c = ca[i];
				while (c.charAt(0) == ' ') 
					c = c.substring(1, c.length);
				if (c.indexOf(nameEQ) == 0) 
					return c.substring(nameEQ.length, c.length);
			}
			return null;
		}
	},
	
	Array: {
		Includes: function(a, s) {
			// a = array, s = subset to check
			for (var i = 0; i < s.length; i++) {
				if (indexOf(a, s[i]) == -1) {
					return false;
				}
			}
			return true;
		},
		Iterate: function(a) {
			var i = 0;
			return function() {
				return a[i++];
			}
		}
	},

	//DB: stole this from Taco's federate thingy on okstate.. He probably stole it too ;)
	FormatNumber: function(a, b, c, d) {
		a = Math.round(a * Math.pow(10, b)) / Math.pow(10, b);
		var e = a + '';
		var f = e.split('.');
		if (!f[0]) {
			f[0] = '0';
		}
		if (!f[1]) {
			f[1] = '';
		}
		if (f[1].length < b) {
			var g = f[1];
			for (i = f[1].length + 1; i <= b; i++) {
					g += '0';
			}
			f[1] = g;
		}
		if (d != '' && f[0].length > 3) {
			var h = f[0];
			f[0] = '';
			for (j = 3; j < h.length; j += 3) {
					i = h.slice(h.length - j, h.length - j + 3);
					f[0] = d + i + f[0] + '';
			}
			j = h.substr(0, (h.length % 3 == 0) ? 3 : (h.length % 3));
			f[0] = j + f[0];
		}
		c = (b <= 0) ? '' : c;
		return f[0] + c + f[1];
	}
	
}
