/* Elastic CSS Framework Released under the MIT, BSD, and GPL Licenses. More information http://www.elasticss.com Elastic Engine Module Provides Pixel rounding Calculations Helpers Events Configuration @author Fernando TrasviƱa (@azendal) @core team Sergio de la Garza (@sgarza), Javier Ayala (@javi_ayala) @copyright 2009 Elastic CSS framework @version 2.0.3 */ (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+)don\-(\d+)(\s+|$)/, esreg = /(^|\s+)dspan\-(\d+)(\s+|$)/, eareg = /(^|\s+)dadaptive\-(\d+)\-(\d+)(\s+|$)/; eg = []; egcl = egnl = 0; econs = $.find('.dcolumns', 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('> .dcolumn, > .dcontainer > .dcolumn', econ).length; } econ = $.find('> .dcontainer', econ)[0] || econ; econw = width(econ); ecrw = econw / egml; ecw = Math.round( ecrw ); if(econclass.indexOf('dadaptive-') > -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('> .dcolumn', 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('dfinal') > -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('dfixed') > -1){ efcs.push(ec); efcsw += width(ec); } else if(ecclass.indexOf('delastic') > -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 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('dfinal') > -1){ ecol.style['margin' + ( (econclass.indexOf('dinverted') > -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('.dsame-height > *, .dfull-height, .delastic-height', context); for(i = 0, hl = h.length; i < hl; i++){h[i].style.height = '';} p = $.find('.dvertical-center, .dcenter, .bottom', context); for(i = 0, pl = p.length; i < pl; i++){p[i].parentNode.style.paddingTop = ''; p[i].parentNode.style.height = '';} w = $.find('.dcolumn:not(.dfixed), .full-width', context); for(i = 0, wl = w.length; i < wl; i++){w[i].style.width = '';} m = $.find('.dcolumn.dfinal', context); for(i = 0, ml = m.length; i < ml; i++){m[i].style.marginLeft = ''; m[i].style.marginRight = '';} doc.trigger('elastic:reset'); }; // Original Code // // Elastic.refresh = function Elastic_refresh(context){ // var doc = $(document); // doc.trigger('elastic:beforeRefresh'); // Elastic.reset(context); // Elastic(context); // doc.trigger('elastic:refresh'); // }; 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() ) ); } }, 'dsame-height' : function Elastic_helper_sameHeight(context){ $('.dsame-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); }); }); }, 'dfull-height' : function Elastic_helper_fullHeight(context){ $('.dfull-height', context).each(function(){ var _this = $(this); _this.css('height', $(this.parentNode).height() - ( _this.outerHeight(true) - _this.height() )); }); }, 'delastic-height' : function Elastic_helper_elasticHeight(context){ $('.delastic-height', context).each(function(){ var _this = $(this); var h = 0; $('> *:not(.delastic-height)', this.parentNode).each(function(){ h += $(this).outerHeight(true); }); _this.css('height', Math.round(_this.parent().height() - h)); Elastic.refresh(this); }); }, 'dcenter' : function Elastic_helper_center(context){ $('.dvertical-center, .dcenter', 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 ) : '' }); }); } }; /* Elastic Layouts Support */ // $(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); // due to a safari 4 final bug, this initialization must be done on window.load event // definitely a must fix either on elastic or 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'); });