﻿Array.prototype.addUnique = function(element) {
    for (var i = 0; i < this.length; i++)
        if (this[i] == element) return;
    this.add(element);
};

Array.prototype.getIndex = function(item) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] === item)
            return i;
    }

    return -1;
};

Array.prototype.sortBy = function(f) {
    this.sort(function(a, b) { return f(a) < f(b) ? -1 : f(b) < f(a) ? 1 : 0; });
    return this;
};

Array.prototype.contains = function(item) {
    return this.getIndex(item) != -1;
};

Array.prototype.removeAt = function(index) {
    this.splice(index, 1);
};

Array.prototype.insertAt = function(item, index) {
    this.splice(index, 0, item);
};

Array.prototype.remove = function(item) {
    var index = this.getIndex(item);

    if (index !== -1)
        this.removeAt(index);
};

Array.prototype.insertBefore = function(item, otherItem) {
    var index = this.getIndex(otherItem);

    if (index === -1)
        this.push(item);
    else {
        this.insertAt(item, index);
    }
};

Array.prototype.insertAfter = function(item, otherItem) {
    var index = this.getIndex(otherItem);

    if (index === -1)
        this.push(item);
    else {
        this.insertAt(item, index + 1);
    }
};

Array.prototype.find = function(f) {
    for (var i = 0; i < this.length; i++) {
        if (f(this[i]))
            return this[i];
    }
};

Array.prototype.findAll = function(f) {
    var result = [];

    for (var i = 0; i < this.length; i++) {
        if (f(this[i]))
            result.push(this[i]);
    }

    return result;
};

Array.prototype.map = function(f) {
    var array = [];

    for (var i = 0; i < this.length; i++)
        array[i] = f(this[i]);

    return array;
};

Array.prototype.hasStdExtensions = true;

var CssHelper = function() {

    var resolve = function(element) { return (typeof (element) == "string") ? document.getElementById(element) : element; }

    var getWidthAdjustment = function(element) {
        var style = (window.getComputedStyle) ? document.defaultView.getComputedStyle(element, "") : element.currentStyle;

        return parseInt(style.paddingLeft) + parseInt(style.paddingRight) +
			((style.borderLeftStyle == "none") ? 0 : parseInt(style.borderLeftWidth)) +
			((style.borderRightStyle == "none") ? 0 : parseInt(style.borderRightWidth));
    };

    var getHeightAdjustment = function(element) {
        var style = (window.getComputedStyle) ? document.defaultView.getComputedStyle(element, "") : element.currentStyle;

        return parseInt(style.paddingTop) + parseInt(style.paddingBottom) +
			((style.borderTopStyle == "none") ? 0 : parseInt(style.borderTopWidth)) +
			((style.borderBottomStyle == "none") ? 0 : parseInt(style.borderBottomWidth));
    };

    return {
        forElement: function(element) {
            element = resolve(element);

            var x = {
                setTop: function(top) {
                    element.style.top = top + "px";
                    return x;
                },

                setLeft: function(left) {
                    element.style.left = left + "px";
                    return x;
                },

                setWidth: function(width) {
                    element.style.width = Math.max(0, width - getWidthAdjustment(element)) + "px";
                    return x;
                },

                setHeight: function(height) {
                    element.style.height = Math.max(0, height - getHeightAdjustment(element)) + "px";
                    return x;
                }
            };

            return x;
        }
    }
} ();

var QueryString = function() {
    var params = [];
    var qs = location.search.substring(1, location.search.length);

    if (qs.length > 0) {
        qs = qs.replace(/\+/g, ' ');
        var args = qs.split('&');

        for (var i = 0; i < args.length; i++) {
            var pair = args[i].split('=');
            var name = decodeURIComponent(pair[0]);
            var value = (pair.length == 2) ? decodeURIComponent(pair[1]) : name;

            params.push({ name: name, value: value });
            params[name] = value;
        }
    }

    return params;
} ();

var TextValidator = {
    isNullOrEmpty: function(str) { return true },
    isNumber: function(str) { return true },
    isInteger: function(str) { return true }
};

