var Common = {
	navRoot : "/",
	
	gotoPage : function(url) {
		document.location.href = Common.navRoot + url;
	},
	
	getUrlParam : function(name) {
		var regexS = "[\\?&]"+name+"=([^&#]*)";
		var regex = new RegExp( regexS );
		var tmpURL = window.location.href;
		var results = regex.exec( tmpURL );
		if( results == null )
			return "";
		else
			return results[1];
	},
	
	pageInit : function() {
		FlashCommunicator.init();
		FlashVideoCommunicator.init();
		FlashVideoCommunicator.loadStartupVideo();
	}
};

var MouseLocation = {
	x : 0,
	y : 0,
	
	xOffset : -55,
	yOffset : -15,
	
	mouseMoveEvent : function(e) {		
		if (document.all) {
		
			var scrollY = 0;
			if (document.documentElement && !document.documentElement.scrollTop) {
				// IE6 +4.01 but no scrolling going on
			} else if (document.documentElement && document.documentElement.scrollTop) {
				// IE6 +4.01 and user has scrolled
				scrollY = document.documentElement.scrollTop;
			} else if (document.body && document.body.scrollTop) {
				// IE5 or DTD 3.2			
				scrollY = document.body.scrollTop;
			}

			MouseLocation.x = event.x + document.body.scrollLeft;
			MouseLocation.y = event.y + scrollY;
		}
		else {
			MouseLocation.x = e.pageX;
			MouseLocation.y = e.pageY;
		}
		
		MouseLocation.x += MouseLocation.xOffset;
		MouseLocation.y += MouseLocation.yOffset;
	}
};

var CategorySelect = {
	selectedId : "",

	select : function(page, divId, linkId) {
		//if (document.getElementById(divId) != undefined)
		//	document.getElementById(divId).innerHTML = "Loading...";
	
		document.getElementById(CategorySelect.selectedId).className = "";
		document.getElementById(linkId).className = "selected";
		CategorySelect.selectedId = linkId;
		DetailBubble.selectedId = 0;

		var req = Network.getXMLHttpRequest();
		if (req == null) 
			return false;		

		req.open("GET", page, true);
		req.onreadystatechange = Network.getResponseFunction(req, CategorySelect.ResponseProcessor.selectProc, divId);
		req.send(null);

		return true;
	},
	
	ResponseProcessor : {
		selectProc : function(responseText, responseArgs) {
			if (document.getElementById(responseArgs[0]) != undefined)
				document.getElementById(responseArgs[0]).innerHTML = responseText;
		}
	}
};

var FlashCommunicator = {
	productPage : "products_mc",
	pressPage : "press_mc",
	videoPage : "video_mc",
	contactPage : "contacts_mc",
	noPage : "",
	
	startupPage : "",
	startupFrame : 1,
	flashObj : null,
	
	init : function() {
		if(navigator.appName.indexOf("Microsoft") != -1)
			FlashCommunicator.flashObj = window.hij_banner;
		else
			FlashCommunicator.flashObj = window.document.hij_banner;
	},
	
	getStartupParams : function() {
		var params = new Array();

		params[0] = FlashCommunicator.productPage;	// Products Button Name
		params[1] = FlashCommunicator.pressPage;	// Press Button Name
		params[2] = FlashCommunicator.videoPage;	// Video Button Name
		params[3] = FlashCommunicator.contactPage;	// Contacts Button Name
		params[4] = FlashCommunicator.startupPage;	// Selected Button

		// MovieClip Frame
		if (Common.getUrlParam("f") == "")
			params[5] = FlashCommunicator.startupFrame;
		else
			params[5] = parseInt(Common.getUrlParam("f"));
			
		return params;
	},
	
	navButtonClick : function(btnClickName, movieFrame) {
		switch(btnClickName) {
			case FlashCommunicator.productPage:
				Common.gotoPage("products/?f=" + movieFrame);
				break;
			
			case FlashCommunicator.pressPage:
				Common.gotoPage("press/?f=" + movieFrame);
				break;

			case FlashCommunicator.videoPage:
				Common.gotoPage("video/?f=" + movieFrame);
				break;

			case FlashCommunicator.contactPage:
				Common.gotoPage("contacts/?f=" + movieFrame);
				break;
		}
	}
};


