var debug = false;

function include_once(filename, callback) {
  var cur_file = {};
  cur_file[window.location.href] = 1;

  if (!window.hos && !window.hos.includes && !window.hos.includes[filename]) {
    if (include(filename, callback)) {
      return true;
    }
  } else {
    return true;
  }
}
function include(filename, callback) {
  var js = document.createElement('script');
  js.setAttribute('type', 'text/javascript');
  js.setAttribute('src', filename);
  js.setAttribute('defer', 'defer');
  document.getElementsByTagName('head')[0].appendChild(js);

  var cur_file = {};
  cur_file[window.location.href] = 1;

  if (!window.hos) window.hos = {};
  if (!window.hos.includes) window.hos.includes = cur_file;
  if (!window.hos.includes[filename]) {
      window.hos.includes[filename] = 1;
  } else {
    window.hos.includes[filename]++;
  }
  js.onreadystatechange = function () {
    if (js.readyState == 'complete') {
      alert('JS onreadystate fired');
    } else if (js.readyState == 'loaded') {
      alert('JS onreadystate fired');
    }
  }

  js.onload = function () {
    alert('JS onload fired');
  }
  return window.hos.includes[filename];
}

// Creates a wood selection manager for use with chess pieces (or boards) that allow that sort of thing
var woodSelectionManagerInstance;
var wsmAttemptCount = 0;
function createWoodSelectionOptions() {
    try {
      woodSelectionManagerInstance = new woodSelectionManager(kingCartProductInstance);
    } catch(err) {
		wsmAttemptCount++;
		if (debug) alert(err);
        if (wsmAttemptCount < 5) // retry 5 times
            setTimeout("createWoodSelectionOptions();", 3000);
    }
}

// Creates an instance of a pricing manager
var pricingManagerInstance;
function createPricingManager() {
    try {
        pricingManager = new pricingManager(kingCartProductInstance, woodSelectionManagerInstance);
    } catch(err) {
		if (debug) alert(err);
	}
}

// Search feature implementation
function doSearch() {
    var url = (domHelper.isHostKingCart())
      ? "http://www.king-cart.com/cgi-bin/cart.cgi?store=houseofstaunton&category=%20&exact_match=on&keywords="
      : "http://www.houseofstaunton.com/Store/category=%20&exact_match=on&keywords=";
    var keywordsBox = document.getElementById("keywordsSearchBox");
    var keywords = keywordsBox.value;

    if (!keywords || keywords == "") {
        alert("Search is empty! Please enter some search terms");
        keywordsBox.focus();
        return;
    }

    window.location = url + keywords;
}
// Replacement for JS window.open() to provide standardized method of opening a window
function showWindow(url) {
    var name = "";
    var features = "";
    var replace = "";
    window.open(url, name, features, replace);
    
    return false;
}
// Adds this site to the user's favorites
function addFavorite() {
    window.external.AddFavorite(location.href, document.title);
    return false;
}
// Limits float values to 2 sig. digits
function formatDollar(value) {
    var num = parseFloat(value);
    if (isNaN(num))
        return "0.00";
    else if (num.toFixed)
        return num.toFixed(2);
    else
        return num; // temp solution; will upgrade
}

// Add trim functionality to string object
String.empty = "";
String.format = function() {
    if (arguments.length == 0) return String.empty;
    var out = arguments[0];
    var params = [];
    if (typeof(arguments[1]) == "object")
        params = arguments[1];
    else
        for (var i = 1; i < arguments.length; i++)
            params[params.length] = arguments[i];

    for (var i = 0; i < params.length; i++)
        out = out.replaceAll("\\{" + (i) + "}", params[i]);

    return out;
};
String.prototype.format = function() {
    return String.format(this, arguments);
};
String.prototype.trim = function () {
        return this.replace(/^\s+|\s+$/g, "");
};
String.prototype.contains = function(text) {
    return this.indexOf(text) > -1;
};
String.prototype.replaceAll = function(searchTerm, replacementText, isCaseSensitive) {
    var regex = "/" + searchTerm + "/g";
	if (!isCaseSensitive) regex += "i";

	return this.replace(eval(regex), replacementText);
};

// Add random int generator to Math object
Math.intRand = function(max, min) {
  max = (!max) ? 1 : max;
  min = (!min) ? 0 : min;
  return Math.floor(Math.random() * (max - min + 1) + min);
}

