var haasJsId = "v0.1 (sp 10) build 121 rc1";
var haasIsDebug = false;

$(document).ready(function()
{
	HaasHandleLoad();
});

function HaasHandleLoad()
{	
	// compat check
	if
		(!
			(
				($.browser.msie && parseFloat($.browser.version) >= 6) ||
				($.browser.mozilla && parseFloat($.browser.version) >= 1) ||
				($.browser.safari && parseFloat($.browser.version) >= 530) ||
				($.browser.opera && parseFloat($.browser.version) >= 9)
			)
		)
		return; // silent exit
		
	// setup handlers etc
	HaasInit();
	
	var haasContext = GetHaasContext();
	
	// ask the server what to do
	HaasRequestAction(haasContext);
}

function GetHaasContext()
{
	// get article title using standard html tags
	var articleTitle = $("html > head > title")[0].text;
	
	// get article meta data
	var articleId = GetMetaZS("meta[name=rbuniqueid1]", "content");
	if (articleId == "")
		articleId = GetMetaZS("meta[name=rbuniqueID1]", "content");
	var articleTaxonomy = GetMetaZS("meta[name=rbtaxonomy]", "content");
	var articleIndustry = GetMetaZS("meta[name=rbindustry]", "content");
	var articleContentType = GetMetaZS("meta[name=rbcontenttype]", "content");
	
	// create an context instance based retrieved metadata
	var haasContext = HaasCreateContext(articleId, articleTitle, articleTaxonomy, articleIndustry, articleContentType);

	return haasContext;
}

function GetMetaZS(name, attribute)
{
	var result = "";
	var element = $(name);
	
	if (element != null && element[0])
		result = element[0].getAttribute(attribute);
		
	return result;
}

function HaasRequestAction(haasContext)
{
	var requestUrl = GetRequestAddress();
 
	var jsonDto = null;
	
	try
	{
		jsonDto = GetDtoJSON(haasContext);
	}
	catch (e)
	{
		if (haasIsDebug)
			alert("e: " + e);
	}
	
	if (jsonDto == null)
		return;

	var haasCookie = "haascontext=" + encodeURIComponent(jsonDto) +
		"; path=/;" + // not the document we are called from
		"; domain=." + document.domain + // make sure it gets sent to subdomain requests
		"; max-age=10" + // short lived
		";";
	document.cookie = haasCookie;
	
	$.getJSON(requestUrl + "?callback=?", function(data, textStatus)
	{
		if (data)
			HaasProcessActions(data);
		else if (haasIsDebug)
			alert(textStatus);
	});
}

function GetRequestAddress()
{			
	var requestUrl = 'http://' + GetRequestDomain() + '/RequestActionClient.aspx';
	
	return requestUrl;
}

function GetRequestDomain()
{
	var localsite = document.domain;

	var domain = 'haas.' + localsite;

	return domain;
}

function GetDtoJSON(haasContext)
{
	// Create a data transfer object (DTO) with the proper structure.
	var dto = { 'HaasContext' : haasContext };

	// serialize the dto for sending to server
	var jsonDto = null;
	
	if (typeof(JSON) != "undefined")
		jsonDto = JSON.stringify(dto);
	
	return jsonDto;
}

function HaasProcessActions(dto)
{
	HaasProcessActionPackage(dto);
}

function HaasProcessActionPackage(haasActionPackage)
{
	for (var actionOffset = 0; actionOffset < haasActionPackage.HaasActions.length; actionOffset++)
	{	
		var haasAction = haasActionPackage.HaasActions[actionOffset];
		
		HaasProcessAction(haasAction);
	}
}


var haasLastAction;
function HaasProcessAction(haasAction)
{
	var actionType = haasAction.Type;
	
	switch (actionType)
	{
		case "ShowDiagnostics":
			HaasExecuteActionShowDiagnostics(haasAction);
			break;
		case "ShowOverlay":
			HaasExecuteActionShowOverlay(haasAction);
			break;
		case "HideOverlay":
			HaasExecuteActionHideOverlay(haasAction);
			break;
		case "Error":
			if (haasIsDebug)
				HaasExecuteActionShowDiagnostics(haasAction);
			break;
		case "ValidationErrors":
			HaasExecuteActionValidationErrors(haasAction);
			break;
		case "Redirect":
			HaasExecuteActionRedirect(haasAction);
			break;
		case "PostForm":
			HaasExecuteActionPostForm(haasAction);
			break;
		default:
			if (haasIsDebug)
				HaasExecuteActionShowDiagnostics(haasAction, "unknown type, blame => assign(erik)");
	}
	
	haasLastAction = haasAction;	
}

