/**
*
* Breadcrumbs-ie
*
*/
(function () {
    var ol = document.getElementById("crumbs");
    if (ol) {
        var li = ol.getElementsByTagName("li");
        for (var i = 0; i < li.length; ++i) {
            li[i].insertBefore(document.createTextNode((i === 0 ? "Du är här: " : "» ")), li[i].firstChild);
        }
    }
})();

/**
 * Core JavaScript library for Bolagsverket
 * @author Tommy Olsson
 * @version 2.1
 */

// $()
function $(element) {
    if (typeof element == "string") element = document.getElementById(element);
    return element;
}


// Core object
var Core = {
    Cookie:     {
                    get:        function (name) {
                                    var re = new RegExp("^\\s*" + name + "=");
                                    var c = document.cookie.split(";");
                                    for (var i in c) {
                                        if (re.test(c[i])) {
                                            return unescape(c[i].substring(c[i].indexOf("=") + 1));
                                        }
                                    }
                                    return null;
                                },
                    remove:     function (name, path) {
                                    if (this.get(name) !== null) {
                                        document.cookie = name + "=" +
                                                          (path ? ";path=" + path : "") +
                                                          ";expires=Thu, 01-Jan-1970 00:00:01 GMT";
                                    }
                                },
                    set:        function (name, value, expireDays, path) {
                                    var expDate, now = new Date();
                                    if (expireDays) {
                                        expDate = new Date(now.getTime() + expireDays * 1000 * 60 * 60 * 24);
                                    }
                                    document.cookie = name + "=" + escape(value) +
                                                      (expireDays ? ";expires=" + expDate.toGMTString() : "") +
                                                      (path ? ";path=" + path : "");
                                }
                },

    Events:     (function () {
                    if (document.addEventListener) {
                        return {
                            target:             function (e) {return e.target},
                            which:              function (e) {return e.which},
                            addListener:        function (element, eventName, listener) {
                                                    $(element).addEventListener(eventName, listener, false);
                                                },
                            removeListener:     function (element, eventName, listener) {
                                                    $(element).removeEventListener(eventName, listener, false);
                                                },
                            stop:               function (e) {
                                                    e.preventDefault();
                                                    e.stopPropagation();
                                                }
                        };
                    } else if (document.attachEvent) {
                        var listenerCounter = 0;

                        var findListener = function (element, eventName, listener) {
                            var listeners = element._listeners;
                            if (!listeners) return -1;
                            var targetDocument = element.document || element;
                            var targetWindow   = targetDocument.parentWindow;
                            for (var i = listeners.length - 1; i >= 0; --i) {
                                var listenerId     = listeners[i];
                                var listenerRecord = targetWindow._allListeners[listenerId];
                                if (listenerRecord.eventName == eventName && listenerRecord.listener == listener) return i;
                            }
                            return -1;
                        };

                        var removeAllListeners = function () {
                            var targetWindow = this;
                            for (id in targetWindow._allListeners) {
                                var listenerRecord = targetWindow._allListeners[id];
                                listenerRecord.element.detachEvent("on" + listenerRecord.eventName, listenerRecord.listener2);
                                delete targetWindow._allListeners[id];
                            }
                        };

                        return {
                            target:             function (e) {return e.srcElement},
                            which:              function (e) {return e.keyCode},
                            addListener:        function (element, eventName, listener) {
                                                    element = $(element);
                                                    if (findListener(element, eventName, listener) != -1) return;
                                                    var listener2 = function() {
                                                        var e = window.event;
                                                        if (Function.prototype.call) {
                                                            listener.call(element, e);
                                                        } else {
                                                            element._currentListener = listener;
                                                            element._currentListener(e);
                                                            element._currentListener = null;
                                                        }
                                                    };
                                                    element.attachEvent("on" + eventName, listener2);
                                                    var listenerRecord = {
                                                        element:   element,
                                                        eventName: eventName,
                                                        listener:  listener,
                                                        listener2: listener2
                                                    };
                                                    var targetDocument = element.document || element;
                                                    var targetWindow   = targetDocument.parentWindow;
                                                    var listenerId     = "l" + listenerCounter++;
                                                    if (!targetWindow._allListeners) targetWindow._allListeners = {};
                                                    targetWindow._allListeners[listenerId] = listenerRecord;
                                                    if (!element._listeners) element._listeners = [];
                                                    element._listeners[element._listeners.length] = listenerId;
                                                    if (!targetWindow._unloadListenersAdded) {
                                                        targetWindow._unloadListenersAdded = true;
                                                        targetWindow.attachEvent("onunload", removeAllListeners);
                                                    }
                                                },
                            removeListener:     function (element, eventName, listener) {
                                                    element = $(element);
                                                    var listenerIndex = findListener(element, eventName, listener);
                                                    if (listenerIndex == -1) return;
                                                    var targetDocument = element.document || element;
                                                    var targetWindow   = targetDocument.parentWindow;
                                                    var listenerId     = element._listeners[listenerIndex];
                                                    var listenerRecord = targetWindow._allListeners[listenerId];
                                                    element.detachEvent("on" + eventName, listenerRecord.listener2);
                                                    element._listeners.splice(listenerIndex, 1);
                                                    delete targetWindow._allListeners[listenerId];
                                                },
                            stop:               function (e) {
                                                    e.returnValue  = false;
                                                    e.cancelBubble = true;
                                                }
                    };
             }
         })(),

    Element:    {
                    ancestor:                   function (element, tagName) {
                                                    var p;
                                                    tagName = tagName.toLowerCase();
                                                    for (p = $(element).parentNode; p && p.nodeName.toLowerCase() != tagName; p = p.parentNode) ;
                                                    return p;
                                                },
                    first:                      function (element, tagName) {
                                                    var c;
                                                    tagName = tagName.toLowerCase();
                                                    for (c = $(element).firstChild; c; c = c.nextSibling)
                                                        if (c.nodeType == 1 && (tagName == "*" || c.nodeName.toLowerCase() == tagName)) break;
                                                    return c;
                                                },
                    previous:                   function (element, tagName) {
                                                    var s;
                                                    tagName = tagName.toLowerCase();
                                                    for (s = $(element).previousSibling; s; s = s.previousSibling)
                                                        if (s.nodeType == 1 && (tagName == "*" || s.nodeName.toLowerCase() == tagName)) break;
                                                    return s;
                                                },
                    next:                       function (element, tagName) {
                                                    var s;
                                                    tagName = tagName.toLowerCase();
                                                    for (s = $(element).nextSibling; s; s = s.nextSibling)
                                                        if (s.nodeType == 1 && (tagName == "*" || s.nodeName.toLowerCase() == tagName)) break;
                                                    return s;
                                                },
                    last:                       function (element, tagName) {
                                                    var c;
                                                    tagName = tagName.toLowerCase();
                                                    for (c = $(element).lastChild; c; c = c.previousSibling)
                                                        if (c.nodeType == 1 && (tagName == "*" || c.nodeName.toLowerCase() == tagName)) break;
                                                    return c;
                                                },
                    hide:                       function () {
                                                    for (var i = 0, l = arguments.length; i < l; ++i) {
                                                        var element = $(arguments[i]);
                                                        element.style.display = 'none';
                                                    }
                                                },
                    show:                       function () {
                                                    for (var i = 0, l = arguments.length; i < l; ++i) {
                                                        var element = $(arguments[i]);
                                                        element.style.display = '';
                                                    }
                                                },
                    toggle:                     function () {
                                                    for (var i = 0, l = arguments.length; i < l; ++i) {
                                                        var element = $(arguments[i]);
                                                        Core.Element[$(element).style.display != 'none' ? 'hide' : 'show'](element);
                                                    }
                                                },
                    remove:                     function (element) {
                                                    element = $(element);
                                                    element.parentNode.removeChild(element);
                                                },
                    hasClass:                   function (element, aClass) {
                                                    var pattern = new RegExp("(^|\\s)" + aClass + "(\\s|$)");
                                                    return pattern.test($(element).className);
                                                },
                    addClass:                   function (element, aClass) {
                                                    element = $(element);
                                                    if (!Core.Element.hasClass(element, aClass)) {
                                                        if (element.className == "") {
                                                            element.className = aClass;
                                                        } else {
                                                            element.className += " " + aClass;
                                                        }
                                                    }
                                                },
                    removeClass:                function (element, aClass) {
                                                    var pattern = new RegExp("(^|\\s)" + aClass + "(\\s|$)");
                                                    element = $(element);
                                                    element.className = element.className.replace(pattern, "$1");
                                                    element.className = element.className.replace(/\\s$/, "");
                                                },
                    getElementsByClass:         function (element, aClass) {
                                                    var allElements     = $(element).getElementsByTagName("*");
                                                    var matchedElements = [];
                                                    var pattern         = new RegExp("(^|\\s)" + aClass + "(\\s|$)");
                                                    for (var i = 0, l = allElements.length; i < l; ++i) {
                                                        if (pattern.test(allElements[i].className)) {
                                                            matchedElements[matchedElements.length] = allElements[i];
                                                        }
                                                    }
                                                    return matchedElements;
                                                },
                    isEmpty:                    function (element) {
                                                    return $(element).innerHTML.match(/^\s*$/);
                                                },
                    getComputedStyle:           function (element, styleProperty) {
                                                    var computedStyle = null;
                                                    element = $(element);
                                                    if (typeof element.currentStyle != "undefined") {
                                                        computedStyle = element.currentStyle;
                                                    } else if (document.defaultView && document.defaultView.getComputedStyle) {
                                                        computedStyle = document.defaultView.getComputedStyle(element, null);
                                                    } else {
                                                        return null;
                                                    }
                                                    return computedStyle[styleProperty];
                                                },
                    getStyle:                   function (element, styleProperty) {
                                                    element = $(element);
                                                    var value = element.style[styleProperty];
                                                    if (!value) value = Core.Element.getComputedStyle(element, styleProperty);
                                                    switch (styleProperty) {
                                                    case "top":
                                                    case "right":
                                                    case "bottom":
                                                    case "left":
                                                        if (Core.Element.getStyle(element, 'position') == 'static') value = 'auto';
                                                        break;
                                                    }
                                                    return value == 'auto' ? null : value;
                                                },
                    setStyle:                   function (element, styles) {
                                                    element = $(element);
                                                    for (name in styles) {
                                                        element.style[name] = styles[name];
                                                    }
                                                },
                    Builder:                    {
                                                    create:     function (tag, attrs, children) {
                                                                    var append = function (element, child) {
                                                                        element.appendChild(typeof child == "string" ? document.createTextNode(child) : child);
                                                                    };
                                                                    var element = document.createElement(tag);
                                                                    for (var attr in attrs) {
                                                                        element[attr] = attrs[attr];
                                                                    }
                                                                    if (children) {
                                                                        if (children instanceof Array) {
                                                                            for (var i = 0, l = children.length; i < l; ++i) {
                                                                                append(element, children[i]);
                                                                            }
                                                                        } else {
                                                                            append(element, children);
                                                                        }
                                                                    }
                                                                    return element;
                                                                }
                                                }
                },

    run:        function (runnable) {
                    var initOnce = function () {
                        if (arguments.callee.done) return;
                        arguments.callee.done = true;
                        runnable.init();
                    };
                    Core.Events.addListener(document, "DOMContentLoaded", initOnce);
                    Core.Events.addListener(window,   "load",             initOnce);
                }
};


