var Runtime = function()
{
	var form = null;
	var datepicker = null;
	
	window.onload = function()
	{
		initialize();
		
		var scrollPosition = getViewState("scrollPosition");
		
		if(scrollPosition != null)
		{
			if(document.documentElement)
				document.documentElement.scrollTop = scrollPosition;
			else
				document.body.scrollTop = scrollPosition;
		}
	};
	
	var initialize = function()
	{
		if(form == null)
		{
			form = document.forms[0];
			form.onsubmit = function() { return false; };
		}
	};
	
	var raiseEvent = function(source, type, args)
	{
		initialize();
		
		form.requestType.value = "event";
		form.eventSource.value = source;
		form.eventType.value = type || "";
		form.eventArgs.value = args || "";
		form.submit();
	};
	
	var setViewState = function(fieldName, value)
	{
		initialize();
		
		var viewStateField = form["V_" + fieldName];
		
		if(viewStateField == null)
		{
			viewStateField = document.createElement("input");
			viewStateField.type = "hidden";
			viewStateField.name = "V_" + fieldName;
			
			form.appendChild(viewStateField);
		}
		
		viewStateField.value = value.toString();
	};
	
	var getViewState = function(fieldName)
	{
		initialize();
		
		var viewStateField = form["V_" + fieldName];
		
		if(viewStateField == null)
			return null;
			
		return viewStateField.value;
	};
	
	var goBack = function()
	{
		var postbackCount = getViewState("postbackCount") || "0";
		history.go( -(parseInt(postbackCount) + 1));
	};
	
	var submit = function()
	{
		initialize();

		var selectedButton = getViewState("selectedButton");

		if(selectedButton == "")
			alert("U heeft nog geen keuze gemaakt.");
		else
			raiseEvent(selectedButton);
	};
	
	var gotoNextNode = function()
	{
		initialize();
		
		form.requestType.value = "gotoNextNode";
		form.submit();
	};
	
	var setValue = function(field, value)
	{
		initialize();
		form[field].value = value;
	};
	
	var getPosition = function(el)
	{
		var position = { left: 0, top: 0};
		
		while(el != null)
		{
			position.left += el.offsetLeft;
			position.top += el.offsetTop;
			el = el.offsetParent;
		}
		
		return position;
	};
	
	var showDatePicker = function(fieldId, doPostback)
	{
		var hiddenField = form[fieldId];
		var visibleText = document.getElementById(fieldId + "_text");
		
		if(datepicker == null)
			datepicker = new DatePicker();
			
		var position = getPosition(visibleText);

		if(hiddenField.value != "")
		{
			var dateparts = hiddenField.value.split("-");
			var date = new Date(parseInt(dateparts[0], 10), parseInt(dateparts[1], 10) - 1, parseInt(dateparts[2], 10));
			datepicker.selectDate(date);
		}
		
		datepicker.show();
		datepicker.setPosition(position.left, position.top + 20);
		
		datepicker.onselect = function()
		{
			var date = datepicker.getSelectedDate();
			hiddenField.value = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();
			visibleText.innerHTML = hiddenField.value;
			datepicker.hide();
			
			if (doPostback)
				postback();
		};
	};
	
	var formatNumber = function(field, decimalPoint, numberOfDecimals)
	{
		var regex = /^\s*(-?\d+)(\.|,)?(\d*)\s*$/;
		var parts = regex.exec(field.value);
		
		/*
			If field.value matches the regex, then the parts array will contain 4 elements:
				0:	the complete string
				1:	the numeric part before the decimal point
				2:	the decimal point (if any) or else undefined
				3:	the numeric part after the decimal point (if any) or else ""
			If field.value doesn't match the regex, then the parts array will be null.
		*/
		
		if(parts == null)
			return;
		
		if(numberOfDecimals == -1)
		{
			if(parts[2] == null)
				field.value = parts[1];
			else
				field.value = parts[1] + decimalPoint + parts[3];
		}	
		if(numberOfDecimals == 0)
		{
			field.value = parts[1];
		}
		else if(numberOfDecimals > 0)
		{
			if(parts[3].length > numberOfDecimals)
			{
				parts[3] = parts[3].substr(0, numberOfDecimals);
			}
			else
			{	
				while(parts[3].length < numberOfDecimals)
					parts[3] += "0";
			}
			
			field.value = parts[1] + decimalPoint + parts[3];
		}
	};
	
	var postback = function()
	{
		initialize();
		form.requestType.value = "postback";
		
		var scrollPosition = document.documentElement ? document.documentElement.scrollTop : document.body.scrollTop;
		setViewState("scrollPosition", scrollPosition);

		form.submit();
	};
	
	var crosslink = function(flowchartId)
	{
		initialize();
		form.requestType.value = "crosslink";
		form.targetFlowchart.value = flowchartId;
		form.submit();
	};
	
	var subroutine = function(flowchartId)
	{
		initialize();
		form.requestType.value = "subroutine";
		form.targetFlowchart.value = flowchartId;
		form.submit();
	};

	var pub = {
		setViewState : setViewState,
		getViewState : getViewState,
		raiseEvent : raiseEvent,
		submit : submit,
		gotoNextNode : gotoNextNode,
		goBack : goBack,
		postback : postback,
		crosslink : crosslink,
		subroutine : subroutine,
		setValue : setValue,
		showDatePicker : showDatePicker,
		formatNumber : formatNumber
	};
	
	return pub;
}();