Team:NYU Abu Dhabi/assets/js/jquery.hoverdir

/**

* jquery.hoverdir.js v1.1.0
* http://www.codrops.com
*
* Licensed under the MIT license.
* http://www.opensource.org/licenses/mit-license.php
* 
* Copyright 2012, Codrops
* http://www.codrops.com
*/
( function( $, window, undefined ) {

'use strict';

$.HoverDir = function( options, element ) {

this.$el = $( element ); this._init( options );

};

// the options $.HoverDir.defaults = { speed : 300, easing : 'ease', hoverDelay : 0, inverse : false };

$.HoverDir.prototype = {

_init : function( options ) {

// options this.options = $.extend( true, {}, $.HoverDir.defaults, options ); // transition properties this.transitionProp = 'all ' + this.options.speed + 'ms ' + this.options.easing; // support for CSS transitions this.support = Modernizr.csstransitions; // load the events this._loadEvents();

}, _loadEvents : function() {

var self = this;

this.$el.on( 'mouseenter.hoverdir, mouseleave.hoverdir', function( event ) {

var $el = $( this ), $hoverElem = $el.find( 'div' ), direction = self._getDir( $el, { x : event.pageX, y : event.pageY } ), styleCSS = self._getStyle( direction );

if( event.type === 'mouseenter' ) {

$hoverElem.hide().css( styleCSS.from ); clearTimeout( self.tmhover );

self.tmhover = setTimeout( function() {

$hoverElem.show( 0, function() {

var $el = $( this ); if( self.support ) { $el.css( 'transition', self.transitionProp ); } self._applyAnimation( $el, styleCSS.to, self.options.speed );

} );


}, self.options.hoverDelay );

} else {

if( self.support ) { $hoverElem.css( 'transition', self.transitionProp ); } clearTimeout( self.tmhover ); self._applyAnimation( $hoverElem, styleCSS.from, self.options.speed );

}

} );

}, // credits : http://stackoverflow.com/a/3647634 _getDir : function( $el, coordinates ) {

// the width and height of the current div var w = $el.width(), h = $el.height(),

// calculate the x and y to get an angle to the center of the div from that x and y. // gets the x value relative to the center of the DIV and "normalize" it x = ( coordinates.x - $el.offset().left - ( w/2 )) * ( w > h ? ( h/w ) : 1 ), y = ( coordinates.y - $el.offset().top - ( h/2 )) * ( h > w ? ( w/h ) : 1 ),

// the angle and the direction from where the mouse came in/went out clockwise (TRBL=0123); // first calculate the angle of the point, // add 180 deg to get rid of the negative values // divide by 90 to get the quadrant // add 3 and do a modulo by 4 to shift the quadrants to a proper clockwise TRBL (top/right/bottom/left) **/ direction = Math.round( ( ( ( Math.atan2(y, x) * (180 / Math.PI) ) + 180 ) / 90 ) + 3 ) % 4;

return direction;

}, _getStyle : function( direction ) {

var fromStyle, toStyle, slideFromTop = { left : '0px', top : '-100%' }, slideFromBottom = { left : '0px', top : '100%' }, slideFromLeft = { left : '-100%', top : '0px' }, slideFromRight = { left : '100%', top : '0px' }, slideTop = { top : '0px' }, slideLeft = { left : '0px' };

switch( direction ) { case 0: // from top fromStyle = !this.options.inverse ? slideFromTop : slideFromBottom; toStyle = slideTop; break; case 1: // from right fromStyle = !this.options.inverse ? slideFromRight : slideFromLeft; toStyle = slideLeft; break; case 2: // from bottom fromStyle = !this.options.inverse ? slideFromBottom : slideFromTop; toStyle = slideTop; break; case 3: // from left fromStyle = !this.options.inverse ? slideFromLeft : slideFromRight; toStyle = slideLeft; break; };

return { from : fromStyle, to : toStyle };

}, // apply a transition or fallback to jquery animate based on Modernizr.csstransitions support _applyAnimation : function( el, styleCSS, speed ) {

$.fn.applyStyle = this.support ? $.fn.css : $.fn.animate; el.stop().applyStyle( styleCSS, $.extend( true, [], { duration : speed + 'ms' } ) );

},

};

var logError = function( message ) {

if ( window.console ) {

window.console.error( message );

}

};

$.fn.hoverdir = function( options ) {

var instance = $.data( this, 'hoverdir' );

if ( typeof options === 'string' ) {

var args = Array.prototype.slice.call( arguments, 1 );

this.each(function() {

if ( !instance ) {

logError( "cannot call methods on hoverdir prior to initialization; " + "attempted to call method '" + options + "'" ); return;

}

if ( !$.isFunction( instance[options] ) || options.charAt(0) === "_" ) {

logError( "no such method '" + options + "' for hoverdir instance" ); return;

}

instance[ options ].apply( instance, args );

});

} else {

this.each(function() {

if ( instance ) {

instance._init();

} else {

instance = $.data( this, 'hoverdir', new $.HoverDir( options, this ) );

}

});

}

return instance;

};

} )( jQuery, window );