var cart = new Cart();


/**
 * Cart
 * @constructor
 */
function Cart()
{
	// Call the prototype's constructor
	Page.call(this);

	// Private
	var self		= this,
		dom			= new DOM(),
		actionBoxes	= [];

	// Public
	this.showStoreInformation 		= showStoreInformation;
	this.rowsHandler				= rowsHandler;
	this.showInsuranceInformation	= showInsuranceInformation;

	// Constructor
	self.addEventListener(Page.LOADED, applyDeliveryDateSelect, false);
	self.addEventListener(Page.LOADED, rowsHandler, false);
	self.addEventListener(Page.LOADED, showInsuranceInformation, false);
	

	/**
	 * Show the assortment state for the product in either all stores, or a specific store, using an ActionBox
	 * @param {Object} event The event that triggered this function.
	 * @param {Number} storeId The store ID.
	 */
	function showStoreInformation(event, storeId)
	{
		if (event == undefined)
		{
			event = window.event;
		}

		if (event.target == undefined)
		{
			event.target = event.srcElement;
		}

		if (typeof storeId != "number") 
		{
			throw new Error("Invalid argument: storeId is missing or not a number");
		}

		var socket			= new Socket(),
			requestResult	= null,
			actionBox		= null,
			thisActive		= false;

		while ((actionBox = actionBoxes.pop()))
		{
			if (actionBox.getAttachedTo() == event.target)
			{
				thisActive = true;
			}

			actionBox.close();
		}

		if (thisActive == true)
		{
			return null;
		}

		actionBox = new ActionBox(
			"Even geduld " + getVousOuTu("alstublieft", "alsjeblieft") + "...",
			[
				dom.create(
					"div",
					{
						className : "actionbox_content_loading"
					},
					[
						"Wordt geladen..."
					]
				)
			]
		);

		actionBoxes.push(actionBox);

		socket.addEventListener(Socket.LOADED, function(event)
		{
			if (socket.getStatus() == 200)
			{
				// Evaluate the response
				try
				{
					eval(event.target.getResponseText());
				}
				catch(error)
				{
					return null;
				}

				requestResult = result;

				// Update the ActionBox
				actionBox.setTitle("Onze winkel in " + requestResult.storeLocation);
				actionBox.setContent(requestResult.content);
			}
			else
			{
				actionBox.setTitle("De informatie kon niet worden geladen");
				actionBox.setContent([
					dom.create(
						"div",
						{
							className : "actionbox_content_loading_error"
						},
						[
							"Helaas kon de informatie niet worden geladen. Onze excuses voor het ongemak."
						]
					)
				]);
			}

			return null;
		});

		socket.request(
			"/winkelmandje/?shopoutletid=" + storeId,
			{
				actionbox : (new Date()).getTime()
			}
		);

		actionBox.show(event.target);
		actionBox.setPosition((event.pageX ? event.pageX : event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft), (event.pageY ? event.pageY : event.clientY + document.documentElement.scrollTop + document.body.scrollTop));

		return null;
	}



	/*
	 * applyDeliveryDateSelect
	 */
	function applyDeliveryDateSelect()
	{
		if (dom.getById("shipmentmethod_deliverydate") != null)
		{
			new Select(
				new SelectSelectTarget(dom.getById("shipmentmethod_deliverydate"))
			);
		}
	}



	/*
	 * rowsHandler shipmentmethod rows
	 */
	function rowsHandler()
	{
		if (!dom.getById("shipmentmethod"))
		{
			return false;
		}

		var table = dom.getById("shipmentmethod");
		var rows = table.getElementsByTagName("tr");
		var rowsLength = rows.length;

		for (var i = 0; i < rowsLength; i++) 
		{
			dom.extend(rows[i]);

			rows[i].onmouseover	= mouseOver;
			rows[i].onmouseout	= mouseOut;

			if (rows[i].hasClass("method"))
			{
				rows[i].onclick = select;
			}
		}
	
		function mouseOver() {
			this.addClass("hover");
		}
	
		function mouseOut() {
			this.removeClass("hover");
		}

		function select(event)
		{
			event = event || window.event;

			if (!event.target)
			{
				event.target = event.srcElement;
			}

			var target = event.target;

			while (target != null && target != this && target.tagName.toLowerCase() != "a" && target.parentNode != null)
			{
				target = target.parentNode;
			}

			if (target.tagName.toLowerCase() != "a")
			{
				this.getElementsByTagName("input")[0].checked = true;
			}

			//get the storelocation ID for storeinfo toggle
			storeId = this.id.replace("cart_selected_storelocation_","");
			toggleStoreInfoBox(storeId);
		}
		
		function storeInfo(toggle, containingElementId)
		{
			var items = dom.getById(containingElementId).getElementsByTagName("div"),
				target = dom.getById(toggle.href.substr(toggle.href.indexOf("#") + 1));
		
			for (var i = 0; i < items.length; i++)
			{
				dom.extend(items[i]);
		
				if (items[i].hasClass("accordion"))
				{
					items[i].removeClass("active");
				}
			}
			target.addClass("active");
			controller.setCookie("shopToggle",toggle.href.substr(toggle.href.indexOf("#") + 1));
		}

		function toggleStoreInfoBox(storeId)
		{
			if (!dom.getById("store_information")) 
			{
				return false;
			}
			if (storeId == "") 
			{
				return false;
			}

			//uses common.js function
			storeInfo(dom.getById("store_location_toggle_"+storeId), 'store_information');
			return false;
		}
	}



	/**
	 * Show the insurance notice using an ActionBox
	 * @param {Object} event The event that triggered this function.
	 */
	function showInsuranceInformation()
	{
		var socket			= new Socket(),
			requestResult	= null;

		if(!dom.getById("insurance_contents"))
		{
			return false;
		}

		var actionBox = new ActionBox(
			"Even geduld " + getVousOuTu("alstublieft", "alsjeblieft") + "...",
			[
				dom.create(
					"div",
					{
						className : "actionbox_content_loading"
					},
					[
						"Wordt geladen..."
					]
				)
			],
			true
		);

		var insuranceNotice = dom.getById("insurance_contents");
		var insuraceInformationIcon = dom.create(
			"img",
			{
				alt 		: "Starttarief zekerheidspakket",
				src			: "/images/default/blank.gif" ,
				className	: "actionbox",
				onclick		: (function() {
								return function(event) {
									if (event == undefined)
									{
										event = window.event;
									}

									if (event.target == undefined)
									{
										event.target = event.srcElement;
									}
									
									actionBox.setTitle("Starttarief zekerheidspakket");
									actionBox.setContent("Het eenmalig starttarief bestaat uit administratiekosten om je zekerheidspakket op te starten.");
									actionBox.show(event.target);
									actionBox.setPosition((event.pageX ? event.pageX : event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft), (event.pageY ? event.pageY : event.clientY + document.documentElement.scrollTop + document.body.scrollTop));
									return false;
								}
							}
						)()
			}
			,null
		)
		insuranceNotice.appendChild(insuraceInformationIcon);
		return null;
	}
}

// Inheritance
Cart.prototype = new Page();
controller.setPageObject(cart);