// domHelper class definition
function domHelper() {}
// Attaches events to HTML elements.
domHelper.addEvent = function(target, eventName, eventHandler, useCapture) {
    eval("var onTarget = target.on" + eventName + ";");

    if (target.addEventListener) {
        target.addEventListener(eventName, eventHandler, useCapture);
    }
    else if (target.attachEvent) {
        target.attachEvent("on" + eventName, eventHandler);
    }
    else if (onTarget) {
        onTarget = function piggyback() {
            onTarget();
            eventHandler();
        };
    }
    else { 
        onTarget = eventHandler();
    }
};
// Creates an instance of an object that can read other documents
domHelper.createDocumentObject = function() {
    var doc;

    if (window.XMLHttpRequest && !(window.ActiveXObject)) {
    	try {
			doc = new XMLHttpRequest();
        } catch (err) {
			doc = false;
			if (debug) alert(err);
        }
    }
	else if (document.implementation && document.implementation.createDocument) {
	    try {
    		doc = document.implementation.createDocument("", "", null);
        } catch (err) {
            doc = false;
			if (debug) alert(err);
        }
	}
	else if (window.ActiveXObject) {
	    try {
	        doc = new ActiveXObject("Microsoft.XMLDOM");
        } catch (err) {
            doc = false;
			if (debug) alert(err);
        }
 	}
	else return;

	return doc;
};
// Instructs the document object to attach an event to the LoadComplete method and load the document
// Currently only used by ImageCycler. Remove when that thing is replaced
domHelper.attachDocumnetReadyStateEvent = function(srcFile, doc, readyStateMethod) {
    if (!doc) return;

	if (!window.ActiveXObject && doc.onreadystatechange) {
		doc.onreadystatechange = readyStateMethod;
	}
	else if (document.implementation && document.implementation.createDocument) {
	    doc.onload = readyStateMethod;
    }
    else if (window.ActiveXObject) {
	    doc.onreadystatechange = function () {
		    if (doc.readyState == 4) readyStateMethod();
	    };
    }
    else return;

    try {
        if (doc.open) {
	        doc.open("GET", srcFile, true);
	        doc.send("");
	    }
	    else {
    	    doc.load(srcFile);
    	}
    } catch (err) {
        if (debug) alert(err);
    }
};
// Cross-browser support for collecting elements from a response stream
// Currently only used by ImageCycler. Remove when that thing is replaced
domHelper.getElementsByTagName = function(doc, tagName) {
	var xmlDoc = doc;
	if (xmlDoc.responseXML) xmlDoc = xmlDoc.responseXML;
	return xmlDoc.getElementsByTagName(tagName);
};
// Cross-browser support for attaching text to the inside of an element
// Currently only used by ImageCycler. Remove when that thing is replaced
domHelper.setInnerHTML = function(target, HTML) {
    target.innerHTML = HTML;
};
// Cross-browser support for getting the text from an element
// Currently only used by ImageCycler. Remove when that thing is replaced
domHelper.getInnerText = function(sourceElement) {
    if (sourceElement.nodeType == 3 || sourceElement.nodeType == 4) { // CDATA elements
        return sourceElement.data;
    }

    var returnValue = [];
    for (var i = 0; i < sourceElement.childNodes.length; i++) {
        returnValue.push(domHelper.getInnerText(sourceElement.childNodes[i]));
    }
    return returnValue.join("");
};
// Gets the URL of the curre nt page
domHelper.getHostUrl = function() {
  var host = (window.location.hostname)
    ? (window.location.hostname.indexOf("http://") > -1) 
      ? window.location.hostname
      : "http://" + window.location.hostname + "/" 
    : "/";
  if (host.indexOf("localhost") > -1) host = "/";
  return host;
}
domHelper.isHostKingCart = function() {
  var a = host.indexOf("king") > 0;
  return a;
}
domHelper.getXmlDataPath = function() {
  var path = (domHelper.isHostKingCart()) ? "store/houseofstaunton/" : "KingCart/Common/Data/"
  return host + path;
}
domHelper.getTemplatePath = function() {
  var path = (domHelper.isHostKingCart()) ? "store/houseofstaunton/" : "KingCart/Common/Template/"
  return host + path;
}
// A ClassEvent is an Event that's attached to a custom JavaScript "Class" and is not to be confused with your standard DOM "event"
function ClassEvent() {
	this.handlers = new Array();
	this.firedCount = 0;
	this.handlersCount = 0;
}
ClassEvent.prototype.add = function(item) {
	this.handlers[this.handlers.length] = item;
	this.handlersCount++;
};
ClassEvent.prototype.fire = function() {
	this.firedCount++;
	for (var i = 0; i < this.handlers.length; i++) {
		eval(this.handlers[i]);
	}
};
ClassEvent.prototype.hasFired = function() {
	return this.firedCount > 0;
};

// Add node definition for browsers that don't support it
if (!window["Node"]) {
    window.Node = new Object();
    Node.ELEMENT_NODE = 1;
    Node.ATTRIBUTE_NODE = 2;
    Node.TEXT_NODE = 3;
    Node.CDATA_SECTION_NODE = 4;
    Node.ENTITY_REFERENCE_NODE = 5;
    Node.ENTITY_NODE = 6;
    Node.PROCESSING_INSTRUCTION_NODE = 7;
    Node.COMMENT_NODE = 8;
    Node.DOCUMENT_NODE = 9;
    Node.DOCUMENT_TYPE_NODE = 10;
    Node.DOCUMENT_FRAGMENT_NODE = 11;
    Node.NOTATION_NODE = 12;
}

// Stores root location to reference data files 
var host = domHelper.getHostUrl();