function setBandwidth (connectionSpeed) {
if ((navigator.userAgent.indexOf("IE") > -1) && (navigator.platform == "Win32")) {
MediaPlayer.autoStart = true;
MediaPlayer.Filename = connectionSpeed + '.wmv';
} else {
document.MediaPlayer.SetAutoStart(true);
document.MediaPlayer1.SetFileName(connectionSpeed + '.wmv');
}
}



var FlashVideoCommunicator = {
	flashObj : null,
	startupVideo : "",
	
	init : function() {
		if (document.getElementById("featured_video") != undefined) {
			if(navigator.appName.indexOf("Microsoft") != -1)
				FlashCommunicator.flashObj = window.featured_video;
			else
				FlashCommunicator.flashObj = window.document.featured_video;		
		}
	},
	
	loadVideo : function(video) {
		if (FlashCommunicator.flashObj != null) {
			FlashCommunicator.flashObj.FLVload(video);
		}
	},
	
	loadStartupVideo : function() {
		if (FlashVideoCommunicator.startupVideo != "")
			FlashVideoCommunicator.loadVideo(FlashVideoCommunicator.startupVideo);
	}
};

var DetailBubble = {
	divName : "productBlurb",
	selectedId : 0,
	divClick : false,
	
	getDivElement : function() {
		var divElement = document.getElementById(DetailBubble.divName);
		
		if (divElement == undefined)
			return null;
			
		return divElement;
	},

	show : function(productId) {
		var divElement = DetailBubble.getDivElement();

		if (divElement == null)
			return;

		divElement.style.display = "block";
		//divElement.style.left = MouseLocation.x + "px";
		divElement.style.top = MouseLocation.y + "px";
		
		DetailBubble.divClick = true;

		if (productId != DetailBubble.selectedId) {
			document.getElementById(DetailBubble.divName + "_title").innerHTML = "Loading...";
			document.getElementById(DetailBubble.divName + "_desc").innerHTML = "&nbsp;";

			var req = Network.getXMLHttpRequest();
			if (req == null) 
				return;

			req.open("GET", Common.navRoot + "productBlurb/" + productId + "/", true);
			req.onreadystatechange = Network.getResponseFunction(req, DetailBubble.ResponseProcessor.showProc);
			req.send(null);
		}
		
		DetailBubble.selectedId = productId;
	},
	
	hide : function() {
		var divElement = DetailBubble.getDivElement();
		
		if (divElement != null && divElement.style.display == "block")
			divElement.style.display = "none";
	},
	
	gotoCoords : function(x, y) {
		var divElement = DetailBubble.getDivElement();
		
		if (divElement != null && divElement.style.display == "block") {
			divElement.style.left = x;
			divElement.style.top = y;
		}
	},
	
	setContent : function(content) {
		var divElement = DetailBubble.getDivElement();
		
		if (divElement == null)
			return false;
			
		DetailBubble.selectedId = 0;
		document.getElementById(DetailBubble.divName + "_desc").innerHTML = content;
		
		return true;
	},
	
	checkForHide : function(e) {
		if (!DetailBubble.divClick)
			DetailBubble.hide();
			
		DetailBubble.divClick = false;
		
		/*
		var divElement = DetailBubble.getDivElement();
		
		if (divElement == null)
			return;
			
		var minX = parseInt(divElement.style.left);
		var minY = parseInt(divElement.style.top);
		var maxX = parseInt(divElement.style.left) + parseInt(divElement.style.width);
		
		if (MouseLocation.x < minX || MouseLocation.y < minY || MouseLocation.x > maxX)
			DetailBubble.hide();
		*/
	},
	
	ResponseProcessor : {
		showProc : function(responseText, responseArgs) {
			var responseXML = Network.parseToXML(responseText);
							
			var resultRoot = responseXML.getElementsByTagName("result")[0];
			var productTitle = resultRoot.getElementsByTagName("product_title")[0];
			var productDesc = resultRoot.getElementsByTagName("product_description")[0];
	
			document.getElementById(DetailBubble.divName + "_title").innerHTML = productTitle.childNodes[0].nodeValue;
			document.getElementById(DetailBubble.divName + "_desc").innerHTML = productDesc.childNodes[0].nodeValue;
		}
	}
};

