var dw_fontSizerDX = {
    sizeUnit: "px",
    defaultSize: 12,
    maxSize: 24,
    minSize: 10,
    adjustList: [], setDefaults: function(unit, dflt, mn, mx, sels) {
        this.sizeUnit = unit;
        this.defaultSize = dflt;
        this.maxSize = mx;
        this.minSize = mn;
        if (sels)
            this.set(dflt, mn, mx, sels);
    }, set: function(dflt, mn, mx, sels) {
        var ln = this.adjustList.length;
        for (var i = 0; sels[i]; i++) {
            this.adjustList[ln + i] = [];
            this.adjustList[ln + i]["sel"] = sels[i];
            this.adjustList[ln + i]["dflt"] = dflt;
            this.adjustList[ln + i]["min"] = mn || this.minSize;
            this.adjustList[ln + i]["max"] = mx || this.maxSize;
            this.adjustList[ln + i]["ratio"] = this.adjustList[ln + i]["dflt"] / this.defaultSize;
        }
    }, init: function() {
        if (!document.getElementById || !document.getElementsByTagName || !dw_fontSizerDX.ready)
            return;
        var size, sizerEl, i;
        size = getCookie("fontSize");
        size = !isNaN(parseFloat(size)) ? parseFloat(size) : this.defaultSize;
        if (size > this.maxSize || size < this.minSize)
            size = this.defaultSize; this.curSize = this.defaultSize;
        sizerEl = document.getElementById('sizer');
        if (sizerEl)
            sizerEl.style.display = "block";
        if (this.adjustList.length == 0) {
            this.setDefaults(this.sizeUnit, this.defaultSize, this.minSize, this.maxSize, ['body', 'td']);
        }
        if (size != this.defaultSize)
            this.adjust(size - this.defaultSize);
    }, adjust: function(n) {
        dw_fontSizerDX.reset()
        if (!this.curSize || !dw_fontSizerDX.ready)
            return;
        var alist, size, list, i, j;
        if (n > 0) {
            if (this.curSize + n > this.maxSize)
                n = this.maxSize - this.curSize;
        }
        else if (n < 0) {
            if (this.curSize + n < this.minSize) n = this.minSize - this.curSize;
        }
        if (n == 0)
            return;
        this.curSize += n;
        alist = this.adjustList;
        for (i = 0; alist[i]; i++) {
            size = this.curSize * alist[i]['ratio'];
            size = Math.max(alist[i]['min'], size);
            size = Math.min(alist[i]['max'], size);
            list = dw_getElementsBySelector(alist[i]['sel']);
            for (j = 0; list[j]; j++) {
                list[j].style.fontSize = size + this.sizeUnit;
            }
        }
        setCookie("fontSize", this.curSize, 180, "/");
    }, reset: function() {
        if (!this.curSize || !dw_fontSizerDX.ready)
            return;
        var alist = this.adjustList, list, i, j;
        for (i = 0; alist[i]; i++) {
            list = dw_getElementsBySelector(alist[i]['sel']);
            for (j = 0; list[j]; j++) {
                list[j].style.fontSize = '';
            }
        }
        this.curSize = this.defaultSize;
        deleteCookie("fontSize", "/");
    }
}
dw_fontSizerDX.ready = true;
function dw_getElementsBySelector(selector) {
    if (!document.getElementsByTagName) return [];
    var nodeList = [document], tokens, bits, list, col, els, i, j, k;
    selector = selector.normalize();
    tokens = selector.split(' ');
    for (i = 0; tokens[i]; i++) {
        if (tokens[i].indexOf('#') != -1) {
            bits = tokens[i].split('#');
            var el = document.getElementById(bits[1]);
            if (!el) return [];
            if (bits[0]) {
                if (el.tagName.toLowerCase() != bits[0].toLowerCase()) return [];
            }
            for (j = 0; nodeList[j]; j++) {
                if (nodeList[j] == document || dw_contained(el, nodeList[j]))
                    nodeList = [el];
                else return [];
            }
            continue;
        }
        else if (tokens[i].indexOf('.') != -1) {
            bits = tokens[i].split('.');
            col = [];
            for (j = 0; nodeList[j]; j++) {
                els = dw_getElementsByClassName(bits[1], bits[0], nodeList[j]);
                for (k = 0; els[k]; k++) {
                    col[col.length] = els[k];
                }
            }
            nodeList = [];
            for (j = 0; col[j]; j++) {
                nodeList.push(col[j]);
            }
            continue;
        }
        else {
            els = [];
            for (j = 0; nodeList[j]; j++) {
                list = nodeList[j].getElementsByTagName(tokens[i]);
                for (k = 0; list[k]; k++) {
                    els.push(list[k]);
                }
            }
            nodeList = els;
        }
    }
    return nodeList;
}

function dw_getElementsByClassName(sClass, sTag, oCont) {
    var result = [], list, i;
    var re = new RegExp("\\b" + sClass + "\\b", "i");
    oCont = oCont ? oCont : document;
    if (document.getElementsByTagName) {
        if (!sTag || sTag == "*") {
            list = oCont.all ? oCont.all : oCont.getElementsByTagName("*");
        }
        else {
            list = oCont.getElementsByTagName(sTag);
        }
        for (i = 0; list[i]; i++)
            if (re.test(list[i].className)) result.push(list[i]);
    }
    return result;
}
function dw_contained(oNode, oCont) {
    if (!oNode) return;
    while (oNode = oNode.parentNode)
        if (oNode == oCont)
        return true;
    return false;
}
if (!Array.prototype.push) {
    Array.prototype.push = function() {
        for (var i = 0; arguments[i]; i++)
            this[this.length] = arguments[i];
        return this[this.length - 1];
    }
}
String.prototype.normalize = function() {
    var re = /\s\s+/g;
    return this.trim().replace(re, " ");
}
String.prototype.trim = function() {
    var re = /^\s+|\s+$/;
    return this.replace(re, "");
}

function setCookie(name, value, days, path, domain, secure) {
    var expires, date;
    if (typeof days == "number") {
        date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        expires = date.toGMTString();
    }
    document.cookie = name + "=" + escape(value) +
((expires) ? "; expires=" + expires : "") +
((path) ? "; path=" + path : "") +
((domain) ? "; domain=" + domain : "") +
((secure) ? "; secure" : "");
}

function getCookie(name) {
    var nameq = name + "=";
    var c_ar = document.cookie.split(';');
    for (var i = 0; i < c_ar.length; i++) {
        var c = c_ar[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameq) == 0) return unescape(c.substring(nameq.length, c.length));
    }
    return null;
}

function deleteCookie(name, path, domain) {
    if (getCookie(name)) {
        document.cookie = name + "=" +
((path) ? "; path=" + path : "") +
((domain) ? "; domain=" + domain : "") +
"; expires=Thu, 01-Jan-70 00:00:01 GMT";
    }
}
