﻿//
// http://www.jsfromhell.com/geral/event-listener
//

if (!window.events)
{
    var events = {

        _stk : [],

        add : function(o, e, f, s)
        {
            var r = o[r = "_" + (e = "on" + e)] = o[r] || (o[e] ? [[o[e], o]] : []), a, c, d;
            r[r.length] = [f, s || o], o[e] = function(e){
                try
                {
                    (e = e || event).preventDefault || (e.preventDefault = function(){e.returnValue = false;});
                    e.stopPropagation || (e.stopPropagation = function(){e.cancelBubble = true;});
                    e.target || (e.target = e.srcElement || null);
                    e.key = (e.which + 1 || e.keyCode + 1) - 1 || 0;
                }
                catch(f){}
                for(d = 1, f = r.length; f; r[--f] && (a = r[f][0], o = r[f][1], a.call ? c = a.call(o, e) : (o._ = a, c = o._(e), o._ = null), d &= c !== false));
                return e = null, !!d;
            }
            
		    events._stk.push({'o':o, 'e':e, 'f':f, 's':s});
        },

        remove : function(o, e, f, s)
        {
            for(var i = (e = o["_on" + e] || []).length; i;)
            {
                if(e[--i] && e[i][0] == f && (s || o) == e[i][1]) return delete e[i];
            }
            return false;
        },
        
        cancel : function(e)
        {
            e.stopPropagation = true;
            e.preventDefault = true;
        },
        /*
        clean : function()
        {
            var els = (document.body||document.documentElement).getElementsByTagName("*");
            
            alert(els.length);
            
            for (var i=0; i<els.length; i++)
            {
                for(o in els[i])
                {           
                    try { delete els[i][o]; delete o; } catch(e){}
                }
                
                delete els[i];
            }
            
            delete el;
            delete o;
        },
        */
        flush : function()
        {
		    for (var i=0;i<events._stk.length; i++)
		    {
		        events.remove(events._stk[i].o, events._stk[i].e, events._stk[i].f, events._stk[i].s);
		        events._stk[i]=null;
		    }
    		
		    delete events._stk;
            //events.clean();
        }   
    };

    var DomLoaded =
    {
	    onload: [],
	    loaded: function()
	    {
		    if (arguments.callee.done) return;
		    arguments.callee.done = true;
		    for (i = 0;i < DomLoaded.onload.length;i++) DomLoaded.onload[i]();
	    },
	    load: function(fireThis)
	    {
		    this.onload.push(fireThis);
		    if (document.addEventListener) 
			    document.addEventListener("DOMContentLoaded", DomLoaded.loaded, null);
		    if (/KHTML|WebKit/i.test(navigator.userAgent))
		    { 
			    var _timer = setInterval(function()
			    {
				    if (/loaded|complete/.test(document.readyState))
				    {
					    clearInterval(_timer);
					    delete _timer;
					    DomLoaded.loaded();
				    }
			    }, 10);
		    }
		    /*@cc_on @*/
		    /*@if (@_win32)
		    var proto = "src='javascript:void(0)'";
		    if (location.protocol == "https:") proto = "src=//0";
		    document.write("<scr"+"ipt id=__ie_onload defer " + proto + "><\/scr"+"ipt>");
		    var script = document.getElementById("__ie_onload");
		    script.onreadystatechange = function() {
		        if (this.readyState == "complete") {
		            DomLoaded.loaded();
		        }
		    };
		    /*@end @*/
	       window.onload = DomLoaded.loaded;
	    }
    };
}
// ensure all events are removed onunload
//events.add(window,'unload',events.flush);