// THESE PATCHES OVERRIDE OR ADD TO JQUERY 1.4.2 - Once we move to a later version,
// Review each patch and remove if necessary.


// JQUERY PATCH WHICH EXTENDS offset() as a SETTER.
// REMOVE THIS ONCE THE NEXT JQUERY LIB IS RELEASED AS THIS FUNCTION IS GOING
// TO END UP IN THE CORE
(function($){
		  
	$.fn.extend({
		_offset : $.fn.offset,
		
		offset : function(newOffset){
		    return newOffset ? this.setXY(newOffset) : this._offset();
		},
		
		setXY: function(newOffset){
			return this.each(function(){
				var el = this;
				
				var hide = false;
				
				if($(el).css('display')=='none'){
					hide = true;
					$(el).show();
				}

				var style_pos = $(el).css('position');
				
				// default to relative
				if (style_pos == 'static') {
					$(el).css('position','relative');
					style_pos = 'relative';
				}
				
				var offset = $(el).offset();
				
				if (offset){
					var delta = {
						left : parseInt($(el).css('left'), 10),
						top: parseInt($(el).css('top'), 10)
					};
					
					// in case of 'auto'
					if (isNaN(delta.left)) 
						delta.left = (style_pos == 'relative') ? 0 : el.offsetLeft;
					if (isNaN(delta.top))
						delta.top = (style_pos == 'relative') ? 0 : el.offsetTop;
					
					if (newOffset.left || newOffset.left===0)
						$(el).css('left',newOffset.left - offset.left + delta.left + 'px');
				
					if (newOffset.top || newOffset.top===0)
						$(el).css('top',newOffset.top - offset.top + delta.top + 'px');
				}
				if(hide) $(el).hide();
			});
		}
	});
})(jQuery);