function HaasExecuteActionPostForm(haasAction)
{
	HaasExecuteActionHideOverlay(haasAction);
	
	var url = haasAction.ActionData;
	var data = haasAction.FormData;
	
	$.post(url, data, function()
	{
		// refresh
		haasAction.ActionData = document.location;
		HaasExecuteActionRedirect(haasAction);
	});
}

function HaasExecuteActionValidationErrors(haasAction)
{
	// hide previous errors
	$("#haasForm *").removeClass("haasValidationError");
	$("#haasForm *").removeClass("haasValidationErrorInput");
	$("#haasForm SPAN[CLASS=error]").html("");

    // enable submit buttons
	var submitButton = $($("#haasForm *"), "input[type='submit']");
	$(submitButton).removeAttr("disabled");
	
	var elements = haasAction.ActionData;
	
	var items = elements.length;
	
	for (var elementOffset = 0; elementOffset < items; elementOffset++)
	{
		var element = elements[elementOffset];
		
		var name = element[0];
		var text = element[1];
		
		var firstError = true;
		var elementSelector = ("*[name=" + name + "]");
		
		/*
		 *	<DIV CLASS="formField">
		 *		<SPAN CLASS="label">Flag0</SPAN>
		 *		<SPAN CLASS="mandatory">*</SPAN>
		 *		<SPAN CLASS="value"><INPUT TYPE="CHECKBOX" name="0279a15d-46fa-4f1c-90df-6a1e6fa75a99" /></SPAN>
		 *		<SPAN CLASS="error"></SPAN>
		 *	</DIV>
		 */ 
		var fieldInput = $(elementSelector);
		var fieldValue = fieldInput.parent();
		var fieldDiv = fieldValue.parent();
		
		// handle multi-value fields
		if (fieldDiv.parent().attr("class") == "values")
			fieldDiv = fieldDiv.parent().parent();
			
		var fieldError = fieldDiv.children("SPAN[CLASS=error]")
		var fieldLabel = fieldDiv.children("SPAN[CLASS=label]")
		
		fieldLabel.addClass("haasValidationError");
		fieldError.addClass("haasValidationError");
		fieldValue.addClass("haasValidationErrorInput");
		fieldError.html(text);
		
		// set focus to the first field that has an error
		if (firstError)
			fieldInput.focus();	
		firstError = false;
	}
}

function CloseOverlay() {
    HaasExecuteActionHideOverlay();
    window.location = document.location;
}

function HaasExecuteActionRedirect(haasAction)
{
	window.location = haasAction.ActionData;
}

var keys = new Array();
function HaasInit()
{
	if (haasIsDebug)
	{
		$("body").keypress(function (e)
		{
			keys.push(String.fromCharCode(e.which));
			
			var word = keys.join("");
			if (word.match("haasdebug"))
			{
				HaasExecuteActionShowDiagnostics();
				keys.length = 0;
			}
		});
	}
}

function HaasExecuteActionHideOverlay(haasAction)
{
	$("#haasOverlay").remove();
	$("#haasDiagnostics").remove();
	$("#fadeBackground").remove();
}

var HAAS_CONST_BUTTONPRESSED = "button";

function HaasSubmitAction(domButton) {
    var button = HaasCreateButton(domButton);
    $("#haasForm").data(HAAS_CONST_BUTTONPRESSED, button);
    $("#haasForm").submit();
    return false;
}

