function addEvent( obj, type, fn ) {
		if (obj.addEventListener) {
			obj.addEventListener( type, fn, false );
			EventCache.add(obj, type, fn);
		}
		else if (obj.attachEvent) {
			obj["e"+type+fn] = fn;
			obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
			obj.attachEvent( "on"+type, obj[type+fn] );
			EventCache.add(obj, type, fn);
		}
		else {
			obj["on"+type] = obj["e"+type+fn];
		}
	}
		
	var EventCache = function(){
		var listEvents = [];
		return {
			listEvents : listEvents,
			add : function(node, sEventName, fHandler){
				listEvents.push(arguments);
			},
			flush : function(){
				var i, item;
				for(i = listEvents.length - 1; i >= 0; i = i - 1){
					item = listEvents[i];
					if(item[0].removeEventListener){
						item[0].removeEventListener(item[1], item[2], item[3]);
					};
					if(item[1].substring(0, 2) != "on"){
						item[1] = "on" + item[1];
					};
					if(item[0].detachEvent){
						item[0].detachEvent(item[1], item[2]);
					};
					item[0][item[1]] = null;
				};
			}
		};
	}();
	
	function $() {
		var elements = new Array();
		for (var i = 0; i < arguments.length; i++) {
			var element = arguments[i];
			if (typeof element == 'string')
				element = document.getElementById(element);
			if (arguments.length == 1)
				return element;
			elements.push(element);
		}
		return elements;
	}
	
	function toggle() {
		for ( var i=0; i < arguments.length; i++ ) {
			$(arguments[i]).style.display = ($(arguments[i]).style.display != 'none' ? 'none' : '' );
		}
	}
	
	var togglers1 = {
		init : function one() {
			addEvent($('controller1'),'click',this.run);
		},
		run : function one() {
			toggle('test1','test2');
		}
	}
	
	var togglers2 = {
		init : function two() {
			addEvent($('controller2'),'click',this.run);
		},
		run : function two() {
			toggle('test3','test4');
		}
	}
	
	
	function pageLoaders() {
		togglers1.init(),
		togglers2.init();
	}
	
	addEvent(window,'unload',EventCache.flush);
	addEvent(window,'load',pageLoaders);