var Cart = {
	divName : "cartSidenav",
	
	add : function(itemId, itemType) {
		var req = Network.getXMLHttpRequest();
		if (req == null) 
			return;

		req.open("GET", Common.navRoot + "cart/addToCart/?itemId=" + itemId + "&itemType=" + itemType, true);
		req.onreadystatechange = Network.getResponseFunction(req, Cart.ResponseProcessor.addProc);
		req.send(null);
	},
	
	remove : function(cartItemId) {
		var req = Network.getXMLHttpRequest();
		if (req == null) 
			return;

		req.open("GET", Common.navRoot + "cart/removeFromCart/?cartItemId=" + cartItemId, true);
		req.onreadystatechange = Network.getResponseFunction(req, Cart.ResponseProcessor.removeProc);
		req.send(null);
	},
	
	removeFromMainCart : function(cartItemId) {
		var req = Network.getXMLHttpRequest();
		if (req == null) 
			return;

		req.open("GET", Common.navRoot + "cart/removeFromCart/?cartItemId=" + cartItemId, true);
		req.onreadystatechange = Network.getResponseFunction(req, Cart.ResponseProcessor.removeFromMainCartProc);
		req.send(null);
	},
	
	refreshCart : function() {
		var divElement = Cart.getDivElement();
		var req = Network.getXMLHttpRequest();

		if (req == null || divElement == null) 
			return;

		req.open("GET", Common.navRoot + "cartSidenav/", true);
		req.onreadystatechange = Network.getResponseFunction(req, Cart.ResponseProcessor.refreshCartProc);
		req.send(null);		
	},

	refreshMainCart : function() {
		var divElement = document.getElementById("leftColumn");
		var req = Network.getXMLHttpRequest();

		if (req == null || divElement == undefined) 
			return;

		req.open("GET", Common.navRoot + "cartDetails/", true);
		req.onreadystatechange = Network.getResponseFunction(req, Cart.ResponseProcessor.refreshMainCartProc);
		req.send(null);		
	},
	
	getDivElement : function() {
		var divElement = document.getElementById(Cart.divName);
		
		if (divElement == undefined)
			return null;
			
		return divElement;
	},
	
	ResponseProcessor: {
		addProc : function(responseText, responseArgs) {
			var responseXML = Network.parseToXML(responseText);
							
			var resultRoot = responseXML.getElementsByTagName("result")[0];
			var success = resultRoot.getElementsByTagName("success")[0].childNodes[0].nodeValue;
			var errNiceMessage = resultRoot.getElementsByTagName("errNiceMessage")[0].childNodes[0].nodeValue;
			var errDetail = resultRoot.getElementsByTagName("errDetail")[0].childNodes[0].nodeValue;
			
			if (success == "true") {
				Cart.refreshCart();
			} else {
				DetailBubble.setContent(errNiceMessage + "<br /><br /><a href=\"#\" onclick=\"DetailBubble.hide();return false;\">Close</a>");
				setTimeout("DetailBubble.hide()", 3000);			
			}
		},
		
		removeProc : function(responseText, responseArgs) {
			Cart.refreshCart();
		},

		removeFromMainCartProc : function(responseText, responseArgs) {
			var divElement = document.getElementById("leftColumn");
			
			if (divElement != undefined) {
				Cart.refreshMainCart();
			}
		},
		
		refreshCartProc : function(responseText, responseArgs) {
			var divElement = Cart.getDivElement();

			if (divElement != null) {
				divElement.innerHTML = responseText;
				DetailBubble.setContent("Item added to downloads...<br /><br /><a href=\"#\" onclick=\"DetailBubble.hide();return false;\">Close</a>");
				setTimeout("DetailBubble.hide()", 2000);
			} else {
				DetailBubble.hide();
			}
		},
		
		refreshMainCartProc : function(responseText, responseArgs) {
			var divElement = document.getElementById("leftColumn");
			
			if (divElement != undefined) {
				divElement.innerHTML = responseText;
			}
		}
	}
};