function HaasExecuteActionShowOverlay(haasAction)
{
	HaasExecuteActionHideOverlay(haasAction);
	
	var content = "<div id='haasOverlay'><div id='haasCanvas'>";
	content += haasAction.ActionData;
	content += "</div></div><div id='fadeBackground'></div>"
	
	$("body").append(content);
	
	$("#haasForm input[type=submit]").click(function(event)
	{			
		var button = HaasCreateButton(this);
		
		$("#haasForm").data(HAAS_CONST_BUTTONPRESSED, button);
	});
	
	// form submissions should be converted into
	// requests to server with data in the context
	$("#haasForm").submit(function() {

	    // disable the submitbuttons
	    var submitButton = $($("#haasForm *"), "input[type='submit']");
	    $(submitButton).attr("disabled", "disabled");

	    var items = this.elements.length;
	    var formData = new Array(items); // inc button
	    var outputLocation = 0;

	    for (var elementOffset = 0; elementOffset < items; elementOffset++) {
	        var element = this.elements[elementOffset];

	        var key = element.name;
	        var value = element.value;

	        /*if ($(element).attr("type") == "checkbox" || $(element).attr("type") == "radio")
	        {
	        value = "off";
	        if ($(element).is(':checked'))
	        value = "on";
	        }*/

	        if ($(element).attr("type") == "checkbox" || $(element).attr("type") == "radio") {
	            value = "off";

	            if ($(element).parent().parent().parent().attr("class") == "values")
	                value = null;

	            if ($(element).is(':checked'))
	                value = $(element).attr("value");
	        }

	        var kvp = MakeKeyValuePair(key, value);
	        if (!IsNullOrBlank(kvp[1]))
	            formData[outputLocation++] = kvp;
	    }

	    // record the button that submitted the form
	    var kvpButton = null;
	    var button = $("#haasForm").data(HAAS_CONST_BUTTONPRESSED);
	    if (button != null) {
	        kvpButton = MakeKeyValuePair("Button", button.Id);
	        formData[outputLocation] = kvpButton;
	    }

	    formData.length = outputLocation + 1;
	    var haasContext = GetHaasContext();
	    // pass the form data in the context
	    haasContext.FormData = formData;
	    HaasRequestAction(haasContext);

	    return false; // stop the submission
	});
}

function IsNullOrBlank(value)
{
	return (value == null || value == "");
}

function MakeKeyValuePair(key, value)
{
	var kvp = new Array(2);
	
	kvp[0] = key;
	kvp[1] = value;

	return kvp;
}

function HaasCreateButton(domButton)
{
	var button = new Object();
	
	button.Value = $(domButton).val();
	button.Id = $(domButton).attr("id");
	
	return button;
}
	
function HaasExecuteActionShowDiagnostics(haasAction, reason)
{
	HaasExecuteActionHideOverlay(haasAction);
	
	var haasContext = GetHaasContext();
	var jsonDto = GetDtoJSON(haasContext).replace(/{/g, "<br/>{ ").replace(/,/g, ",<br/>");
	var requestUrl = GetRequestAddress();
	
	var content = "<div id='haasDiagnostics'><div id='haasCanvas'><br/><h1>Haas Diagnostics";
	if (reason != null)
		content += " - " + reason;
	content += "</h1>"
	content += "Client</br>"
	content += "<span class='haasDiagLabel'>Request URL</span>: " + requestUrl + "<br/>";
	content += "<span class='haasDiagLabel'>DTO</span>:" + jsonDto + "<br>";
	content += "<span class='haasDiagLabel'>Document Domain</span>: " + document.domain + "<br/>";

	content += "<br/>Server<br/>";
	if (haasAction == null)
		haasAction = haasLastAction;

	if (haasAction != null)
		content += "<span class='haasDiagLabel'>Type</span>: " + haasAction.Type + "<br/>";
		
	if (haasAction != null)
	{
		content += "<span class='haasDiagLabel'>DTO</span>: ";
		content += JSON.stringify(haasAction).replace(/\n/g, "<br/>");
	}
	else
		content += "No server data!";
	content += "<br/><img src='http://" + GetRequestDomain() + "/images/7of9.jpg' height='344'>";
	//content += "<br/>Diagnostics end. <div id='haasOverlayClose' onclick='$(\"#haasDiagnostics\").remove()'>[x] close</div>";
	//content += "<object width='425' height='344'><param name='movie' value='http://www.youtube.com/v/VCGcljqOSW0&hl=en&fs=1&'></param><param name='allowFullScreen' value='true'></param><param name='allowscriptaccess' value='always'></param><embed src='http://www.youtube.com/v/VCGcljqOSW0&hl=en&fs=1&' type='application/x-shockwave-flash' allowscriptaccess='always' allowfullscreen='true' width='425' height='344'></embed></object></div>";
	content += "</div>";
	//content += "</div></div>";
	
	$("body").append(content);
}

function HaasCreateContext(articleId, articleTitle, articleTaxonomy, articleIndustry, articleContentType)
{
	var haasContext = new Object();
	
	haasContext.ArticleId = articleId;
	haasContext.ArticleTitle = articleTitle;
	haasContext.ArticleTaxonomy = articleTaxonomy;
	haasContext.ArticleIndustry = articleIndustry;
	haasContext.ArticleContentType = articleContentType;
	haasContext.JavaScriptId = haasJsId;
	haasContext.Referrer = document.referrer;
	haasContext.FormData = null;
	
	return haasContext;
}