// document.getElementsByClass()
document.getElementsByClass = function (aClass) {
    return Core.Element.getElementsByClass(document, aClass);
};


// Element creation functions: $a() ... $var()
(function () {
    var tags = ["a", "abbr", "acronym", "address", "area", "b", "base", "bdo", "big", "blockquote", "br", "button", "caption", "cite", "code", "col", "colgroup",
                "dd", "del", "dfn", "div", "dl", "dt", "em", "fieldset", "form", "h1", "h2", "h3", "h4", "h5", "h6", "hr", "i", "img", "input", "ins", "kbd",
                "label", "legend", "li", "link", "map", "meta", "object", "ol", "optgroup", "option", "p", "param", "pre", "q", "samp", "script", "select",
                "small", "span", "strong", "style", "sub", "sup", "table", "tbody", "td", "textarea", "tfoot", "th", "thead", "tr", "ul", "var"];
    for (var i =0, l = tags.length; i < l; ++i) {
        window["$" + tags[i]] = (function (tag) {
            return function (attrs, children) {
                if (arguments.length == 1 && (typeof attrs != "object" || attrs instanceof Array || attrs.nodeName)) {
                    children = attrs;
                    attrs = {};
                }
                return Core.Element.Builder.create(tag, attrs, children);
            };
        })(tags[i]);
    }
})();

