//ON LOAD
//load listeners
addLoadListener(initSearch);
addLoadListener(initAutoComplete);
addLoadListener(startBanners);
addLoadListener(initCart);

//global variables for banner system
var bannerWidth = 468;
var bannerHeight = 60;
var bannerRotateSeconds = 5;
//don't change these
var numBanners = 0;
var bannerCurrentPosition = 1;
var bannerTimeout;

//COMMON FUNCTIONS

//add functions to run upon page load
function addLoadListener(fn) {
  if (typeof window.addEventListener != 'undefined') {
    window.addEventListener('load', fn, false);
  } else if (typeof document.addEventListener != 'undefined') {
    document.addEventListener('load', fn, false);
  } else if (typeof window.attachEvent != 'undefined') {
    window.attachEvent('onload', fn);
  } else {
    var oldfn = window.onload;
    if (typeof window.onload != 'function') {
      window.onload = fn;
    } else {
      window.onload = function() {
        oldfn();
        fn();
      };
    }
  }
}

//create a request object
var request = null;
try {
  request = new XMLHttpRequest();
} catch (trymicrosoft) {
  try {
    request = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (othermicrosoft) {
    try {
      request = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (failed) {
      request = null;
    }
  }
}

//generate a random number
function randomBetween(min, max) {
  return min + Math.floor(Math.random() * (max - min + 1));
}

//validate email field
function validateEmail(email) {
  var trimmedEmail = trimWhiteSpace(email);
  if (!/^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$/.test(trimmedEmail))  {
	  if (!/^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+([\w\-]+\.)+[a-zA-Z]+$/.test(trimmedEmail))  {
		return false;
	  } else {
		  return true;
	  }
  } else {
	return true;
  } 
}

//validate required field
function validateRequired(text) {
  if (text == "" || /^\s+$/.test(text)) {
	return false;
  } else {
    return true;
  }
}

//validate field is numberical
function validateNumerical(num) {
  if (num != parseFloat(num, 10)) {
	return false;
  } else {
    return true;
  }
}

//compare two passwords
function validatePasswords(pass1, pass2) {
	if (pass1 == pass2){
		return true;
	} else {
		return false;
	}
}

//validate string length
function validateLength(text, low, high){
	var stringLength = text.length;
	if ((stringLength>=low) && (stringLength<=high)) {
		return true;
	} else {
		return false;
	}
}

//trim whitespace from a string
function trimWhiteSpace(str) {
	return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}

//format number
function formatTo(base, precision) {
  var a = roundTo(base, precision);
  var s = a.toString();

  var decimalIndex = s.indexOf(".");
  if (precision > 0 && decimalIndex < 0)  {
    decimalIndex = s.length;
    s += '.';
  }
  while (decimalIndex + precision + 1 > s.length) {
    s += '0';
  }
  return s;
}

//round number
function roundTo(base, precision) {
  var m = Math.pow(10, precision);
  var a = Math.round(base * m) / m;
  return a;
}

//swap images
function imageSwap(imageId, newSrc) {
	var oldImage = document.getElementById(imageId);
	oldImage.setAttribute('src',newSrc);
}

//remove element with specified id
function removeElementById(id){
	var anchor = document.getElementById(id);
	if(anchor) {	
		var parent = anchor.parentNode;
		var remove = parent.removeChild(anchor);	
	}
}

//replace text of an element
function replaceText(el, text) {
  if (el != null) {
    clearText(el);
    var newNode = document.createTextNode(text);
    el.appendChild(newNode);
  }
}

//clear text of an element
function clearText(el) {
  if (el != null) {
    if (el.childNodes) {
      for (var i = 0; i < el.childNodes.length; i++) {
        var childNode = el.childNodes[i];
        el.removeChild(childNode);
      }
    }
  }
}

//get text of an element
function getText(el) {
  var text = "";
  if (el != null) {
    if (el.childNodes) {
      for (var i = 0; i < el.childNodes.length; i++) {
        var childNode = el.childNodes[i];
        if (childNode.nodeValue != null) {
          text = text + childNode.nodeValue;
        }
      }
    }
  }
  return text;
}

//get all elements with a specific attribute
function getElementsByAttribute(attribute, attributeValue) {
  var elementArray = new Array();
  var matchedArray = new Array();
  if (document.all) {
    elementArray = document.all;
  } else {
    elementArray = document.getElementsByTagName("*");
  }
  for (var i = 0; i < elementArray.length; i++) {
    if (attribute == "class") {
      var pattern = new RegExp("(^| )" + attributeValue + "( |$)");
      if (pattern.test(elementArray[i].className)) {
        matchedArray[matchedArray.length] = elementArray[i];
      }
    } else if (attribute == "for"){
      if (elementArray[i].getAttribute("htmlFor") || elementArray[i].getAttribute("for")) {
        if (elementArray[i].htmlFor == attributeValue) {
          matchedArray[matchedArray.length] = elementArray[i];
        }
      }
    } else if (elementArray[i].getAttribute(attribute) == attributeValue) {
      matchedArray[matchedArray.length] = elementArray[i];
    }
  }
  return matchedArray;
}

//attach event listeners to an element
function attachEventListener(target, eventType, functionRef, capture) {
  if (typeof target.addEventListener != "undefined") {
    target.addEventListener(eventType, functionRef, capture);
  } else if (typeof target.attachEvent != "undefined") {
    var functionString = eventType + functionRef;
    target["e" + functionString] = functionRef;
    target[functionString] = function(event) {
      if(typeof event == "undefined"){event = window.event}; target["e" + functionString](event);
    };
    target.attachEvent("on" + eventType, target[functionString]);
  } else {
    eventType = "on" + eventType;
    if (typeof target[eventType] == "function") {
      var oldListener = target[eventType];
      target[eventType] = function() {
        oldListener();
        return functionRef();
      }
    } else {
      target[eventType] = functionRef;
    }
  }
  return true;
}

//get all elements of a particular class
function getElementsByClassName(oElm, strTagName, strClassName){
	var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	strClassName = strClassName.replace(/\-/g, "\\-");
	var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
	var oElement;
	for(var i=0; i<arrElements.length; i++){
		oElement = arrElements[i];
		if(oRegExp.test(oElement.className)){
			arrReturnElements.push(oElement);
		}
	}
	return (arrReturnElements)
}

//retreive computed CSS style
function retrieveComputedStyle(element, styleProperty) {
  var computedStyle = null;
  if (typeof element.currentStyle != "undefined") {
    computedStyle = element.currentStyle;
  } else {
    computedStyle = document.defaultView.getComputedStyle(element, null);
  }
  return computedStyle[styleProperty];
}

//disable enter key
function disableEnterKey(e) {
     var key;     
     if(window.event)
          key = window.event.keyCode; //IE
     else
          key = e.which; //firefox     

     return (key != 13);
}

//get a form field value
function getFormValue(field){
	var value = document.getElementById(field).value;
	return value;
}

//check if a string contains PO Box
function checkPoBox(string){
	var lowerString = string.toLowerCase();
	var pattern =/p.?o.? box/;
	if (pattern.test(lowerString))	{
	  return false;
	} else{
	  return true;
	}
}

//get height of browser window
function getWindowHeight() {
	var windowHeight;		
    var yScroll;
	var pageHeight;

	if (self.innerHeight) {	// all except Explorer			
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode			
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other Explorers
		windowHeight = document.body.clientHeight;
	}
			
	if (window.innerHeight && window.scrollMaxY) {	
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		yScroll = document.body.scrollHeight;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		yScroll = document.body.offsetHeight;
	}
	
	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else { 
		pageHeight = yScroll;
	}
	
	return pageHeight;

}

//get width of browser window
function getWindowWidth() {
	var windowWidth;
	var xScroll;	
	var pageWidth;
		
	if (self.innerHeight) {	// all except Explorer
		if(document.documentElement.clientWidth){
			windowWidth = document.documentElement.clientWidth; 
		} else {
			windowWidth = self.innerWidth;
		}
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;	
	} else if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
	}			
	
	if (window.innerHeight && window.scrollMaxY) {	
		xScroll = window.innerWidth + window.scrollMaxX;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		xScroll = document.body.scrollWidth;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		xScroll = document.body.offsetWidth;
	}
	
	if(xScroll < windowWidth){	
		pageWidth = xScroll;		
	} else {
		pageWidth = windowWidth;
	}
	
	return pageWidth;
}

//ADD TO CART
function addToCart(item_id, size, qty) {
	var url = "../../../javascript/ajax/add_to_cart.php";
	request.open("POST", url, true);	
	request.onreadystatechange = updateCart;	
	request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	request.send("item_id=" + escape(item_id) + "&size=" + escape(size) + "&qty=" + escape(qty));	
	
}

function updateCart() {
	if (request.readyState == 4) {
		if (request.status == 200) {
			var xmlDoc = request.responseXML;
			var xmlTotal = xmlDoc.getElementsByTagName("items")[0];
			var total = xmlTotal.firstChild.nodeValue;
			var xmlItem = xmlDoc.getElementsByTagName("overlay")[0];
			var itemHTML = xmlItem.firstChild.nodeValue;			

			var TotalDiv = document.getElementById("view-cart-text");
			TotalDiv.innerHTML = total;			
			var ItemDiv = document.getElementById("product-added-content");
			ItemDiv.innerHTML = itemHTML;						
			showCartDropdown();
			
		}
	}		
}

function showCartDropdown() {	
	Effect.SlideDown('view-cart-drop-down');
	setTimeout("autoCloseCartDropdown()",10000);
}

function autoCloseCartDropdown() {
	if (retrieveComputedStyle(document.getElementById("view-cart-drop-down"), "display") != 'none') {		
		Effect.SlideUp('view-cart-drop-down');
	}
}

function closeCartDropdown() {
	Effect.SlideUp('view-cart-drop-down');	
}

function initCart() {
	var closeOverlay = document.getElementById("close-product-added");
	attachEventListener(closeOverlay, "click", closeCartDropdown, false);
}

//SEARCH ENGINE
function initSearch() {
	document.getElementById("search-form").onsubmit = searchValidate;
}

function searchValidate() {
	var query = document.getElementById('search').value;
	if	(validateLength(query,1,1000)) {
		return true;
	} else {
		return false;
		
	}
}
//BANNER SYSTEM
function startBanners() {
	numBanners = getElementsByClassName(document.getElementById("rotating-banner"), "div", "banner").length; 
	var forwardLink = document.getElementById("banner-forward");
	attachEventListener(forwardLink, "click", bannerSlideForward, false);
	var backwardLink = document.getElementById("banner-backward");
	attachEventListener(backwardLink, "click", bannerSlideBackward, false);	
	setTimeout("bannerSlideForward()", bannerRotateSeconds * 1000);
	var totalWidth = numBanners * bannerWidth;
	document.getElementById("rotating-banner").style.width = totalWidth + 'px';
}

function disableLinks() {
	var forwardLink = document.getElementById("banner-forward");
	forwardLink.setAttribute("id","banner-forward-disable");
	var backwardLink = document.getElementById("banner-backward");
	backwardLink.setAttribute("id","banner-backward-disable");
}

function enableLinks() {
	var forwardLink = document.getElementById("banner-forward-disable");
	forwardLink.setAttribute("id","banner-forward");
	var backwardLink = document.getElementById("banner-backward-disable");
	backwardLink.setAttribute("id","banner-backward");
}

function bannerSlideBackward() {
	if (bannerCurrentPosition != 1) {
		clearTimeout(bannerTimeout);		
		disableLinks();
		var currentLocation = parseInt(retrieveComputedStyle(document.getElementById("rotating-banner"),'left'));
		var newLocation = currentLocation + bannerWidth;
		new Effect.Morph('rotating-banner', {
		  style: 'left:' + newLocation + 'px;', 
		  duration: 1 
		});
		bannerCurrentPosition -= 1;
		setTimeout("enableLinks()",1010);	
		bannerTimeout = setTimeout("bannerSlideForward()", bannerRotateSeconds * 1000);				
	}
}

function bannerSlideForward() {
	if (bannerCurrentPosition != numBanners) {
		clearTimeout(bannerTimeout);
		disableLinks();	
		var currentLocation = parseInt(retrieveComputedStyle(document.getElementById("rotating-banner"),'left'));
		var newLocation = currentLocation - bannerWidth;
		new Effect.Morph('rotating-banner', {
		  style: 'left:' + newLocation + 'px;', 
		  duration: 1 
		});
		bannerCurrentPosition += 1;
		setTimeout("enableLinks()",1010);		
		bannerTimeout = setTimeout("bannerSlideForward()", bannerRotateSeconds * 1000);		
	}

}

//AUTOSUGGEST
var searchAutosuggest = new Array();

function getAutosuggest() {	
	var query = document.getElementById("search").value;	
	var url = "../../../javascript/ajax/autosuggest.php";
	request.open("POST", url, true);	
	request.onreadystatechange = createSearchArray;	
	request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	request.send("query=" + escape(query));	
}

function createSearchArray() {
	if (request.readyState == 4) {
		if (request.status == 200) {
			var xmlDoc = request.responseXML;
			var xmlProducts = xmlDoc.getElementsByTagName("products");
			searchAutosuggest = [];
			for (var i = 0; i < xmlProducts.length; i++){
				var totalProducts = xmlProducts[i].firstChild.nodeValue;
				//searchAutosuggest[searchAutosuggest.length] = totalProducts;
				searchAutosuggest.push(totalProducts);
			}
		}
	}		
}

function initAutoComplete() {
	var searchBox = document.getElementById("search");
	searchBox.setAttribute("autocomplete", "off");
	attachEventListener(searchBox, "keydown", getAutosuggest, false);    
	attachEventListener(searchBox, "keydown", keydownAutoComplete, false);
	attachEventListener(searchBox, "blur", blurAutoComplete, false);
	return true;
}

function keydownAutoComplete(event) {
	if (typeof event == "undefined") {
		event = window.event;
	}
 
	switch(event.keyCode) {
		case 9:     // tab
		case 13:    // enter
			break;		
		case 16:    // shift
		case 17:    // ctrl
		case 18:    // alt
		case 20:    // caps lock
		case 27:    // esc
		
			closeDropdown();
			stopDefaultAction(event);
			break;
			
		case 33:    // page up
		case 34:    // page down
		case 35:    // end
		case 36:    // home
		case 37:    // left arrow
		case 39:    // right arrow
			break;
		case 38:    // up arrow
	
			var target = getEventTarget(event);
			var autoCompleteDropdown = document.getElementById("autoCompleteDropdown");
	
			if (autoCompleteDropdown != null) {
				var childLis = autoCompleteDropdown.childNodes;
				var selected = false;
	
				for (var i = 0; i < childLis.length; i++) {
					if (childLis[i].className == "hover") {
					selected = true;
	
					if (i > 0) {
					  childLis[i].className = "";
					  childLis[i - 1].className = "hover";
					  target.value = childLis[i - 1].firstChild.nodeValue;
					}
	
				break;
			  }
			}
	
			if (!selected) {
				childLis[0].className = "hover";
				target.value = childLis[0].firstChild.nodeValue;
			}
		  }
	
		stopDefaultAction(event);		
		break;
	
		case 40:    // down arrow
			var target = getEventTarget(event);
			var autoCompleteDropdown = document.getElementById("autoCompleteDropdown");
			
			if (autoCompleteDropdown != null)  {
				var childLis = autoCompleteDropdown.childNodes;
				var selected = false;
			
				for (var i = 0; i < childLis.length; i++) {
					if (childLis[i].className == "hover") {
						selected = true;
				
						if (i < childLis.length - 1) {
						  childLis[i].className = "";
						  childLis[i + 1].className = "hover";
					
						  target.value = childLis[i + 1].firstChild.nodeValue;
						}			
					break;
				  }
				}
				
				if (!selected) {
				  childLis[0].className = "hover";			
				  target.value = childLis[0].firstChild.nodeValue;
				}
			}
			
			stopDefaultAction(event);		
			break;
	
		case 8:     // backspace
			
			var currentSearch = document.getElementById("search").value;
			if((currentSearch.length==1) || (currentSearch.length==0)) {
				 closeDropdown();
				 break;
			}
			
			if (typeof autoCompleteTimer != "undefined") {
				clearTimeout(autoCompleteTimer);
			}
			
			autoCompleteTimer = setTimeout("generateDropdown(false)", 0);
			break;		
		
		case 46:    // delete
	
			if (typeof autoCompleteTimer != "undefined") {
				clearTimeout(autoCompleteTimer);
			}
			
			autoCompleteTimer = setTimeout("generateDropdown(false)", 0);		
			break;
	
		default:
	
			if (typeof autoCompleteTimer != "undefined") {
				clearTimeout(autoCompleteTimer);
			}
			
			var target = getEventTarget(event);
			var inputRanges = "false";
			
			if (typeof target.createTextRange != "undefined" || typeof target.setSelectionRange != "undefined") {
				inputRanges = "true";
			}
			
			autoCompleteTimer = setTimeout("generateDropdown(" + inputRanges + ")", 0);
	  }
	
	  return true;
}

function generateDropdown(doAutoComplete) {
 
	closeDropdown();
	
	var input = document.getElementById("search");
	
	var newUl = document.createElement("ul");
	newUl.setAttribute("id", "autoCompleteDropdown");
	newUl.autoCompleteInput = input;
	newUl.style.position = "absolute";
	newUl.style.left = getPosition(input)[0] + "px";
	newUl.style.top = getPosition(input)[1] + input.offsetHeight - 2 + "px";
	newUl.style.width = input.offsetWidth - 3 + "px";
	
	for (var i = 0; i < searchAutosuggest.length; i++) {

	var searchLower = searchAutosuggest[i].toLowerCase();
	var inputLower = input.value.toLowerCase();

		if (searchLower.indexOf(inputLower) == 0) {
			var newLi = document.createElement("li");
			newLi.appendChild(document.createTextNode(searchAutosuggest[i]));			
			attachEventListener(newLi, "mouseover", mouseoverDropdown, false);
			attachEventListener(newLi, "mouseout", mouseoutDropdown, false);
			attachEventListener(newLi, "mousedown", mousedownDropdown, false);		
			newUl.appendChild(newLi);
		}
	}

	if (newUl.firstChild != null) {
		document.getElementsByTagName("body")[0].appendChild(newUl);
	}

  return true;
}



function mouseoverDropdown(event) {
	if (typeof event == "undefined") {
		event = window.event;
	}
	
	var target = getEventTarget(event);
	
	while (target.nodeName.toLowerCase() != "li") {
		target = target.parentNode;
	}
	
	var childLis = target.parentNode.childNodes;
	
	for (var i = 0; i < childLis.length; i++) {
		childLis[i].className = "";
	}
	
	target.className = "hover";	
	return true;
}

function mouseoutDropdown(event) {
	if (typeof event == "undefined")  {
		event = window.event;
	}
	
	var target = getEventTarget(event);
	
	while (target.nodeName.toLowerCase() != "li") {
		target = target.parentNode;
	}
	
	target.className = "";	
	return true;
}

function mousedownDropdown(event) {
	if (typeof event == "undefined")  {
		event = window.event;
	}
	
	var target = getEventTarget(event);
	
	while (target.nodeName.toLowerCase() != "li") {
		target = target.parentNode;
	}
	
	target.parentNode.autoCompleteInput.value = target.firstChild.nodeValue;
	var searchForm = document.getElementById("search-form");
	searchForm.submit();
	
	closeDropdown();
	return true;
}

function blurAutoComplete() {
	if (typeof autoCompleteTimer != "undefined")  {
		clearTimeout(autoCompleteTimer);
	}
	
	closeDropdown();
	return true;
}

function closeDropdown() {
	var autoCompleteDropdown = document.getElementById("autoCompleteDropdown");
	
	if (autoCompleteDropdown != null)  {
		autoCompleteDropdown.parentNode.removeChild(autoCompleteDropdown);
	}
	
	return true;
}


function getEventTarget(event) {
	var targetElement = null;
	
	if (typeof event.target != "undefined")  {
		targetElement = event.target;
	}  else  {
		targetElement = event.srcElement;
	}
	
	while (targetElement.nodeType == 3 && targetElement.parentNode != null)  {
		targetElement = targetElement.parentNode;
	}
	
	return targetElement;
}

function stopDefaultAction(event) {
	event.returnValue = false;
	
	if (typeof event.preventDefault != "undefined")  {
		event.preventDefault();
	}
	
	return true;
}

function getPosition(theElement) {
	var positionX = 0;
	var positionY = 0;
	
	while (theElement != null)  {
		positionX += theElement.offsetLeft;
		positionY += theElement.offsetTop;
		theElement = theElement.offsetParent;
	}
	
	return [positionX, positionY];
}

//Loading Overlay
function showLoadingOverlay() {
	var content = document.getElementById('loading-overlay-content');
	var background = document.getElementById('loading-overlay-background');
	content.style.display = 'block';
	background.style.display = 'block'
	background.style.height = getWindowHeight() + 'px';
	background.style.width = getWindowWidth() + 'px';
}

function hideLoadingOverlay() {
	var content = document.getElementById('loading-overlay-content');
	var background = document.getElementById('loading-overlay-background');
	content.style.display = 'none';
	background.style.display = 'none'
	background.style.height = '100%';
	background.style.width = '100%';	
}