﻿OverlayUpload = function()
{

	var _obj;
	var _stageNumber = 0;
	var _stageCount = 2;

	var _pre = "#inp_";

	var _generalErrors = 0;

	var _stage1 = { stage: 1, elements: [
								_pre + "personal-details",
								_pre + "personal-details-notes",
								_pre + "name",
								_pre + "dob",
								_pre + "email",
								_pre + "region",
								_pre + "gender",
								_pre + "website",
								_pre + "social1",
								_pre + "social2",
								_pre + "social3",
								_pre + "socialnotes",
								"#nextStageContainer"
								] };

	var _stage2 = { stage: 2, elements: [
								_pre + "upload-details",
								_pre + "upload-details-notes",
								_pre + "type",
								_pre + "title",
								_pre + "description",
								_pre + "text",
								_pre + "file",
								_pre + "terms",
								_pre + "mailing",
								_pre + "recaptcha",
								_pre + "recaptcha_image",
								"#backStageContainer",
								"#submitUploadContainer"
								] };

	var _stage1Recommended = { stage: 1, elements: [
								_pre + "personal-details",
								_pre + "recommendation-details",
								_pre + "personal-details-notes",
								_pre + "name",
								_pre + "dob",
								_pre + "recommendation",
								_pre + "category",
								_pre + "streetAddress",
								_pre + "postalCode",
								_pre + "county",
								_pre + "email",
								_pre + "region",
								_pre + "website",
								_pre + "social1",
								_pre + "social2",
								_pre + "social3",
								_pre + "socialnotes",
								"#nextStageContainer"
								] };

	var _stage2Recommended = { stage: 2, elements: [
								_pre + "upload-details",
								_pre + "upload-details-notes",
								_pre + "type",
								_pre + "title",
								_pre + "description",
								_pre + "text",
								_pre + "file",
								_pre + "terms",
								_pre + "mailing",
								_pre + "recaptcha",
								_pre + "recaptcha_image",
								"#backStageContainer",
								"#submitUploadContainer"
								] };

	var _stages = [ _stage1, _stage2 ];

	return {
		init : function(obj)
		{
			_obj = obj;
			if(_obj.section == "Recommended")
			{
				_stages = [ _stage1Recommended, _stage2Recommended ];
			}
			else
			{
				_stages = [ _stage1, _stage2 ];
			}
			if($el("popUp") == null)
			{
				$("body").append("<div id=\"popUp\"></div>");
			}
			if($el("termsAndConditions") == null)
			{
				$("body").append("<div id=\"termsAndConditions\"></div>");
			}
			$("#popUp").hide();

			//$("#termsLinkFooter").attr("href", "javascript:void(0)");
			$("#termsLinkFooter").click(function(){
				OverlayUpload.terms(true);
				return false;
			});

		},
		launch : function()
		{
			var url = "/" + _obj.region + "/" + _obj.section + "/Upload";

			_generalErrors = 0;

			_stageNumber = 0;

			blockForms(false);

			// track here
			trackPopUnder("upload", url);

			$.ajax({
				url: url,
				beforeSend: function(xhrObj){
					xhrObj.setRequestHeader("X-Request-Type", "application/remote-form");
					waitMessage($so("TextRemoteWaitMessage"));
				},
				error: function(XMLHttpRequest, textStatus, errorThrown)
				{
					if(_generalErrors == 0)
					{
						_generalErrors ++;
						generalError($so("ErrorGeneralNetworkIssue"), true);
					}
					else
					{
						generalError($so("ErrorGeneralNetworkIssueRepeating"), true);
					}
				},
				success: function(data)
				{
					_generalErrors = 0;
					$("#popUp").html(data);
					OverlayUpload.render();
				},
				complete: function()
				{
					killWaitMessage();
				}
			});
		},
		terms : function(standard)
		{
			var url = "/" + _obj.region + "/" + _obj.section + "/UploadTerms";

			if(standard)
			{
				url = "/" + _obj.region + "/" + _obj.section + "/Terms";
			}

			$.ajax({
				url: url,
				beforeSend: function(xhrObj) {
					xhrObj.setRequestHeader("X-Request-Type", "application/remote-form");
				},
				error: function(XMLHttpRequest, textStatus, errorThrown)
				{
					if(_generalErrors == 0)
					{
						_generalErrors ++;
						generalError($so("ErrorGeneralNetworkIssue"), false);
					}
					else
					{
						generalError($so("ErrorGeneralNetworkIssueRepeating"), false);
					}
				},
				success: function(data)
				{
					_generalErrors = 0;
					$("#termsAndConditions").html(data);
					OverlayUpload.termsShown();
				},
				complete: function()
				{
				}
			});
		},
		termsShown : function()
		{
			$("#termsAndConditionsUploadContainer").wrap("<div id=\"termsScrollable\"></div>");
			DropShadows.addShadow($el("termsAndConditions"), "drop-shadow-entry");
			addCloseToPopup("#termsAndConditions", OverlayUpload.hideTerms);
			$("#termsAndConditions").show();
			blockForms(true);
			jQuery('#termsAndConditions').center();
		},
		hideTerms : function()
		{
			unBlockForms(true);
			$("#termsAndConditions").hide();
		},
		close : function()
		{
			$("#termsAndConditions").hide();
			$("#popUp").hide();
			hideGeneralError();
			unBlockForms(false);
		},
		render : function()
		{
			DropShadows.addShadow($el("popUp"), null);
			addCloseToPopup("#popUp", OverlayUpload.close);

			// add back button
			var back = $("<div id=\"backStageContainer\"><input class=\"back-style\" type=\"button\" id=\"backStage\" value=\"" + $so("TextSubmitBack") + "\" /></div>");

			$("#submitUploadContainer").before(back);

			$el("backStage").onclick = function()
			{
				OverlayUpload.back();
			}

			// add next button
			var next = $("<div id=\"nextStageContainer\"><input type=\"button\" id=\"nextStage\" value=\"" + $so("TextSubmitNext") + "\" /></div>");

			$("#submitUploadContainer").before(next);

			$el("nextStage").onclick = function()
			{
				OverlayUpload.next();
			}

			$el("submitUpload").onclick = function()
			{
				OverlayUpload.submit();
			}

			replaceRecaptchaSubmits($el("inp_recaptcha_image"));

			$("#inp_recaptcha_image").removeClass("field");

			$("#uploadForm div.field input[type!='checkbox']").wrap("<div class=\"rounded\"><div class=\"rounded-inner\"></div></div>");
			$("#uploadForm div.field textarea").wrap("<div class=\"rounded\"><div class=\"rounded-inner\"></div></div>");
			$(".rounded-inner").corner("round 6px");
			$(".rounded").corner("round 8px");

			hook(_obj.section);

			// re-create a recaptcha image for the next upload
			recaptcha(null);

			styleUpSelects($el("popUp"));
			replaceSubmits($el("popUp"));
			replaceLinks($el("popUp"));

			//replaceMediaTypeSelect();
			//updateMediaTypeSelect($("#type").val());

			$("#termsLink").attr("href", "javascript:void(0)");
			$("#termsLink").click(function(){
				OverlayUpload.terms(false);
			});

			$("#termsLink").parent("label").attr("for", "");

			// TODO: place in centre screen

			// setup stage tab and stage
			OverlayUpload.showStage(_stageNumber, null);

			$(".tooltip").each(function(){
				var t = $(this).text();
				$(this).attr("title", t);
				$(this).attr("class", "tooltip-active");
				$(this).text("");
				$(this).hover(function(){
					$(this).html("<div class=\"tooltip-open\"><span>" + $(this).attr("title") + "</span></div>");
				},
					function(){
						$(this).html("");
					});
			});

			$("#popUp").show();

		},
		showStage : function(pos, errors)
		{
			var i;
			var j;
			var tab = "";
			var stage;

			for(i = 0; i < _stages.length; i++)
			{
				stage = _stages[i];
				for(j = 0; j < stage.elements.length; j++)
				{
					OverlayUpload.setStageElementDisplay(stage.elements[j], i == pos);
				}
			}

			tab = $so("TextFormSectionLabel");

			tab = tab.replace("{0}", _stageNumber + 1);
			tab = tab.replace("{1}", _stageCount);

			if(_stageNumber == 1)
			{
				// reset the layout based on type
				hook(_obj.section);
			}

			if(errors != null)
			{
				if(errors.length > 0)
				{
					showErrors(errors);
				}
			}

			$("#formTab").remove();
			$("#popUp").prepend("<div id=\"formTab\">" + tab + "</div>");

			jQuery('#popUp').center();

		},
		findStageOfFirstError : function(errors)
		{
			var i, j, k;
			var id;
			var s = 1000;
			var global = false; // did global errors occur?
			var globalErrors = [];

			for(i = 0; i < errors.length; i++)
			{
				if(errors[i].id == null)
				{
					global = true;
					globalErrors[globalErrors.length] = errors[i].message;
				}
				else
				{
					for(j = 0; j < _stages.length; j++)
					{
						k = _stages[j].elements.indexOf(_pre + errors[i].id);
						if(k != -1)
						{
							if(_stages[j].stage < s)
							{
								s = _stages[j].stage;
							}
						}
					}
				}
			}
			if(s != 1000)
			{
				_stageNumber = s - 1;
				OverlayUpload.showStage(_stageNumber, errors);
			}
			if(global)
			{
				generalError(globalErrors, false);
			}
		},
		setStageElementDisplay : function(name, show)
		{
			var el = $(name);
			if(show)
			{
				el.show();
			}
			else
			{
				el.hide();
			}
		},
		back : function()
		{
			if(_stageNumber > 0)
			{
				_stageNumber--;
				OverlayUpload.showStage(_stageNumber, null);
			}
		},
		next : function()
		{
			var errors = validate(_obj.section);
			if(errors.length == 0)
			{
				_stageNumber++;
				OverlayUpload.showStage(_stageNumber, null);
			}
			else
			{
				OverlayUpload.showStage(_stageNumber, errors);
			}
		},
		submit : function()
		{
			var errors = validate(_obj.section);
			if(errors.length == 0)
			{

				var url = "/" + _obj.region + "/" + _obj.section + "/CheckRecaptcha";
				$.ajax({
					type : "POST",
					url: url,
					data: {recaptcha: $("#recaptcha").val()},
					beforeSend: function(xhrObj){
						xhrObj.setRequestHeader("X-Request-Type", "application/remote-form");
						waitMessage($so("TextRemoteWaitMessage"));
					},
					error: function(XMLHttpRequest, textStatus, errorThrown)
					{
						generalError($so("ErrorGeneralNetworkIssue"), false);
					},
					success: function(data)
					{
						var root, status;
						var errors = [];

						root = data.documentElement;

						status = xmlAttributeValue(root, "status");

						killWaitMessage();

						if(status == "success")
						{
							OverlayUpload.submitAll();
						}
						else
						{
							errors[errors.length] = { id: "recaptcha", message: "ErrorCaptchaFailed", fromStringtable: true};
							OverlayUpload.showStage(_stageNumber, errors);
							recaptcha(null);
						}

					}

				});

			}
			else
			{
				OverlayUpload.showStage(_stageNumber, errors);
			}
		},
		submitAll : function()
		{
			var errors = validate(_obj.section);
			if(errors.length == 0)
			{
				var options = {
					dataType: 'xml',
					beforeSend: function(xhrObj){
						waitMessage($so("TextRemoteWaitMessage"));
					},
					data: { XRequestType: "application/remote-form" },
					success: function(data)
					{
						OverlayUpload.submitDone(data);
					},
					complete: function()
					{
						killWaitMessage();
					}
				};

				$('#uploadForm').ajaxSubmit(options);
			}
			else
			{
				OverlayUpload.showStage(_stageNumber, errors);
			}
		},
		submitDone : function(data)
		{
			var root;
			var i;
			var c;
			var status = "failure";
			var errors = [];
			var stageError;

			root = data.documentElement;

			status = xmlAttributeValue(root, "status");

			if(status == "exception")
			{
				// destroy the form and show success
				if(_generalErrors == 0)
				{
					_generalErrors ++;
					generalError($so("ErrorGeneralNetworkIssue"), false);
				}
				else
				{
					generalError($so("ErrorGeneralNetworkIssueRepeating"), false);
				}
				return;
			}

			_generalErrors = 0;

			if(status == "success")
			{
				// destroy the form and show success
				OverlayUpload.showSuccess();
				return;
			}

			// reload the security image
			recaptcha(null);

			for (i = 0; i < root.childNodes.length; i++)
			{
				c = root.childNodes.item(i);
				if (c.nodeType == 1)
				{
					if(c.nodeName == "error")
					{
						stageError = xmlAttributeValue(c, "id");
						errors[errors.length] = { id: stageError, message: c.firstChild.nodeValue, fromStringtable: false};
					}
				}
			}

			OverlayUpload.findStageOfFirstError(errors);

		},
		showSuccess : function()
		{
			var url = "/" + _obj.region + "/" + _obj.section + "/UploadComplete";

			$.ajax({
				url: url,
				beforeSend: function(xhrObj){
					xhrObj.setRequestHeader("X-Request-Type", "application/remote-form");
					waitMessage($so("TextRemoteWaitMessage"));
				},
				success: function(data)
				{
					$("#popUp").attr("class", "drop-shadow-active");
					$("#popUp").html(data);
					DropShadows.addShadow($el("popUp"), "drop-shadow-message");
					addCloseToPopup("#popUp", OverlayUpload.close);
					replaceLinks($el("popUp"));
					$("#repeatUpload").click(function(){
						OverlayUpload.launch();
					});
					$("#repeatUpload").attr("href", "javascript:void(0)");
				},
				complete: function()
				{
					killWaitMessage();
				}
			});
		}
	}
}();

var xmlAttributeValue = function(node, name)
{
	var i;

	for(i = 0; i < node.attributes.length; i++)
	{
		if(node.attributes[i].nodeName == name)
		{
			return node.attributes[i].nodeValue;
		}
	}
	return null;
}
