(function($){ var option = { stage : 'parent', center : true, centerX : true, centerY : true, scale : true, scaleX : true, scaleY : true, scaleMargin : 0, aspectRatio : true }; $.fn.adjust = function (_opt) { return this.each(function() { var opt = $.extend({}, option, _opt); var $ele = $(this); var $stage = (opt.stage != 'parent') ? $ele.parents(opt.stage) : $ele.parent(); $stage = ($stage.get(0)) ? $stage : $ele.parent(); $ele.bind('adjust.center', {stage:$stage, opt:opt}, $.sfs.adjust.center); $ele.bind('adjust.scale', {stage:$stage, opt:opt}, $.sfs.adjust.scale); var scale = (opt.scale && (opt.scaleX || opt.scaleY)) ? true : false; var center = (opt.center && (opt.centerX || opt.centerY) ) ? true : false; if($.sfs.adjust.registerElement(this)) { if (scale) $ele.trigger('adjust.scale'); if (center) $ele.trigger('adjust.center'); // hook for "embed" & "object" elements if ($ele.get(0).tagName.toLowerCase() == 'embed' || $ele.get(0).tagName.toLowerCase() == 'object') { if (scale) $.sfs.adjust.scale({target:$ele.get(0), data:{stage:$stage, opt:opt}}); if (center) $.sfs.adjust.center({target:$ele.get(0), data:{stage:$stage, opt:opt}}); } } // $.sfs.adjust.registerElement(this); // $stage.bind('resize', $.sfs.adjust.resize); return $ele; }); }; $.sfs = ($.sfs) ? $.sfs : {}; $.sfs.adjust = { elements : [], resizeTimeout : false, init : function(_opt) { $(window).load(function() { var selector = _opt.selector ? _opt.selector : _opt; var $adjustees = (typeof selector == 'object') ? $(selector[0], eval('('+selector[1]+')')) : $(selector); var opt = $.extend({},_opt); // init if($adjustees.get(0)) { $adjustees .adjust(opt) .data('sfs', $.extend($adjustees.data('sfs'), {adjust: opt})); } }); }, registerElement : function (_ele) { var contained = false; $.each($.sfs.adjust.elements, function(){ if (this === _ele) { contained = true; return false; } }); if (!contained) { $.sfs.adjust.elements.push(_ele); return true; } else { return false; } }, center : function (e) { var $stage = e.data.stage; var stage_overflow = $stage.css('overflow'); var stage_position = $stage.css('position').toLowerCase(); $stage.css({overflow: 'hidden'}); var stage = { width : $stage.innerWidth(), height : $stage.innerHeight(), offset : $stage.offset() }; var $ele = $(e.target).clone(); $ele.css({visibility:'hidden', position:'fixed'}).appendTo('body'); var ele = { width : $ele.innerWidth(), height : $ele.innerHeight(), offset : $ele.offset(), position : $ele.position() }; $ele.remove(); var opt = e.data.opt; var ele_top = (opt.centerY) ? stage.height / 2 - ele.height / 2 : ele.position.top; var ele_left = (opt.centerX) ? stage.width / 2 - ele.width / 2 : ele.position.left; if ($stage.css('text-align') == 'center') $stage.css('text-align', 'left'); $(e.target) // .width($ele.width()) // .height($ele.height()) .css({marginTop: ele_top+'px', marginLeft:ele_left+'px'}) ; $stage.css({overflow: stage_overflow}); }, scale : function (e) { var $stage = e.data.stage; var stage_overflow = $stage.css('overflow'); $stage // .width($stage.width()) // .height($stage.height()) .css({overflow: 'hidden'}) ; var stage = { width : $stage.innerWidth(), height : $stage.innerHeight() }; var $ele = $(e.target).clone(); $ele.css({visibility:'hidden', position:'fixed'}).appendTo('body'); var ele = { width : $ele.innerWidth(), height : $ele.innerHeight() }; $ele.remove(); var ele_width = ele.width; var ele_height = ele.height; var ele_aspect = ele_width / ele_height; var opt = e.data.opt; if (opt.scaleX && ele_width > stage.width || !opt.aspectRatio ) { ele_width = stage.width - opt.scaleMargin * 2; ele_height = (opt.aspectRatio) ? ele_width / ele_aspect : ele_height; } if (opt.scaleY && ele_height > stage.height || !opt.aspectRatio ) { ele_height = stage.height - opt.scaleMargin * 2; ele_width = (opt.aspectRatio) ? ele_height * ele_aspect : ele_width; } if (ele_height < 0 || ele_width < 0) { ele_height = 0; ele_height = 0; } $(e.target).width(ele_width).height(ele_height); }, resize : function() { clearTimeout($.sfs.adjust.resizeTimeout); $.sfs.adjust.resizeTimeout = window.setTimeout(function(){ $.each($.sfs.adjust.elements, function(){ $(this).trigger('adjust.scale').trigger('adjust.center'); }); }, 10); } }; $(window).bind('resize', $.sfs.adjust.resize); })(jQuery);