/**
*
* FAQ
*
*/
(function () {
    var FAQ = {
        init:           function () {
                            var dl = $("faq");
                            if (dl) {
                                var dt = dl.getElementsByTagName("dt");
                                for (var i = 0; i < dt.length; ++i) {
                                    var a = $a({href:"#"});
                                    while (dt[i].hasChildNodes()) {
                                        a.appendChild(dt[i].firstChild);
                                    }
                                    dt[i].appendChild(a);
                                    a.onclick = function () {
                                        FAQ.toggle(this.parentNode);
                                        return false;
                                    };
                                }
                            }
                        },

        toggle:         function (dt) {
                            var dd = Core.Element.next(dt, "dd");
                            if (Core.Element.hasClass(dt, "expanded")) {
                                if (dd) {
                                    dd.style.display = "";
                                }
                                dt.className = "";
                            } else {
                                if (dd) {
                                    dd.style.display = "block";
                                }
                                dt.className = "expanded";
                            }
                        }
    };

    FAQ.init();
})();

/**
*
* Links
*
*/
(function () {
    var Links = {
        init:           function () {
                            var links = document.getElementsByTagName("a");
                            for (var i = 0, n = links.length; i < n; ++i) {
                                if (/(^|\s)(vl-example|vl-read-more)(\s|$)/.test(links[i].className)) {
                                    links[i].onclick = Links.toggle;
                                }
                            }
                        },

        toggle:         function () {
                            if (/($|\s)vl-expanded(\s|$)/.test(this.className)) {
                                this.className = this.className.replace(/($|\s)vl-expanded(\s|$)/, "$1");
                                this.className = this.className.replace(/\s$/, "");
                            } else {
                                if (this.className == "") {
                                    this.className = "vl-expanded";
                                } else {
                                    this.className += " vl-expanded";
                                }
                            }
                            return false;
                        }
    };

    if (document.getElementsByTagName) {
        Links.init();
    }
})();

