﻿//
// Kernel
//

// Loader
function Loader(){}
Loader.LoadHandlers = new Array();
Loader.UnloadHandlers = new Array();
Loader.AddObject = function(object)
{
    if(typeof(object.OnLoad) != 'undefined') {
        Loader.AddLoadHandler(object.Container + '.OnLoad();');
    }
    if(typeof(object.OnUnload) != 'undefined') {
        Loader.AddUnloadHandler(object.Container + '.OnUnload();');
    }
}
Loader.AddLoadHandler = function(handler)
{
	var length = Loader.LoadHandlers.length;
	Loader.LoadHandlers[length] = handler;
}
Loader.AddUnloadHandler = function(handler)
{
	var length = Loader.UnloadHandlers.length;
	Loader.UnloadHandlers[length] = handler;
}
Loader.RunLoadHandlers = function()
{
	var length = Loader.LoadHandlers.length;
	var i;
	for (i=0; i<length; i++)
	{
		eval(Loader.LoadHandlers[i]);
	}	
}
Loader.RunUnloadHandlers = function()
{
	var length = Loader.UnloadHandlers.length;
	var i;
	for (i=0; i<length; i++)
	{
		eval(Loader.UnloadHandlers[i]);
	}	
}

window.onunload = Loader.RunUnloadHandlers;
window.onload = Loader.RunLoadHandlers;

// Events
function Event(type) {
    this.type = type;
    this.handlers = new Array();
    
	this.toString = function()
	{
		return "[Event: "+this.Type+"]";
	}
	
    this.GetActiveCount = function ()
    {
	    var activeCount=0;
	
	    for (i=0; i < this.handlers.length; i++) 
	    {
		    if (this.handlers[i] != null)
		    {
			    activeCount++;
		    }
	    }
		
	    return activeCount;
    }
    this.AddHandler = function(handler)
    {
        var i;
	    for (i=0; i < this.handlers.length; i++) 
	    {
		    if (this.handlers[i] == null)
		    {
			    this.handlers[i] = handler;
			    return;
		    }
	    }
	
        this.handlers.push(handler);
    }
    this.RemoveHandler = function(handler)
    {
	    var i;
	    for (i=0; i < this.handlers.length; i++) 
	    {
		    if (this.handlers[i] == handler)
		    {
			    this.handlers[i] = null;
			    return;
		    }
	    }
    }
    this.Send = function(args)
    {
		args.Type = this.type;
		
	    if (window!=null)
	    {
		    args.Source=window.name;
	    }
	
	    Event.DoCallBacks(this, args);
    }
    /*this.Post = function(objArgs)
    {
		args.Type = this.Type;
		
	    if (window!=null)
	    {
		    objArgs.Source=window.name;
	    }
		
	    rfo = new EventReflectObj(this, objArgs);
	
	    TimedEvent.setTimeOut(this.ReflectedPost, 1, rfo);
    }*/
}
Event.DoCallBacks = function(eventObj, args)
{
	var i;
	for (i=0; i < eventObj.handlers.length; i++) 
	{
		var handler = eventObj.handlers[i];
		if (handler !=null)
		{
			var container = handler.Container;
			var invokee = handler.Invokee;
			if (container != null)
			{
				//alert("evaluating: " + handler.Container + "." + handler.MethodName + "(args)");
				eval(handler.Container + "." + handler.MethodName + "(args)");
			}
			else if (invokee != null)
			{
				//alert("calling invokee");
				handler.OnEvent.call(invokee, args);
			}
			else
			{
				//alert("calling handler.OnEvent");
				handler.OnEvent(args);
			}
		}
	}
}

function EventHandler(name)
{
	this.Name = name;
	
	this.OnEvent = function(objArgs)
	{
		alert('SelectionEventHandler.OnEvent was not implemented for Handler: ' +this+" "+objArgs); 
	}
	
	this.toString = function()
	{
		if (!this.Name)
			return "[Unnamed Handler]";
		else
			return "["+this.Name+"]";
	}
}

function EventType(){}
// Define user event type

function EventArgs()
{
	this.Source;
	this.Type;
    
	this.toString = function()
	{
		return "[EVENT: "+this.Type+" SENDER: "+this.Source+"]";
	}
}

// BrowserEvent
function BrowserEvent(){}
BrowserEvent.GetEvent = function(Event)
{
	if (Event)
		return Event;
	else
		return window.event;
}
BrowserEvent.Attach = function(obj, eventName, handler)
{
	if ( document.attachEvent ) 
	{
	    // IE
		obj.attachEvent(eventName, handler);
	} 
	else if ( document.addEventListener ) 
	{
	    // Mozilla family
		obj.addEventListener(eventName.substring(2, eventName.length), handler, false);
	} 
	else 
	{
		eval(obj.id + "." + eventName + " = " + handler);
	}
}
BrowserEvent.Detach = function(obj, eventName, handler)
{
	if ( document.removeEventListener )
	{
	    // Mozilla family
		obj.removeEventListener(eventName.substring(2, eventName.length), handler, false);
	} 
	else if ( document.detachEvent ) 
	{
	    // IE
		obj.detachEvent(eventName, handler);
	} 
	else 
	{
		eval(obj.id + "." + eventName + " = ''");
	}
}


