/*  nCore Library, version 0.2
 *  (c) 2005-2008 Sam Stephenson
 *
 *  nCoreLibrary is freely distributable under the terms of an MIT-style license.
 *  For details, see the nCore Library web site: http://www.prototypejs.org/
 *
 *--------------------------------------------------------------------------*/

var nCore = {
	useDebugging: false,
	debug: function() { var x = 0; if(nCore.useDebugging) for(x=0;x<arguments.length;x++) console.log(arguments[x]); },
	
	DOM_LOADED : false,
	
	Version: '0.3',
	
	Browser: {},
	
	Controls: {},
	
	Behaviors: {},
	
	Element: {},
	
	isJSON: function(JSONString){var returnedJSON = true; try{ var temp = eval(JSONString);}catch(error){returnedJSON = false}; return returnedJSON;},
	
	uniqIDseed: -1,
	uniqID: function(){}
}

nCore.duplicateObject = function(input){var output = {}; for(var property in input){if(typeof property == "string") eval("output." + property + " = input." + property + ";")}; return output;}

nCore.uniqID = function(pre){ nCore.uniqIDseed++; if(Object.isUndefined(pre)) return nCore.uniqIDseed; else return pre + nCore.uniqIDseed;};
 
nCore.Browser = {
	get: function()
	{
		// Ultimate client-side JavaScript client sniff. Version 3.03
		// convert all characters to lowercase to simplify testing
		nCore.Browser.agt = navigator.userAgent.toLowerCase();

		// *** BROWSER VERSION ***
	    // Note: On IE5, these return 4, so use is_ie5up to detect IE5.
	    nCore.Browser.is_major = parseInt(navigator.appVersion);
	    nCore.Browser.is_minor = parseFloat(navigator.appVersion);

	    // Note: Opera and WebTV spoof Navigator.  We do strict client detection.
	    // If you want to allow spoofing, take out the tests for opera and webtv.
	    nCore.Browser.is_nav  = ((nCore.Browser.agt.indexOf('mozilla')!=-1) && (nCore.Browser.agt.indexOf('spoofer')==-1)
	                && (nCore.Browser.agt.indexOf('compatible') == -1) && (nCore.Browser.agt.indexOf('opera')==-1)
	                && (nCore.Browser.agt.indexOf('webtv')==-1) && (nCore.Browser.agt.indexOf('hotjava')==-1));
	    nCore.Browser.is_nav2 = (nCore.Browser.is_nav && (nCore.Browser.is_major == 2));
	    nCore.Browser.is_nav3 = (nCore.Browser.is_nav && (nCore.Browser.is_major == 3));
	    nCore.Browser.is_nav4 = (nCore.Browser.is_nav && (nCore.Browser.is_major == 4));
	    nCore.Browser.is_nav4up = (nCore.Browser.is_nav && (nCore.Browser.is_major >= 4));
	    nCore.Browser.is_navonly      = (nCore.Browser.is_nav && ((nCore.Browser.agt.indexOf(";nav") != -1) ||
	                          (nCore.Browser.agt.indexOf("; nav") != -1)) );
	    nCore.Browser.is_nav6 = (nCore.Browser.is_nav && (nCore.Browser.is_major == 5));
	    nCore.Browser.is_nav6up = (nCore.Browser.is_nav && (nCore.Browser.is_major >= 5));
	    nCore.Browser.is_gecko = (nCore.Browser.agt.indexOf('gecko') != -1);

	    nCore.Browser.is_ie     = ((nCore.Browser.agt.indexOf("msie") != -1) && (nCore.Browser.agt.indexOf("opera") == -1));
	    nCore.Browser.is_ie3    = (nCore.Browser.is_ie && (nCore.Browser.is_major < 4));
	    nCore.Browser.is_ie4    = (nCore.Browser.is_ie && (nCore.Browser.is_major == 4) && (nCore.Browser.agt.indexOf("msie 4")!=-1) );
	    nCore.Browser.is_ie4up  = (nCore.Browser.is_ie && (nCore.Browser.is_major >= 4));
	    nCore.Browser.is_ie5    = (nCore.Browser.is_ie && (nCore.Browser.is_major == 4) && (nCore.Browser.agt.indexOf("msie 5.0")!=-1) );
	    nCore.Browser.is_ie5_5  = (nCore.Browser.is_ie && (nCore.Browser.is_major == 4) && (nCore.Browser.agt.indexOf("msie 5.5") !=-1));
	    nCore.Browser.is_ie5up  = (nCore.Browser.is_ie && !nCore.Browser.is_ie3 && !nCore.Browser.is_ie4);
	    nCore.Browser.is_ie5_5up =(nCore.Browser.is_ie && !nCore.Browser.is_ie3 && !nCore.Browser.is_ie4 && !nCore.Browser.is_ie5);
	    nCore.Browser.is_ie6    = (nCore.Browser.is_ie && (nCore.Browser.is_major == 4) && (nCore.Browser.agt.indexOf("msie 6.")!=-1) );
	    nCore.Browser.is_ie6up  = (nCore.Browser.is_ie && !nCore.Browser.is_ie3 && !nCore.Browser.is_ie4 && !nCore.Browser.is_ie5 && !nCore.Browser.is_ie5_5);
	    nCore.Browser.is_ie7    = (nCore.Browser.is_ie && (nCore.Browser.is_major == 4) && (nCore.Browser.agt.indexOf("msie 7.")!=-1) );

		// KNOWN BUG: On AOL4, returns false if IE3 is embedded browser
	    // or if this is the first browser window opened.  Thus the
	    // variables is_aol, is_aol3, and is_aol4 aren't 100% reliable.
	    nCore.Browser.is_aol   = (nCore.Browser.agt.indexOf("aol") != -1);
	    nCore.Browser.is_aol3  = (nCore.Browser.is_aol && nCore.Browser.is_ie3);
		nCore.Browser.is_aol4  = (nCore.Browser.is_aol && nCore.Browser.is_ie4);
	    nCore.Browser.is_aol5  = (nCore.Browser.agt.indexOf("aol 5") != -1);
	    nCore.Browser.is_aol6  = (nCore.Browser.agt.indexOf("aol 6") != -1);

	    nCore.Browser.is_opera = (nCore.Browser.agt.indexOf("opera") != -1);
	    nCore.Browser.is_opera2 = (nCore.Browser.agt.indexOf("opera 2") != -1 || nCore.Browser.agt.indexOf("opera/2") != -1);
	    nCore.Browser.is_opera3 = (nCore.Browser.agt.indexOf("opera 3") != -1 || nCore.Browser.agt.indexOf("opera/3") != -1);
	    nCore.Browser.is_opera4 = (nCore.Browser.agt.indexOf("opera 4") != -1 || nCore.Browser.agt.indexOf("opera/4") != -1);
	    nCore.Browser.is_opera5 = (nCore.Browser.agt.indexOf("opera 5") != -1 || nCore.Browser.agt.indexOf("opera/5") != -1);
	    nCore.Browser.is_opera5up = (nCore.Browser.is_opera && !nCore.Browser.is_opera2 && !nCore.Browser.is_opera3 && !inCore.Browser.s_opera4);

	    nCore.Browser.is_webtv = (nCore.Browser.agt.indexOf("webtv") != -1); 

	    nCore.Browser.is_TVNavigator = ((nCore.Browser.agt.indexOf("navio") != -1) || (nCore.Browser.agt.indexOf("navio_aoltv") != -1)); 
	    nCore.Browser.is_AOLTV = nCore.Browser.is_TVNavigator;

	    nCore.Browser.is_hotjava = (nCore.Browser.agt.indexOf("hotjava") != -1);
	    nCore.Browser.is_hotjava3 = (nCore.Browser.is_hotjava && (nCore.Browser.is_major == 3));
	    nCore.Browser.is_hotjava3up = (nCore.Browser.is_hotjava && (nCore.Browser.is_major >= 3));

	    // *** JAVASCRIPT VERSION CHECK ***
	    nCore.Browser.is_js;
	    if (nCore.Browser.is_nav2 || nCore.Browser.is_ie3) nCore.Browser.is_js = 1.0;
	    else if (nCore.Browser.is_nav3) nCore.Browser.is_js = 1.1;
	    else if (nCore.Browser.is_opera5up) nCore.Browser.is_js = 1.3;
	    else if (nCore.Browser.is_opera) nCore.Browser.is_js = 1.1;
	    else if ((nCore.Browser.is_nav4 && (nCore.Browser.is_minor <= 4.05)) || nCore.Browser.is_ie4) nCore.Browser.is_js = 1.2;
	    else if ((nCore.Browser.is_nav4 && (nCore.Browser.is_minor > 4.05)) || nCore.Browser.is_ie5) nCore.Browser.is_js = 1.3;
	    else if (nCore.Browser.is_hotjava3up) nCore.Browser.is_js = 1.4;
	    else if (nCore.Browser.is_nav6 || nCore.Browser.is_gecko) nCore.Browser.is_js = 1.5;
	    // NOTE: In the future, update this code when newer versions of JS
	    // are released. For now, we try to provide some upward compatibility
	    // so that future versions of Nav and IE will show they are at
	    // *least* JS 1.x capable. Always check for JS version compatibility
	    // with > or >=.
	    else if (nCore.Browser.is_nav6up) nCore.Browser.is_js = 1.5;
	    // NOTE: ie5up on mac is 1.4
	    else if (nCore.Browser.is_ie5up) nCore.Browser.is_js = 1.3

	    // HACK: no idea for other browsers; always check for JS version with > or >=
	    else nCore.Browser.is_js = 0.0;

	    // *** PLATFORM ***
	    nCore.Browser.is_win   = ( (nCore.Browser.agt.indexOf("win")!=-1) || (nCore.Browser.agt.indexOf("16bit")!=-1) );
	    // NOTE: On Opera 3.0, the userAgent string includes "Windows 95/NT4" on all
	    //        Win32, so you can't distinguish between Win95 and WinNT.
	    nCore.Browser.is_win95 = ((nCore.Browser.agt.indexOf("win95")!=-1) || (nCore.Browser.agt.indexOf("windows 95")!=-1));

	    // is this a 16 bit compiled version?
	    nCore.Browser.is_win16 = ((nCore.Browser.agt.indexOf("win16")!=-1) || 
	               (nCore.Browser.agt.indexOf("16bit")!=-1) || (nCore.Browser.agt.indexOf("windows 3.1")!=-1) || 
	               (nCore.Browser.agt.indexOf("windows 16-bit")!=-1) );  

	    nCore.Browser.is_win31 = ((nCore.Browser.agt.indexOf("windows 3.1")!=-1) || (nCore.Browser.agt.indexOf("win16")!=-1) ||
	                    (nCore.Browser.agt.indexOf("windows 16-bit")!=-1));

	    nCore.Browser.is_winme = ((nCore.Browser.agt.indexOf("win 9x 4.90")!=-1));
	    nCore.Browser.is_win2k = ((nCore.Browser.agt.indexOf("windows nt 5.0")!=-1));

	    // NOTE: Reliable detection of Win98 may not be possible. It appears that:
	    //       - On Nav 4.x and before you'll get plain "Windows" in userAgent.
	    //       - On Mercury client, the 32-bit version will return "Win98", but
	    //         the 16-bit version running on Win98 will still return "Win95".
	    nCore.Browser.is_win98 = ((nCore.Browser.agt.indexOf("win98")!=-1) || (nCore.Browser.agt.indexOf("windows 98")!=-1));
	    nCore.Browser.is_winnt = ((nCore.Browser.agt.indexOf("winnt")!=-1) || (nCore.Browser.agt.indexOf("windows nt")!=-1));
	    nCore.Browser.is_win32 = (nCore.Browser.is_win95 || nCore.Browser.is_winnt || nCore.Browser.is_win98 || 
	                    ((nCore.Browser.is_major >= 4) && (navigator.platform == "Win32")) ||
	                    (nCore.Browser.agt.indexOf("win32")!=-1) || (nCore.Browser.agt.indexOf("32bit")!=-1));

	    nCore.Browser.is_os2   = ((nCore.Browser.agt.indexOf("os/2")!=-1) || 
	                    (navigator.appVersion.indexOf("OS/2")!=-1) ||   
	                    (nCore.Browser.agt.indexOf("ibm-webexplorer")!=-1));

	    nCore.Browser.is_mac    = (nCore.Browser.agt.indexOf("mac")!=-1);
	    // hack ie5 js version for mac
	    if (nCore.Browser.is_mac && nCore.Browser.is_ie5up) nCore.Browser.is_js = 1.4;
	    nCore.Browser.is_mac68k = (nCore.Browser.is_mac && ((nCore.Browser.agt.indexOf("68k")!=-1) || 
	                               (nCore.Browser.agt.indexOf("68000")!=-1)));
	    nCore.Browser.is_macppc = (nCore.Browser.is_mac && ((nCore.Browser.agt.indexOf("ppc")!=-1) || 
	                                (nCore.Browser.agt.indexOf("powerpc")!=-1)));

	    nCore.Browser.is_sun   = (nCore.Browser.agt.indexOf("sunos")!=-1);
	    nCore.Browser.is_sun4  = (nCore.Browser.agt.indexOf("sunos 4")!=-1);
	    nCore.Browser.is_sun5  = (nCore.Browser.agt.indexOf("sunos 5")!=-1);
	    nCore.Browser.is_suni86= (nCore.Browser.is_sun && (nCore.Browser.agt.indexOf("i86")!=-1));
	    nCore.Browser.is_irix  = (nCore.Browser.agt.indexOf("irix") !=-1);    // SGI
	    nCore.Browser.is_irix5 = (nCore.Browser.agt.indexOf("irix 5") !=-1);
	    nCore.Browser.is_irix6 = ((nCore.Browser.agt.indexOf("irix 6") !=-1) || (nCore.Browser.agt.indexOf("irix6") !=-1));
	    nCore.Browser.is_hpux  = (nCore.Browser.agt.indexOf("hp-ux")!=-1);
	    nCore.Browser.is_hpux9 = (nCore.Browser.is_hpux && (nCore.Browser.agt.indexOf("09.")!=-1));
	    nCore.Browser.is_hpux10= (nCore.Browser.is_hpux && (nCore.Browser.agt.indexOf("10.")!=-1));
	    nCore.Browser.is_aix   = (nCore.Browser.agt.indexOf("aix") !=-1);      // IBM
	    nCore.Browser.is_aix1  = (nCore.Browser.agt.indexOf("aix 1") !=-1);    
	    nCore.Browser.is_aix2  = (nCore.Browser.agt.indexOf("aix 2") !=-1);    
	    nCore.Browser.is_aix3  = (nCore.Browser.agt.indexOf("aix 3") !=-1);    
	    nCore.Browser.is_aix4  = (nCore.Browser.agt.indexOf("aix 4") !=-1);    
	    nCore.Browser.is_linux = (nCore.Browser.agt.indexOf("inux")!=-1);
	    nCore.Browser.is_sco   = (nCore.Browser.agt.indexOf("sco")!=-1) || (nCore.Browser.agt.indexOf("unix_sv")!=-1);
	    nCore.Browser.is_unixware = (nCore.Browser.agt.indexOf("unix_system_v")!=-1); 
	    nCore.Browser.is_mpras    = (nCore.Browser.agt.indexOf("ncr")!=-1); 
	    nCore.Browser.is_reliant  = (nCore.Browser.agt.indexOf("reliantunix")!=-1);
	    nCore.Browser.is_dec   = ((nCore.Browser.agt.indexOf("dec")!=-1) || (nCore.Browser.agt.indexOf("osf1")!=-1) || 
	           (nCore.Browser.agt.indexOf("dec_alpha")!=-1) || (nCore.Browser.agt.indexOf("alphaserver")!=-1) || 
	           (nCore.Browser.agt.indexOf("ultrix")!=-1) || (nCore.Browser.agt.indexOf("alphastation")!=-1)); 
	    nCore.Browser.is_sinix = (nCore.Browser.agt.indexOf("sinix")!=-1);
	    nCore.Browser.is_freebsd = (nCore.Browser.agt.indexOf("freebsd")!=-1);
	    nCore.Browser.is_bsd = (nCore.Browser.agt.indexOf("bsd")!=-1);
	    nCore.Browser.is_unix  = ((nCore.Browser.agt.indexOf("x11")!=-1) || nCore.Browser.is_sun || nCore.Browser.is_irix || nCore.Browser.is_hpux || 
	                 nCore.Browser.is_sco || nCore.Browser.is_unixware || nCore.Browser.is_mpras || nCore.Browser.is_reliant || 
	                 nCore.Browser.is_dec || nCore.Browser.is_sinix || nCore.Browser.is_aix || nCore.Browser.is_linux || nCore.Browser.is_bsd || nCore.Browser.is_freebsd);

	    nCore.Browser.is_vms   = ((nCore.Browser.agt.indexOf("vax")!=-1) || (nCore.Browser.agt.indexOf("openvms")!=-1));
	},
		
	getScroll: function()
	{
		var scrOfX = 0, scrOfY = 0;
		if(typeof( window.pageYOffset ) == 'number' )
		{
			//Netscape compliant
			scrOfY = window.pageYOffset;
			scrOfX = window.pageXOffset;
		}
		else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) )
		{
			//DOM compliant
			scrOfY = document.body.scrollTop;
			scrOfX = document.body.scrollLeft;
		} else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) )
		{
			//IE6 standards compliant mode
			scrOfY = document.documentElement.scrollTop;
			scrOfX = document.documentElement.scrollLeft;
		}

		return {top:scrOfY, left:scrOfX};
	},

	getFullSize: function()
	{
	  var myWidth = 0, myHeight = 0;
	  if( typeof( window.innerWidth ) == 'number' )
	  {
	    //Non-IE
	    myWidth = window.innerWidth;
	    myHeight = window.innerHeight;
	  }
	  else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
	  {
	    //IE 6+ in 'standards compliant mode'
	    myWidth = document.documentElement.clientWidth;
	    myHeight = document.documentElement.clientHeight;
	  }
	  else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
	  {
	    //IE 4 compatible
	    myWidth = document.body.clientWidth;
	    myHeight = document.body.clientHeight;
	  }
	  
	  return {width:myWidth, height:myHeight};
	},

	getFullSizeWScroll: function()
	{
		var size = nCore.Browser.getFullSize();
		var scroll = nCore.Browser.getScroll();

		var body = $$("body").first();
		Element.extend(body);
		
		return {width:body.getWidth(), height:body.getHeight(),scroll: scroll};
	},
		
	getAbsolutePosition: function(obj,includeDimensions)
	{
		if(Object.isUndefined(includeDimensions)) includeDimensions = false;
		
		var result = {left:0,top:0};			
		if(includeDimensions) result.dimensions = obj.getDimensions();
		
		while (obj != null)
		{			
			result.top += obj.offsetTop;
			result.left += obj.offsetLeft;			
			obj = obj.offsetParent;
		}		
		return result;
	},	
	
	updateViewport: function()
	{
		nCore.Browser.viewport = nCore.Browser.getFullSizeWScroll();
	},
	
	getViewport: function()
	{
		nCore.Browser.updateViewport();
		return nCore.Browser.viewport;
	},
	
	install: function()
	{
		nCore.Browser.get();
		nCore.Browser.screen = {};
		nCore.Browser.screen.width = screen.width;
		nCore.Browser.screen.height = screen.height;
		
		nCore.Browser.screen.widthA = screen.width - 25;
		nCore.Browser.screen.heightA = screen.height - 25;
		
		nCore.Browser.viewport = nCore.Browser.getFullSizeWScroll();
	}
}

