﻿if (!window)
	this.window = this;
	
window.__rootNamespaces = [];

function Tideworks$registerNamespace(namespacePath) // this is ripped directly from MicrosoftAjax.js with a few tweaks
{
    var rootObject = window;
    var namespaceParts = namespacePath.split('.');

    for (var i = 0; i < namespaceParts.length; i++)
	{
        var currentPart = namespaceParts[i];
        var ns = rootObject[currentPart];
        if (!ns)
		{
            ns = rootObject[currentPart] = {};
            if (i === 0)
			{
                window.__rootNamespaces[window.__rootNamespaces.length] = ns;
            }
            ns.__namespace = true;
            ns.__typeName = namespaceParts.slice(0, i + 1).join('.');
            var parsedName;
            try
			{
                parsedName = eval(ns.__typeName);
            }
            catch(e)
			{
                parsedName = null;
            }
            if (parsedName !== ns)
			{
                delete rootObject[currentPart];
            }
            ns.getName = function ns$getName() {return this.__typeName;}
        }
        rootObject = ns;
    }
}
Tideworks$registerNamespace("Tideworks.Web.UI");

Tideworks.Web.UI.KeyCodes = function Tideworks$Web$UI$KeyCodes()
{
}

var $KeyCodes = Tideworks.Web.UI.KeyCodes.prototype =
{
	BACKSPACE: 8,
	TAB: 9,
	ENTER: 13,
	SHIFT: 16,
	CTRL: 17,
	ALT: 18,
	PAUSE: 19,
	CAPS: 20,
	ESC: 27,
	PAGEUP: 33,
	PAGEDN: 34,
	END: 35,
	HOME: 36,
	LEFT: 37,
	UP: 38,
	RIGHT: 39,
	DOWN: 40,
	INSERT: 45,
	DELETE: 46,
	n0: 48,
	n1: 49,
	n2: 50,
	n3: 51,
	n4: 52,
	n5: 53,
	n6: 54,
	n7: 55,
	n8: 56,
	n9: 57,
	A: 65,
	B: 66,
	C: 67,
	D: 68,
	E: 69,
	F: 70,
	G: 71,
	H: 72,
	I: 73,
	J: 74,
	K: 75,
	L: 76,
	M: 77,
	N: 78,
	O: 79,
	P: 80,
	Q: 81,
	R: 82,
	S: 83,
	T: 84,
	U: 85,
	V: 86,
	W: 87,
	X: 88,
	Y: 89,
	Z: 90,
	LEFTWINDOWS: 91,
	RIGHTWINDOWS: 92,
	CONTEXT: 93,
	NUM0: 96,
	NUM1: 97,
	NUM2: 98,
	NUM3: 99,
	NUM4: 100,
	NUM5: 101,
	NUM6: 102,
	NUM7: 103,
	NUM8: 104,
	NUM9: 105,
	MULTIPLY: 106,
	ADD: 107,
	SUBTRACT: 109,
	DECIMAL: 110,
	DIVIDE: 111,
	F1: 112,
	F2: 113,
	F3: 114,
	F4: 115,
	F5: 116,
	F6: 117,
	F7: 118,
	F8: 119,
	F9: 120,
	F10: 121,
	F11: 122,
	F12: 123,
	NUMLOCK: 144,
	SCROLLLOCK: 145,
	SEMICOLON: 186,
	EQUAL: 187,
	COMMA: 188,
	DASH: 189,
	PERIOD: 190,
	FORWARDSLASH: 191,
	GRAVEACCENT: 192,
	OPENBRACKET: 219,
	BACKSLASH: 220,
	CLOSEBRACKET: 221,
	QUOTE: 222
};

Tideworks.Web.UI.EventNames = function Tideworks$Web$UI$EventNames()
{
}

var $EventNames = Tideworks.Web.UI.EventNames.prototype = 
{
	Blur: 'blur',
	Change: 'change',
	Click: 'click',
	Focus: 'focus',
	KeyDown: 'keydown',
	KeyUp: 'keyup',
	KeyPress: 'keypress',
	Load: 'load',
	MouseDown: 'mousedown',
	MouseOut: 'mouseout',
	MouseOver: 'mouseover',
	MouseUp: 'mouseup',
	Scroll: 'scroll',
	Unload: 'unload'
};