/**
*
* Nav
*
*/
(function () {
    var Nav = {
        items:          [
                            ["Start", "index"],
                            ["Övergripande krav", "anv_krav"],
                            ["Tillgänglighet", "anv_riktlinjer"],
                            ["Interaktionsflöden", "interaktionsfloden"],
                            ["Global CSS", "designelement",
                                [["Flikar", "des_flikar"],
                                 ["Format, in- och utdata", "des_format"],
                                 ["Formulär", "des_formular"],
                                 ["Obligatoriska fält", "des_obligatoriska-falt"],
                                 ["Färger", "des_farger"],
                                 ["Guider, stegsekvens", "des_guider"],
                                 ["Ikoner", "des_ikoner"],
                                 ["Listor", "des_listor"],
                                 ["Länkar", "des_lankar"],
                                 ["Meddelanden", "des_meddelanden"],
                                 ["Felsidor", "des_felsidor"],
                                 ["Tabeller", "des_tabeller"],
                                 ["Text och typografi", "des_text"],
                                 ["Diverse", "des_diverse"]]
                            ],
                            ["FAQ", "anv_faq"],
                            ["Hänvisningar", "hanvisningar"],
                            ["Verktygslådans förvaltning", "forvaltning"]
                        ],

        addItem:        function (parent, item) {
                            var li = $li();
                            var a = $a({href: item[1] + ".html"}, item[0]);
                            li.appendChild(a);
                            var re = new RegExp(item[1] + "\\.html$");
                            var uri = document.location.href;
                            if (/\/$/.test(uri)) {
                                uri += "index.html";
                            }
                            var isOpen = re.test(uri);
                            if (isOpen) {
                                li.id = "current";
                            }
                            if (item.length > 2) {
                                a.className = "collapsed";
                                var ul = $ul();
                                for (var i = 0, n = item[2].length; i < n; ++i) {
                                    if (this.addItem(ul, item[2][i])) {
                                        isOpen = true;
                                    }
                                    if (isOpen) {
                                        ul.className = "open";
                                        a.className = "expanded";
                                    }
                                }
                                li.appendChild(ul);
                            }
                            parent.appendChild(li);
                            return isOpen;
                        },

        create:         function (parent) {
                            if (parent) {
                                var ul = $ul();
                                for (var i = 0, n = this.items.length; i < n; ++i) {
                                    this.addItem(ul, this.items[i]);
                                }
                                parent.appendChild(ul);
                            }
                        }
    };

    Nav.create($("nav"));

    var hdr = $("header");
    if (hdr) {
        hdr.appendChild($span("1.0"));
    }
})();


