window.OnDomLoaded = Class.create();
window.OnDomLoaded.prototype = {
    initialize : function()
    {
        if (!document.onDomLoadedCallbacks) {
            document.onDomLoadedCallbacks = [];

            var script;

            if (document.addEventListener) {
                document.addEventListener('DOMContentLoaded', this.doOnLoad, false);
            }
            else if (null != $('init_js')) {
                script = $('init_js');
                var self = this;
                script.onreadystatechange = function() {
                    if ('complete' == this.readyState) {
                        self.doOnLoad();
                    }
                };

                script.onreadystatechange();
                script = null;
            }
            else {
                script = document.createElement('script');
                script.setAttribute('defer', true);
                script.setAttribute('src', "javascript:'window.OnDomLoaded.doOnLoad();'");
                $$('head')[0].appendChild(script);
            }

            Event.observe(window, 'load', this.doOnLoad);
        }
    },

    register : function(callback)
    {
        document.onDomLoadedCallbacks.push(callback);
    },

    doOnLoad : function()
    {
        if (arguments.callee.done) {
            return;
        }

        arguments.callee.done = true;

        $A(document.onDomLoadedCallbacks).each(
            function(callback)
            {
                try {
                    callback();
                }
                catch (e) {
                    alert(e);
                }
            }
        );

        document.onDomLoadedCallbacks = [];
    }
};

var odl = new window.OnDomLoaded();
