var saizfont = {

    sizeUnit: "px",

    defaultSize: 14,

    maxSize: 26,

    minSize: 8,

    sizerDivId: 'saiz', 

    queryName: "dw_fsz", 

    cookieLifetime: 180, 

    

    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;

        }

    },

 

    addHandlers: function () {

        var sizerEl = document.getElementById( saizfont.sizerDivId );

        if ( !saizfont.sizeIncrement ) { saizfont.getSizeIncrement(); }

        var links = sizerEl.getElementsByTagName('a');

        for (var i=0; links[i]; i++) {

            if ( dw_hasClass( links[i], 'tambah') ) {

                links[i].onclick = function () { saizfont.adjust( saizfont.sizeIncrement ); return false }

            } else if ( dw_hasClass( links[i], 'tolak') ) {

                links[i].onclick = function () { saizfont.adjust( -saizfont.sizeIncrement ); return false }

            } else if ( dw_hasClass( links[i], 'reset')  ) {

                links[i].onclick = function () { saizfont.reset(); return false }

            }

        }

        if (sizerEl) sizerEl.style.display = "block";

    },

 

    getSizeIncrement: function () {

        var val = 2;

        switch ( saizfont.sizeUnit ) {

            case 'px' : val = 2; break;

            case 'em' : val = .2; break;

            case '%' : val = 10; break;

        }

        saizfont.sizeIncrement = val;

    },

    

    init: function() {

        if ( !document.getElementById || !document.getElementsByTagName || !document.createElement ) return;

        var _this = saizfont;

        if ( !_this.doControlsSetup ) {

            _this.addHandlers();

        } else {

            _this.setupControls();

        }

        var size;

 

        size = dw_getValueFromQueryString( _this.queryName );

        if ( isNaN( parseFloat(size) ) || size > _this.maxSize || size < _this.minSize ) {

            size = dw_getCookie("fontSize");

            if ( isNaN( parseFloat(size) ) || size > _this.maxSize || size < _this.minSize ) {

                size = _this.defaultSize;

            }

        } 

        if (_this.adjustList.length == 0) _this.set(  _this.defaultSize, _this.minSize, _this.maxSize, ['body', 'td'] ); 

        _this.curSize = _this.defaultSize;  // create curSize property to use in calculations 

        if ( size != _this.defaultSize ) _this.adjust( size - _this.defaultSize );

    },

 

    adjust: function(n) {

        if ( !this.curSize ) return; 

        var alist, size, list, i, j;

        // check against max/minSize

        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;

        // loop through adjustList, calculating size, checking max/min

        alist = this.adjustList;

        for (i=0; alist[i]; i++) {

            size = this.curSize * alist[i]['ratio']; // maintain proportion 

            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; }

        }

        dw_setCookie( "fontSize", this.curSize, this.cookieLifetime, "/" );

    },

 

    reset: function() {

        if ( !this.curSize ) 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 = '';  // restores original font size (unless set inline!)

            } 

        }

        this.curSize = this.defaultSize;

        dw_deleteCookie("fontSize", "/");

    }

 

};

 

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 ) {  // id

            bits = tokens[i].split('#'); 

            var el = document.getElementById( bits[1] );

            if (!el) return []; 

            if ( bits[0] ) {  // check tag

                if ( el.tagName.toLowerCase() != bits[0].toLowerCase() ) return [];

            }

            for (j=0; nodeList[j]; j++) {  // check containment

                if ( nodeList[j] == document || dw_contained(el, nodeList[j]) ) 

                    nodeList = [el];

                else return [];

            }

        } else if ( tokens[i].indexOf('.') != -1 ) {  // class

            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]); }

        } else {  // element 

            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 == "*" ) { // for ie5

            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_getValueFromQueryString(name, obj) {

    obj = obj? obj: window.location; 

    if (obj.search && obj.search.indexOf(name != -1) ) {

        var pairs = obj.search.slice(1).split("&"); // name/value pairs

        var set;

        for (var i=0; pairs[i]; i++) {

            set = pairs[i].split("="); // Check each pair for match on name 

            if ( set[0] == name && set[1] ) {

                return set[1];

            }

        }

    }

    return '';

}

 

function dw_hasClass(el, cl) {

    var re = new RegExp("\\b" + cl + "\\b", "i");

    if ( re.test( el.className ) ) {

        return true;

    }

    return false;

}

 

function dw_contained(oNode, oCont) {

    if (!oNode) return; // in case alt-tab away while hovering (prevent error)

    while ( oNode = oNode.parentNode ) if ( oNode == oCont ) return true;

    return false;

};

 

if (!Array.prototype.push) {  // ie5.0

                Array.prototype.push =  function() {

                                for (var i=0; arguments[i]; i++) this[this.length] = arguments[i];

                                return this[this.length-1]; // return last value appended

                }

};

 

String.prototype.normalize = function() {

                var re = /\s\s+/g;

                return this.trim().replace(re, " ");

};

 

String.prototype.trim = function() {

                var re = /^\s+|\s+$/g;

                return this.replace(re, "");

};

 

 

function dw_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 dw_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 dw_deleteCookie(name,path,domain) {

  if ( dw_getCookie(name) ) {

    document.cookie = name + "=" +

      ((path) ? "; path=" + path : "") +

      ((domain) ? "; domain=" + domain : "") +

      "; expires=Thu, 01-Jan-70 00:00:01 GMT";

  }

}

 

 

var doc = {

  

    add: function(obj, etype, fp, cap) {

        cap = cap || false;

        if (obj.addEventListener) obj.addEventListener(etype, fp, cap);

        else if (obj.attachEvent) obj.attachEvent("on" + etype, fp);

    }, 

 

    remove: function(obj, etype, fp, cap) {

        cap = cap || false;

        if (obj.removeEventListener) obj.removeEventListener(etype, fp, cap);

        else if (obj.detachEvent) obj.detachEvent("on" + etype, fp);

    }, 

    

    DOMit: function(e) { 

        e = e? e: window.event;

        if (!e.target) e.target = e.srcElement;

        if (!e.preventDefault) e.preventDefault = function () { e.returnValue = false; return false; }

        if (!e.stopPropagation) e.stopPropagation = function () { e.cancelBubble = true; }

        return e;

    },

    

    getTarget: function(e) {

        e = doc.DOMit(e); var tgt = e.target; 

        if (tgt.nodeType != 1) tgt = tgt.parentNode;

        return tgt;

    }

    

}

 

function addLoadEvent(func) {

    var oldQueue = window.onload? window.onload: function() {};

    window.onload = function() {

        oldQueue();

        func();

    }

}