var FormUtility = function() {
    var readForm = function(form) {
        var data = {};

        for (var i = 0; i < form.length; i++) {
            var formitem = form[i];

            if (formitem.type == "text" || formitem.type == "hidden" || formitem.tagName == "TEXTAREA") {
                data[formitem.name] = formitem.value;
            }
            else if (formitem.tagName == "SELECT") {
                if (formitem.multiple) {
                    data[formitem.name] = {};

                    for (var j = 0; j < formitem.options.length; j++)
                        data[formitem.name][formitem.options[j].value] = formitem.options[j].selected;
                }
                else {
                    data[formitem.name] = formitem.options[formitem.selectedIndex].value;
                }
            }
            else if (formitem.type == "radio") {
                if (formitem.checked)
                    data[formitem.name] = formitem.value;
                else if (data[formitem.name] == null)
                    data[formitem.name] = "";
            }
            else if (formitem.type == "checkbox") {
                if (!form[formitem.name].tagName) // More than one checkbox with the same name
                {
                    if (data[formitem.name] == null) {
                        data[formitem.name] = {};

                        var formitems = form[formitem.name];

                        for (var j = 0; j < formitems.length; j++)
                            data[formitem.name][formitems[j].value] = formitems[j].checked;
                    }
                }
                else {
                    data[formitem.name] = formitem.checked;
                }
            }
        }

        return data;
    };

    var populateForm = function(form, data) {
        for (var item in data) {
            var formitem = form[item];

            if (formitem == null) {
                // Skip this item...
                break;
            }
            if (!formitem.tagName) // It's a list of form items.
            {
                if (formitem[0].type == "radio") {
                    for (var i = 0; i < formitem.length; i++)
                        formitem[i].checked = (formitem[i].value == data[item]);
                }
                else if (formitem[0].type == "checkbox") {
                    for (var i = 0; i < formitem.length; i++)
                        formitem[i].checked = data[item][formitem[i].value];
                }
            }
            else if (formitem.tagName == "SELECT") {
                if (formitem.multiple) {
                    for (var i = 0; i < formitem.options.length; i++) {
                        formitem.options[i].selected = data[item][formitem.options[i].value];
                    }
                }
                else {
                    for (var i = 0; i < formitem.options.length; i++) {
                        if (formitem.options[i].value == data[item].toString())
                            formitem.selectedIndex = i;
                    }
                }
            }
            else if (formitem.type == "text" || formitem.type == "hidden" || formitem.tagName == "TEXTAREA") {
                formitem.value = data[item].toString();
            }
            else if (formitem.type == "checkbox") {
                formitem.checked = data[item];
            }
        }
    };

    return {
        readForm: readForm,
        populateForm: populateForm
    };
} ();


var DateFormatter = function() {
    var days = ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"];
    var months = ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"];

    var formatLong = function(date) {
        date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate()
        var minutes = date.getMinutes();
        minutes = (minutes < 10) ? "0" + minutes : minutes.toString();
        return days[date.getDay()] + ", " + date.getDate() + " " + months[date.getMonth()] + " " + date.getFullYear() + " - " + date.getHours() + ":" + minutes;
    };

    return {
        formatLong: formatLong
    };
} ();

var serializeObject = function(obj) {
    if (obj == null)
        return "null";

    if (typeof (obj.toSource) == "function")
        return obj.toSource();

    var source = "";

    switch (typeof (obj)) {
        case "number": source = obj.toString(); break;
        case "string": source = "\"" + obj.split("\\").join("\\\\").split("\n").join("\\n").split("\"").join("\\\"") + "\""; break;
        case "boolean": source = obj ? "true" : "false"; break;
        case "undefined": source = "undefined"; break;
        case "function": source = "function() {...}"; break;
        case "object":
            if (obj.length && obj.splice && obj.slice && obj.push && obj.pop) {
                source = "[";
                var separator = "";

                for (var i = 0; i < obj.length; i++) {
                    source += separator + serializeObject(obj[i]);
                    separator = ", ";
                }

                source += "]";
            }
            else {
                source = "{";
                var separator = "";

                for (var item in obj) {
                    source += separator + item + ": " + serializeObject(obj[item]);
                    separator = ", ";
                }

                source += "}";
            }
            break;
    }

    return source;
};


window.getSize = function() {
    var size = { width: 0, height: 0 };

    if (typeof (window.innerWidth) == 'number') {
        size.width = window.innerWidth;
        size.height = window.innerHeight;
    }
    else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
        size.width = document.documentElement.clientWidth;
        size.height = document.documentElement.clientHeight;
    }
    else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
        size.width = document.body.clientWidth;
        size.height = document.body.clientHeight;
    }

    return size;
};

// This method removes all the child nodes from a html node.
window.clearNode = function(node) {
    while (node.hasChildNodes())
        node.removeChild(node.firstChild);
};

window.setText = function(node, text) {
    window.clearNode(node);
    node.appendChild(document.createTextNode(text));
};

window.createFrame = function(url) {
    // This function should return an <object> element, with the following properties:
    // obj.type = "text/html";
    // obj.data = url;
    // However, since iframes still work, and IE7 has some problems with <object> elements, we still use iframes here...

    var frame = document.createElement("iframe");
    frame.frameBorder = 0;
    frame.scrolling = "no";
    frame.src = url;
    frame.gotoUrl = function(newUrl) { frame.src = newUrl };
    return frame;
};