/// <reference path="./DomHelper.ts" />
var econda;
(function (econda) {
    var util;
    (function (util) {
        /**
         * Single log message, helper class for LogViewer
         * @private
         * @class econda.util.LogItem
         */
        var LogItem = (function () {
            function LogItem(timestamp, type, message, data) {
                this.timestamp = null;
                this.type = "info";
                this.message = null;
                this.data = null;
                this.timestamp = timestamp;
                this.type = type;
                this.message = message;
                this.data = data;
            }
            LogItem.TYPE_INFO = "info";
            LogItem.TYPE_WARNING = "warning";
            LogItem.TYPE_ERROR = "error";
            return LogItem;
        }());
        /**
         * Display econda debug output inside of a div container.
         * See {@link econda.debug} on how to log debug output.
         * @class econda.util.LogViewer
         */
        var LogViewer = (function () {
            function LogViewer() {
                /**
                 * Id of div container where we should write the debug output.
                 * @cfg {string} [container=null]
                 */
                this.container = null;
                /**
                 * Scroll container on new log items
                 * @cfg {boolean} [autoScroll=true]
                 */
                this.autoScroll = true;
                /**
                 * When div element is not rendered, we'll queue all log messages here and write them lager
                 * @property {Array} queue
                 * @private
                 */
                this.queue = [];
                /**
                 * If no container element is available, set timeout and try again later
                 * @private
                 */
                this.timeout = null;
            }
            /**
             * Write a info message to log container
             * @param {String} message
             * @param {Array} data
             */
            LogViewer.prototype.log = function (message, data) {
                var item = new LogItem(new Date(), LogItem.TYPE_INFO, message, data);
                this.queue.push(item);
                this.writeQueue();
            };
            /**
             * Write a warning to log container
             * @param {String} message
             * @param {Array} data
             */
            LogViewer.prototype.warn = function (message, data) {
                var item = new LogItem(new Date(), LogItem.TYPE_WARNING, message, data);
                this.queue.push(item);
                this.writeQueue();
            };
            /**
             * Write an error to log container
             * @param {String} message
             * @param {Array} data
             */
            LogViewer.prototype.error = function (message, data) {
                var item = new LogItem(new Date(), LogItem.TYPE_ERROR, message, data);
                this.queue.push(item);
                this.writeQueue();
            };
            /**
             * Write all items from queue to div container
             * @private
             */
            LogViewer.prototype.writeQueue = function () {
                var container = econda.util.DomHelper.element(this.container);
                if (container != null) {
                    var item = null;
                    while (item = this.queue.shift()) {
                        this.writeItemToContainer(item, container);
                    }
                }
                else if (this.timeout == null) {
                    var cmp = this;
                    setTimeout(function () { cmp.writeQueue(); }, 250);
                }
            };
            /**
             * Format an write single log item to div container
             * @private
             */
            LogViewer.prototype.writeItemToContainer = function (item, container) {
                var minutes = item.timestamp.getMinutes();
                var mStr = (minutes < 10) ? '0' + minutes.toString() : minutes.toString();
                var html = [
                    item.timestamp.getHours().toString(), ':',
                    mStr, '.',
                    item.timestamp.getSeconds().toString(), ' - ',
                    item.message
                ];
                var domItem = document.createElement('p');
                domItem.innerHTML = html.join('');
                domItem.style.margin = "0";
                domItem.style.padding = "2px";
                domItem.style.fontFamily = "Fixed, monospace";
                domItem.style.fontSize = "12px";
                switch (item.type) {
                    case LogItem.TYPE_ERROR:
                        domItem.style.backgroundColor = "#FF9999";
                        break;
                    case LogItem.TYPE_WARNING:
                        domItem.style.backgroundColor = "#FFFF99";
                        break;
                }
                container.appendChild(domItem);
                if (this.autoScroll) {
                    container.scrollTop = container.scrollHeight;
                }
            };
            /**
             * Get container element
             * @returns {HTMLElement}
             */
            LogViewer.prototype.getContainerElement = function () {
                var container = null;
                if (this.container instanceof HTMLElement) {
                    container = this.container;
                }
                else {
                    container = document.getElementById(this.container);
                }
                return container;
            };
            return LogViewer;
        }());
        util.LogViewer = LogViewer;
    })(util = econda.util || (econda.util = {}));
})(econda || (econda = {}));