jQuery.fn.vibrate = function(){

	// Loop over each of the elements in the jQuery
	// stack so that we can set up the properties
	// for the individual elements.
	this.each(
		function( intI ){
			// Get a jQuery object for this element.
			var jNode = $( this );

			// Default plugin to not be vibrating.
			var blnVibrate = false;

			// Get current position of the element.
			var intLeft = parseInt( jNode.css( "left" ) );
			var intTop = parseInt( jNode.css( "top" ) );
			var randRotation = 0;

			// Create a function pointer that will
			// handle the updating of elements position
			// such that it will make it appear to be
			// vibrating.
			var fnUpdatePosition = function(){
				var intCurrentLeft = parseInt(
					jNode.css( "left" )
					);

				var intCurrentTop = parseInt(
					jNode.css( "top" )
					);


				// Check to see if we should keep going.
				if (blnVibrate){

					// Check to see which direction to
					// adjust in - either vert. or horz.
					if (Math.random() > .5){

						// Adjust vertically.
						if (intCurrentTop > intTop){
							intCurrentTop = (intTop - 1);
						} else {
							intCurrentTop = (intTop + 1);
						}

					} else {

						// Adjust horizontally.
						if (intCurrentLeft > intLeft){
							intCurrentLeft = (intLeft - 1);
						} else {
							intCurrentLeft = (intLeft + 1);
						}

					}
					
					var randRotation = Math.random();

					// Set a timeout to call this method
					// again and update position.
					setTimeout(
						fnUpdatePosition,
						60
						);

				} else {

					// Reset position.
					intCurrentLeft = intLeft;
					intCurrentTop = intTop;
					randRotation = 0;

				}


				// Update the position.
				jNode.css(
					"top",
					(intCurrentTop + "px")
					);

				jNode.css(
					"left",
					(intCurrentLeft + "px")
					);
					
				// Some fun with CSS3 :)
				jNode.css({
					'WebkitTransform': 'rotate(' + randRotation + 'deg)',
					'-moz-transform': 'rotate(' + randRotation + 'deg)',
					'transform': 'rotate(' + randRotation + 'deg)'});
			}


			// Hoook up the mouse over event to flag
			// that the vibrating should begin.
			jNode.mouseover(
				function(){
					// Flag vibration.
					blnVibrate = true;

					// Start vibrating.
					fnUpdatePosition();
				}
				);


			// Hook up the mouse out event to flag
			// that the vibrating should end.
			jNode.mouseout(
				function(){
					// Clear vibration.
					blnVibrate = false;
				}
				);

		}
		);
	// END: each()

	// Return the jQuery stack to keep chaining.
	return( this );
}
