var originalText;
var highlightStartTag = "<span class='highlighted' name='highlightedArea'>";
var highlightEndTag = "</span>";

function initContext(){
	originalText = document.getElementById('bodyText').innerHTML;
}

function findString(form){
	var string = form.searchText.value;
	var occurence = form.occurence.value;
	var treatAsPhrase = form.treatAsPhrase.checked;
	var bodyText = document.getElementById('bodyText');
	document.getElementById('bodyText').innerHTML = originalText;
	if (string.length != 0 && bodyText.length != 0) 
		highlightSearchTerms(string, treatAsPhrase, occurence, bodyText);
}


function doHighlight(bodyText, searchTerm, occurence){
	var newText = "";
	var i = -1;
	var lcSearchTerm = searchTerm.toLowerCase();
	var lcBodyText = bodyText.toLowerCase();
	var occurenceCount = 0;
	while (bodyText.length > 0) {
		//Search for last occurrence
		if (occurence == "last" && lcBodyText.lastIndexOf(lcSearchTerm)>0) {
			i = lcBodyText.lastIndexOf(lcSearchTerm);
			newText += bodyText.substring(0, i) + highlightStartTag + bodyText.substr(i, searchTerm.length) + highlightEndTag + bodyText.substr(i + searchTerm.length, bodyText.length);
			return newText;
		}
		//Search for first occurrence
		else if(lcBodyText.indexOf(lcSearchTerm, i + 1)>0) {
			i = lcBodyText.indexOf(lcSearchTerm, i + 1);
			occurenceCount++;
			// skip anything inside an HTML tag
			if (bodyText.lastIndexOf(">", i) >= bodyText.lastIndexOf("<", i)) {
				// skip anything inside a <script> block
				if (lcBodyText.lastIndexOf("/script>", i) >= lcBodyText.lastIndexOf("<script", i)) {
					if (occurence == 0 || occurence == occurenceCount) 
						newText += bodyText.substring(0, i) + highlightStartTag + bodyText.substr(i, searchTerm.length) + highlightEndTag;
					else 
						newText += bodyText.substring(0, i) + bodyText.substr(i, searchTerm.length);
					bodyText = bodyText.substr(i + searchTerm.length);
					lcBodyText = bodyText.toLowerCase();
					i = -1;
				}
			}
		}
		else{
			newText += bodyText;
			bodyText = "";
		}
	}
	return newText;
}

function highlightSearchTerms(searchText, treatAsPhrase, occurence, bodyText){
	if (treatAsPhrase) {
		searchArray = [searchText];
	} else {
		searchArray = searchText.split(" ");
	}
	var body = bodyText.innerHTML;
	for (var i = 0; i < searchArray.length; i++) {
		body = doHighlight(body, searchArray[i], occurence);
	}
	bodyText.innerHTML = body;
	scrollToFirst();
	return true;
}

function scrollToFirst(){
	var searchResults = document.getElementsByClassName("highlighted", document);
	var bodyText = document.getElementById('bodyText');
	if (searchResults.length>=0){
		bodyText.scrollTop = searchResults[0].offsetTop - bodyText.clientHeight;
	}
}

document.getElementsByClassName = function(className, parentElement) {
	if (typeof parentElement == 'string'){
		parentElement = document.getElementById(parentElement);
	} 
	else if (typeof parentElement != 'object' || typeof parentElement.tagName != 'string'){
		parentElement = document.body;
	}
	var children = parentElement.getElementsByTagName('*');
	var re = new RegExp('\\b' + className + '\\b');
	var el, elements = [];
	var i = 0;
	while ( (el = children[i++]) ){
		if ( el.className && re.test(el.className)){
			elements.push(el);
		}
	}
	return elements;
} 
