/*
 Elastic CSS Framework
 Released under the MIT, BSD, and GPL Licenses.
 More information http://elasticss.com
 
 Elastic Engine
 @author     Fernando Trasviña (@azendal)
 @core team  Sergio de la Garza (@sgarza), Javier Ayala (@javi_ayala)
 @copyright  2009 Elastic CSS framework
 @version    2.0.2
 */
(function($){
    var CStyle = function(element, pseudoElement){
        if (window.getComputedStyle) {
            return window.getComputedStyle(element, pseudoElement)
        }
        else {
            return element.currentStyle
        }
    };
    var width = function(element){
        var width = CStyle(element).width;
        if (width == "auto" || width.indexOf("px") < 0) {
            return $(element).width()
        }
        else {
            return parseFloat(width)
        }
    };
    window.Elastic = function Elastic(context){
        var r, ra, i, j, k, l, il, jl, kl, ll, econs, econ, econw, econclass, ecols, ecol, ecolclass, eg, egml, egcl, egnl, ecrw, ecw, escol, rp, ig, efcs, efcsw, eecs, eecsw, eecw, eecrw, ecs, ecsw, ec, ecclass, eecfw, ecolminw, ecolmaxw, egreg = /(^|\s+)on\-(\d+)(\s+|$)/, esreg = /(^|\s+)span\-(\d+)(\s+|$)/, eareg = /(^|\s+)adaptive\-(\d+)\-(\d+)(\s+|$)/;
        eg = [];
        egcl = egnl = 0;
        econs = $.find(".columns", context);
        for (i = 0, il = econs.length; i < il; i++) {
            econ = econs[i];
            econclass = econ.className;
            if (econclass.indexOf("on-") > -1 && egreg.test(econclass)) {
                egml = Number(RegExp.$2)
            }
            else {
                egml = $.find("> .column, > .container > .column", econ).length
            }
            econ = $.find("> .container", econ)[0] || econ;
            econw = width(econ);
            ecrw = econw / egml;
            ecw = Math.round(ecrw);
            if (econclass.indexOf("adaptive-") > -1 && eareg.test(econclass)) {
                ecolminw = Number(RegExp.$2);
                ecolmaxw = Number(RegExp.$3);
                if (ecw > ecolmaxw) {
                    while (ecw > ecolmaxw) {
                        egml = egml + 1;
                        ecrw = econw / egml;
                        ecw = Math.round(ecrw)
                    }
                }
                else {
                    if (ecw < ecolminw) {
                        while (ecw < ecolminw) {
                            egml = egml - 1;
                            ecrw = econw / egml;
                            ecw = Math.round(ecrw)
                        }
                    }
                }
            }
            ecols = $.find("> .column", econ);
            for (j = 0, jl = ecols.length; j < jl; j++) {
                efcs = [];
                eecs = [];
                ecs = [];
                rp = ig = efcsw = ecsw = 0;
                ecol = ecols[j];
                ecolclass = ecol.className;
                escol = 1;
                if (ecolclass.indexOf("span-") > -1 && esreg.test(ecolclass)) {
                    escol = Number(RegExp.$2)
                }
                ecol.escol = escol = ((escol <= egml) ? escol : egml);
                egnl += escol;
                if (egnl == egml || j == (jl - 1) || ecolclass.indexOf("final") > -1) {
                    eg.push(ecol);
                    egcl = 0;
                    rp = 1
                }
                else {
                    if (egnl < egml) {
                        eg.push(ecol);
                        egcl = egnl
                    }
                    else {
                        if (egnl > egml) {
                            egcl = escol;
                            rp = 1;
                            ig = 1
                        }
                    }
                }
                if (rp) {
                    for (k = 0, kl = eg.length; k < kl; k++) {
                        ec = eg[k];
                        ecclass = ec.className;
                        if (ecclass.indexOf("fixed") > -1) {
                            efcs.push(ec);
                            efcsw += width(ec)
                        }
                        else {
                            if (ecclass.indexOf("elastic") > -1) {
                                eecs.push(ec)
                            }
                            else {
                                ecs.push(ec);
                                if (ec == eg[kl - 1]) {
                                    ec.style.width = Math.round(ecrw * ec.escol) + "px"
                                }
                                else {
                                    ec.style.width = Math.round(ecw * ec.escol) + "px"
                                }
                                ecsw = ecsw + width(ec)
                            }
                        }
                    }
                    ll = eecs.length;
                    if (ll > 0) {
                        eecfw = econw - (ecsw + efcsw);
                        if (eecfw <= 0) {
                            continue
                        }
                        eecrw = eecfw / ll;
                        eecw = Math.round(eecrw);
                        eecsw = eecw * ll;
                        for (l = 0; l < ll; l++) {
                            eecs[l].style.width = eecw + "px"
                        }
                        if (eecsw > eecfw) {
                            ra = eecsw - eecfw + 1;
                            for (r = 1; r < ra; r++) {
                                eecs[eecs.length - r].style.width = (eecw - 1) + "px"
                            }
                        }
                        else {
                            if (eecsw < eecfw) {
                                ra = eecfw - eecsw + 1;
                                for (r = 1; r < ra; r++) {
                                    eecs[eecs.length - r].style.width = (eecw + 1) + "px"
                                }
                            }
                        }
                        var tcw = 0;
                        for (var f = 0; f < ll - 1; f++) {
                            tcw += Number(eecs[f].style.width.replace("px", ""))
                        }
                        eecs[ll - 1].style.width = (econw - (ecsw + efcsw + (tcw))) + "px"
                    }
                    else {
                        if (ecol.escol == egml && efcs.length === 0) {
                            ecol.style.width = econw + "px"
                        }
                        else {
                            if (ecs.length > 0 && efcs.length === 0 && egnl == egml) {
                                if (ecsw > econw) {
                                    ra = ecsw - econw + 1;
                                    for (r = 1; r < ra; r++) {
                                        ecs[ecs.length - r].style.width = ((ecw - 1) * ecs[ecs.length - r].escol) + "px"
                                    }
                                }
                                else {
                                    if (ecsw < econw) {
                                        ra = econw - ecsw + 1;
                                        for (r = 1; r < ra; r++) {
                                            ecs[ecs.length - r].style.width = ((ecw + 1) * ecs[ecs.length - r].escol) + "px"
                                        }
                                    }
                                }
                                var tcw = 0;
                                for (var f = 0; f < ecs.length - 1; f++) {
                                    tcw += Number(ecs[f].style.width.replace("px", ""))
                                }
                                ec.style.width = (econw - (tcw)) + "px"
                            }
                            else {
                                if (egnl < egml && ecolclass.indexOf("final") > -1) {
                                    ecol.style["margin" + ((econclass.indexOf("inverted") > -1) ? "Left" : "Right")] = (econw - ecsw - efcsw) + "px"
                                }
                            }
                        }
                    }
                    eg = [];
                    egnl = 0
                }
                if (ig) {
                    eg = [ecol];
                    egnl = escol
                }
            }
        }
        for (i in Elastic.helpers) {
            if (Elastic.helpers.hasOwnProperty(i)) {
                Elastic.helpers[i](context)
            }
        }
    };
    var Elastic = window.Elastic;
    Elastic.version = "2.0.3";
    Elastic.reset = function Elastic_reset(context){
        var doc = $(document);
        doc.trigger("elastic:beforeReset");
        var i, w, wl, h, hl, p, pl, m, ml;
        h = $.find(".same-height > *, .full-height, .elastic-height", context);
        for (i = 0, hl = h.length; i < hl; i++) {
            h[i].style.height = ""
        }
        p = $.find(".vertical-center, .center, .bottom", context);
        for (i = 0, pl = p.length; i < pl; i++) {
            p[i].parentNode.style.paddingTop = "";
            p[i].parentNode.style.height = ""
        }
        w = $.find(".column:not(.fixed), .full-width", context);
        for (i = 0, wl = w.length; i < wl; i++) {
            w[i].style.width = ""
        }
        m = $.find(".column.final", context);
        for (i = 0, ml = m.length; i < ml; i++) {
            m[i].style.marginLeft = "";
            m[i].style.marginRight = ""
        }
        doc.trigger("elastic:reset")
    };
    Elastic.refresh = function Elastic_refresh(context){
        var doc = $(document);
        doc.trigger("elastic:beforeRefresh");
        Elastic.reset(context);
        Elastic(context);
        doc.trigger("elastic:refresh")
    };
    Elastic.configuration = {
        refreshOnResize: true
    };
    Elastic.helpers = {
        "full-width": function Elastic_helper_fullWidth(context){
            var i, $el;
            var els = $.find(".full-width", context);
            var elsl = els.length;
            for (i = 0; i < elsl; i++) {
                $el = $(els[i]);
                $el.width($el.parent().width() - ($el.outerWidth(true) - $el.width()))
            }
        },
        "same-height": function Elastic_helper_sameHeight(context){
            $(".same-height", context).each(function(){
                var columns = $("> *", this);
                var maxHeight = 0;
                columns.each(function(){
                    var currentHeight = $(this).outerHeight(true);
                    maxHeight = (maxHeight > currentHeight) ? maxHeight : currentHeight
                }).each(function(){
                    $(this).css("height", maxHeight)
                })
            })
        },
        "full-height": function Elastic_helper_fullHeight(context){
            $(".full-height", context).each(function(){
                var _this = $(this);
                _this.css("height", $(this.parentNode).height() - (_this.outerHeight(true) - _this.height()))
            })
        },
        "elastic-height": function Elastic_helper_elasticHeight(context){
            $(".elastic-height", context).each(function(){
                var _this = $(this);
                var h = 0;
                $("> *:not(.elastic-height)", this.parentNode).each(function(){
                    h += $(this).outerHeight(true)
                });
                _this.css("height", Math.round(_this.parent().height() - h));
                Elastic.refresh(this)
            })
        },
        "center": function Elastic_helper_center(context){
            $(".vertical-center, .center", context).each(function(){
                var parentNode = $(this.parentNode);
                var paddingTop = Math.round((parentNode.height() - $(this).outerHeight(true)) / 2);
                parentNode.css({
                    paddingTop: paddingTop + "px",
                    height: (parentNode.css("height")) ? (parentNode.outerHeight() - paddingTop) : ""
                })
            })
        },
        "bottom": function Elastic_helper_bottom(context){
            $(".bottom", context).each(function(){
                var parentNode = $(this.parentNode);
                var paddingTop = Math.round(parentNode.height() - $(this).outerHeight(true));
                parentNode.css({
                    paddingTop: paddingTop + "px",
                    height: (parentNode.css("height")) ? (parentNode.outerHeight() - paddingTop) : ""
                })
            })
        }
    };
    $(document).bind("elastic:beforeInitialize", function(){
        var r = /(^|\s+)display\s+([\w\_\-\d]+)(\s+|$)/;
        $(".display").each(function Elastic_layout(){
            r.test(this.className);
            var c = ".position-" + RegExp.$2;
            $(c).removeClass(c).appendTo(this)
        })
    })
})(jQuery);
jQuery(window).bind("load", function(){
    var doc = jQuery(document);
    var iw = document.body.clientWidth;
    doc.trigger("elastic:beforeInitialize");
    Elastic();
    if (iw != document.body.clientWidth) {
        Elastic.refresh()
    }
    jQuery(window).bind("resize", function Elastic_resizeHandler(){
        if (Elastic.configuration.refreshOnResize) {
            Elastic.refresh()
        }
    });
    doc.bind("elastic", Elastic.refresh);
    doc.trigger("elastic:initialize")
});

