﻿///<reference path="C:\tfsroot\DGI\Main\Source\DGI\DGI\script\jquery-1.2.6-vsdoc.js" />
///<reference path="C:\tfsroot\DGI\Main\Source\DGI\DGI\script\jsCoreExtensions.js" />
//  kræver jsCoreExtensions.js
(function($) {
    $.fn.outerHTML = function() {
        /// <SUMMARY>Returnerer html fragment inklusiv elementet selv.</SUMMARY>
        if ($.browser.msie) {
            return this[0].outerHTML;
        }
        else {
            var attrStr = "";
            $(this[0].attributes).each(function(i, itm) {
                attrStr += " {0}='{1}'".format(itm.name, itm.nodeValue);
            });
            return "<{0}{2}>{1}</{0}>".format(this[0].tagName, this[0].innerHTML, attrStr);
        }
    };
    $.fn.databind = function(data, config) {
        /// <SUMMARY>Binder en array af objekter til HTML i siden</SUMMARY>
        /// <PARAM name="data" type="Array">Array of objects used as datasource for the binding</PARAM>
        if (data.isPrototypeOf(Array))
            throw new Error("$.bind: Data skal være en array af objekter.");

        config = config || { cssEven: "even", cssOdd: "odd" };
        return this.each(function() {
            // Setup
            var $container = $(this);
            if (!$container.data("bindingExpression"))
                $container.data("bindingExpression", $($container.children()[0]).outerHTML());

            var bindingExpression = $container.data("bindingExpression");

            // Workaround: Children skjules, da man her ikke længere kan kalde: $container.empty() efter jQuery 1.4.
            $container.children().hide();

            $container.show();
            // Bind
            $(data).each(function(i, itm) {
                $container.append(
                        $(bindingExpression.bind(itm))
                        .addClass(i % 2 == 0 ? config.cssEven : config.cssOdd));
            });
        });
    };
    $.fn.pager = function(data, pageChangedCallback, config) {
        config = config || { pageSize: 10, queryParam: "idx" };
        var totalRows = data.length,
            pageCount = Math.ceil(totalRows / config.pageSize);
        var query = new Query(data);

        return this.each(function(idx, element) {
            element.data = data;
            var $container = $(element);

            $container.empty();

            var startIdx = parseInt($tate.containsKey(config.queryParam) ? $tate.get(config.queryParam) : 0);
            for (var i = 0; i < pageCount; i++) {
                $link = $("<a idx='{0}'>{1}</a>".format(i, i + 1));
                $link.css("cursor", "pointer");
                if (i == startIdx)
                    $link.addClass("current");
                $link.click(function() {
                    $container.find("> a").removeClass("current");
                    $(this).addClass("current");
                    var idx = $(this).attr("idx");
                    $tate.set(config.queryParam, idx);
                    pageChangedCallback(query.limit(idx * config.pageSize, config.pageSize).toArray());
                });
                $container.append($link);
                $container.append("&nbsp; ");
            }
            pageChangedCallback(query.limit(startIdx * config.pageSize, config.pageSize).toArray());
        });
    };
})(jQuery);

var $tate = function() {
    // Private objekter
    var _dict = {};
    var _serialize = function() {
        var res = "";
        for (var key in _dict) {
            res += (res ? "|" : "") + key + "=" + _dict[key];
        }
        return res;
    };
    var _deserialize = function(data) {
        var items = data.split(/[|#]/g);
        for (var i = 0, l = items.length; i < l; i++) {
            if (!items[i])
                continue;
            var kevValue = items[i].split('=');
            if (kevValue.length < 2)
                continue;
            _dict[kevValue[0]] = kevValue[1];
        }
    };
    var _save = function() {
        location.hash = _serialize();
    };

    // Initialicering
    $(document).ready(function() {
        _deserialize(location.hash);
        for (var key in _dict) {
            $("#" + key).val(_dict[key]);
        }
    });

    // Public / offentlige objekter
    return {
        set: function(key, value) {
            _dict[key] = value;
            _save();
        },
        get: function(key) {
            if (typeof (_dict[key]) == "undefined")
                throw new Error("Ingen state med nøglen: " + key);
            return _dict[key];
        },
        containsKey: function(key) {
            return (typeof (_dict[key]) != "undefined")
        },
        hookup: function(id) {
            $(id).change(function() {
                var $caller = $(this);
                $tate.set($caller.attr("id"), $caller.val());
            });
        },
        clear: function() { //virker ikke i Firefox. Trigger et reload af siden. PLUND
            _dict = {};
            _save();
        }
    };
} ();

