var Help = function() {
	/*global document,window,escape,navigator */
	/*members className, container, defaultContainerName, display, errors, 
	    firstChild, getElementById, getElementsByTagName, hasOwnProperty, hash, 
	    href, indexOf, init, innerHTML, inspectHash, keywords, length, location, 
	    match, name, nodeName, nodeValue, onclick, parentNode, push, referrer, 
	    reset, search, setInterval, showAnswer, split, style, test, toLowerCase, 
	    value, createElement, createTextNode, appendChild, createAttribute,
	    setAttributeNode
	*/	
	// Private variables
	var self = this;
	var i,s;
	var _answers = {};
	var _keywords = {};
	var _searchcount = 3;
	var _hash;
	var _browserinfo = '';
	var _hashInpectionInterval;
	var _rxConcealable = /\bconcealable\b/;
	var _failedSearchMessage = 'No topics found. Please try again.';
	var _rxAnchorHash = /#(.+)/;
	var _rxKeywords = /\s*,\s*/;
	var _rxMailto = /^mailto:tech@tsn.ca/;

	// Public variables
	this.errors = [];
	this.defaultContainerName = 'helptopnav';
	
	// Private methods
	var collapseAll = function() {
		for (var strAnswer in _answers) {
			if (_answers.hasOwnProperty(strAnswer)) {
				_answers[strAnswer].container.style.display = 'none';
			}
		}
	};
	var clearSearch = function() {
		document.getElementById('helpsearchresult').innerHTML = '';
		document.getElementById('keywordsearch').value = '';
	};
	var countSearch = function() {
		_searchcount--;
		if (_searchcount < 1) {
			document.getElementById('tsnHelpCantFind').style.display="block";
		}
	};
	var showTop = function() {
		_answers[self.defaultContainerName].container.style.display = 'block';
	};
	var findContainer = function(o) { // THIS IS A RECURSIVE FUNCTION
		var objTestElement = o.parentNode;
		if (objTestElement === undefined || objTestElement.nodeName === 'BODY' || objTestElement.nodeName === 'HTML') {
			return false;
		}
		if (objTestElement !== undefined && objTestElement.className !== undefined && _rxConcealable.test(objTestElement.className)) {
			return objTestElement;
		}
		return findContainer(objTestElement);
	};
	var extractKeywords = function(o) {
		var objContainer;
		var rxKeyword = /\bkeywords\b/;
		var arrContainers = o.getElementsByTagName('div');
		var arrKeywords = [];
		for (var i = 0; i<arrContainers.length;i++) {
			objContainer = arrContainers[i];
			if (objContainer.firstChild && objContainer.firstChild.nodeValue && objContainer.className && rxKeyword.test(objContainer.className)) {
				arrKeywords = objContainer.firstChild.nodeValue.split(_rxKeywords);
			}
		}
		return arrKeywords;
	};
	var extractHash = function(s) {
		var arrHashedLink = s.match(_rxAnchorHash);
		if (arrHashedLink && arrHashedLink.length > 0) {
			return arrHashedLink[1];
		}
		return '';
	};
	var findAnswers = function() {
		var objContainer;
		var objAnchor;
		var arrKeywords;
		var arrAnchors = document.getElementsByTagName('a');
		for (i=0;i<arrAnchors.length;i++) {
			objAnchor = arrAnchors[i];
			if (objAnchor.name !== undefined && objAnchor.name !== '') {
				objContainer = findContainer(objAnchor);
				arrKeywords = extractKeywords(objContainer);
				_answers[objAnchor.name] = {'container':objContainer,'name':objAnchor.name, 'keywords':arrKeywords};
			} 
		}
	};
	var findKeywords = function() {
		var objAnswer;
		var strKeyword;
		for (s in _answers) {
			if (_answers.hasOwnProperty(s)) {
				objAnswer = _answers[s];
				for (i=0;i<objAnswer.keywords.length;i++) {
					strKeyword = objAnswer.keywords[i].toLowerCase();
					if (_keywords[strKeyword] === undefined) {
						_keywords[strKeyword] = [];
					}
					_keywords[strKeyword].push(objAnswer);
				}
			}
		}
	};
	var findQuestionLinksAndMailto = function() {
		var objAnchor;
		var objAnswer;
		var strAnswer;
		var arrAnchors = document.getElementsByTagName('a');
		for (i=0;i<arrAnchors.length;i++) {
			objAnchor = arrAnchors[i];
			if (objAnchor.href !== undefined && objAnchor.href !== '') {
				strAnswer = extractHash(objAnchor.href);
				objAnswer = _answers[strAnswer];
				if (objAnswer !== undefined) {
					objAnchor.onclick = self.showAnswer; 
				}
				if (objAnchor && objAnchor.href && objAnchor.href.test && objAnchor.href.test(_rxMailto)) {
					objAnchor.href += ('&body=' + escape(_browserinfo));
				}
			}
		}
	};
	var startTimer = function() {
		_hashInpectionInterval = window.setInterval(self.inspectHash,250);
	};
	var buildBrowserProfile = function() {
		var strNavigatorItem;
		for (s in navigator) {
			// do nothign
				strNavigatorItem = navigator[s];
				if (typeof(strNavigatorItem) === 'string' || typeof(strNavigatorItem) === 'number' || typeof(strNavigatorItem) === 'boolean') {
					_browserinfo += (s + ': ' + navigator[s] + '\n');
				}
		}
		if (document && document.referrer) {
			_browserinfo += ('referrer: ' + document.referrer);
		}
		if (_browserinfo) {
			_browserinfo = 'Please enter your comment\n\n\n---\nPlease note:\nThe text below is information about your web browser.\nIf you are having technical problems, this information\nmay help us help you. There should be no personal\ninformation below. If you want to keep this information\nprivate, please feel free to delete it.\n\n' + _browserinfo;
		}
	};
	var createElement = function(t,v,a){ // t = tagname, v = tag value, a = attribute list
		var objTag = document.createElement(t);
		if (v !== undefined && v !== null) {
			if (typeof(v) === 'string') {
				v = document.createTextNode(v);
				objTag.appendChild(v);
			}
			else if(v.length > 0) {
				for (var i=0;i<v.length;i++) {
					objTag.appendChild(v[i]);
				}
			}
			else {
				objTag.appendChild(v);
			}
		}
		if (a !== undefined) {
			for (var s in a) {
				if (a.hasOwnProperty(s)) {
					var n = document.createAttribute(s);
					n.value = a[s];
					objTag.setAttributeNode(n);
				}
			}
		}
		return objTag;
	};
	var createSearchBox = function() {
/*        <div class="tsnHelpSearch">
          <h2>Search:</h2>
          <input type="text" id="keywordsearch" size="40" />
          <input type="button" value="GO" onclick="tsnHelp.search()" class="button" />
          <input type="button" value="Start over" onclick="tsnHelp.reset()" class="button" />
        </div>
        <div id="helpsearchresult"></div>*/
		var objSpace = document.createTextNode(' ');
		var objTitle = createElement('h2','Search');
		var objSearchBox = createElement('input',null,{'type':'text','id':'keywordsearch','size':'40'});

		var objSearchButton = createElement('input',null,{'type':'button'});
		objSearchButton.value = 'GO';
		objSearchButton.className = 'button';
		objSearchButton.onclick=self.search;

		var objResetButton = createElement('input',null,{'type':'button'});
		objResetButton.value='Start over';
		objResetButton.className = 'button';
		objResetButton.onclick=self.reset;
		
		var objDivHelpSearch =  createElement('div',[objTitle,objSearchBox,objSpace,objSearchButton,objSpace,objResetButton]);
		objDivHelpSearch.className = 'tsnHelpSearch';
		
		var objDivSearchResults = createElement('div','',{'id':'helpsearchresult'});

		document.getElementById('tsnHelp').insertBefore(objDivSearchResults,document.getElementById('tsnHelp').childNodes[0]);
		document.getElementById('tsnHelp').insertBefore(objDivHelpSearch,document.getElementById('tsnHelp').childNodes[0]);
	}
	var hideContactForm = function() {
			document.getElementById('tsnHelpCantFind').style.display="none";
	}
	// Public methods
	this.init = function() {
		buildBrowserProfile(); //Creates string of browser profile for emailing tech issues
		hideContactForm(); // Users can submit their questions
		createSearchBox(); //Searching works only for JS enabled browsers, so we write it in with javascript
		findAnswers(); // Finds all Answers
		findQuestionLinksAndMailto();//Finds the links  that display answers and the technical-issue mailto
		findKeywords();
		self.reset();//Closes all answers and opens the default answer (the main nav)
		startTimer(); //The page continually checks the URL for signs the user has used the browser navigation buttons to move trhough the document. This sets up the interval.
	};
	this.reset = function() {
		clearSearch();
		collapseAll();
		showTop();
	};
	this.showAnswer = function(s) {
		var objAnswer;
		var strHash;
		var arrMatches;
		arrMatches = this.href.match(_rxAnchorHash);
		clearSearch();
		countSearch();
		if (arrMatches.length < 2) {
			return false;
		}
		strHash = arrMatches[1];
		objAnswer = _answers[strHash];
		if (objAnswer === undefined) {
			return false;
		}
		collapseAll();
		objAnswer.container.style.display="block";
		_hash = '#' + strHash;
		
		return true;
	};
	
	this.search = function() {
		var strSearchTerm = document.getElementById('keywordsearch').value.toLowerCase();
		var isResultFound = false;
		var objAnswer;
		var strKeyword;
		var strFirstTarget;
		collapseAll();
		countSearch();
		for (s in _keywords) {
			if (s && _keywords.hasOwnProperty(s)) {
				if (strSearchTerm.indexOf(s) > -1) {
					strKeyword = s;
					for (i=0;i<_keywords[s].length;i++) {
						objAnswer = _keywords[s][i];
						objAnswer.container.style.display = 'block';
						if (strFirstTarget === undefined) {
							strFirstTarget = objAnswer.name;
						}
					}
					isResultFound = true;
				}
			}
		}
		if (isResultFound) {
			document.location = _hash = '#' + strFirstTarget;
		}
		else {
			document.getElementById('helpsearchresult').innerHTML = _failedSearchMessage;
		}
	};
	this.inspectHash = function() {
		var strHash;
		if (_hash !== document.location.hash) {
			strHash = extractHash(document.location.hash);
			if (_answers[strHash] !== undefined) {
				collapseAll();
				_answers[strHash].container.style.display = 'block';
			}
		}
		_hash = document.location.hash;
	};
};