var $CrossBrowserEventArgs = Tideworks.Web.UI.CrossBrowserEventArgs = function Tideworks$Web$UI$CrossBrowserEventArgs(eventObj)
{
	this.eventHandler = null;     //the event handler
	this.eventElement = null;     //the element that caused the event
	this.elementTag = '';         //the html tag that caused the event
	this.elementID = '';          //the id of the element
	this.element = null;          //the actual element
	this.keyCode = 0;             //the keycode to capture

	if (document.all)
	{
		// IE or FF (Basically W3C Compliant Browsers)
		this.eventHandler = eventObj;
		if ((eventObj.srcElement != null) && (eventObj.srcElement != 'undefined'))
		{
			this.eventElement = eventObj.srcElement;
			this.element = eventObj.srcElement;
			if ((eventObj.srcElement.tagName != null) && (eventObj.srcElement.tagName != 'undefined'))
			{
				this.elementTag = eventObj.srcElement.tagName;
			}
			if ((eventObj.srcElement.name != null) && (eventObj.srcElement.name != 'undefined'))
			{
				this.elementID = eventObj.srcElement.name;
			}
		}
		if ((eventObj.keyCode != null) && (eventObj.keyCode != 'undefined'))
		{
			this.keyCode = eventObj.keyCode;
		}
	}
	else
	{
		// Not IE (Such as Netscape 4.0 and lower)
		this.eventHandler = eventObj;
		if ((eventObj.target != null) && (eventObj.target != 'undefined'))
		{
			this.element = eventObj.target;
			if ((eventObj.target.srcElement != null) && (eventObj.target.srcElement != 'undefined'))
			{
				this.eventElement = eventObj.target.srcElement;
			}
			if ((eventObj.target.tagName != null) && (eventObj.target.tagName != 'undefined'))
			{
				this.elementTag = eventObj.target.tagName;
			}
			if ((eventObj.target.name != null) && (eventObj.target.name != 'undefined'))
			{
				this.elementID = eventObj.target.name;
			}
		}
		if ((eventObj.which != null) && (eventObj.which != 'undefined'))
		{
			this.keyCode = eventObj.which;
		}

		// Safari bug workaround
		if (this.element.nodeType == 3) 
			targ = targ.parentNode;
	}
};

function Tideworks$Web$UI$CrossBrowserEventArgs$get_eventHandler()
{
	return this.eventHandler;
}

function Tideworks$Web$UI$CrossBrowserEventArgs$set_eventHandler(e)
{
	this.eventHandler = e;
}

function Tideworks$Web$UI$CrossBrowserEventArgs$get_eventElement()
{
	return this.eventElement;
}

function Tideworks$Web$UI$CrossBrowserEventArgs$set_eventElement(e)
{
	this.eventElement = e;
}

function Tideworks$Web$UI$CrossBrowserEventArgs$get_elementTag()
{
	return this.elementTag;
}

function Tideworks$Web$UI$CrossBrowserEventArgs$set_elementTag(e)
{
	this.elementTag = e;
}

function Tideworks$Web$UI$CrossBrowserEventArgs$get_elementID()
{
	return this.elementID;
}

function Tideworks$Web$UI$CrossBrowserEventArgs$set_elementID(e)
{
	this.elementID = e;
}

function Tideworks$Web$UI$CrossBrowserEventArgs$get_element()
{
	return this.element;
}

function Tideworks$Web$UI$CrossBrowserEventArgs$set_element(e)
{
	this.element = e;
}

function Tideworks$Web$UI$CrossBrowserEventArgs$get_keyCode()
{
	return this.keyCode;
}

function Tideworks$Web$UI$CrossBrowserEventArgs$set_keyCode(e)
{
	this.keyCode = e;
}
	
Tideworks.Web.UI.CrossBrowserEventArgs.prototype =
{
	get_eventHandler: Tideworks$Web$UI$CrossBrowserEventArgs$get_eventHandler,
	set_eventHandler: Tideworks$Web$UI$CrossBrowserEventArgs$set_eventHandler,
	get_eventElement: Tideworks$Web$UI$CrossBrowserEventArgs$get_eventElement,
	set_eventElement: Tideworks$Web$UI$CrossBrowserEventArgs$set_eventElement,
	get_elementTag: Tideworks$Web$UI$CrossBrowserEventArgs$get_elementTag,
	set_elementTag: Tideworks$Web$UI$CrossBrowserEventArgs$set_elementTag,
	get_elementID: Tideworks$Web$UI$CrossBrowserEventArgs$get_elementID,
	set_elementID: Tideworks$Web$UI$CrossBrowserEventArgs$set_elementID,
	get_element: Tideworks$Web$UI$CrossBrowserEventArgs$get_element,
	set_element: Tideworks$Web$UI$CrossBrowserEventArgs$set_element,
	get_keyCode: Tideworks$Web$UI$CrossBrowserEventArgs$get_keyCode,
	set_keyCode: Tideworks$Web$UI$CrossBrowserEventArgs$set_keyCode
};