nCore.Behaviors = {
	
	registered: new Array(),
	
	get: function(value,field)
	{
		if(Object.isUndefined(field)) field = "name";
		if(!nCore.Behaviors.registered.length) return false;
		var foundBehavior = false;
		nCore.Behaviors.registered.each(function(behavior){ if(eval("behavior." + field) == value) foundBehavior = behavior;});
		return foundBehavior;
	},
	
	register: function(behavior,overrideVersion)
	{
		if(Object.isUndefined(overrideVersion)) overrideVersion = false;
		var oldBehavior = nCore.Behaviors.get(behavior.behaviorName,"behaviorName");
		
		if(oldBehavior !== false)
		{			
			if((parseFloat(oldBehavior.version) < parseFloat(behavior)) || ((parseFloat(oldBehavior.version) > parseFloat(behavior)) && (overrideVersion)))
			{
				nCore.Behaviors.unRegister(oldBehavior);
				nCore.Behaviors.pushBehavior(behavior);
			}
		}
		else nCore.Behaviors.pushBehavior(behavior);
	},
	
	unRegister: function(oldBehavior)
	{
		var x = 0;
		for(x=0;x<nCore.Behaviors.registered.length;x++) if(nCore.Behaviors.registered[x].behaviorName == oldBehavior.behaviorName) nCore.Behaviors.registered.splice(x,1);
		if(!Object.isUndefined(eval("nCore.Behaviors." + oldBehavior.name))) eval("nCore.Behaviors." + oldBehavior.name + " = function(){throw 'Behavior has been previously un-registered.};");
		return oldBehavior;
	},
	
	pushBehavior: function(newBehavior)
	{
		nCore.Behaviors.registered.push(newBehavior);
		eval("nCore.Behaviors." + newBehavior.name + " = newBehavior.behavior;");
		return newBehavior;
	},
	
	add: function(selector,behaviorName)
	{
		var behaviorArguments = new Array();
		var x = 0;
		if(arguments.length > 2) for(x=2;x<arguments.length;x++){ behaviorArguments.push(arguments[x]);}
		eval("Event.addBehavior({'" + selector + "' : nCore.Behaviors." + behaviorName + "(behaviorArguments) });");
	}
};


