﻿Type.registerNamespace('Mercell.Web.UI');

Mercell.Web.UI.TextHighlight = function(element) 
{ 
	Mercell.Web.UI.TextHighlight.initializeBase(this, [element]);
}

Mercell.Web.UI.TextHighlight.prototype = {
	initialize: function()
	{
		Mercell.Web.UI.TextHighlight.callBaseMethod(this, 'initialize');
		var self = this;
		setTimeout(function() { self.highlight(self.get_find(), self.get_element()) }, 20);
	},

	dispose: function()
	{
		$clearHandlers(this.get_element());
		Mercell.Web.UI.TextHighlight.callBaseMethod(this, 'dispose');
	},

	set_find: function(value)
	{
		this._find = value;
	},

	get_find: function()
	{
		return this._find;
	},

	highlightItem: function(item, searchTerm)
	{
		searchTerm = searchTerm.toLowerCase();
		if (item.hasChildNodes())
		{
			for (var i = 0; i < item.childNodes.length; ++i)
			{
				var currentNode = item.childNodes[i];
				if (currentNode.nodeType == 3)
				{
					var orgText = currentNode.data;
					var text = currentNode.data.toLowerCase();
					var pos = 0;
					var ok = true;
					var newNodes = new Array();
					if (currentNode.parentNode && currentNode.parentNode.className != "highlight")
					{
						while (ok)
						{
							var idx = -1;
							var tmpPos = pos;
							do
							{
								var nextChar = "?";
								idx = text.indexOf(searchTerm, tmpPos);
								if (idx > 0)
								{
									nextChar = orgText.substring(idx + searchTerm.length, idx + searchTerm.length + 1);
									if (nextChar == "")
									{
										nextChar = "?"; //End of line == OK
									}
								}
								tmpPos++;
							} while (isChar(nextChar))
							var preChar = "";
							if (idx > 0)
							{
								preChar = orgText.substring(idx - 1 , idx);
							}
							if ((preChar != "" && isChar(preChar)) || idx == -1)
							{
								newNodes.push(document.createTextNode(orgText.substr(pos)));
								ok = false;
							}
							else
							{
								if (idx > 0)
								{
									newNodes.push(document.createTextNode(orgText.substring(pos, idx)));
								}
								var newNode = document.createElement("FONT");
								newNode.className = "highlight";
								newNode.innerHTML = orgText.substr(idx, searchTerm.length);
								newNodes.push(newNode);
							}
							pos = idx + searchTerm.length;
						}
					}
					if (newNodes.length > 0)
					{
						for (var n = 0; n < newNodes.length; ++n)
						{
							item.insertBefore(newNodes[n], currentNode);
						}
						item.removeChild(currentNode);
					}
				}
				else
				{
					this.highlightItem(currentNode, searchTerm);
				}
			}
		}
	},

	highlight: function(searchArray, item)
	{
		if (item)
		{
			for (var i = 0; i < searchArray.length; i++)
			{
				if (searchArray[i].length > 0)
				{
					this.highlightItem(item, searchArray[i]);
				}
			}
		}
	}
}

if (typeof(Sys) !== 'undefined')
{
	Sys.Application.notifyScriptLoaded();
}