﻿function Delegate(f) {
    this.func = f;
}
Delegate.prototype.func = function() { }
Delegate.create = function(obj, func) {
    var f = function() {
        var target = arguments.callee.target;
        var func = arguments.callee.func;
        return func.apply(target, arguments);
    };

    f.target = obj;
    f.func = func;

    return f;
}

Delegate.prototype.createDelegate = function(obj) {
    return create(obj, func);
}

function createCookie(name, value, days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        var expires = "; expires=" + date.toGMTString();
    }
    else var expires = "";
    document.cookie = name + "=" + value + expires + "; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name, "", -1);
}

Unshift = function() { };
Unshift.eventListeners = new Array();
Unshift.addEventListener = function(eventName, target, functionToExecute) {
    //if the event already exists, replace it
    for (var i = 0; i < Unshift.eventListeners.length; i++) {
        if (Unshift.eventListeners[i].name == eventName && Unshift.eventListeners[i].target == target && Unshift.eventListeners[i].functionToExecute == functionToExecute) {
            return;
        }
    }

    Unshift.eventListeners.push(new Unshift.EventListener(eventName, target, functionToExecute));
}
Unshift.removeEventListener = function(eventName, target, functionToExecute) {
    for (var i = 0; i < Unshift.eventListeners.length; i++) {
        if (Unshift.eventListeners[i].name == eventName && Unshift.eventListeners[i].target == target && Unshift.eventListeners[i].functionToExecute == functionToExecute) {
            Unshift.addEventListener.splice(i, 1);
        }
    }
}
Unshift.dispatchEvent = function(eventName, target) {
    for (var i = 0; i < Unshift.eventListeners.length; i++) {
        if (Unshift.eventListeners[i].name == eventName && Unshift.eventListeners[i].target == target) {
            var event = new Unshift.Event(eventName, target);
            var delegate = Delegate.create(target, Unshift.eventListeners[i].functionToExecute);
            delegate(event);
        }
    }
}

Unshift.Event = function(eventName, target) {
    this.name = eventName;
    this.target = target;
};
Unshift.Event.prototype.name = "";
Unshift.Event.prototype.target = null;
Unshift.Event.prototype.getTarget = function() { return this.target };
Unshift.Event.prototype.setTarget = function(value) { this.target = value };

Unshift.EventListener = function(eventName, target, functionToExecute) {
    this.event = new Unshift.Event(eventName, target);
    this.functionToExecute = functionToExecute;
}
Unshift.EventListener.prototype.event = null;
Unshift.EventListener.prototype.functionToExecute = null;