Lib.Utils.EventUtils.addEvent(window, 'load', function() { new MenuUtils() });

MenuUtils = function() {
    this._convertContentURIs();
    var menuLinks = cssQuery('a.menuLink');
    for (var i = 0; i < menuLinks.length; i++) {
        this._attachMenuEvents(menuLinks[i]);
    }
    
    var disabledLinks = cssQuery('a.disabledLink');
    for (var i = 0; i < disabledLinks.length; i++) {
    	this._attachDisableLinkEvent(disabledLinks[i]);
    }
}

MenuUtils.EXCLUDED_PARAMETERS = ['lang', 'contentid', 'queryText', 'action', 'page', 'range', 'totalresults', 'pfs'];

MenuUtils.prototype._convertContentURIs = function() {
    var content = document.getElementById('content');
    if (typeof content != 'undefined' && content != null) {
        var links = document.getElementById('content').getElementsByTagName('a');
        for (var i = 0; i < links.length; i++) {
            var uri = links[i].href;
            if ((uri.indexOf('monsanto.com') > -1 || uri.indexOf('localhost') > -1) && !Lib.Utils.DocumentUtils.containsClass(links[i], 'disableLinkRewrite')) {
                uri = this._addLevelParametersToURI(uri);
                links[i].href = uri;
                Lib.Utils.DocumentUtils.addClass(links[i], 'menuLink');
            }
        }
    }
}

MenuUtils.prototype._addLevelParametersToURI = function(uri) {
    var paramMap = this._getLevelParameters();
    for (key in paramMap) {
    	uri = this._appendParameter(uri, key, paramMap[key]);
    }
    return uri;
}

MenuUtils.prototype._attachMenuEvents = function(menuLink) {
    Lib.Utils.EventUtils.addEvent(menuLink, 'click', this._getMenuEvents(menuLink, this));
}

MenuUtils.prototype._getMenuEvents = function(menuLink, self) {
    return function(event) {
      	Lib.Utils.EventUtils.cancelDefaultAction(event);
        var baseURL = self._parseBaseURL(menuLink.href);
        var parameters = self._parseParameters(menuLink.href);
        var baseURL = self._appendExcludedParameters(baseURL, parameters);
        var formElement = self._createNewForm(baseURL, parameters, self);
        formElement.submit();
        return false;
    }
}

MenuUtils.prototype._appendExcludedParameters = function(baseUrl, parameters) {
	for (var i = 0; Lib.Utils.ObjectUtils.isDefined(parameters) && i < parameters.length; i++) {
		var parts = this._parseParameterParts(parameters[i]);
		if (Lib.Utils.ObjectUtils.ArrayUtils.contains(MenuUtils.EXCLUDED_PARAMETERS, parts[0])) {
			baseUrl = this._appendParameter(baseUrl, parts[0], parts[1]);
		}
	}
	return baseUrl;
}

MenuUtils.prototype._createNewForm = function(baseURL, parameters, self) {
    var formElement = document.createElement('form');
    formElement.action = baseURL;
    formElement.method = 'post';
    if (parameters) {
        self._appendHiddenParameters(formElement, parameters, self);
    }
    document.body.appendChild(formElement);
    return formElement;
}

MenuUtils.prototype._appendHiddenParameters = function(formElement, parameters, self) {
    for (var i = 0; i < parameters.length; i++) {
        var paramParts = self._parseParameterParts(parameters[i]);
        var hiddenInput;
        if (document.all) {
            hiddenInput = document.createElement('<input name="' + paramParts[0] + '">');
        } else {
            hiddenInput = document.createElement('input');
            hiddenInput.name = paramParts[0];
        }
        hiddenInput.value = paramParts[1];
        hiddenInput.type = 'hidden';
        formElement.appendChild(hiddenInput);
    }
}

MenuUtils.prototype._parseBaseURL = function(url) {
    return url.split('?')[0];
}

MenuUtils.prototype._parseParameters = function(url) {
    var urlParts = url.split('?');
    if (urlParts.length > 1) {
        return urlParts[1].split('&');
    }
}

MenuUtils.prototype._parseParameterParts = function(parameter) {
    return parameter.split('=');
}

MenuUtils.prototype._getLevelParameters = function() {
	var paramMap = {};
	var breadCrumb = document.getElementById('breadcrumb-bar');
	var levels = cssQuery('span.level', breadCrumb);
	for (var i = 0; i < levels.length; i++) {
		paramMap = this._appendLevelParameter(levels[i], paramMap);
	}
	return paramMap;
}

MenuUtils.prototype._appendLevelParameter = function(level, paramMap) {
	if (level.childNodes.length > 0) {
		paramMap[level.id] = level.firstChild.nodeValue;
	}
	return paramMap;
}

MenuUtils.prototype._appendParameter = function(url, name, value) {
	if (url.indexOf('?') > -1) {
		url = url + '&' + name + "=" + value;
	} else {
		url = url + '?' + name + "=" + value;
	}
	return url;
}

MenuUtils.prototype._attachDisableLinkEvent = function(linkElement) {
	Lib.Utils.EventUtils.addEvent(linkElement, 'click', this._cancelLinkEvent);
}

MenuUtils.prototype._cancelLinkEvent = function(evt) {
	Lib.Utils.EventUtils.cancelDefaultAction(evt);
}