//dynamic script loading
var Scripts = {
    load: function(url, callback) {
        var script = document.createElement('script');
        var func = callback;
        script.setAttribute('src', url);
        script.setAttribute('type', 'text/javascript');
        document.documentElement.firstChild.appendChild(script);
        if (func) {
            var handler = Events.addListener(script, 'readystatechange', function() {
                if ((script.readyState == 'complete') || (script.readyState == 'loaded')) {
                    func();
                }
            });
            Events.addListener(script, 'load', func);
        }
        return script;
    }
};
 
var Events = {
    eventListeners: [],
    onreadyCallbacks: [],
    oncloseCallbacks: [],
    _isReady: false,
    whenReady: function(callback) {
        if (callback) {
            if (this._isReady) {
                callback();
            }
            else {
                this.onreadyCallbacks.push(callback);
            }
        }
    },
    beforeClose: function(callback) {
        if (callback) {
            this.oncloseCallbacks.push(callback);
        }
    },
    notifyReady: function() {
        _isReady = true;
        for (var i = 0; i < Events.onreadyCallbacks.length; i++) {
            Events.onreadyCallbacks[i]();
        }
    },
 
    notifyClosing: function() {
        Events.dispose();
        for (var i = 0; i < Events.oncloseCallbacks.length; i++) {
            Events.oncloseCallbacks[i]();
        }
    },
 
    addListener: function(instance, eventName, listener) {
        var listenerFn = listener;
        if (instance.addEventListener) {
            instance.addEventListener(eventName, listenerFn, false);
        }
        else {
            if (instance.attachEvent) {
                listenerFn = function() {
                    listener(window.event);
                }
                instance.attachEvent("on" + eventName, listenerFn);
            }
            else {
                throw new Error("Event registration not supported");
            }
        }
        var event = {
            instance: instance,
            name: eventName,
            listener: listenerFn
        };
        this.eventListeners.push(event);
        return event;
    },
    removeListener: function(handler) {
        var instance = handler.instance;
        if (instance.removeEventListener) {
            instance.removeEventListener(handler.name, handler.listener, false);
        }
        else {
            if (instance.detachEvent) {
                instance.detachEvent("on" + handler.name, handler.listener);
            }
        }
        for (var i = 0; i < this.eventListeners.length; i++) {
            if (this.eventListeners[i] == handler) {
                this.eventListeners.splice(i, 1);
                break;
            }
        }
    },
    dispose: function() {
        while (this.eventListeners.length > 0) {
            this.removeListener(this.eventListeners[0]);
        }
    }
 
};
 
utils = {
    loadTracker: function(callback) {
        var context = utils;
        Scripts.load('http://www.google-analytics.com/ga.js', function() {
            context.tracker = _gat._getTracker("UA-4913883-1");
            context.tracker._initData();
            context.tracker._trackPageview();
            if (callback) callback();
        });
    }
};
 
Events.whenReady(utils.loadTracker);