var $EventManager = Tideworks.Web.UI.EventManager = function Tideworks$Web$UI$EventManager()
{
};

function Tideworks$Web$UI$EventManager$handleEvent(e)
{
	var hasHandler = false;
	var handlerList = []
	var xbArgs = null;
	
	if (!e)
	{
		e = window.event;
		if((e != null) && (e != 'undefined'))
		{
			xbArgs = new $CrossBrowserEventArgs(e);
		}
	}
	else
	{
		xbArgs = new $CrossBrowserEventArgs(e);
	}
	
	if((xbArgs != null) && (xbArgs != 'undefined'))
	{
		//var desc = '';
		//for(var prop in xbArgs)
		//{
		//	if(typeof(xbArgs[prop]) != 'function')
		//	{
		//		desc += '\n\n----------------------------------------\nxbArgs[' + prop + '] = ' + xbArgs[prop];
				//if(prop == 'eventHandler')
				//{
				//	for(var subProp in xbArgs[prop])
				//	{
				//		if(typeof(xbArgs[prop]) != 'function')
				//		{
				//			desc += '\n\n----------------------------------------\nxbArgs[' + prop + '][' + subProp + '] = ' + xbArgs[prop][subProp];
				//		}
				//	}
				//}
		//	}
		//}
		//alert('[xbArgs Description]\n\n' + desc);
		if((xbArgs.element == null) || (xbArgs.element == 'undefined'))
		{
			// must be either window or document - try window first;
			if (xbArgs.eventHandler.type == 'load')
			{
				// load events can only be fired on the window object;
				xbArgs.element = window;
			}
			else
			{
				// otherwise look for other events in either window or document that match the fired event.
				if (window._events)
				{
					if (window._events[xbArgs.eventHandler.type])
					{
						xbArgs.element = window;
					}
				}
				else if(document._events)
				{
					if (document._events[xbArgs.eventHandler.type])
					{
						xbArgs.element = document;
					}
				}
			}
		}
		if((xbArgs.element != null) && (xbArgs.element != 'undefined'))
		{
			src = xbArgs.element;
			//alert('src._events = ' + src._events + '\nsrc._events[' + xbArgs.eventHandler.type + '] = ' + src._events[xbArgs.eventHandler.type]);
			if (src._events)
			{
				var cache = src._events;
				for (var name in cache)
				{
					if(xbArgs.eventHandler.type == name)
					{
						var handlers = cache[name];
						for (var x in handlers)
						{
							if (typeof(handlers[x]) == 'object')
							{
								for (var y in handlers[x])
								{
									if ((typeof(handlers[x][y]) == 'function') && (y == 'handler'))
									{
										//alert('handlers[' + x + '].handler = ' + handlers[x].handler + '\n--------------------\nhandlers[' + x + '].handlerArgs = ' + handlers[x].handlerArgs);
										handlerList[handlerList.length] = { handler: handlers[x].handler, handlerArgs: handlers[x].handlerArgs };
									}
								}
							}
							else if (typeof(handlers[x]) == 'function')
							{
								//alert('handlers[' + x + '] = ' + handlers[x]);
								handlerList[handlerList.length] = { handler: handlers[x] };
							}
						}
					}
				}
			}
		}
		
		if(handlerList.length > 0)
		{
			hasHandler = true;
		}
	}
	
	if (hasHandler)
	{
		var r;
		for(var key in handlerList)
		{
			if(typeof(handlerList[key]) == 'function')
			{
				if ((handlerList[key]) && (typeof(handlerList[key]) == 'function'))
				{
					r = handlerList[key].call(xbArgs.element, xbArgs, 'from handleEvent');
				}
			}
			else if (typeof(handlerList[key]) == 'object')
			{
				if ((handlerList[key].handler) && (typeof(handlerList[key].handler) == 'function'))
				{
					r = handlerList[key].handler.call(xbArgs.element, xbArgs, handlerList[key].handlerArgs);
				}
			}
		}
		
		if (r == false)
		{
			if (window.event)
			{
				window.event.cancelBubble = true;
				window.event.returnValue = false;
			}
			else if (window.addEventListener)
			{
				xbArgs.eventHandler.stopPropagation();
				xbArgs.eventHandler.preventDefault();
			}
			return false;
		}
		else
		{
			if (window.event)
			{
				window.event.cancelBubble = false;
				window.event.returnValue = true;
			}
			return true;
		}
	}
}