;(function($){ // secure $ jQuery alias
/*******************************************************************************************/
// jquery.event.hover.js - rev 5 
// PLUS Modification made by Andy Ballingall May 2 2010 to continue the hover state if
// the mouse only transiently moves off the hover element.
// On mouseout, the hover isn't cancelled immediately, but only after a timeout. (Set to the 
// same delay as for the speed evaluation mechanism)
// If the mouse reenters the hover area again before the expiry of this timeout, then the 
// hover continues as if the mouse had never left. Only if the mouse remains outside the
// area for long enough does the hover complete.
// ABHERE - need to share this underneath.
// Copyright (c) 2008, Three Dub Media (http://threedubmedia.com)
// Liscensed under the MIT License (MIT-LICENSE.txt)
// http://www.opensource.org/licenses/mit-license.php
// Created: 2008-06-02 | Updated: 2008-07-30
/*******************************************************************************************/

// See http://blog.threedubmedia.com/2008/08/eventspecialhover.html
//
//	USE THESE PROPERTIES TO CUSTOMIZE SETTINGS...

//	$.event.special.hover.delay = 100; 
//	Defines the delay (msec) while mouse is inside the element before checking the speed

//	$.event.special.hover.speed = 100; 
//	Defines the maximum speed (px/sec) the mouse may be moving to trigger the hover event

// save the old jquery "hover" method
$.fn._hover = $.fn.hover;

// jquery method 
$.fn.hover = function( fn1, fn2, fn3 ) {
	if ( fn3 ) this.bind('hoverstart', fn1 ); // 3 args
	if ( fn2 ) this.bind('hoverend', fn3 ? fn3 : fn2 ); // 2+ args
	return !fn1 ? this.trigger('hover') // 0 args 
		: this.bind('hover', fn3 ? fn2 : fn1 ); // 1+ args
	};	

// special event configuration
var hover = $.event.special.hover = {
	delay: 100, // milliseconds
	speed: 100, // pixels per second
	setup: function( data ){
		data = $.extend({ speed: hover.speed, delay: hover.delay, hovered:0 }, data||{} );
		$.event.add( this, "mouseenter mouseleave", hoverHandler, data );
		},
	teardown: function(){
		$.event.remove( this, "mouseenter mouseleave", hoverHandler );
		}
	};

// shared event handler
function hoverHandler( event ){
	var data = event.data || event;
	switch ( event.type ){
		case 'mouseenter': // mouseover
			data.dist2 = 0; // init mouse distance²
			if (data.hovered) {
				// The timer is currently tracking the time since the mouse last left the element,
				// so cancel it and restore the 
				clearTimeout( data.timer );
				data.event.type = "hover";
			}
			else {
				data.event = event; // store the event
				event.type = "hoverstart"; // hijack event
				if ( $.event.handle.call( this, event ) !== false ){ // handle "hoverstart"
					data.elem = this; // ref to the current element
					$.event.add( this, "mousemove", hoverHandler, data ); // track the mouse
					data.timer = setTimeout( compare, data.delay ); // start async compare
					}
			}
			break;
		case 'mousemove': // track the event, mouse distance² = x² + y²
			data.dist2 += Math.pow( event.pageX-data.event.pageX, 2 ) 
				+ Math.pow( event.pageY-data.event.pageY, 2 ); 
			data.event = event; // store current event
			break;
		case 'mouseleavetimeout':
			data.event.type = "hoverend"; // hijack event
			$.event.handle.call( data.elem, data.event ); // handle "hoverend"
			data.hovered--; // reset flag
			data.type = null;
			break;
		case 'mouseleave': // mouseout
			clearTimeout( data.timer ); // uncompare
			if ( data.hovered ){
				data.type = "mouseleavetimeout";
				data.timer = setTimeout( compare, 100/*data.delay*/);
			}
			else $.event.remove( data.elem, "mousemove", hoverHandler ); // untrack
			break;
		default: // timeout compare // distance² = x² + y²  = ( speed * time )²
			if ( data.dist2 <= Math.pow( data.speed*( data.delay/1e3 ), 2 ) ){ // speed acceptable
				$.event.remove( data.elem, "mousemove", hoverHandler ); // untrack
				data.event.type = "hover"; // hijack event
				if ( $.event.handle.call( data.elem, data.event ) !== false ) // handle "hover"
					data.hovered++; // flag for "hoverend"
				}
			else data.timer = setTimeout( compare, data.delay ); // async recurse
			data.dist2 = 0; // reset distance² for next compare
			break;
		}
	function compare(){ hoverHandler( data ); }; // timeout/recursive function
	};
	
/*******************************************************************************************/
})(jQuery); // confine scope



/**
 * .disableTextSelect - Disable Text Select Plugin
 *
 * Version: 1.1
 * Updated: 2007-11-28
 *
 * Used to stop users from selecting text
 *
 * Copyright (c) 2007 James Dempster (letssurf@gmail.com, http://www.jdempster.com/category/jquery/disabletextselect/)
 *
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 **/

/**
 * Requirements:
 * - jQuery (John Resig, http://www.jquery.com/)
 **/
(function($) {
    if ($.browser.mozilla) {
        $.fn.disableTextSelect = function() {
            return this.each(function() {
                $(this).css({
                    'MozUserSelect' : 'none'
                });
            });
        };
        $.fn.enableTextSelect = function() {
            return this.each(function() {
                $(this).css({
                    'MozUserSelect' : ''
                });
            });
        };
    } else if ($.browser.msie) {
        $.fn.disableTextSelect = function() {
            return this.each(function() {
                $(this).bind('selectstart.disableTextSelect', function() {
                    return false;
                });
            });
        };
        $.fn.enableTextSelect = function() {
            return this.each(function() {
                $(this).unbind('selectstart.disableTextSelect');
            });
        };
    } else {
        $.fn.disableTextSelect = function() {
            return this.each(function() {
                $(this).bind('mousedown.disableTextSelect', function() {
                    return false;
                });
            });
        };
        $.fn.enableTextSelect = function() {
            return this.each(function() {
                $(this).unbind('mousedown.disableTextSelect');
            });
        };
    }
})(jQuery);