/**
*
* Popup
*
*/
(function () {
    var listen;

    if (document.addEventListener) {
        listen = function (element, eventName, listener) {
            element.addEventListener(eventName, listener, false);
        };
    } else if (document.attachEvent) {
        listen = function (element, eventName, listener) {
            element.attachEvent("on" + eventName, function () {
                return listener.call(element, window.event);
            });
        };
    }

    var Popup = {
        init:   function () {
                    if (document.getElementsByTagName) {
                        var links = document.getElementsByTagName("a");
                        for (var i = 0, n = links.length; i < n; ++i) {
                            if (/(^|\s)vl-popup(\s|$)/.test(links[i].className)) {
                                listen(links[i], "click", Popup.open);
                                links[i].appendChild(document.createTextNode(" (öppnas i nytt fönster)"));
                            }
                        }
                    }
                },

        open:   function (e) {
                    if (window.open(this.href, "")) {
                        if (e.preventDefault) {
                            e.preventDefault();
                            e.stopPropagation();
                        } else if (window.event) {
                            window.event.returnValue = false;
                            window.event.cancelBubble = true;
                        }
                    }
                }
    };

    Popup.init();
})();

/**
*
* Show-source
*
*/
(function () {
    var SourceViewer = {
        init:           function () {
                            var e = document.getElementsByClass("show-source");
                            for (var i = 0; i < e.length; ++i) {
                                e[i].onclick = function () {SourceViewer.show(this);};
                            }
                        },

        show:           function (node) {
                            var viewer = this.getViewer(node.parentNode);
                            viewer.lastChild.innerHTML = "";
                            viewer.lastChild.appendChild(document.createTextNode(node.innerHTML));
                            viewer.style.display = "block";
                        },

        getViewer:      function (node) {
                            if (typeof node.sourceViewer === "undefined") {
                                node.sourceViewer = $div({className:"source-view"}, [$p(), $div()]);
                                var a = $a({href:"#"}, $img({src:"img/close.png", alt:"Stäng", title:"Stäng"}));
                                a.onclick = function () {
                                    this.parentNode.parentNode.style.display = "none";
                                    return false;
                                };
                                node.sourceViewer.firstChild.appendChild(a);
                                node.appendChild(node.sourceViewer);
                            }
                            return node.sourceViewer;
                        }
    };

    SourceViewer.init();
})();


/**
* 
* Tabs
*
*/
(function () {
    var Tabs = {
        init:           function () {
                            var div = $("tabs");
                            if (div) {
                                var links = div.getElementsByTagName("a");
                                for (var i = 0; i < links.length; ++i) {
                                    links[i].onclick = function () {
                                        Tabs.setCurrent(this);
                                        Tabs.showSource();
                                        return false;
                                    };
                                }
                                Tabs.showSource();
                            }
                        },

        setCurrent:     function (link) {
                            var div = $("tabs");
                            var li = div.getElementsByTagName("li");
                            for (var i = 0; i < li.length; ++i) {
                                li[i].removeAttribute("class");
                                li[i].removeAttribute("className");
                            }
                            link.parentNode.parentNode.className = "current";
                            link.blur();
                        },

        showSource:     function () {
                            var src = $("src");
                            if (src) {
                                src.replaceChild(document.createTextNode($("tabs").innerHTML), src.firstChild);
                            }
                        }
    };

    Tabs.init();
})();


/**
*
* Toggle-form
*
*/
var VLForm = {
    toggle:     function (id) {
                    var div = document.getElementById(id);
                    if (div) {
                        div.className = (div.className === "vl-columnar" ? "" : "vl-columnar");
                    }
                    return false;
                }
};