/***************************************************************************
* Internet Explorer Margin Fix
* Copyright 2002-2005 by David Schontzler and contributors
* http://iemarginfix.sourceforge.net
* Distributed under the Academic Free License 2.1 or above
* Description:  This script will fix the horizontal margin support in IE5-7
***************************************************************************
* Version: 2.4.0.src
* $Revision: 14 $
* $LastChangedDate: 2007-05-21 08:33:19 -0700 (Mon, 21 May 2007) $
***************************************************************************/

IEmarginFix = {
    list : [],
    
    ss : null,

    needsFixed: (function() {
        var ua = navigator.userAgent;
        return /msie [5-7]\./i.test(ua) && !/mac/i.test(ua)
            && document.compatMode != "CSS1Compat" && window.attachEvent
            && document.styleSheets.length > 0;
    })(),
    
    init : function() {
        if(IEmarginFix.needsFixed) {
            this.ss = document.styleSheets;
            var auto, lop, list, s, i, a;
            auto = [];
            lop = [];
            list = [];
            s = this.getRules();
            for(i=0; i<s.length; i++) {
                if( this.checkMargin(s[i][1]) ) {
                    auto[auto.length] = s[i][0];
                } else if( this.checkLopsided(s[i][1]) ) {
                    lop[lop.length] = s[i][0];
                }
            }
            for(i=0; a = auto[i]; i++) {
                this.ss[this.ss.length-1].addRule(a, "margin-left : expression( IEmarginFix.autoFix(this) );");
            }
            for(i=0; a = lop[i]; i++) {
                this.ss[this.ss.length-1].addRule(a, "margin-left : expression( IEmarginFix.lopsidedFix(this) );");
            }
            this.list = auto.length > 0 ? lop.length > 0 ? auto.concat(lop) : auto : lop;
            window.attachEvent("onload", IEmarginFix.checkInline);
        }
    },
    
    autoFix : function(elm) {
        var rslt = "auto", w = elm.currentStyle.width;
        var id = elm.id ? "#" + elm.id : elm.className ? elm.tagName + "." + elm.className : elm.tagName; // Credit: BS
        if(w.indexOf("%") != -1) {
            rslt = ( 100 - parseInt(w) )/2 + "%";
            IEmarginFix.ss[IEmarginFix.ss.length-1].addRule(id, "margin-left : " + rslt + "; margin-right : " + rslt + "; width : 100%");
        } else
            IEmarginFix.ss[IEmarginFix.ss.length-1].addRule(id, "margin-left : expression( IEmarginFix.pxAutoFix(this) );");
        return rslt;
    },
    
    // so we don't have to go through the if...else all over again!
    pxAutoFix : function(elm) {
        var rslt, par = elm.parentNode;
        rslt = par.clientWidth > 0 ? par.clientWidth : par.scrollWidth;
        rslt = (rslt - elm.offsetWidth) / 2;
        return Math.max(rslt, 0);
    },
    
    lopsidedFix : function(elm) {
        var par = elm.parentNode, parWidth, rslt;
        parWidth = par.clientWidth > 0 ? par.clientWidth : par.scrollWidth;
        rslt = parWidth - elm.offsetWidth;
        if( elm.currentStyle.marginRight.indexOf("px") != -1 ) {
            rslt -= parseInt( elm.currentStyle.marginRight );
        } else if( elm.currentStyle.marginRight.indexOf("%") != -1 ) {
            rslt -= parseInt(elm.currentStyle.marginRight) * 0.01 * parWidth;
        }
        rslt -= ( parseInt(par.currentStyle.paddingLeft) + parseInt(par.currentStyle.paddingRight) );
        return rslt;
    },
    
    checkInline : function() {
        var i, a, elm, blk, list = [], auto = IEmarginFix.list;
        for(i=0; a = auto[i]; i++) {
            if( a.indexOf(".") != -1 ) { // classes
                list = list.concat( IEmarginFix.getClass( a.substring(a.indexOf(".")+1) ) );
            } else if( a.charAt(0) == '#' ) { // ids
                list[list.length] = document.all[a.substring(1)];
            } else { // tags
                elm = document.getElementsByTagName(a);
                if(elm.length > 0) {
                    for(i=0; i < elm.length; i++) {
                        list = list.concat( elm.item(i) );
                    }
                }
            }
        }
        for(i=0; i<list.length; i++) {
            elm = list[i];
            if(elm && elm.style) {
                blk = IEmarginFix.getStyle(elm, "display");
                if(blk != "block" && ( IEmarginFix.ie50 ? !IEmarginFix.ie50check(elm.tagName) : blk != "list-item" ) ) {
                    elm.style.margin = 0;
                }
            }
        }
    },
    
    checkMargin : function(str) {
        return ( str.search(/position\s*:\s*absolute/i) == -1 && (
            str.match(/margin\s*:\s*auto(;|$)/i) || str.match(/margin\s*:\s*\S+\s+auto(;|$)/i)
            || ( str.match(/margin-left\s*:\s*auto/i) && str.match(/margin-right\s*:\s*auto/i) )
            || str.match(/margin\s*:\s*\S+\s+auto\s+\S+(;|$)/i) || str.match(/margin\s*:\s*\S+\s+auto\s+\S+\s+auto/i)
            )
        );
    },
    
    checkLopsided : function(str) {
        return ( str.search(/position\s*:\s*absolute/i) == -1 && (
                str.match(/margin-left\s*:\s*auto/i) && str.match(/margin-right\s*:\s*\d+(px|%)?/i)
                || str.match(/margin-left\s*:\s*auto/i) && !str.match(/margin-right/i)
            )
        );
    },
    
    // these next few methods are basically for IE 5.0's bad interpretation of the "display" property (always returning "inline" unless explicitly set, even for block elements!)
    ie50 : navigator.appVersion.toLowerCase().indexOf("msie 5.0") != -1,
    
    ie50check : function(tag) {
        var i, r = false;
        tag = tag.toUpperCase();
        for(i=0; i<this.blockElms.length; i++) {
            if(tag == this.blockElms[i]) {
                r = true;
            }
        }
        return r;
    },
    
    blockElms : ["ADDRESS", "BLOCKQUOTE", "BODY", "CENTER", "COL", "COLGROUP",
        "DD", "DIR", "DIV", "DL", "DT", "FIELDSET", "FORM", "FRAME", "HN", "HR",
        "IFRAME", "LEGEND", "LI", "LISTING", "MARQUEE", "MENU", "OL", "P",
        "PLAINTEXT", "PRE", "TABLE", "TBODY", "TD", "TFOOT", "TH", "THEAD",
        "TR", "UL", "XMP"],
    // end IE5.0 detect
    
    getClass : function(cls) {
        var el, r, i;
        el = document.all ? document.all : document.getElementsByTagName('*');
        r = [];
        for(i=0; el[i]; i++) {
            if(el[i].className == cls) { r[r.length] = el[i]; }
        }
        if(r.length==0) { r = null; }
        return r;
    },
    
    getRules : function(wh) {
        var s = null;
        if(document.styleSheets && document.styleSheets.length) {
            var i, j, k, m, x, y, is = true, screen = true;
            s = [];
            for(i=0; i < document.styleSheets.length; i++) {
                j = document.styleSheets.item(i);
                if(wh) { is = (j.title || j.id) == wh; }
                if( typeof j.media == "string" && j.media.length > 0 && !j.media.match(/^(screen)|(media)$/i) ) {
                    screen = false;
                } else {
                    screen = true;
                }
                if(!j.disabled && screen && is) {
                    if(j.rules) {
                        if(j.imports && j.imports.length) {
                            for(k=0; k < j.imports.length; k++) {
                                for(x=0; y = j.imports[k].rules[x]; x++) {
                                    s[s.length] = [y.selectorText, y.style.cssText];
                                }
                            }
                        }
                        for(k=0; m = j.rules[k]; k++) {
                                s[s.length] = [m.selectorText, m.style.cssText];
                        }
                    } else {
                        return null;
                    }
                }
                if(wh && is) { break; } else { is = true; }
            }
        }
        return s;
    },
    
    getStyle : function(obj,sty) {
        var sty2 = IEmarginFix.compactStyle(sty);
        var r = obj.style[sty2];
        if(r=='') {
            if(document.defaultView) {
                r = document.defaultView.getComputedStyle(obj,'').getPropertyValue(sty);
            }
            else r = obj.currentStyle[sty2];
        }
        if(!r) { r = null; }
        return r;
    },

    compactStyle : function(str) {
        var s = str.split('-'); var o = [s[0]];
        for(i=1;(j=s[i]);i++) { o[o.length] = j.charAt(0).toUpperCase(); o[o.length] = j.substring(1) };
        return o.join('');
    }
};
IEmarginFix.init();