(function () {
	var Fn = {
		/* DOM functions to get elements and manage events and classes etc. */
		Dom: {
			/* getById */
			oElemCache: {},
			
			$: function (sId, bRefresh) {
				if (bRefresh || !Fn.Dom.oElemCache[sId]) {
					Fn.Dom.oElemCache[sId] = document.getElementById(sId);
				}

				return Fn.Dom.oElemCache[sId];
			},
			
			/*
			 * Event functions.
			 * Description: Add eventlisteners to DOM elements to enforce unobtrusive js.
			 */
			addEvent: function (obj, evType, fn, useCapture) {
				useCapture = useCapture || false;
				
				if (obj.addEventListener) {
					obj.addEventListener(evType, fn, useCapture);
					return true;
				} else if (obj.attachEvent) {
					obj["e" + evType + fn] = fn;
					obj[evType + fn] = function () {
						obj["e" + evType + fn](window.event);
					};
					var r = obj.attachEvent("on" + evType, obj[evType + fn]);
					return r;
				} else {
					obj["on" + evType] = fn;
					return true;
				}
			},
			
			removeEvent: function (obj, evType, fn) {
				if (obj.detachEvent) {
					obj.detachEvent("on" + evType, obj[evType + fn]);
					obj[evType + fn] = null;
				} else {
					obj.removeEventListener(evType, fn, false);
				}
			},

			cancelEvent: function (e) {
				var evt = e || window.event;
				
				evt.cancelBubble = true;
				evt.returnValue = false;
				
				if (evt.stopPropagation) {
					evt.stopPropagation();
					evt.preventDefault();
				}
				
				return false;
			},
			
			addLoadEvent: function (f) {
				var oldOnload = window.onload;
				
				if (typeof window.onload !== "function") {
					window.onload = f;
				}
				else {
					window.onload = function () {
						oldOnload();
						f();
					};
				}
			}
		},
		
		round: function (dNumber, iDecimals) {
			dNumber	= (Math.round(dNumber * Math.pow(10, iDecimals)) / Math.pow(10, iDecimals)).toString().replace(".", ",");
			
			var iDotIndex = dNumber.indexOf(",");
			
			return iDotIndex === -1 ? dNumber + ",00" : iDotIndex === dNumber.length - 2 ? dNumber + "0" : dNumber;
		}
	},
	
	cartPageInit = function () {
		var elForm = Fn.Dom.$("frmCart");
		
		if (!elForm) {
			// Form not found, cart probably empty.
			return;
		}
		
		var aShipOptions = elForm.verzendingsOptie,
			i, j;
		
		for (i = 0, j = aShipOptions.length; i < j; i++) {
			Fn.Dom.addEvent(aShipOptions[i], "click", function (e) {
				var dNewTotal = parseFloat(elForm.subTotal.value) + parseFloat(elForm["shipTotal_" + this.value].value);
				Fn.Dom.$("lblTotal").innerHTML = Fn.round(dNewTotal, 2);
			});
			
			Fn.Dom.addEvent(elForm.shippingCountry, "change", function (e) {
				if (elForm.verzendingsOptie[0].checked) {
					var dShipCosts	= (this[this.selectedIndex].innerHTML).replace(/[^\d,.]/gi, "");
					
					dShipCosts = parseFloat(dShipCosts.replace(",", "."));
					
					if (!isNaN(dShipCosts)) {
						var dNewTotal	= parseFloat(elForm.subTotal.value) + dShipCosts;
						Fn.Dom.$("lblShipCosts").innerHTML	= Fn.round(dShipCosts, 2);
						Fn.Dom.$("lblTotal").innerHTML		= Fn.round(dNewTotal, 2);
					}
				}
			});
		}
	};
	
	// Check what method to use to initiate our function on page load.
	if (typeof(jQuery) !== "undefined" && !/load=domready/gi.test(location.search) && !/load=addload/gi.test(location.search)) {
		// Use jQuery to check for DOMContentLoaded event.
		jQuery(document).ready(cartPageInit);
	} else if (typeof(domReady) !== "undefined" && !/load=addload/gi.test(location.search)) {
		// Use new domReady function to check for DOMContentLoaded event.
		domReady(cartPageInit);
	} else {
		// Use old addLoadEvent function to check for DOMContentLoaded event (slower).
		Fn.Dom.addLoadEvent(cartPageInit);
	}
}());
