// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function (mod) {
    if (typeof exports == "object" && typeof module == "object") // CommonJS
        mod(require("../../lib/codemirror"));
    else if (typeof define == "function" && define.amd) // AMD
        define(["../../lib/codemirror"], mod);
    else // Plain browser env
        mod(CodeMirror);
})(function (CodeMirror) {
    "use strict";

    CodeMirror.defineOption("rulers", false, function (cm, val, old) {
        if (old && old != CodeMirror.Init) {
            clearRulers(cm);
            cm.off("refresh", refreshRulers);
        }
        if (val && val.length) {
            setRulers(cm);
            cm.on("refresh", refreshRulers);
        }
    });

    function clearRulers(cm) {
        for (var i = cm.display.lineSpace.childNodes.length - 1; i >= 0; i--) {
            var node = cm.display.lineSpace.childNodes[i];
            if (/(^|\s)CodeMirror-ruler($|\s)/.test(node.className))
                node.parentNode.removeChild(node);
        }
    }

    function setRulers(cm) {
        var val = cm.getOption("rulers");
        var cw = cm.defaultCharWidth();
        var left = cm.charCoords(CodeMirror.Pos(cm.firstLine(), 0), "div").left;
        var minH = cm.display.scroller.offsetHeight + 30;
        for (var i = 0; i < val.length; i++) {
            var elt = document.createElement("div");
            elt.className = "CodeMirror-ruler";
            var col, cls = null, conf = val[i];
            if (typeof conf == "number") {
                col = conf;
            } else {
                col = conf.column;
                if (conf.className) elt.className += " " + conf.className;
                if (conf.color) elt.style.borderColor = conf.color;
                if (conf.lineStyle) elt.style.borderLeftStyle = conf.lineStyle;
                if (conf.width) elt.style.borderLeftWidth = conf.width;
                cls = val[i].className;
            }
            elt.style.left = (left + col * cw) + "px";
            elt.style.top = "-50px";
            elt.style.bottom = "-20px";
            elt.style.minHeight = minH + "px";
            cm.display.lineSpace.insertBefore(elt, cm.display.cursorDiv);
        }
    }

    function refreshRulers(cm) {
        clearRulers(cm);
        setRulers(cm);
    }
});
