jquery.crumble.min.js 3.4 KB
/*
 * jQuery.crumble - A tour extension for grumble
 * Tom Moor, http://tommoor.com
 * Copyright (c) 2012 Tom Moor
 * MIT Licensed
 * @version 0.3
 */
 
(function($){var Crumble=function(){var position=0;var setup=[];var $setup;var defaults={grumble:{text:'',angle:85,distance:30,showAfter:0,hasHideButton:false},scrollSpeed:'fast',onStep:function(){},onStart:function(){},onFinish:function(){}};var scrollToGrumble=function($grumble){var top=$grumble.position().top;var bottom=$grumble.height()+top;var windowHeight=$(window).innerHeight();var windowTop=$(window).scrollTop();var windowBottom=windowHeight+windowTop;var pad=100;if(top<windowTop){$('html, body').animate({scrollTop:top-pad},defaults.scrollSpeed)}else if(bottom>windowBottom){$('html, body').animate({scrollTop:bottom-windowHeight+pad},defaults.scrollSpeed)}};var getCurrentGrumble=function(){return $('.grumble').last().next()};var calculateAngle=function($element){var windowTop=$(window).scrollTop();var centerX=window.innerWidth/2;var centerY=window.innerHeight/2;var elementX=$element.position().left;var elementY=$element.position().top+windowTop;var o=elementY-centerY;var a=elementX-centerX;var angle=Math.atan2(o,a)*(180/Math.PI);if(angle<0)return angle-90;return angle+90};var bindKeys=function(){$(document).bind('keyup.crumble',function(ev){if(ev.keyCode===27){ev.stopImmediatePropagation();methods.clear();$(document).unbind('keyup.crumble')}})};var methods={init:function(o){defaults=$.extend(defaults,o);$('li',this).each(function(index,stop){var $stop=$(stop);var opt=$stop.data('options');var options={};options.text=$stop.html();options.angle=$stop.data('angle');if(opt){var j;var data=opt.split(';');for(var i in data){j=data[i].split(':');if(j.length===2){options[j[0]]=j[1]}else{continue}}}setup.push({target:$stop.data('target'),options:options})});methods.clear();methods.step();bindKeys();return this},go:function(pos){position=Math.max(0,Math.min(pos,setup.length-1));this.step()},forward:function(){position++;methods.step();defaults.onStep(position,setup[position])},step:function(){if(position===0){defaults.onStart()}if(position>=setup.length){methods.clear();defaults.onFinish();return}var current=setup[position];var $current=$(current.target).first();if(!current.target){$.error('Crumble step does not include data-target property');return}if(!$current.length){methods.forward();return}var options=$.extend({},defaults.grumble,current.options,{angle:current.options.angle||calculateAngle($current),onHide:function(){methods.forward()},onShow:function(){var $grumble=getCurrentGrumble();scrollToGrumble($grumble);$grumble.data('clicked',false);$grumble.click(function(ev){ev.stopImmediatePropagation();if(!$grumble.data('clicked')){$grumble.data('clicked',true);$current.trigger('hide.bubble')}});$grumble.hover(function(){$grumble.prev().addClass('hover')},function(){$grumble.prev().removeClass('hover')})}});options.distance=parseInt(options.distance,10);$current.grumble(options)},clear:function(){position=0;$('.grumble, .grumble-text, .grumble-button').remove()}};return methods};$.fn.crumble=function(method){var args=arguments;return this.each(function(){var state=$(this).data('Crumble');if(state&&state[method]){state[method].apply(this,Array.prototype.slice.call(args,1))}else if(typeof method==='object'||!method){var tr=(new Crumble(this));tr.init.apply(this,args);$(this).data('Crumble',tr)}else{$.error('Method '+method+' does not exist on jQuery.crumble')}})}})(jQuery);