var $describeArray = function Tideworks$Web$UI$EventManager$describeArray(title, arr, deep)
{
	var div = document.getElementById('debugDiv');
	//alert('doc = ' + doc + '\ndiv = ' + div + '\ntitle = ' + title + '\narr = ' + arr + '\ndeep = ' + deep);
	var description = '';
	var tempString = '';
	var useAlert = false;
	
	if((div != null) && (div != 'undefined'))
	{
		div.innerText += (title == null) ? '' : title;
	}
	else
	{
		useAlert = true;
		tempString += (title == null) ? '' : title;
	}
	for(var name in arr)
	{
		if(arr[name])
		{
			if (typeof(arr[name]) == 'object')
			{
				if((div != null) && (div != 'undefined'))
				{
					div.innerText += '\narr[' + name + '] is object:\n';
				}
				else
				{
					tempString += '\narr[' + name + '] is object:\n';
				}
				if(deep)
				{
					this.describeArray('\n[' + name + ' Description]', arr[name], deep);
				}
			}
			else
			{
				description += '\narr[' + name + '] = ' + arr[name];
				description += '\n  typeof(arr[' + name + ']) = ' + typeof(arr[name]);
			}
		}
	}
	if((div != null) && (div != 'undefined'))
	{
		div.innerText += '\n' + description + '\n';
	}
	else
	{
		tempString += '\n' + description + '\n';
		if(useAlert)
		{
			alert(tempString);
		}
	}
}

function Tideworks$Web$UI$EventManager$addHandler(element, eventName, handler, evtArgs)
{
	//alert('element = ' + element + '\neventName = ' + eventName + '\nhandler = ' + handler + '\nevtArgs = ' + evtArgs);
	if (!element._events)
	{
		element._events = {};
	}
	var eventCache = element._events[eventName.toLowerCase()];
	if (!eventCache)
	{
		element._events[eventName.toLowerCase()] = eventCache = {};
	}
	//alert('element = ' + element + '\neventName = ' + eventName + '\neventCache = ' + eventCache);
	var browserHandler;
	if (element.addEventListener)
	{
		browserHandler = function (e)
		{
			return handler.call(element, new $CrossBrowserEventArgs(e), evtArgs);
		}
		element.addEventListener(eventName.toLowerCase(), this.handleEvent, false);
	}
	else if (element.attachEvent)
	{
		browserHandler = function ()
		{
			return handler.call(element, new $CrossBrowserEventArgs(window.event), evtArgs);
		}
		element.attachEvent("on" + eventName.toLowerCase(), this.handleEvent);
	}
	else
	{
		element["on" + eventName.toLowerCase()] = this.handleEvent;
	}

	if (element.layers)
	{
		element.captureEvents(Event[eventName.toUpperCase()]);
	}
	eventCache[eventCache.length] = {handler: handler, handlerArgs: evtArgs, browserHandler: browserHandler};
}

function Tideworks$Web$UI$EventManager$removeHandler(element, eventName, handler)
{
	var browserHandler = null;
	var cache = element._events[eventName.toLowerCase()];
	for (var i = 0, l = cache.length; i < l; i++)
	{
		if (cache[i].handler === handler)
		{
			browserHandler = cache[i].browserHandler;
			break;
		}
	}
	if (element.removeEventListener)
	{
		element.removeEventListener(eventName.toLowerCase(), this.handleEvent, false);
	}
	else if (element.detachEvent)
	{
		element.detachEvent("on" + eventName.toLowerCase(), this.handleEvent);
	}
	else
	{
		element["on" + eventName.toLowerCase()] = null;
	}

	if (element.layers)
	{
		element.releaseEvents(Event[eventName.toUpperCase()]);
	}
	
	cache.splice(i, 1);
}

Tideworks.Web.UI.EventManager.prototype =
{
	handleEvent: Tideworks$Web$UI$EventManager$handleEvent,
	describeArray: $describeArray,
	addHandler: Tideworks$Web$UI$EventManager$addHandler,
	removeHandler: Tideworks$Web$UI$EventManager$removeHandler,
	dispose: function()
	{
		var element = document;
		if (element._events)
		{
	        var cache = element._events;
	        for (var name in cache)
			{
	            var handlers = cache[name];
	            for (var i = handlers.length - 1; i >= 0; i--)
				{
	                removeHandler(element, name, handlers[i].handler);
	            }
	        }
	        element._events = null;
	    }
	}
}

var $evtMgr = evtMgr = new $EventManager();
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();