/**
 * Systeem om GET parameters uit de URL te halen en cookies te lezen.
 */

var input =
{
	'file': '',
	'rawParams': '',
	'params': { },
	'hash': null,
	'cookies': { }
};

(function()
{
	input.get = function input_get(varName, defaultValue)
	{
		if (typeof this.params[varName] !== 'undefined')
			return this.params[varName];

		else
			return defaultValue;
	};

	input.getCookie = function input_getCookie(cookieName, defaultValue)
	{
		if (typeof this.cookies[cookieName] !== 'undefined')
			return this.cookies[cookieName];

		else
			return defaultValue;
	};

	input.parseURL = function input_parseURL()
	{
		var urlParts = window.location.href.match(/([^\?#]+)([\?][^#]+)?(#.+)?/);
		this.file = urlParts[1];
		if (urlParts[3])
			this.hash = urlParts[3];

		if (urlParts[2])
		{
			this.rawParams = urlParts[2];
			this.params = this.parseQuerystring(urlParts[2]);
		}

		return true;
	};

	input.parseCookies = function input_parseCookies()
	{
		var cookies = document.cookie.split(';');

		for (var i = 0; i < cookies.length; i++)
		{
			var cookieParts = cookies[i].split('=');
			var cookieName = cookieParts[0].replace(/^\s+|\s+$/g, '');

			if (cookieParts.length > 1)
				this.cookies[cookieName] = decodeURIComponent(cookieParts[1].replace(/^\s+|\s+$/g, ''));
			else
				this.cookies[cookieName] = '';
		}

		return true;
	};

	input.parseQuerystring = function input_parseQuerystring(str)
	{
		var params = { };

		var strParts = str.replace(/^\?/, '').split(/[\?&]/);
		for (var p = 0; p < strParts.length; p++)
		{
			var paramParts = strParts[p].split(/=/);
			if (paramParts.length != 2)
				continue;

			if (paramParts[0].match(/^[a-z0-9\+%_\-\'\.!~\*\(\)]+$/i))
			{
				try { if (paramParts[0].match(/\+/)) paramParts[0] = paramParts[0].replace(/\+/, '%20'); paramParts[0] = decodeURIComponent(paramParts[0]); }
				catch(err)
				{
					if (typeof toerEngineError !== 'undefined')
						toerEngineError('URL parameternaam onjuist gecodeerd: '+paramParts[0], window.location.protocol+'\/\/'+window.location.hostname+'\/js\/input.js', 85, '', 'webmaster');
				}
			}
			if (paramParts[1].match(/^[a-z0-9\+%_\-\'\.!~\*\(\)]+$/i))
			{
				try { if (paramParts[1].match(/\+/)) paramParts[1] = paramParts[1].replace(/\+/, '%20'); paramParts[1] = decodeURIComponent(paramParts[1]); }
				catch(err)
				{
					if (typeof toerEngineError !== 'undefined')
						toerEngineError('URL parameterwaarde onjuist gecodeerd: '+paramParts[1], window.location.protocol+'\/\/'+window.location.hostname+'\/js\/input.js', 94, '', 'webmaster');
				}
			}

			// Check of de variabele een array is (dus met blokhaken in de naam)
			var arrayParts = paramParts[0].match(/^(.*)\[([^\]]*)\]$/);

			if (!arrayParts)
			{
				if (paramParts[1] == '[]')
					// Leeg array-like object
					params[paramParts[0]] = { 'length': 0 };

				else
					// Normale variabele. overschrijf evt eerder ingelezen waardes
					params[paramParts[0]] = paramParts[1];
			}

			else if (arrayParts[2])
			{
				// Associatieve array, dus object in javascript.
				if (typeof params[arrayParts[1]] != 'object')
				{
					// De variabele bestaat nog niet of is een primitieve variabele.
					// Nieuw object maken en evt. de variabele overschrijven.
					params[arrayParts[1]] = { };
					params[arrayParts[1]][arrayParts[2]] = paramParts[1];
				}

				else
				{
					// Er staat al iets. Controleren of het een object of een array is

					if (isArraylikeObject(params[arrayParts[1]]))
					{
						// Er bestaat al een array-like object. Dit is verkeerd. Overschrijven met een object.
						params[arrayParts[1]] = { };
						params[arrayParts[1]][arrayParts[2]] = paramParts[1];
					}
					else
					{
						// Er bestaat al een object. Nieuw item toevoegen.
						params[arrayParts[1]][arrayParts[2]] = paramParts[1];
					}
				}
			}

			else
			{
				// Sequentiele array, zou dus in javascript een normale moeten zijn. Maar
				// omdat arrays onder sommige omstandigheden geconverteerd worden naar
				// een array-like object, gebruiken we dus maar gewoon een array-like
				// object en geen echte array.
				if (typeof params[arrayParts[1]] != 'object')
				{
					// De variabele bestaat nog niet of is een primitieve variabele.
					// Nieuwe array maken en evt. de variabele overschrijven.
					params[arrayParts[1]] = { '0': paramParts[1], 'length': 1 };
				}

				else
				{
					// Er staat al iets. Controleren of het een object of een array (array-like object) is

					if (isArraylikeObject(params[arrayParts[1]]))
					{
						// Er bestaat al een array-like object. Nieuw item toevoegen
						params[arrayParts[1]][params[arrayParts[1]].length++] = paramParts[1];
					}
					else
					{
						// Er bestaat al een gewoon object. Dit is verkeerd. Overschrijven met een array-like object.
						params[arrayParts[1]] = { '0': paramParts[1], 'length': 1 };
					}
				}
			}
		}
		return params;
	};
})();

input.parseURL();
input.parseCookies();