nCore.Controls = {
	
	registered: new Array(),
	controlsInstances: new Array(),
	
	//unObtrusive
	unObtrusiveRegisters: new Array(),
	unObtrusiveDone: false,
	
	get: function(value,field)
	{
		if(Object.isUndefined(field)) field = "name";
		if(!nCore.Controls.registered.length) return false;
		var foundControl = false;
		nCore.Controls.registered.each(function(control){ if(eval("control." + field) == value) foundControl = control;});
		return foundControl;
	},
	
	register: function(control,overrideVersion)
	{
		if(!Object.isUndefined(control.behavior))
		{			
			var behavior = Object.extend(Object.clone(control),Object.clone(control.behavior));
			Object.extend(behavior,{control:null,controlName:null});
			if(Object.isUndefined(behavior.behaviorName)) behavior.behaviorName = control.controlName;
			nCore.Behaviors.register(behavior,overrideVersion);
			control.behavior = null;
		}
		
		if(Object.isUndefined(overrideVersion)) overrideVersion = false;
		var oldControl = nCore.Controls.get(control.controlName,"controlName");
		
		if(oldControl !== false)
		{			
			if((parseFloat(oldControl.version) < parseFloat(control)) || ((parseFloat(oldControl.version) > parseFloat(control)) && (overrideVersion)))
			{
				nCore.Controls.unRegister(oldControl);				
				nCore.Controls.pushControl(control);
			}
		}
		else nCore.Controls.pushControl(control);
	},
	
	unRegister: function(oldControl)
	{
		var x = 0;
		for(x=0;x<nCore.Controls.registered.length;x++) if(nCore.Controls.registered[x].controlName == oldControl.controlName) nCore.Controls.registered.splice(x,1);
		if(!Object.isUndefined(eval("nCore.Controls." + oldControl.name))) eval("nCore.Controls." + oldControl.name + " = function(){throw 'Control has been previously un-registered.};");
		return oldControl;
	},
	
	pushControl: function(newControl)
	{
		nCore.Controls.registered.push(newControl);
		eval("nCore.Controls." + newControl.name + " = newControl.control;");
		return newControl;
	},
	
	newInstance: function(controlName,instanceName,overrideOldInstance)
	{
		if(Object.isUndefined(overrideOldInstance)) overrideOldInstance = false;
		var control = nCore.Controls.get(controlName);
		var oldInstance = nCore.Controls.getInstance(instanceName);

		if(control === false) throw "nCore new instance of control '" + controlName + "' failed, unavailable control.";

		if((oldInstance !== false) && (!overrideOldInstance)) throw "nCore new instance of control '" + controlName + "' failed, instance name already taken.";

		if((oldInstance !== false) && (overrideOldInstance)) nCore.Controls.delInstance(instanceName);
		return nCore.Controls.pushInstance(arguments);
	},
	
	getInstance: function(instanceName)
	{
		if(!nCore.Controls.controlsInstances.length) return false;
		var returnedInstance = undefined;
		nCore.Controls.controlsInstances.each(function(controlInstance) { if(controlInstance.name == instanceName) returnedInstance = controlInstance.control; } );
		return returnedInstance;
	},
	
	pushInstance: function(arguments)
	{
		var controlName = arguments[0];
		var instanceName = arguments[1];
		

		
		var control = nCore.Controls.get(controlName);
		
		var controlArgs = arguments;
		if(arguments.length > 3)
		{
			var controlString = "var newControl = new control.control(";
			for(var argNum = 3;argNum<controlArgs.length;argNum++) controlString += "controlArgs[" + argNum + "],";
			controlString = controlString.substr(0,controlString.length-1) + ");";
			eval(controlString);
		}
		else var newControl = new control.control();
		
		var newInstance = {name: instanceName, control: newControl};
		
		nCore.Controls.controlsInstances.push(newInstance);
		return newInstance;
	},
	
	delInstance: function(instanceName)
	{
		var instance = nCore.Controls.getInstance(instanceName);
		if(instance === false) return;
		if(Object.isUndefined(instance)) return;
		
		if(!Object.isUndefined(instance.deleteControl))
			if(Object.isFunction(instance.deleteControl))
				instance.deleteControl();
		
		var x = 0;
		for(x=0;x<nCore.Controls.controlsInstances.length;x++) if(nCore.Controls.controlsInstances[x].name == instanceName) nCore.Controls.controlsInstances.splice(x,1);
		return instance;
	},
	
	registerUnObtrusiveControl: function(controlInstances)
	{
		if(Object.isUndefined(controlInstances)) return;
		if(!Object.isArray(controlInstances)) controlInstances = [controlInstances];
		if(!controlInstances.length) return;
		
		//load up all instances
		if(nCore.Controls.unObtrusiveDone !== true) controlInstances.each(function(element){ nCore.Controls.unObtrusiveRegisters.push(element); });
		
		if(nCore.Controls.unObtrusiveDone === false) if(nCore.DOM_LOADED) nCore.Controls.unObtrusiveDone = true;

		if(nCore.Controls.unObtrusiveDone === true)
		{
			nCore.Controls.unObtrusiveRegisters = new Array();
			controlInstances.each(function(element){ nCore.Controls.unObtrusiveRegisters.push(element); });
			nCore.Controls.doUnObtrusiveControls();
		}
	},
	
	doUnObtrusiveControls: function()
	{
		if(!nCore.Controls.unObtrusiveRegisters.length)
		{
			nCore.Controls.unObtrusiveDone = true;
			return;
		}
		
		nCore.Controls.unObtrusiveRegisters.each(function(register)
		{
			var elements = $$(register.selector);
			if(!elements.length) return;
			elements.each(function(element)
			{
				$(element);
				var registerElement = true;
				if(!Object.isUndefined(this.attributes)) for(var X in this.attributes) if(element.readAttribute(X) !== eval("this.attributes." + X)) registerElement = false;
				
				var overrideOldInstance = false;
				if(!Object.isUndefined(this.overrideOldInstance)) overrideOldInstance = this.overrideOldInstance;

				if(registerElement)
				{
					if(!Object.isUndefined(this.constructorOptions)) if(this.constructorOptions.length)
					{
						var controlString = "nCore.Controls.newInstance(this.control,element.identify(),overrideOldInstance,";
						for(var argNum = 0;argNum<this.constructorOptions.length;argNum++)
						{
							var addUp = "this.constructorOptions[" + argNum + "],";
							if(Object.isString(this.constructorOptions[argNum])) if(this.constructorOptions[argNum].match(/#\{element\}/))
							{
								addUp = this.constructorOptions[argNum].replace(/#\{element\}/,"element,");
							}
							
							controlString += addUp;
						}
						controlString = controlString.substr(0,controlString.length-1) + ");";
						eval(controlString);
					}
					else var newControl = new control.control();
				}
			}.bind(register));
		});
		
		nCore.Controls.unObtrusiveDone = true;
	}
}

nCore.Element = {
	
	getForm: function(element)
	{
		var _form = false;
		var ancestors = element.ancestors();
		if(ancestors.length) ancestors.each(function(ancestor){ if(ancestor.nodeName.toLowerCase() == "form") _form = ancestor;});
		return _form;
	}
	
}










document.observe("dom:loaded", function()
{
	nCore.DOM_LOADED = true;
	nCore.Browser.install();
	nCore.Controls.doUnObtrusiveControls();
});