;(function($){ var sidrMoving=false, sidrOpened=false; var privateMethods={ isUrl: function (str){ var pattern=new RegExp('^(https?:\\/\\/)?'+ '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ '((\\d{1,3}\\.){3}\\d{1,3}))'+ '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ '(\\?[;&a-z\\d%_.~+=-]*)?'+ '(\\#[-a-z\\d_]*)?$','i'); if(!pattern.test(str)){ return false; }else{ return true; }}, loadContent: function($menu, content){ $menu.html(content); }, addPrefix: function($element){ var elementId=$element.attr('id'), elementClass=$element.attr('class'); if(typeof elementId==='string'&&''!==elementId){ $element.attr('id', elementId.replace(/([A-Za-z0-9_.\-]+)/g, 'sidr-id-$1')); } if(typeof elementClass==='string'&&''!==elementClass&&'sidr-inner'!==elementClass){ $element.attr('class', elementClass.replace(/([A-Za-z0-9_.\-]+)/g, 'sidr-class-$1')); } $element.removeAttr('style'); }, execute: function(action, name, callback){ if(typeof name==='function'){ callback=name; name='sidr'; } else if(!name){ name='sidr'; } var $menu=$('#' + name), $body=$($menu.data('body')), $html=$('html'), menuWidth=$menu.outerWidth(true), speed=$menu.data('speed'), side=$menu.data('side'), displace=$menu.data('displace'), onOpen=$menu.data('onOpen'), onClose=$menu.data('onClose'), bodyAnimation, menuAnimation, scrollTop, bodyClass=(name==='sidr' ? 'sidr-open':'sidr-open ' + name + '-open'); if('open'===action||('toggle'===action&&!$menu.is(':visible'))){ if($menu.is(':visible')||sidrMoving){ return; } if(sidrOpened!==false){ methods.close(sidrOpened, function(){ methods.open(name); }); return; } sidrMoving=true; if(side==='left'){ bodyAnimation={left: menuWidth + 'px'}; menuAnimation={left: '0px'};}else{ bodyAnimation={right: menuWidth + 'px'}; menuAnimation={right: '0px'};} if($body.is('body')){ scrollTop=$html.scrollTop(); $html.css('overflow-x', 'hidden').scrollTop(scrollTop); } if(displace){ $body.addClass('sidr-animating').css({ width: $body.width(), position: 'absolute' }).animate(bodyAnimation, speed, function(){ $(this).addClass(bodyClass); }); }else{ setTimeout(function(){ $(this).addClass(bodyClass); }, speed); } $menu.css('display', 'block').animate(menuAnimation, speed, function(){ sidrMoving=false; sidrOpened=name; if(typeof callback==='function'){ callback(name); } $body.removeClass('sidr-animating'); }); onOpen(); }else{ if(!$menu.is(':visible')||sidrMoving){ return; } sidrMoving=true; if(side==='left'){ bodyAnimation={left: 0}; menuAnimation={left: '-' + menuWidth + 'px'};}else{ bodyAnimation={right: 0}; menuAnimation={right: '-' + menuWidth + 'px'};} if($body.is('body')){ scrollTop=$html.scrollTop(); $html.removeAttr('style').scrollTop(scrollTop); } $body.addClass('sidr-animating').animate(bodyAnimation, speed).removeClass(bodyClass); $menu.animate(menuAnimation, speed, function(){ $menu.removeAttr('style').hide(); $body.removeAttr('style'); $('html').removeAttr('style'); sidrMoving=false; sidrOpened=false; if(typeof callback==='function'){ callback(name); } $body.removeClass('sidr-animating'); }); onClose(); }} }; var methods={ open: function(name, callback){ privateMethods.execute('open', name, callback); }, close: function(name, callback){ privateMethods.execute('close', name, callback); }, toggle: function(name, callback){ privateMethods.execute('toggle', name, callback); }, toogle: function(name, callback){ privateMethods.execute('toggle', name, callback); }}; $.sidr=function(method){ if(methods[method]){ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); } else if(typeof method==='function'||typeof method==='string'||! method){ return methods.toggle.apply(this, arguments); }else{ $.error('Method ' + method + ' does not exist on jQuery.sidr'); }}; $.fn.sidr=function(options){ var settings=$.extend({ name:'sidr', speed:200, side:'left', source:null, renaming:true, body:'body', displace: true, onOpen:function(){}, onClose:function(){}}, options); var name=settings.name, $sideMenu=$('#' + name); if($sideMenu.length===0){ $sideMenu=$('
') .attr('id', name) .appendTo($('body')); } $sideMenu .addClass('sidr') .addClass(settings.side) .data({ speed:settings.speed, side:settings.side, body:settings.body, displace:settings.displace, onOpen:settings.onOpen, onClose:settings.onClose }); if(typeof settings.source==='function'){ var newContent=settings.source(name); privateMethods.loadContent($sideMenu, newContent); } else if(typeof settings.source==='string'&&privateMethods.isUrl(settings.source)){ $.get(settings.source, function(data){ privateMethods.loadContent($sideMenu, data); }); } else if(typeof settings.source==='string'){ var htmlContent='', selectors=settings.source.split(','); $.each(selectors, function(index, element){ htmlContent +='