var Network = {
	getXMLHttpRequest : function() {
		var req = null;
	
		if(typeof XMLHttpRequest == "undefined") {
			var MSXML_XMLHTTP_PROGIDS = ['MSXML2.XMLHTTP.7.0','MSXML2.XMLHTTP.6.0','MSXML2.XMLHTTP.5.0','MSXML2.XMLHTTP.4.0','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP','Microsoft.XMLHTTP'];
	
			var success = false;
			for (var i=0; i<MSXML_XMLHTTP_PROGIDS.length && !success; i++) {
				try {
					req = new ActiveXObject(MSXML_XMLHTTP_PROGIDS[i]);
					success = true;
				} catch (e) {
					/* Nothing */
				}
			}
		} else {
			req = new XMLHttpRequest();
		}
		
		return req;
	},

    getResponseFunction : function(transport, responseFunction) {
		var responseArgs = new Array();
	
		if (typeof arguments != "undefined")
			for (var i=2; i<arguments.length; i++)
				responseArgs[i-2] = arguments[i];
    
		var ret = function() {
		    if (transport.readyState == 4) {
		        if (transport.status == 200) {
		            var responseText = transport.responseText.replace(/^\s+|\s+$/, '');
		            responseFunction(responseText, responseArgs);
		        } else {
		            Utility.error("There was a problem retrieving data: " + transport.statusText + "<br/>Contents: " + escape(transport.responseText) );
		        }
		    }
		};
		return ret;
	},
    
	parseToXML : function(text) {
		return (new DOMParser()).parseFromString(text.replace(/^\s+|\s+$/, ''), "text/xml");
	}
};

var Utility = {
	error : function(msg) {
		if (document.getElementById("ErrorField") != undefined)
			document.getElementById("ErrorField").innerHTML = document.getElementById("ErrorField").innerHTML + "<br />" + "<span style=\"color:#FF0000\">*" + msg + "</span>";
	},
	
	log : function(msg) {
		if (document.getElementById("ErrorField") != undefined)
			document.getElementById("ErrorField").innerHTML = document.getElementById("ErrorField").innerHTML + "<br />" + "<span style=\"color:#0000FF\">*" + msg + "</span>";
	},
	
	clear : function() {
		if (document.getElementById("ErrorField") != undefined)
			document.getElementById("ErrorField").innerHTML = "";	
	}
};

// For IE compatibility: Define DOMParser
if (typeof DOMParser == "undefined") {
	DOMParser = function () {};

	DOMParser.prototype.parseFromString = function (str, contentType) {
		if (typeof ActiveXObject != "undefined") {
			var d = new ActiveXObject("MSXML.DomDocument");
			d.loadXML(str);

			return d;
		} else if (typeof XMLHttpRequest != "undefined") {
			var req = new XMLHttpRequest;
			req.open("GET", "data:" + (contentType || "application/xml") +
					";charset=utf-8," + encodeURIComponent(str), false);
			
			if (req.overrideMimeType)
			req.overrideMimeType(contentType);

			req.send(null);
			return req.responseXML;
		}
	};
}

document.onmousemove = MouseLocation.mouseMoveEvent;
document.onclick = DetailBubble.checkForHide;
window.onload = Common.pageInit;