var product = new Product();



/**
 * Product
 * @extends Page
 * @constructor
 */
function Product()
{
	// Call the prototype's constructor
	Page.call(this);

	// Private
	var self			= this,
		dom				= new DOM(),
		productId		= self.getRequestVariables()[1];

	// Public
	this.showStoreProductAvailabilityState				= showStoreProductAvailabilityState;
	this.showPromotionalIconState						= showPromotionalIconState;
	this.showInsuranceCoverageOverview					= showInsuranceCoverageOverview;
	this.showInsuranceAttributeDescription				= showInsuranceAttributeDescription;
	this.showSuggestedServiceplanInformation 			= showSuggestedServiceplanInformation;
	this.showProductSpecificationInformation			= showProductSpecificationInformation;
	this.showMailAFriend								= showMailAFriend;
	this.addPrintButton 								= addPrintButton;
	this.highlightSpecificationRows 					= highlightSpecificationRows;
	this.showGallery 									= showGallery;
	this.showActiveSMSMailer							= showActiveSMSMailer;
	this.activateReviewToggle							= activateReviewToggle;
	this.activateReviewVoter							= activateReviewVoter;
	this.show360FlashMovie 								= show360FlashMovie;
	this.showPromotionImage 							= showPromotionImage;
	this.showCustomerImageGallery 						= showCustomerImageGallery;
	this.showDeliveryNotice								= showDeliveryNotice;

	//load on pageload
	self.addEventListener(Page.LOADED, showMailAFriend, false);
	self.addEventListener(Page.LOADED, addPrintButton, false);
	self.addEventListener(Page.LOADED, highlightSpecificationRows, false);
	self.addEventListener(Page.LOADED, showGallery, false);
	self.addEventListener(Page.LOADED, showActiveSMSMailer, false);
	self.addEventListener(Page.LOADED, activateReviewToggle, false);
	self.addEventListener(Page.LOADED, activateReviewVoter, false);
	self.addEventListener(Page.LOADED, setupInsurances, false);
	self.addEventListener(Page.LOADED, show360FlashMovie, false);
	self.addEventListener(Page.LOADED, showProductSpecificationInformation, false);
	self.addEventListener(Page.LOADED, showProductInformationText, false);
	self.addEventListener(Page.LOADED, showPromotionalIconState, false);

	/**
	 * Show productinformation text
	 */
	function showProductInformationText()
	{	
		if (dom.getById("multivariate_productinformation_text") && dom.getById("multivariate_productinformation_text") != undefined)
		{
			var readMore = dom.create(
				"p",
				{
					className: "more"
				},
				[
					dom.create(
						"a",
						{
							title: "Lees de volledige product beschrijving",
							href: "#",
							onclick: function()
							{
								dom.getById("multivariate_productinformation_text").innerHTML = productText;

								return false;
							}
						},
						["Lees verder"]
					)
				]
			);

			var productText = dom.getById("multivariate_productinformation_text").innerHTML;

			if (productText.length > 1000)
			{
				var closingParagraphTagIndex = productText.toLowerCase().indexOf("</p>");

				if (closingParagraphTagIndex != -1)
				{
					dom.getById("multivariate_productinformation_text").innerHTML = productText.substring(0, closingParagraphTagIndex + 4);
					dom.getById("multivariate_productinformation_text").appendChild(readMore);
				}
			}
		}
	}

	/**
	 * 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} productId The product ID.
	 * @param {Number} storeId The store ID.
	 * @requires ActionBox
	 * @requires Socket
	 * @throws {Invalid Argument} When productId is missing or not a number.
	 */
	function showStoreProductAvailabilityState(event, productId, storeId)
	{
		if (event == undefined)
		{
			event = window.event;
		}

		if (event.target == undefined)
		{
			event.target = event.srcElement;
		}

		if (typeof productId != "number") 
		{
			throw new Error("Invalid argument: productId is missing or not a number");
		}

		if (typeof storeId != "number") 
		{
			storeId = null;
		}

		var socket			= new Socket(),
			requestResult	= null;

		var actionBox = new ActionBox(
			"Even geduld " + getVousOuTu("alstublieft", "alsjeblieft") + "...",
			[
				dom.create(
					"div",
					{
						className : "actionbox_content_loading"
					},
					[
						"Wordt geladen..."
					]
				)
			],
			true
		);

		socket.addEventListener(Socket.LOADED, function(event)
		{
			if (socket.getStatus() == 200)
			{
				// Evaluate the response
				try
				{
					eval(event.target.getResponseText());
				}
				catch(error)
				{
					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."
							]
						)
					], true);
				}

				requestResult = result;

				// Update the ActionBox
				if (storeId != null)
				{
					actionBox.setTitle("Onze winkel" + (requestResult.storeLocation != null ? " in " + requestResult.storeLocation : ""));
				}
				else
				{
					actionBox.setTitle(requestResult.storeCount > 1 ? "Dit product kopen in één van onze winkels" : "Dit product kopen in onze winkel");
				}

				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."
						]
					)
				], true);
			}

			return null;
		});

		socket.request(
			"/winkelstatus/" + productId + (storeId != null ? "/" + 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;
	}


	/**
	 * Show the promotional icon 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} productId The product ID.
	 * @param {Number} storeId The store ID.
	 * @requires PromoIconBox
	 * @requires Socket
	 */
	function showPromotionalIconState()
	{
		if (!dom.getById("product_images"))
		{
			return false;
		}

		var images = dom.getById("product_images").getElementsByTagName("img");

		for (i=0; i < images.length; i++)
		{
			dom.extend(images[i]);

			if (images[i].hasClass("promotionalicon"))
			{
				var socket			= new Socket(),
				requestResult	= null,
				productId 		= productInformation["id"],
				promotionalIcon = dom.extend(images[i]);

				promotionalIcon.onclick = function(event)
				{
					if (event == undefined)
					{
						event = window.event;
					}

					if (event.target == undefined)
					{
						event.target = event.srcElement;
					}
					var promoiconBox = new PromoIconBox(
						"Even geduld " + getVousOuTu("alstublieft", "alsjeblieft") + "...",
						[
							dom.create(
								"div",
								{
									className : "promoiconbox_content_loading"
								},
								[
									"Wordt geladen..."
								]
							)
						],
						true
					);

					socket.addEventListener(Socket.LOADED, function(event)
					{
						if (socket.getStatus() == 200)
						{
							// Evaluate the response
							try
							{
								eval(event.target.getResponseText());
							}
							catch(error)
							{
								return null;
							}

							requestResult = result;

							promoiconBox.setTitle(requestResult.productName);

							promoiconBox.setContent(requestResult.content);

							if (typeof urchinTracker != "undefined") 
							{
								urchinTracker("/promotionalicon/"+requestResult.productName.toLowerCase()+".html");
							}
						}
						else
						{
							promoiconBox.setTitle("De informatie kon niet worden geladen");
							promoiconBox.setContent([
								dom.create(
									"div",
									{
										className : "promoiconbox_content_loading_error"
									},
									[
										"Helaas kon de informatie niet worden geladen. Onze excuses voor het ongemak."
									]
								)
							], true);
						}

						return false;
					});
			
					socket.request(
							"/promoiconinformation/" + productId + "/?actionbox=true"
					);

					promoiconBox.show(event.target);
					promoiconBox.setPosition(promotionalIcon.getPosition().x + 108,promotionalIcon.getPosition().y - 24)
			
					return false;
				}
			}
		}
	}
	

	/**
	 * Show the delivery notice using an ActionBox
	 * @param {Event} event The event that triggered this function.
	 * @event
	 * @requires ActionBox
	 * @requires Socket
	 */
	function showDeliveryNotice(event)
	{
		if (event == undefined)
		{
			event = window.event;
		}

		if (event.target == undefined)
		{
			event.target = event.srcElement;
		}

		var socket			= new Socket(),
			requestResult	= null;

		var actionBox = new ActionBox(
			"Even geduld " + getVousOuTu("alstublieft", "alsjeblieft") + "...",
			[
				dom.create(
					"div",
					{
						className : "actionbox_content_loading"
					},
					[
						"Wordt geladen..."
					]
				)
			],
			true
		);

		actionBox.setTitle("Contractafhandeling aan de deur");
		actionBox.setContent([
			dom.create(
				"div",
				{},
				[
					dom.create("p",
					{},
					["Plaats je bestelling met abonnement op een werkdag vóór 18.00 uur, dan nemen wij nog de zelfde dag contact met je op om een afspraak te maken voor aflevering. Je kunt zelf de dag en het gewenste dagdeel kiezen. Levering is in veel gevallen al de volgende dag mogelijk. Bestel je na 18.00 uur, in het weekeinde of op een feestdag? Dan bellen wij je de eerstvolgende werkdag."]
					),
					dom.create("br",{},null),
					dom.create("p",
					{
						className:"more"
					}, 
					[
						dom.create(
							"a",
							{
								href: "#",
								title: "Meer informatie over contractafhandeling aan de deur"
							},
							["Meer informatie over contractafhandeling aan de deur"]
						)
					])
				]
			)
		], true);

		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;
	}


	/**
	 * Show suggested serviceplan information with an ActionBox
	 * @param {Object} event The event that triggered this function.
	 * @param {Number} suggestedServiceplanId The suggestedserviceplan ID.
	 * @param {Number} productId The product ID.
	 * @requires ActionBox
	 * @requires Socket
	 * @throws {Invalid Argument} When suggestedServiceplanId is missing or not a number
	 * @throws {Invalid Argument} When productId is missing or not a number
	 */
	function showSuggestedServiceplanInformation(event, suggestedServiceplanId, productId)
	{
		if (event == undefined)
		{
			event = window.event;
		}

		if (event.target == undefined)
		{
			event.target = event.srcElement;
		}

		if (typeof suggestedServiceplanId != "number") 
		{
			throw new Error("Invalid argument: suggestedServiceplanId is missing or not a number");
		}

		if (typeof productId != "number") 
		{
			throw new Error("Invalid argument: productId is missing or not a number");
		}

		var socket			= new Socket(),
			requestResult	= null,
			actionBox		= null;

		actionBox = new ActionBox(
			"Even geduld " + getVousOuTu("alstublieft", "alsjeblieft") + "...",
			[
				dom.create(
					"div",
					{
						className : "actionbox_content_loading"
					},
					[
						"Wordt geladen..."
					]
				)
			],true
		);

		socket.addEventListener(Socket.LOADED, function(event)
		{
			if (socket.getStatus() == 200)
			{
				// Evaluate the response
				try
				{
					eval(event.target.getResponseText());
				}
				catch(error)
				{
					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."
							]
						)
					], true);
				}

				requestResult = result;
				
				actionBox.setTitle(requestResult.title);

				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."
						]
					)
				], true);
			}

			return null;
		});

		socket.request(
			"/suggestedserviceplandetails/" + suggestedServiceplanId + "/" + productId + "/",
			{
				specdescription : (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;
	}



	/**
	 * show the specification description in an actionbox and the specificationlink in an infobox
	 * @requires ActionBox
	 * @requires InfoBox
	 * @requires Socket
	 */

	function showProductSpecificationInformation()
	{
		if (!dom.getById("product_specifications"))
		{
			return false;
		}

		var informationIcons = dom.getById("product_specifications").getElementsByTagName("img");

		var socket					= new Socket(),
			requestResult		 	= null,
			actionBox				= null,
			infoBox					= null;

		for (var i = 0; i < informationIcons.length ;i++)
		{
			var informationIcon = dom.extend(informationIcons[i]);
			if (informationIcon.title != "" )
			{
				informationIcon.title = "";
			}

			if (informationIcon.hasClass("info")) //informationicons
			{
				var aSpecificationDescriptions = informationIcon.alt.split("_");
				var specificationId = aSpecificationDescriptions[1];

				informationIcon.onclick = (function(specificationId) {
						return function(event) 
						{
							if (event == undefined)
							{
								event = window.event;
							}

							if (event.target == undefined)
							{
								event.target = event.srcElement;
							}

							actionBox = new ActionBox(
								"Even geduld " + getVousOuTu("alstublieft", "alsjeblieft") + "...",
								[
									dom.create(
										"div",
										{
											className : "actionbox_content_loading"
										},
										[
											"Wordt geladen..."
										]
									)
								],
								true
							);

							socket.addEventListener(Socket.LOADED, function(event)
							{
								if (socket.getStatus() == 200)
								{
									// Evaluate the response
									try
									{
										eval(event.target.getResponseText());
									}
									catch(error)
									{
										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."
												]
											)
										], true);
									}

									requestResult = result;

									actionBox.setTitle(requestResult.title);
									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."
											]
										)
									], true);
								}

								return null;
							});

							socket.request(
								"?specificationid=" + specificationId,
									{
										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 false;
						}
					}
				)(specificationId);
			}
			else if (informationIcon.hasClass("specificationfilter")) //specificationfilter link
			{
				var specificationComparisonTitle = informationIcon.parentNode.title;

				informationIcon.onmouseover = (function(specificationComparisonTitle) {
						return function(event) 
						{
							if (event == undefined)
							{
								event = window.event;
							}

							if (event.target == undefined)
							{
								event.target = event.srcElement;
							}

							infoBox = new InfoBox(
								"Even geduld " + getVousOuTu("alstublieft", "alsjeblieft") + "...",
								[
									dom.create(
										"div",
										{
											className : "actionbox_content_loading"
										},
										[
											"Wordt geladen..."
										]
									)
								],
								true
							);

							this.parentNode.title = "";
							infoBox.setTitle(specificationComparisonTitle);
							infoBox.setContent("Vind producten met dezelfde eigenschap in onze keuzehulp.");
							infoBox.show(event.target);
							infoBox.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;
						}
				})(specificationComparisonTitle);
			}
		}
	}



	/**
	 * Show the print button on the prodcut page
	 */
	function addPrintButton()
	{
		if (!dom.getById("product_links")) 
		{
			return false;
		}

		var linkContainer = dom.getById("product_links");
		if (!linkContainer.getFirstByTagName('ul'))
		{
			linkContainer.appendChild(
				dom.create(
					"ul",
					null,
					null
				)
			)
		}

		var printParentNode = dom.getById("product_links").getFirstByTagName("ul"),
			li = dom.create(
				"li",
				{
					id : "product_print_toggle"
				},
				[
					dom.create(
						"a",
						{
							
							href : window.location.href,
							title : "Print deze pagina",
							className : "js",
							onclick : function() {
								window.print();
								return false;
							}
						},
						[
							dom.create(
								"img",
								{
									src : "/images/default/product_links_print.gif",
									alt : "Print deze pagina"
								},
								null
							),
							dom.create(
									"span",
									null,
									["Print deze pagina"]
							)
						]
					)
				]
			)
		printParentNode.appendChild(li);
	}



	/**
	 * Highlight table rows in productspecification
	 */
	function highlightSpecificationRows()
	{
		if (!dom.getById("product_specifications")) 
		{
			return false;
		}

		var table = dom.getById("product_specifications").getFirstByTagName("table");

		if (!table) {
			return false;
		}

		for (var i = 0, rows = table.getElementsByTagName("tr"), rowsLength = rows.length; i < rowsLength; i++) {
			dom.extend(rows[i]);
	
			rows[i].onmouseover	= mouseOver;
			rows[i].onmouseout	= mouseOut;
		}

		function mouseOver() {
			this.addClass("hover");
		}

		function mouseOut() {
			this.removeClass("hover");
		}

		return true;
	}

	/**
	 * Shows image gallery
	 * @requires ImageGallery
	 */
	function showGallery()
	{
		var imageDimension = "1";
		ImageGallery(imageDimension, true);
	}



	/**
	 * Show and activate validation for the ActiveSMSMailer
	 * @requires ActiveSMSMailer
	 */
	function showActiveSMSMailer()
	{
		var productPageModule = true;
			productName = productInformation["name"];

		if (!dom.getById("product_activemailer_form"))
		{
			return false;
		}

		var form 		= dom.getById("product_activemailer_form").getFirstByTagName("form");
		activeSMSMailer = new ActiveSMSMailer(form, productName, productPageModule);
		

		//No highlighting on product page
		if (productPageModule == false)
		{
			activeSMSMailer.rowHighlighting();
		}

		activeSMSMailer.toggleActiveSMSMailer();
	}

	/**
	 * Shows the mail a friend option
	 * @requires MailAFriend
	 */
	function showMailAFriend()
	{
		var productName = productInformation["name"],
			productId = productInformation["id"];

		var mailAFriend = new MailAFriend(productName, productId);
	}



	/**
	 * Activate the review scorecard toggle
	 */
	function activateReviewToggle(){
		if (!dom.getById("product_reviews"))
		{
			return false;
		}

		var scorecardLinks = dom.getById("product_reviews").getElementsByTagName("a");
				
		for (var i = 0; i < scorecardLinks.length; i++)
		{
			var toggle = dom.extend(scorecardLinks[i]);
			if (toggle.hasClass("toggle")) 
			{
				toggle.onclick = function(){
					target = dom.getById(toggle.href.substr(toggle.href.indexOf("#") + 1));
					if (target) 
					{
						if (toggle.hasClass("active")) {
							toggle.removeClass("active");
							target.removeClass("active");
						} else {
							toggle.addClass("active");
							target.addClass("active");
						}
					}
					
				}
			}
		}
	}



	/**
	 * Activate the review voting
	 * @requires voteHandler
	 */
	function activateReviewVoter() 
	{
		if (!dom.getById("product_reviews"))
		{
			return false;
		}

		var elements = dom.getById("product_reviews").getElementsByTagName("div");

		for (var i = 0; i < elements.length; i++)
		{
			dom.extend(elements[i]);
			if(elements[i].hasClass("hreview"))
			{
				var reviewId = elements[i].id.replace("review_","");
				if(dom.getById("reviewvote_" + reviewId + "_yes"))
				{
					dom.getById("reviewvote_" + reviewId + "_yes").onclick = (function(reviewId){
						return function()
						{
							var socket = new Socket();
							dom.getById("reviewvote_" + reviewId + "_yes").addClass("disabled");
							dom.getById("reviewvote_" + reviewId + "_no").addClass("disabled");
							dom.getById("reviewvote_" + reviewId + "_yes").onclick = function(){return false};
							dom.getById("reviewvote_" + reviewId + "_no").onclick = function(){return false};
							dom.getById("reviewvote_" + reviewId + "_buttons").appendChild(
								dom.create(
									"span",
									{
										className : "loading"
									},
									[]
								)
							);
							socket.request(
							"/review/"+productId,
								{
									reviewvoter : (new Date()).getTime(),
									save_vote	: "1",
									reviewid	: reviewId,
									vote		: "Y"
								},true,true
							);
							voteHandler(socket, reviewId, "Y");
							return false;
						}
					})(reviewId);
				}
				if(dom.getById("reviewvote_" + reviewId + "_no"))
				{
					dom.getById("reviewvote_" + reviewId + "_no").onclick = (function(reviewId){
						return function() {
							var socket = new Socket();
							dom.getById("reviewvote_" + reviewId + "_no").addClass("disabled");
							dom.getById("reviewvote_" + reviewId + "_yes").addClass("disabled");
							dom.getById("reviewvote_" + reviewId + "_yes").onclick = function(){return false};
							dom.getById("reviewvote_" + reviewId + "_no").onclick = function(){return false};
							dom.getById("reviewvote_" + reviewId + "_buttons").appendChild(
								dom.create(
									"span",
									{
										className : "loading"
									},
									[]
								)
							);
							socket.request(
							"/review/"+productId,
								{
									reviewvoter : (new Date()).getTime(),
									save_vote	: "1",
									reviewid	: reviewId,
									vote		: "N"
								},true,true
							);
							voteHandler(socket, reviewId, "N");
							return false;
						}
					})(reviewId);
				}
			}
		}
	}



	/**
	 * Procedures after the vote
	 * @param {Object} socket the socketconnection.
	 * @param {Number} reviewId the id if the review
	 * @param {String} vote yes Y or no N
	 * @requires Socket
	 */
	function voteHandler(socket, reviewId, vote)
	{
		socket.addEventListener(Socket.LOADED, function(event)
		{
			if (socket.getStatus() == 200)
			{
				var voteParent = dom.getById("reviewvote_" + reviewId + "_buttons");
				while (voteParent.firstChild)
				{
					voteParent.removeChild(voteParent.firstChild);
				}
				var voteText = dom.getById("reviewvote_" + reviewId + "_text");
				while (voteText.firstChild)
				{
					voteText.removeChild(voteText.firstChild);
				}
				
				// Update count
				var voteCountText = dom.getById("reviewvotes_"+reviewId);
				if (voteCountText.childNodes.length > 1)
				{
					if (vote == "Y")
					{
						votePos = dom.getById("reviewvotes_pos_"+reviewId);
						votePos.replaceChild
						(
							dom.createText(parseInt(votePos.firstChild.nodeValue)+1),
							votePos.firstChild
						);
					}
					voteTotal = dom.getById("reviewvotes_total_"+reviewId);
					voteTotal.replaceChild(
						dom.createText(parseInt(voteTotal.firstChild.nodeValue)+1),
						voteTotal.firstChild
					);
				}
				else
				{
					while (voteCountText.firstChild)
					{
						voteCountText.removeChild(voteCountText.firstChild);
					}
					voteCountText.appendChild(
						dom.create(
							"span",
							{
								className : "pipe"
							},
							["|"]
						)
					);
					if (vote == "Y") {
						voteCountText.appendChild(dom.createText("behulpzaamheid: 1 van 1"));
					} else {
						voteCountText.appendChild(dom.createText("behulpzaamheid: 0 van 1"));
					}
					voteCountText.appendChild(
						dom.create(
							"span",
							{
								className : "pipe"
							},
							["|"]
						)
					);
				}

				voteText.appendChild(dom.createText(getVousOuTu("Uw", "Je") + " keuze is opgeslagen. Hartelijk dank voor " + getVousOuTu("uw", "je") + " bijdrage!"));
			}
			else if(socket.getStatus() == 500)
			{
				var voteParent = dom.getById("reviewvote_" + reviewId + "_buttons");
				while (voteParent.firstChild)
				{
					voteParent.removeChild(voteParent.firstChild);
				}
				var voteText = dom.getById("reviewvote_" + reviewId + "_text");
				while (voteText.firstChild)
				{
					voteText.removeChild(voteText.firstChild);
				}
				voteText.appendChild(dom.createText(getVousOuTu("U heeft", "Je hebt") + " deze review al eerder beoordeeld"));
			}
			else
			{
				var voteParent = dom.getById("reviewvote_" + reviewId + "_buttons");
				while (voteParent.firstChild)
				{
					voteParent.removeChild(voteParent.firstChild);
				}
				var voteText = dom.getById("reviewvote_" + reviewId + "_text");
				while (voteText.firstChild)
				{
					voteText.removeChild(voteText.firstChild);
				}
				voteText.appendChild(dom.createText(getVousOuTu("Uw", "Je") + " stem kon niet worden opgeslagen"));
			}
			return null;
		});	
	}



	/**
	 * Set up the insurance overview (row highlighting, additional coverage info through a PopupBox, etc.)
	 */
	function setupInsurances()
	{
		if (dom.getById("product_insurances") == null)
		{
			return false;
		}

		var table		= dom.getById("product_insurances").getFirstByTagName("table"),
			tableRows	= table.getElementsByTagName("tr");

		// Apply clickable rows and highlighting
		for (var i = 0; i < tableRows.length; i++)
		{
			dom.extend(tableRows[i]);

			tableRows[i].onclick = select;
			tableRows[i].onmouseover = highlight;
			tableRows[i].onmouseout = highlight;
		}

		/**
		 * Select insurance option
		 * @event
		 * @param {Event} event
		 */
		function select(event)
		{
		    if (event == undefined) {
		        event = window.event;
		    }

		    if (event.target == undefined) {
		        event.target = event.srcElement;
		    }

		    if (this.getFirstByTagName("input") != null && (event.target.nodeName.toLowerCase() == "img" && event.target.parentNode.nodeName.toLowerCase() == "a") == false)
		    {
			    this.getFirstByTagName("input").checked = true;
			    return true;			    
			}
			else 
			{
			    return false;
			}
		}

		/**
		 * Highlight insurance option (gives class to row)
		 */
		function highlight()
		{
			if (this.hasClass("hover"))
			{
				this.removeClass("hover");
			}
			else
			{
				this.addClass("hover");
			}
		}

		return true;
	}



	/**
	 * Show the insurance coverage
	 * @param {Number} productId the id of the product
	 * @param {Number} insurancePartnerId the id of the insurance partner
	 * @throws {Invalid Argument} When productId is missing or not a number
	 * @throws {Invalid Argument} When insurancePartnerId is missing or not a number
	 * @requires UserAgent
	 * @requires PopupBox
	 * @requires Socket
	 */
	function showInsuranceCoverageOverview(productId, insurancePartnerId)
	{
		if (typeof productId != "number") 
		{
			throw new Error("Invalid argument: productId is missing or not a number");
		}

		if (typeof insurancePartnerId != "number") 
		{
			throw new Error("Invalid argument: insurancePartnerId is missing or not a number");
		}

		var socket			= new Socket(),
			requestResult	= null,
			popupBox		= null,
			userAgent		= new UserAgent();

		if (userAgent.getUserAgent() == UserAgent.UA_MSIE && userAgent.getVersion() == "6.0")
		{
			//location.hash is changed to "#" to force IE6 to display the page from the top after using the back button.
			location.hash = "#";
		}

		popupBox = new PopupBox(
			"Even geduld " + getVousOuTu("alstublieft", "alsjeblieft") + "...",
			[
				dom.create(
					"div",
					{
						className : "popupbox_content_loading"
					},
					[
						"Wordt geladen..."
					]
				)
			],
			"popupbox_insurances"
		);

		socket.addEventListener(Socket.LOADED, function(event)
		{    
			if (socket.getStatus() == 200)
			{
				// Evaluate the response
				try
				{
					eval(event.target.getResponseText());
				}
				catch(error)
				{
					return null;
				}

				requestResult = result;

				popupBox.setTitle("Zekerheidspakketten bij " + getVousOuTu("uw", "je") + " " + requestResult.productName);
				popupBox.setContent(requestResult.content);
				return false;
			}
			else
			{
				popupBox.setTitle("De informatie kon niet worden geladen");
				popupBox.setContent([
					dom.create(
						"div",
						{
							className : "popupbox_content_loading_error"
						},
						[
							"Helaas kon de informatie niet worden geladen. Onze excuses voor het ongemak."
						]
					)
				], true);
			}

			return null;
		});

		socket.request(
			"/zekerheidspakketten/" + productId + "/" + insurancePartnerId,
			{
				popupbox		: (new Date()).getTime(),
				referringPage	: "product"
			}
		);

		popupBox.show();
	}



	/**
	 * Show a description for an insurance attribute, using an InfoBox
	 * @param {Object} event The event that triggered this function.
	 * @param {Number} productId The product ID.
	 * @param {Number} insurancePartnerId The insurance partner ID.
	 * @param {Number} attributeId The attribute ID.
	 * @throws {Invalid Argument} When productId is missing or not a number
	 * @throws {Invalid Argument} When insurancePartnerId is missing or not a number
	 * @throws {Invalid Argument} When attributeId is missing or not a number
	 * @requires Socket
	 * @requires InfoBox
	 */
	function showInsuranceAttributeDescription(event, productId, insurancePartnerId, attributeId)
	{
		if (event == undefined)
		{
			event = window.event;
		}

		if (event.target == undefined)
		{
			event.target = event.srcElement;
		}

		if (typeof productId != "number") 
		{
			throw new Error("Invalid argument: productId is missing or not a number");
		}

		if (typeof insurancePartnerId != "number") 
		{
			throw new Error("Invalid argument: insurancePartnerId is missing or not a number");
		}

		if (typeof attributeId != "number") 
		{
			throw new Error("Invalid argument: attributeId is missing or not a number");
		}

		var socket			= new Socket(),
			requestResult	= null,
			infoBox			= null;

		infoBox = new InfoBox(
			"Even geduld " + getVousOuTu("alstublieft", "alsjeblieft") + "...",
			[
				dom.create(
					"div",
					{
						className : "infobox_content_loading insurance"
					},
                    null
				)
			]
		);

		socket.addEventListener(Socket.LOADED, function(event)
		{
			if (socket.getStatus() == 200)
			{
				// Evaluate the response
				try
				{
					eval(event.target.getResponseText());
				}
				catch(error)
				{
				    infoBox.setTitle("De informatie kon niet worden geladen");
				    infoBox.setContent(
		            [
			            dom.create(
				            "div",
				            {
				                className: "infobox_content_loading_error"
				            },
				            [
					            "Helaas kon de informatie niet worden geladen. Onze excuses voor het ongemak."
				            ]
			            )
    				], true);
    				return null;
				}

				requestResult = result;

				// Update the ActionBox
				infoBox.setTitle(requestResult.attributeName);
				infoBox.setContent(requestResult.attributeText);
			}
			else
			{
			    infoBox.setTitle("De informatie kon niet worden geladen");
			    infoBox.setContent([
					dom.create(
						"div",
						{
						    className: "infobox_content_loading_error"
						},
						[
							"Helaas kon de informatie niet worden geladen. Onze excuses voor het ongemak."
						]
					)
				], true);
			}

			return null;
		});

		socket.request(
			"/zekerheidspakketten/" + productId + "/" + insurancePartnerId,
			{
				infobox					: (new Date()).getTime(),
				insuranceAttributeID	: attributeId
			}
		);

		infoBox.show(event.target);
		infoBox.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;
	}



	/**
	 * Show the customer images gallery using an popupBox
	 * @param {Object} event The trigger event.
	 * @param {Number} productId The product ID.
	 * @param {Number} reviewId The review ID.
	 * @param {Number} currentImage The current image.
	 * @throws {Invalid Argument} When reviewId is missing or not a number
	 * @throws {Invalid Argument} When currentImage is missing or not a number
	 * @requires UserAgent,PopupBox,Socket,controller
	 */
	function showCustomerImageGallery(event, productId, reviewId, currentImage)
	{
		if (event == undefined)
		{
			event = window.event;
		}
		if (event.target == undefined)
		{
			event.target = event.srcElement;
		}
		if (typeof reviewId != "number") 
		{
			throw new Error("Invalid argument: reviewId is missing or not a number");
		}
		if (typeof currentImage != "number") 
		{
			throw new Error("Invalid argument: currentImage is missing or not a number");
		}

		var socket			= new Socket(),
			requestResult	= null,
			popupBox		= null,
			userAgent		= new UserAgent(),
			storeId 		= controller.getParameter("shopid"),
			images,fullSize,thumbnails,enlargeLink;

		if (userAgent.getUserAgent() == UserAgent.UA_MSIE && userAgent.getVersion() == "6.0")
		{
			//location.hash is changed to "#" to force IE6 to display the page from the top after using the back button.
			location.hash = "#";
		}

		popupBox = new PopupBox(
			"Even geduld " + getVousOuTu("alstublieft", "alsjeblieft") + "...",
			[
				dom.create(
					"div",
					{
						className : "popupbox_content_loading"
					},
					[
						"Wordt geladen..."
					]
				)
			],
			"customer_image_gallery"
		);

		socket.addEventListener(Socket.LOADED, function(event)
		{    
			if (socket.getStatus() == 200)
			{
				// Evaluate the response
				try
				{
					eval(event.target.getResponseText());
				}
				catch(error)
				{
					return null;
				}

				requestResult = result;

				popupBox.setTitle(requestResult.reviewTitle);
				popupBox.setContent(requestResult.content);
				images = requestResult.images;
				fullSize = dom.getById("customer_image_gallery_fullsize",true);
				thumbnails = dom.getById("customer_image_gallery_thumbnails",true);
				enlargeLink = dom.getById("image_enlarge",true);
				
			}
			else
			{
				popupBox.setTitle("De informatie kon niet worden geladen");
				popupBox.setContent([
					dom.create(
						"div",
						{
							className : "popupbox_content_loading_error"
						},
						[
							"Helaas kon de informatie niet worden geladen. Onze excuses voor het ongemak."
						]
					)
				], true);
			}

			return null;
		});

		socket.request(
			"/review/" + reviewId + "/" + productId + "/",
			{
				customergallery : (new Date()).getTime(),
				currentimage 	: currentImage
			}
		);

		popupBox.show();

		previousImage = function(){
			if (currentImage == 0)
			{
				currentImage = images.length - 1;
			}
			else
			{
				currentImage--;
			}
			setCurrent(currentImage);
			return false;
		}

		nextImage = function(){
			if (currentImage == images.length - 1)
			{
				currentImage = 0;
			}
			else
			{
				currentImage++;
			}
			setCurrent(currentImage);
			return false;
		}

		// Show the thumbnail full size
		zoomImage = function(event)
		{
			dom.extend(event);
			var clickedImage = event.id.substr(30);
			if (clickedImage != currentImage)
			{
				currentImage = clickedImage;
				setCurrent(currentImage);	
			}
			return false;
		}

		function setCurrent(currentImage)
		{
			// Clear the "current" class from the other thumbnails and set it to this thumbnail
			for (var i = 0, thumbnailsLength = thumbnails.childNodes.length; i < thumbnailsLength; i++)
			{
				dom.extend(thumbnails.childNodes[i]);
				thumbnails.childNodes[i].removeClass("current");
			}

			dom.extend(dom.getById("customer_image_thumbnail_link_"+currentImage,true).parentNode);
			dom.getById("customer_image_thumbnail_link_"+currentImage,true).parentNode.addClass("current");
			if(dom.getById("image_enlarge"))
			{
				dom.getById("image_enlarge",true).href = "/images/customerimage.php?id=" + images[currentImage].imageId;				
			}
			dom.getById("customer_image_gallery_image_title",true).innerHTML = images[currentImage].imageTitle;
			dom.getById("customer_image_gallery_image_description",true).innerHTML = images[currentImage].imageDescription;
			fullSize.firstChild.src = "/images/customerimage.php?id=" + images[currentImage].imageId + "&dimensionid=35&shopid="+storeId;
			return false;
		}

		return false;
	}


	/**
	 * Show the promotionimage from promobox
	 * @param {object} trigger The trigger (link).
	 * @param {Number} image The image ID.
	 */
	function showPromotionImage(trigger,image) {
		var body = dom.getFirstByTagName("body", document);

		if (typeof image != "number") 
		{
			throw new Error("Invalid argument: image is missing or not a number");
		}

		var socket						= new Socket(),
			shopid 						= controller.getParameter("shopid"),
			popupBox					= null,
			fullSizeImageDimensionId 	= 40,
			userAgent					= new UserAgent(),
			storeId 					= controller.getParameter("shopid");

		if (userAgent.getUserAgent() == UserAgent.UA_MSIE && userAgent.getVersion() == "6.0")
		{
			//location.hash is changed to "#" to force IE6 to display the page from the top after using the back button.
			location.hash = "#";
		}

		popupBox = new PopupBox(
			"Even geduld " + getVousOuTu("alstublieft", "alsjeblieft") + "...",
			[
				dom.create(
					"div",
					{
						className : "popupbox_content_loading"
					},
					[
						"Wordt geladen..."
					]
				)
			],
			"promotion_image_gallery"
		);

		popupBox.setTitle(trigger.title);
		popupBox.setContent([
				dom.create(
					"div",
					{
						id	: "promotion_image_gallery_fullsize"
					},
					[
						dom.create(
						"img",
						{
							src	: "/images/image.php?id=" + image + "&dimensionid=" + fullSizeImageDimensionId + "&shopid=" + shopid
						},
						[]
						)
					]
				)
			], true);
		popupBox.show();
	}



	/**
	 * Show 360 flash movie or hi laptop movie using the PopupBox as container
	 */
	function show360FlashMovie()
	{
		/**
		 * Tomtom
		 */
		if (productInformation["id"] == 51712 || productInformation["id"] == 51714 || productInformation["id"] == 51715)
		{
			var flashMovieWidth	 			= "500";
			var flashMovieHeight 			= "395";
			var flashMovieImage  			= "/images/default/flashpromobox_360_tomtom.jpg";
			var flashPromotionDescription 	= "Klik en sleep om de "+ productInformation["name"] +" handmatig te draaien";
			var flashPromotionTitle			= "Bekijk de "+ productInformation["name"] +" in 360 graden";
			if (productInformation["id"] == 51712 || productInformation["id"] == 51714)
			{
				var flashMovieName 		 		= "/flash/tomtom730.swf";
				var flashMovieId 	 			= "730";
				var flashMovieIdExtra			= "";
			}
			else
			{
				var flashMovieName 				= "/flash/tomtom930.swf";
				var flashMovieId 				= "930";
				var flashMovieIdExtra			= "";
			}
		}
		else if(productInformation["id"] == 70139 || productInformation["id"] == 70140 || productInformation["id"] == 70141 || 
				productInformation["id"] == 70142 || productInformation["id"] == 70143 || productInformation["id"] == 70144 || 
				productInformation["id"] == 70146 || productInformation["id"] == 78532 || productInformation["id"] == 78542 ||
				productInformation["id"] == 78544)
		{
			/**
			 * Navigon
			 */
			if(productInformation["id"] == 70139 || productInformation["id"] == 70140)
			{
				var flashMovieName 				= "/flash/interactive_demo_navigon_1300.swf";
			}
			else if(productInformation["id"] == 70141)
			{
				var flashMovieName 				= "/flash/interactive_demo_navigon_2310.swf";
			}
			else if(productInformation["id"] == 70142)
			{
				var flashMovieName 				= "/flash/interactive_demo_navigon_3310.swf";
			}
			else if(productInformation["id"] == 70143)
			{
				var flashMovieName 				= "/flash/interactive_demo_navigon_4310.swf";
			}
			else if(productInformation["id"] == 70144)
			{
				var flashMovieName 				= "/flash/interactive_demo_navigon_4350.swf";
			}
			else if(productInformation["id"] == 70146)
			{
				var flashMovieName 				= "/flash/interactive_demo_navigon_7310.swf";
			}
			else if(productInformation["id"] == 78532)
			{
				var flashMovieName 				= "/flash/interactive_demo_navigon_1400.swf";
			}
			else if(productInformation["id"] == 78542)
			{
				var flashMovieName 				= "/flash/interactive_demo_navigon_2410.swf";
			}
			else if(productInformation["id"] == 78544)
			{
				var flashMovieName 				= "/flash/interactive_demo_navigon_8410.swf";
			}
			
			var flashMovieId 				= "navigon";
			var flashMovieIdExtra			= "_navigon";
			var flashMovieWidth	 			= "550";
			var flashMovieHeight 			= "600";
			var flashMovieImage  			= "/images/image.php?id=10724";
			var flashPromotionDescription 	= "";
			var flashPromotionTitle			= "3D-model en live-demo van de "+ productInformation["name"];
		}
		else if(productInformation["id"] == 52626)
		{
			/**
			 * Hi
			 */
			var flashMovieName 				= "http://www.hi.nl/upload/waaromhi-player.swf";
			var flashMovieId 				= "hi";
			var flashMovieIdExtra			= "_large";
			var flashMovieWidth	 			= "680";
			var flashMovieHeight 			= "410";
			var flashMovieImage  			= "/images/default/flashpromobox_hi.png";
			var flashPromotionDescription 	= "";
			var flashPromotionTitle			= "Bekijk de voordelen van internet op je laptop van Hi";
		}
		else
		{
			return false;
		}
	
		var productinformationContainer	= dom.getById("product_information"),
			shopName 					= controller.getParameter("shopname"),
			popupBox					= null,
			thisActive					= false,
			userAgent					= new UserAgent();

		if (userAgent.getUserAgent() == UserAgent.UA_MSIE && userAgent.getVersion() == "6.0")
		{
			//location.hash is changed to "#" to force IE6 to display the page from the top after using the back button.
			location.hash = "#";
		}

		var flashMovie	 = '<div id="flashpromotion_movie_gallery_fullsize" class="preload">';
			flashMovie 	+= '<object type="application/x-shockwave-flash" data="' + flashMovieName + '" width="'+ flashMovieWidth +'" height="'+ flashMovieHeight +'">';
			flashMovie 	+= '<param name="movie" value="' + flashMovieName + '" />';
			flashMovie 	+= '</object>';
			flashMovie 	+= '</div>';

		popupBox = new PopupBox(
			"Even geduld " + getVousOuTu("alstublieft", "alsjeblieft") + "...",
			[
				dom.create(
					"div",
					{
						className : "popupbox_content_loading"
					},
					[
						"Wordt geladen..."
					]
				)
			],
			"flashpromotion"+flashMovieIdExtra+"_movie_gallery",true
		);
		//make a PopupBox instance and set variables
		popupBox.setTitle(flashPromotionTitle);
		popupBox.setDescription(flashPromotionDescription);

		if(productInformation["id"] == 70139 || productInformation["id"] == 70140 || productInformation["id"] == 70141 || 
				productInformation["id"] == 70142 || productInformation["id"] == 70143 || productInformation["id"] == 70144 || 
				productInformation["id"] == 70146 || productInformation["id"] == 78532 || productInformation["id"] == 78542 ||
				productInformation["id"] == 78544)
		{
			/**
			 * Navigon
			 */
			/* append flash promo to the container */
			var flashContainer =
				dom.create(
					"div",
					{
						id: "product_information_flash_promo"
					},
					[
						dom.create(
							"div",
							{
								className: "product_information_flashpromo_image"
							},
							[
								dom.create(
									"a",
									{
										id			: "promo_" + flashMovieId + "_movie",
										className	: "image",
										href 		: "?utm_source="+ productInformation["id"] +"&utm_campaign=navigondemo",
										title 		: flashPromotionTitle,
										onclick		: (function() {
														return function() {
															if (typeof urchinTracker != "undefined") {
																urchinTracker("navigondemo.html");
															}
															popupBox.setFixedY(60);
															popupBox.setContent(flashMovie);
															popupBox.show();
															return false;
														}
													}
												)()
									},
									[
										dom.create(
											"img",
											{
												src 	: flashMovieImage,
												alt		: flashPromotionTitle
											},
											null
										)
									]
								)
							]
						),
						dom.create(
							"div",
							{
								className 	: "product_information_flashpromo_content"
							},
							[
								dom.create(
									"h3",
									{
										className	: "promo_"+flashMovieId
									},
									["Probeer de "+ productInformation["name"]+" nu zelf"]
								),
								dom.create(
									"p",
									null,
									[
										"Nieuwsgierig naar alle mogelijkheden van de "+ productInformation["name"]+"? Probeer het apparaat nu zelf met onze ",
										dom.create(
											"a",
											{
												href	: "?utm_source="+ productInformation["name"] +"&utm_campaign=navigondemo",
												title	: flashPromotionTitle,
												id		: "promo_" + flashMovieId + "_movielink",
												onclick	: (function() {
														return function() {
															if (typeof urchinTracker != "undefined") {
																urchinTracker("navigondemo.html");
															}
															popupBox.setFixedY(60);
															popupBox.setContent(flashMovie);
															popupBox.show();
															return false;
														}
													}
												)()
											},
											["interactieve demonstratie"]
										),
										"."
									]
								)
							]
						)
					]
				);
			dom.getById("product_averagerating").parentNode.insertBefore(flashContainer, dom.getById("product_averagerating").nextSibling );
		}
		else
		{
			/**
			 * Tomtom
			 */
			/* append flash promo to the container */
			productinformationContainer.appendChild(
				dom.create(
					"div",
					{
						id: "product_information_flash_promo"
					},
					[
						dom.create(
							"div",
							{
								className: "product_information_flashpromo_image"
							},
							[
								dom.create(
									"a",
									{
										id			: "promo_" + flashMovieId + "_movie",
										className	: "image",
										href 		: "#",
										title 		: flashPromotionTitle,
										onclick		: (function() {
														return function() {
															if (typeof urchinTracker != "undefined") {
																urchinTracker("tomtom360viewer.html");
															}
															popupBox.setContent(flashMovie);
															popupBox.show();
															return false;
														}
													}
												)()
									},
									[
										dom.create(
											"img",
											{
												src 	: flashMovieImage,
												alt		: flashPromotionTitle
											},
											null
										)
									]
								)
							]
						),
						dom.create(
							"div",
							{
								className 	: "product_information_flashpromo_content"
							},
							[
								dom.create(
									"h3",
									{
										className	: "promo_"+flashMovieId
									},
									["Bekijk nu de "+ productInformation["name"] +" in 360 graden"]
								),
								dom.create(
									"p",
									null,
									[
										"Nieuw bij "+shopName+ "! ",
										dom.create(
											"a",
											{
												href	: "#",
												title	: flashPromotionTitle,
												id		: "promo_" + flashMovieId + "_movielink",
												onclick	: (function() {
														return function() {
															if (typeof urchinTracker != "undefined") {
																urchinTracker("tomtom360viewer.html");
															}
															popupBox.setContent(flashMovie);
															popupBox.show();
															return false;
														}
													}
												)()
											},
											["Bekijk nu"]
										),
										" de "+ productInformation["name"] +" in 360 graden"
									]
								)
							]
						)
					]
				)
			);
		}
		return false;
	}
}

// Inheritance
Product.prototype = new Page();
controller.setPageObject(product);