(function LinkController () {
	
	var REQUIRED_PARAMS = ['webSiteId', 'webSiteLocale', 'cs'];
	
	function getCurrentPageParameters () {
		var queryString = window.location.search.replace(/^\?/, '');
		return getParametersFromQueryString(queryString);
	}
	
	function getParametersFromQueryString (queryString) {
		var parameters = queryString.split('&');
		var paramObject = {};
		for (var i = 0; i < parameters.length; i++) {
			var keyValuePair = parameters[i].split('=');
			if (keyValuePair && keyValuePair.length === 2) {
				paramObject[keyValuePair[0]] = keyValuePair[1];
			}
		}
		return paramObject;
	}
	
	function getPageParamsToPassOn (requiredParamsList) {
		var currentPageParams = getCurrentPageParameters();
		var paramsToBeAdded = {};
		for (var i = 0; i < requiredParamsList.length; i++) {
			if (currentPageParams.hasOwnProperty(requiredParamsList[i])) {
				paramsToBeAdded[requiredParamsList[i]] = currentPageParams[requiredParamsList[i]];
			}
		}
		return paramsToBeAdded;
	}
	
	function addQueryStringParams (pageUrl, requiredParamsList) {
		var paramsToBeAdded = getPageParamsToPassOn(requiredParamsList);
		
		var linkHash = '',
			linkParameters = {},
			newParamString = '';
		
		if (pageUrl.indexOf('#') !== -1) {
			linkHash = pageUrl.slice(pageUrl.indexOf('#'));
			pageUrl = pageUrl.slice(0, pageUrl.indexOf('#'));
		}
		
		if (pageUrl.indexOf('?') !== -1) {
			var currentQueryString = pageUrl.slice(pageUrl.indexOf('?') + 1);
			linkParameters = getParametersFromQueryString(currentQueryString);
			pageUrl = pageUrl.slice(0, pageUrl.indexOf('?'));
		}
		
		for (var prop in paramsToBeAdded) {
			if (paramsToBeAdded.hasOwnProperty(prop)) {
				if (linkParameters.hasOwnProperty(prop)) {
					delete linkParameters[prop];
				}
				newParamString += prop + "=" + paramsToBeAdded[prop] + '&';
			}
		}
		var linkParamString = '';
		for (var prop in linkParameters) {
			if (linkParameters.hasOwnProperty(prop)) {
				linkParamString += prop + "=" + linkParameters[prop] + '&';
			}
		}
		if (linkParamString || newParamString) {
			pageUrl += '?' + linkParamString + newParamString;
			pageUrl = pageUrl.slice(0, -1); // Remove trailing ampersand
		}
		pageUrl += linkHash;
		return pageUrl;
	}
	
	function isAnchor (tag) {
		return !!getAnchor(tag);
	}
	
	function getAnchor (tag) {
		return getTag(tag, 'a');
	}
	
	function getTag (tag, tagType) {
		if (tag.tagName.toLowerCase() === tagType) {
			return tag;
		}
		if (jQuery(tag).parents(tagType).length > 0) {
			return jQuery(tag).parents(tagType)[0];
		}
	}
	
	jQuery(document.body).click (
		function (event) {
			var clicked = event.target;
			if (isAnchor(clicked)) {
				var link = getAnchor(clicked);
				link.href = addQueryStringParams(link.href, REQUIRED_PARAMS);
			} else if (clicked.tagName.toLowerCase() === 'input' && clicked.type === 'submit') {
				var form = getTag(clicked, 'form');
				form.action = addQueryStringParams(form.action, REQUIRED_PARAMS);
			}
		}
	)
	
})()
