/* Copyright (c) 2007 Paul Bakaus (paul.bakaus@googlemail.com) and Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * $LastChangedDate: 2007-12-20 15:43:48 +0100 (Do, 20 Dez 2007) $
 * $Rev: 4257 $
 *
 * Version: @VERSION
 *
 * Requires: jQuery 1.2+
 */

(function($){
	
$.dimensions = {
	version: '@VERSION'
};

// Create innerHeight, innerWidth, outerHeight and outerWidth methods
$.each( [ 'Height', 'Width' ], function(i, name){
	
	// innerHeight and innerWidth
	$.fn[ 'inner' + name ] = function() {
		if (!this[0]) return;
		
		var torl = name == 'Height' ? 'Top'    : 'Left',  // top or left
		    borr = name == 'Height' ? 'Bottom' : 'Right'; // bottom or right
		
		return this.is(':visible') ? this[0]['client' + name] : num( this, name.toLowerCase() ) + num(this, 'padding' + torl) + num(this, 'padding' + borr);
	};
	
	// outerHeight and outerWidth
	$.fn[ 'outer' + name ] = function(options) {
		if (!this[0]) return;
		
		var torl = name == 'Height' ? 'Top'    : 'Left',  // top or left
		    borr = name == 'Height' ? 'Bottom' : 'Right'; // bottom or right
		
		options = $.extend({ margin: false }, options || {});
		
		var val = this.is(':visible') ? 
				this[0]['offset' + name] : 
				num( this, name.toLowerCase() )
					+ num(this, 'border' + torl + 'Width') + num(this, 'border' + borr + 'Width')
					+ num(this, 'padding' + torl) + num(this, 'padding' + borr);
		
		return val + (options.margin ? (num(this, 'margin' + torl) + num(this, 'margin' + borr)) : 0);
	};
});

// Create scrollLeft and scrollTop methods
$.each( ['Left', 'Top'], function(i, name) {
	$.fn[ 'scroll' + name ] = function(val) {
		if (!this[0]) return;
		
		return val != undefined ?
		
			// Set the scroll offset
			this.each(function() {
				this == window || this == document ?
					window.scrollTo( 
						name == 'Left' ? val : $(window)[ 'scrollLeft' ](),
						name == 'Top'  ? val : $(window)[ 'scrollTop'  ]()
					) :
					this[ 'scroll' + name ] = val;
			}) :
			
			// Return the scroll offset
			this[0] == window || this[0] == document ?
				self[ (name == 'Left' ? 'pageXOffset' : 'pageYOffset') ] ||
					$.boxModel && document.documentElement[ 'scroll' + name ] ||
					document.body[ 'scroll' + name ] :
				this[0][ 'scroll' + name ];
	};
});

$.fn.extend({
	position: function() {
		var left = 0, top = 0, elem = this[0], offset, parentOffset, offsetParent, results;
		
		if (elem) {
			// Get *real* offsetParent
			offsetParent = this.offsetParent();
			
			// Get correct offsets
			offset       = this.offset();
			parentOffset = offsetParent.offset();
			
			// Subtract element margins
			offset.top  -= num(elem, 'marginTop');
			offset.left -= num(elem, 'marginLeft');
			
			// Add offsetParent borders
			parentOffset.top  += num(offsetParent, 'borderTopWidth');
			parentOffset.left += num(offsetParent, 'borderLeftWidth');
			
			// Subtract the two offsets
			results = {
				top:  offset.top  - parentOffset.top,
				left: offset.left - parentOffset.left
			};
		}
		
		return results;
	},
	
	offsetParent: function() {
		var offsetParent = this[0].offsetParent;
		while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && $.css(offsetParent, 'position') == 'static') )
			offsetParent = offsetParent.offsetParent;
		return $(offsetParent);
	}
});

function num(el, prop) {
	return parseInt($.curCSS(el.jquery?el[0]:el,prop,true))||0;
};

})(jQuery);





(function($) {

	

	//If the UI scope is not available, add it

	$.ui = $.ui || {};

	

	//Add methods that are vital for all mouse interaction stuff (plugin registering)

	$.extend($.ui, {

		plugin: {

			add: function(module, option, set) {

				var proto = $.ui[module].prototype;

				for(var i in set) {

					proto.plugins[i] = proto.plugins[i] || [];

					proto.plugins[i].push([option, set[i]]);

				}

			},

			call: function(instance, name, arguments) {

				var set = instance.plugins[name]; if(!set) return;

				for (var i = 0; i < set.length; i++) {

					if (instance.options[set[i][0]]) set[i][1].apply(instance.element, arguments);

				}

			}	

		},

		cssCache: {},

		css: function(name) {

			if ($.ui.cssCache[name]) return $.ui.cssCache[name];

			

			var tmp = $('<div class="ui-resizable-gen">').addClass(name).css(

				{position:'absolute', top:'-5000px', left:'-5000px', display:'block'}

			).appendTo('body');

			

			//Opera and Safari set width and height to 0px instead of auto

			//Safari returns rgba(0,0,0,0) when bgcolor is not set

			$.ui.cssCache[name] = !!(

				((/^[1-9]/).test(tmp.css('height')) || (/^[1-9]/).test(tmp.css('width')) || 

				!(/none/).test(tmp.css('backgroundImage')) || !(/transparent|rgba\(0, 0, 0, 0\)/).test(tmp.css('backgroundColor')))

			);

			try { $('body').get(0).removeChild(tmp.get(0));	} catch(e){}

			return $.ui.cssCache[name];

		},

		disableSelection: function(e) {

			if (!e) return;

			e.unselectable = "on";

			e.onselectstart = function() {	return false; };

			if (e.style) e.style.MozUserSelect = "none";

		},

		enableSelection: function(e) {

			if (!e) return;

			e.unselectable = "off";

			e.onselectstart = function() { return true; };

			if (e.style) e.style.MozUserSelect = "";

		}

	});

	

	/********************************************************************************************************/



	$.fn.extend({

		mouseInteraction: function(o) {

			return this.each(function() {

				new $.ui.mouseInteraction(this, o);

			});

		},

		removeMouseInteraction: function(o) {

			return this.each(function() {

				if($.data(this, "ui-mouse"))

					$.data(this, "ui-mouse").destroy();

			});

		}

	});

	

	/********************************************************************************************************/

	

	$.ui.mouseInteraction = function(element, options) {

	

		var self = this;

		this.element = element;

		$.data(this.element, "ui-mouse", this);

		this.options = $.extend({}, options);

		

		$(element).bind('mousedown.draggable', function() { return self.click.apply(self, arguments); });

		if($.browser.msie) $(element).attr('unselectable', 'on'); //Prevent text selection in IE

		

	};

	

	$.extend($.ui.mouseInteraction.prototype, {

		

		destroy: function() { $(this.element).unbind('mousedown.draggable'); },

		trigger: function() { return this.click.apply(this, arguments); },

		click: function(e) {

			

			if(

				   e.which != 1 //only left click starts dragging

				|| $.inArray(e.target.nodeName.toLowerCase(), this.options.dragPrevention) != -1 // Prevent execution on defined elements

				|| (this.options.condition && !this.options.condition.apply(this.options.executor || this, [e, this.element])) //Prevent execution on condition

			) return true;

			

			var self = this;

			var initialize = function() {

				self._MP = { left: e.pageX, top: e.pageY }; // Store the click mouse position

				$(document).bind('mouseup.draggable', function() { return self.stop.apply(self, arguments); });

				$(document).bind('mousemove.draggable', function() { return self.drag.apply(self, arguments); });

			};



			if(this.options.delay) {

				if(this.timer) clearInterval(this.timer);

				this.timer = setTimeout(initialize, this.options.delay);

			} else {

				initialize();

			}

			

			return false;

			

		},

		stop: function(e) {			

			

			var o = this.options;

			if(!this.initialized) return $(document).unbind('mouseup.draggable').unbind('mousemove.draggable');



			if(this.options.stop) this.options.stop.call(this.options.executor || this, e, this.element);

			$(document).unbind('mouseup.draggable').unbind('mousemove.draggable');

			this.initialized = false;

			return false;

			

		},

		drag: function(e) {



			var o = this.options;

			if ($.browser.msie && !e.button) return this.stop.apply(this, [e]); // IE mouseup check

			

			if(!this.initialized && (Math.abs(this._MP.left-e.pageX) >= o.distance || Math.abs(this._MP.top-e.pageY) >= o.distance)) {

				if(this.options.start) this.options.start.call(this.options.executor || this, e, this.element);

				this.initialized = true;

			} else {

				if(!this.initialized) return false;

			}



			if(o.drag) o.drag.call(this.options.executor || this, e, this.element);

			return false;

			

		}

	});



 })(jQuery);
 
(function($) {



	$.fn.extend({

		draggable: function(options) {

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

			

			return this.each(function() {

				if (typeof options == "string") {

					var drag = $.data(this, "ui-draggable");

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



				} else if(!$.data(this, "ui-draggable"))

					new $.ui.draggable(this, options);

			});

		}

	});

	

	$.ui.draggable = function(element, options) {

		//Initialize needed constants

		var self = this;

		

		this.element = $(element);

		

		$.data(element, "ui-draggable", this);

		this.element.addClass("ui-draggable");

		

		//Prepare the passed options

		this.options = $.extend({}, options);

		var o = this.options;

		$.extend(o, {

			helper: o.ghosting == true ? 'clone' : (o.helper || 'original'),

			handle : o.handle ? ($(o.handle, element)[0] ? $(o.handle, element) : this.element) : this.element,

			appendTo: o.appendTo || 'parent'		

		});

		

		$(element).bind("setData.draggable", function(event, key, value){

			self.options[key] = value;

		}).bind("getData.draggable", function(event, key){

			return self.options[key];

		});

		

		//Initialize mouse events for interaction

		$(o.handle).mouseInteraction({

			executor: this,

			delay: o.delay,

			distance: o.distance || 0,

			dragPrevention: o.prevention ? o.prevention.toLowerCase().split(',') : ['input','textarea','button','select','option'],

			start: this.start,

			stop: this.stop,

			drag: this.drag,

			condition: function(e) { return !(e.target.className.indexOf("ui-resizable-handle") != -1 || this.disabled); }

		});

		

		//Position the node

		if(o.helper == 'original' && (this.element.css('position') == 'static' || this.element.css('position') == ''))

			this.element.css('position', 'relative');

		

	};

	

	$.extend($.ui.draggable.prototype, {

		plugins: {},

		ui: function(e) {

			return {

				helper: this.helper,

				position: this.position,

				absolutePosition: this.positionAbs,

				instance: this,

				options: this.options					

			};

		},

		propagate: function(n,e) {

			$.ui.plugin.call(this, n, [e, this.ui()]);

			return this.element.triggerHandler(n == "drag" ? n : "drag"+n, [e, this.ui()], this.options[n]);

		},

		destroy: function() {

			this.handle.removeMouseInteraction();

			this.element

				.removeClass("ui-draggable ui-draggable-disabled")

				.removeData("ui-draggable")

				.unbind(".draggable");

		},

		enable: function() {

			this.element.removeClass("ui-draggable-disabled");

			this.disabled = false;

		},

		disable: function() {

			this.element.addClass("ui-draggable-disabled");

			this.disabled = true;

		},

		recallOffset: function(e) {



			var elementPosition = { left: this.elementOffset.left - this.offsetParentOffset.left, top: this.elementOffset.top - this.offsetParentOffset.top };

			var r = this.helper.css('position') == 'relative';



			//Generate the original position

			this.originalPosition = {

				left: (r ? parseInt(this.helper.css('left'),10) || 0 : elementPosition.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft)),

				top: (r ? parseInt(this.helper.css('top'),10) || 0 : elementPosition.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop))

			};

			

			//Generate a flexible offset that will later be subtracted from e.pageX/Y

			this.offset = {left: this._pageX - this.originalPosition.left, top: this._pageY - this.originalPosition.top };

			

		},

		start: function(e) {

			

			var o = this.options;

			if($.ui.ddmanager) $.ui.ddmanager.current = this;

			

			//Create and append the visible helper

			this.helper = typeof o.helper == 'function' ? $(o.helper.apply(this.element[0], [e])) : (o.helper == 'clone' ? this.element.clone().appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo)) : this.element);

			if(this.helper[0] != this.element[0]) this.helper.css('position', 'absolute');

			if(!this.helper.parents('body').length) this.helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));



			//Find out the next positioned parent

			this.offsetParent = (function(cp) {

				while(cp) {

					if(cp.style && (/(absolute|relative|fixed)/).test($.css(cp,'position'))) return $(cp);

					cp = cp.parentNode ? cp.parentNode : null;

				}; return $("body");		

			})(this.helper[0].parentNode);

			

			//Prepare variables for position generation

			this.elementOffset = this.element.offset();

			this.offsetParentOffset = this.offsetParent.offset();

			var elementPosition = { left: this.elementOffset.left - this.offsetParentOffset.left, top: this.elementOffset.top - this.offsetParentOffset.top };

			this._pageX = e.pageX; this._pageY = e.pageY;

			this.clickOffset = { left: e.pageX - this.elementOffset.left, top: e.pageY - this.elementOffset.top };

			var r = this.helper.css('position') == 'relative';



			//Generate the original position

			this.originalPosition = {

				left: (r ? parseInt(this.helper.css('left'),10) || 0 : elementPosition.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft)),

				top: (r ? parseInt(this.helper.css('top'),10) || 0 : elementPosition.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop))

			};

			

			//If we have a fixed element, we must subtract the scroll offset again

			if(this.element.css('position') == 'fixed') {

				this.originalPosition.top -= this.offsetParent[0] == document.body ? $(document).scrollTop() : this.offsetParent[0].scrollTop;

				this.originalPosition.left -= this.offsetParent[0] == document.body ? $(document).scrollLeft() : this.offsetParent[0].scrollLeft;

			}

			

			//Generate a flexible offset that will later be subtracted from e.pageX/Y

			this.offset = {left: e.pageX - this.originalPosition.left, top: e.pageY - this.originalPosition.top };

			

			//Call plugins and callbacks

			this.propagate("start", e);



			this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() };

			if ($.ui.ddmanager && !o.dropBehaviour) $.ui.ddmanager.prepareOffsets(this, e);

			

			//If we have something in cursorAt, we'll use it

			if(o.cursorAt) {

				if(o.cursorAt.top != undefined || o.cursorAt.bottom != undefined) {

					this.offset.top -= this.clickOffset.top - (o.cursorAt.top != undefined ? o.cursorAt.top : (this.helperProportions.height - o.cursorAt.bottom));

					this.clickOffset.top = (o.cursorAt.top != undefined ? o.cursorAt.top : (this.helperProportions.height - o.cursorAt.bottom));

				}

				if(o.cursorAt.left != undefined || o.cursorAt.right != undefined) {

					this.offset.left -= this.clickOffset.left - (o.cursorAt.left != undefined ? o.cursorAt.left : (this.helperProportions.width - o.cursorAt.right));

					this.clickOffset.left = (o.cursorAt.left != undefined ? o.cursorAt.left : (this.helperProportions.width - o.cursorAt.right));

				}

			}



			return false;



		},

		clear: function() {

			if($.ui.ddmanager) $.ui.ddmanager.current = null;

			this.helper = null;

		},

		stop: function(e) {



			//If we are using droppables, inform the manager about the drop

			if ($.ui.ddmanager && !this.options.dropBehaviour)

				$.ui.ddmanager.drop(this, e);

				

			//Call plugins and trigger callbacks

			this.propagate("stop", e);

			

			if(this.cancelHelperRemoval) return false;			

			if(this.options.helper != 'original') this.helper.remove();

			this.clear();



			return false;

		},

		drag: function(e) {



			//Compute the helpers position

			this.position = { top: e.pageY - this.offset.top, left: e.pageX - this.offset.left };

			this.positionAbs = { left: e.pageX - this.clickOffset.left, top: e.pageY - this.clickOffset.top };



			//Call plugins and callbacks			

			this.position = this.propagate("drag", e) || this.position;

			

			this.helper.css({ left: this.position.left+'px', top: this.position.top+'px' }); // Stick the helper to the cursor

			if($.ui.ddmanager) $.ui.ddmanager.drag(this, e);

			return false;

			

		}

	});



})(jQuery);



(function($) {



	$.fn.extend({

		droppable: function(options) {

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

			

			return this.each(function() {

				if (typeof options == "string") {

					var drop = $.data(this, "ui-droppable");

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



				} else if(!$.data(this, "ui-droppable"))

					new $.ui.droppable(this, options);

			});

		}

	});



	

	$.ui.droppable = function(element, options) {



		//Initialize needed constants			

		this.element = $(element);

		$.data(element, "ui-droppable", this);

		this.element.addClass("ui-droppable");		

		

		//Prepare the passed options

		this.options = $.extend({}, options);

		var o = this.options; var accept = o.accept;

		$.extend(o, {

			accept: o.accept && o.accept.constructor == Function ? o.accept : function(d) {

				return $(d).is(accept);	

			},

			tolerance: o.tolerance || 'intersect'		

		});

		

		$(element).bind("setData.draggable", function(event, key, value){

			o[key] = value;

		}).bind("getData.draggable", function(event, key){

			return o[key];

		});

		

		//Store the droppable's proportions

		this.proportions = { width: this.element.outerWidth(), height: this.element.outerHeight() };

		

		// Add the reference and positions to the manager

		$.ui.ddmanager.droppables.push({ item: this, over: 0, out: 1 });

			

	};

	

	$.extend($.ui.droppable.prototype, {

		plugins: {},

		ui: function(c) {

			return {

				instance: this,

				draggable: c.element,

				helper: c.helper,

				position: c.position,

				absolutePosition: c.positionAbs,

				options: this.options	

			};		

		},

		destroy: function() {

			var drop = $.ui.ddmanager.droppables;

			for ( var i = 0; i < drop.length; i++ )

				if ( drop[i].item == this )

					drop.splice(i, 1);

			

			this.element

				.removeClass("ui-droppable ui-droppable-disabled")

				.removeData("ui-droppable")

				.unbind(".droppable");

		},

		enable: function() {

			this.element.removeClass("ui-droppable-disabled");

			this.disabled = false;

		},

		disable: function() {

			this.element.addClass("ui-droppable-disabled");

			this.disabled = true;

		},

		over: function(e) {



			var draggable = $.ui.ddmanager.current;

			if (!draggable || draggable.element[0] == this.element[0]) return; // Bail if draggable and droppable are same element

			

			if (this.options.accept.call(this.element,draggable.element)) {

				$.ui.plugin.call(this, 'over', [e, this.ui(draggable)]);

				this.element.triggerHandler("dropover", [e, this.ui(draggable)], this.options.over);

			}

			

		},

		out: function(e) {



			var draggable = $.ui.ddmanager.current;

			if (!draggable || draggable.element[0] == this.element[0]) return; // Bail if draggable and droppable are same element



			if (this.options.accept.call(this.element,draggable.element)) {

				$.ui.plugin.call(this, 'out', [e, this.ui(draggable)]);

				this.element.triggerHandler("dropout", [e, this.ui(draggable)], this.options.out);

			}

			

		},

		drop: function(e) {



			var draggable = $.ui.ddmanager.current;

			if (!draggable || draggable.element[0] == this.element[0]) return; // Bail if draggable and droppable are same element

			

			if(this.options.accept.call(this.element,draggable.element)) {

				$.ui.plugin.call(this, 'drop', [e, this.ui(draggable)]);

				this.element.triggerHandler("drop", [e, this.ui(draggable)], this.options.drop);

			}

			

		},

		activate: function(e) {



			var draggable = $.ui.ddmanager.current;

			$.ui.plugin.call(this, 'activate', [e, this.ui(draggable)]);

			if(draggable) this.element.triggerHandler("dropactivate", [e, this.ui(draggable)], this.options.activate);

				

		},

		deactivate: function(e) {

			

			var draggable = $.ui.ddmanager.current;

			$.ui.plugin.call(this, 'deactivate', [e, this.ui(draggable)]);

			if(draggable) this.element.triggerHandler("dropdeactivate", [e, this.ui(draggable)], this.options.deactivate);

			

		}

	});

	

	$.ui.intersect = function(draggable, droppable, toleranceMode) {



		if (!droppable.offset) return false;

		

		var x1 = draggable.positionAbs.left, x2 = x1 + draggable.helperProportions.width,

		    y1 = draggable.positionAbs.top, y2 = y1 + draggable.helperProportions.height;

		var l = droppable.offset.left, r = l + droppable.item.proportions.width, 

		    t = droppable.offset.top,  b = t + droppable.item.proportions.height;



		switch (toleranceMode) {

			case 'fit':

				return (   l < x1 && x2 < r

					&& t < y1 && y2 < b);

				break;

			case 'intersect':

				return (   l < x1 + (draggable.helperProportions.width  / 2)        // Right Half

					&&     x2 - (draggable.helperProportions.width  / 2) < r    // Left Half

					&& t < y1 + (draggable.helperProportions.height / 2)        // Bottom Half

					&&     y2 - (draggable.helperProportions.height / 2) < b ); // Top Half

				break;

			case 'pointer':

				return (   l < (draggable.positionAbs.left + draggable.clickOffset.left) && (draggable.positionAbs.left + draggable.clickOffset.left) < r

					&& t < (draggable.positionAbs.top + draggable.clickOffset.top) && (draggable.positionAbs.top + draggable.clickOffset.top) < b);

				break;

			case 'touch':

				return (   (l < x1 && x1 < r && t < y1 && y1 < b)    // Top-Left Corner

					|| (l < x1 && x1 < r && t < y2 && y2 < b)    // Bottom-Left Corner

					|| (l < x2 && x2 < r && t < y1 && y1 < b)    // Top-Right Corner

					|| (l < x2 && x2 < r && t < y2 && y2 < b) ); // Bottom-Right Corner

				break;

			default:

				return false;

				break;

			}

		

	};

	

	/*

		This manager tracks offsets of draggables and droppables

	*/

	$.ui.ddmanager = {

		current: null,

		droppables: [],

		prepareOffsets: function(t, e) {



			var m = $.ui.ddmanager.droppables;

			for (var i = 0; i < m.length; i++) {

				

				if(m[i].item.disabled || (t && !m[i].item.options.accept.call(m[i].item.element,t.element))) continue;

				m[i].offset = $(m[i].item.element).offset();

				

				if(t) m[i].item.activate.call(m[i].item, e); //Activate the droppable if used directly from draggables

					

			}

			

		},

		drop: function(draggable, e) {

			

			$.each($.ui.ddmanager.droppables, function() {

				

				if (!this.item.disabled && $.ui.intersect(draggable, this, this.item.options.tolerance))

					this.item.drop.call(this.item, e);

					

				if (!this.item.disabled && this.item.options.accept.call(this.item.element,draggable.element)) {

					this.out = 1; this.over = 0;

					this.item.deactivate.call(this.item, e);

				}

				

			});

			

		},

		drag: function(draggable, e) {

			

			//If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.

			if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets();

		

			//Run through all draggables and check their positions based on specific tolerance options

			$.each($.ui.ddmanager.droppables, function() {



				if(this.item.disabled) return false; 

				var intersects = $.ui.intersect(draggable, this, this.item.options.tolerance);



				var c = !intersects && this.over == 1 ? 'out' : (intersects && this.over == 0 ? 'over' : null);

				if(!c) return;

					

				this[c] = 1; this[c == 'out' ? 'over' : 'out'] = 0;

				this.item[c].call(this.item, e);

					

			});

			

		}

	};

	

})(jQuery);



/*

 * 'this' -> original element

 * 1. argument: browser event

 * 2.argument: ui object

 */



(function($) {



	$.ui.plugin.add("draggable", "cursor", {

		start: function(e,ui) {

			var t = $('body');

			if (t.css("cursor")) ui.options._cursor = t.css("cursor");

			t.css("cursor", ui.options.cursor);

		},

		stop: function(e,ui) {

			if (ui.options._cursor) $('body').css("cursor", ui.options._cursor);

		}

	});



	$.ui.plugin.add("draggable", "zIndex", {

		start: function(e,ui) {

			var t = $(ui.helper);

			if(t.css("zIndex")) ui.options._zIndex = t.css("zIndex");

			t.css('zIndex', ui.options.zIndex);

		},

		stop: function(e,ui) {

			if(ui.options._zIndex) $(ui.helper).css('zIndex', ui.options._zIndex);

		}

	});



	$.ui.plugin.add("draggable", "opacity", {

		start: function(e,ui) {

			var t = $(ui.helper);

			if(t.css("opacity")) ui.options._opacity = t.css("opacity");

			t.css('opacity', ui.options.opacity);

		},

		stop: function(e,ui) {

			if(ui.options._opacity) $(ui.helper).css('opacity', ui.options._opacity);

		}

	});





	$.ui.plugin.add("draggable", "revert", {

		stop: function(e,ui) {

			var self = ui.instance;

			self.cancelHelperRemoval = true;

			$(ui.helper).animate({ left: self.originalPosition.left, top: self.originalPosition.top }, parseInt(ui.options.revert, 10) || 500, function() {

				if(ui.options.helper != 'original') self.helper.remove();

				self.clear();

			});

		}

	});



	$.ui.plugin.add("draggable", "iframeFix", {

		start: function(e,ui) {



			var o = ui.options;

			if(ui.instance.slowMode) return; // Make clones on top of iframes (only if we are not in slowMode)

			

			if(o.iframeFix.constructor == Array) {

				for(var i=0;i<o.iframeFix.length;i++) {

					var co = $(o.iframeFix[i]).offset({ border: false });

					$('<div class="DragDropIframeFix"" style="background: #fff;"></div>').css("width", $(o.iframeFix[i])[0].offsetWidth+"px").css("height", $(o.iframeFix[i])[0].offsetHeight+"px").css("position", "absolute").css("opacity", "0.001").css("z-index", "1000").css("top", co.top+"px").css("left", co.left+"px").appendTo("body");

				}		

			} else {

				$("iframe").each(function() {					

					var co = $(this).offset({ border: false });

					$('<div class="DragDropIframeFix" style="background: #fff;"></div>').css("width", this.offsetWidth+"px").css("height", this.offsetHeight+"px").css("position", "absolute").css("opacity", "0.001").css("z-index", "1000").css("top", co.top+"px").css("left", co.left+"px").appendTo("body");

				});							

			}



		},

		stop: function(e,ui) {

			if(ui.options.iframeFix) $("div.DragDropIframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers	

		}

	});

	

	$.ui.plugin.add("draggable", "containment", {

		start: function(e,ui) {



			var o = ui.options;

			if((o.containment.left != undefined || o.containment.constructor == Array) && !o._containment) return;

			if(!o._containment) o._containment = o.containment;



			if(o._containment == 'parent') o._containment = this[0].parentNode;

			if(o._containment == 'document') {

				o.containment = [

					0,

					0,

					$(document).width(),

					($(document).height() || document.body.parentNode.scrollHeight)

				];

			} else { //I'm a node, so compute top/left/right/bottom



				var ce = $(o._containment)[0];

				var co = $(o._containment).offset();



				o.containment = [

					co.left,

					co.top,

					co.left+(ce.offsetWidth || ce.scrollWidth),

					co.top+(ce.offsetHeight || ce.scrollHeight)

				];

			}



		},

		drag: function(e,ui) {



			var o = ui.options;

			var h = ui.helper;

			var c = o.containment;

			var self = ui.instance;

			

			if(c.constructor == Array) {

				if((ui.absolutePosition.left < c[0])) self.position.left = c[0] - (self.offset.left - self.clickOffset.left);

				if((ui.absolutePosition.top < c[1])) self.position.top = c[1] - (self.offset.top - self.clickOffset.top);

				if(ui.absolutePosition.left - c[2] + self.helperProportions.width >= 0) self.position.left = c[2] - (self.offset.left - self.clickOffset.left) - self.helperProportions.width;

				if(ui.absolutePosition.top - c[3] + self.helperProportions.height >= 0) self.position.top = c[3] - (self.offset.top - self.clickOffset.top) - self.helperProportions.height;

			} else {

				if((ui.position.left < c.left)) self.position.left = c.left;

				if((ui.position.top < c.top)) self.position.top = c.top;

				if(ui.position.left - self.offsetParent.innerWidth() + self.helperProportions.width + c.right + (parseInt(self.offsetParent.css("borderLeftWidth"), 10) || 0) + (parseInt(self.offsetParent.css("borderRightWidth"), 10) || 0) >= 0) self.position.left = self.offsetParent.innerWidth() - self.helperProportions.width - c.right - (parseInt(self.offsetParent.css("borderLeftWidth"), 10) || 0) - (parseInt(self.offsetParent.css("borderRightWidth"), 10) || 0);

				if(ui.position.top - self.offsetParent.innerHeight() + self.helperProportions.height + c.bottom + (parseInt(self.offsetParent.css("borderTopWidth"), 10) || 0) + (parseInt(self.offsetParent.css("borderBottomWidth"), 10) || 0) >= 0) self.position.top = self.offsetParent.innerHeight() - self.helperProportions.height - c.bottom - (parseInt(self.offsetParent.css("borderTopWidth"), 10) || 0) - (parseInt(self.offsetParent.css("borderBottomWidth"), 10) || 0);

			}



		}

	});



	$.ui.plugin.add("draggable", "grid", {

		drag: function(e,ui) {

			var o = ui.options;

			ui.instance.position.left = ui.instance.originalPosition.left + Math.round((e.pageX - ui.instance._pageX) / o.grid[0]) * o.grid[0];

			ui.instance.position.top = ui.instance.originalPosition.top + Math.round((e.pageY - ui.instance._pageY) / o.grid[1]) * o.grid[1];

		}

	});



	$.ui.plugin.add("draggable", "axis", {

		drag: function(e,ui) {

			var o = ui.options;

			if(o.constraint) o.axis = o.constraint; //Legacy check

			o.axis == 'x' ? ui.instance.position.top = ui.instance.originalPosition.top : ui.instance.position.left = ui.instance.originalPosition.left;

		}

	});



	$.ui.plugin.add("draggable", "scroll", {

		start: function(e,ui) {

			var o = ui.options;

			o.scrollSensitivity	= o.scrollSensitivity || 20;

			o.scrollSpeed		= o.scrollSpeed || 20;



			ui.instance.overflowY = function(el) {

				do { if(/auto|scroll/.test(el.css('overflow')) || (/auto|scroll/).test(el.css('overflow-y'))) return el; el = el.parent(); } while (el[0].parentNode);

				return $(document);

			}(this);

			ui.instance.overflowX = function(el) {

				do { if(/auto|scroll/.test(el.css('overflow')) || (/auto|scroll/).test(el.css('overflow-x'))) return el; el = el.parent(); } while (el[0].parentNode);

				return $(document);

			}(this);

		},

		drag: function(e,ui) {

			

			var o = ui.options;

			var i = ui.instance;



			if(i.overflowY[0] != document && i.overflowY[0].tagName != 'HTML') {

				if(i.overflowY[0].offsetHeight - (ui.position.top - i.overflowY[0].scrollTop + i.clickOffset.top) < o.scrollSensitivity)

					i.overflowY[0].scrollTop = i.overflowY[0].scrollTop + o.scrollSpeed;

				if((ui.position.top - i.overflowY[0].scrollTop + i.clickOffset.top) < o.scrollSensitivity)

					i.overflowY[0].scrollTop = i.overflowY[0].scrollTop - o.scrollSpeed;				

			} else {

				//$(document.body).append('<p>'+(e.pageY - $(document).scrollTop())+'</p>');

				if(e.pageY - $(document).scrollTop() < o.scrollSensitivity)

					$(document).scrollTop($(document).scrollTop() - o.scrollSpeed);

				if($(window).height() - (e.pageY - $(document).scrollTop()) < o.scrollSensitivity)

					$(document).scrollTop($(document).scrollTop() + o.scrollSpeed);

			}

			

			if(i.overflowX[0] != document && i.overflowX[0].tagName != 'HTML') {

				if(i.overflowX[0].offsetWidth - (ui.position.left - i.overflowX[0].scrollLeft + i.clickOffset.left) < o.scrollSensitivity)

					i.overflowX[0].scrollLeft = i.overflowX[0].scrollLeft + o.scrollSpeed;

				if((ui.position.top - i.overflowX[0].scrollLeft + i.clickOffset.left) < o.scrollSensitivity)

					i.overflowX[0].scrollLeft = i.overflowX[0].scrollLeft - o.scrollSpeed;				

			} else {

				if(e.pageX - $(document).scrollLeft() < o.scrollSensitivity)

					$(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);

				if($(window).width() - (e.pageX - $(document).scrollLeft()) < o.scrollSensitivity)

					$(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);

			}

			

			ui.instance.recallOffset(e);



		}

	});

	

	$.ui.plugin.add("draggable", "snap", {

		start: function(e,ui) {

			

			ui.instance.snapElements = [];

			$(ui.options.snap === true ? '.ui-draggable' : ui.options.snap).each(function() {

				var $t = $(this); var $o = $t.offset();

				if(this != ui.instance.element[0]) ui.instance.snapElements.push({

					item: this,

					width: $t.outerWidth(),

					height: $t.outerHeight(),

					top: $o.top,

					left: $o.left

				});

			});

			

		},

		drag: function(e,ui) {



			var d = ui.options.snapTolerance || 20;

			var x1 = ui.absolutePosition.left, x2 = x1 + ui.instance.helperProportions.width,

			    y1 = ui.absolutePosition.top, y2 = y1 + ui.instance.helperProportions.height;



			for (var i = ui.instance.snapElements.length - 1; i >= 0; i--){



				var l = ui.instance.snapElements[i].left, r = l + ui.instance.snapElements[i].width, 

				    t = ui.instance.snapElements[i].top,  b = t + ui.instance.snapElements[i].height;



				//Yes, I know, this is insane ;)

				if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) continue;



				if(ui.options.snapMode != 'inner') {

					var ts = Math.abs(t - y2) <= 20;

					var bs = Math.abs(b - y1) <= 20;

					var ls = Math.abs(l - x2) <= 20;

					var rs = Math.abs(r - x1) <= 20;

					if(ts) ui.position.top = t - ui.instance.offset.top + ui.instance.clickOffset.top - ui.instance.helperProportions.height;

					if(bs) ui.position.top = b - ui.instance.offset.top + ui.instance.clickOffset.top;

					if(ls) ui.position.left = l - ui.instance.offset.left + ui.instance.clickOffset.left - ui.instance.helperProportions.width;

					if(rs) ui.position.left = r - ui.instance.offset.left + ui.instance.clickOffset.left;

				}

				

				if(ui.options.snapMode != 'outer') {

					var ts = Math.abs(t - y1) <= 20;

					var bs = Math.abs(b - y2) <= 20;

					var ls = Math.abs(l - x1) <= 20;

					var rs = Math.abs(r - x2) <= 20;

					if(ts) ui.position.top = t - ui.instance.offset.top + ui.instance.clickOffset.top;

					if(bs) ui.position.top = b - ui.instance.offset.top + ui.instance.clickOffset.top - ui.instance.helperProportions.height;

					if(ls) ui.position.left = l - ui.instance.offset.left + ui.instance.clickOffset.left;

					if(rs) ui.position.left = r - ui.instance.offset.left + ui.instance.clickOffset.left - ui.instance.helperProportions.width;

				}



			};

		}

	});



	//TODO: wrapHelper, snap



})(jQuery);

/* jquery.ui.droppable */

(function($) {



	$.fn.extend({

		droppable: function(options) {

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

			

			return this.each(function() {

				if (typeof options == "string") {

					var drop = $.data(this, "ui-droppable");

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



				} else if(!$.data(this, "ui-droppable"))

					new $.ui.droppable(this, options);

			});

		}

	});



	

	$.ui.droppable = function(element, options) {



		//Initialize needed constants			

		this.element = $(element);

		$.data(element, "ui-droppable", this);

		this.element.addClass("ui-droppable");		

		

		//Prepare the passed options

		this.options = $.extend({}, options);

		var o = this.options; var accept = o.accept;

		$.extend(o, {

			accept: o.accept && o.accept.constructor == Function ? o.accept : function(d) {

				return $(d).is(accept);	

			},

			tolerance: o.tolerance || 'intersect'		

		});

		

		$(element).bind("setData.draggable", function(event, key, value){

			o[key] = value;

		}).bind("getData.draggable", function(event, key){

			return o[key];

		});

		

		//Store the droppable's proportions

		this.proportions = { width: this.element.outerWidth(), height: this.element.outerHeight() };

		

		// Add the reference and positions to the manager

		$.ui.ddmanager.droppables.push({ item: this, over: 0, out: 1 });

			

	};

	

	$.extend($.ui.droppable.prototype, {

		plugins: {},

		ui: function(c) {

			return {

				instance: this,

				draggable: c.element,

				helper: c.helper,

				position: c.position,

				absolutePosition: c.positionAbs,

				options: this.options	

			};		

		},

		destroy: function() {

			var drop = $.ui.ddmanager.droppables;

			for ( var i = 0; i < drop.length; i++ )

				if ( drop[i].item == this )

					drop.splice(i, 1);

			

			this.element

				.removeClass("ui-droppable ui-droppable-disabled")

				.removeData("ui-droppable")

				.unbind(".droppable");

		},

		enable: function() {

			this.element.removeClass("ui-droppable-disabled");

			this.disabled = false;

		},

		disable: function() {

			this.element.addClass("ui-droppable-disabled");

			this.disabled = true;

		},

		over: function(e) {



			var draggable = $.ui.ddmanager.current;

			if (!draggable || draggable.element[0] == this.element[0]) return; // Bail if draggable and droppable are same element

			

			if (this.options.accept.call(this.element,draggable.element)) {

				$.ui.plugin.call(this, 'over', [e, this.ui(draggable)]);

				this.element.triggerHandler("dropover", [e, this.ui(draggable)], this.options.over);

			}

			

		},

		out: function(e) {



			var draggable = $.ui.ddmanager.current;

			if (!draggable || draggable.element[0] == this.element[0]) return; // Bail if draggable and droppable are same element



			if (this.options.accept.call(this.element,draggable.element)) {

				$.ui.plugin.call(this, 'out', [e, this.ui(draggable)]);

				this.element.triggerHandler("dropout", [e, this.ui(draggable)], this.options.out);

			}

			

		},

		drop: function(e) {



			var draggable = $.ui.ddmanager.current;

			if (!draggable || draggable.element[0] == this.element[0]) return; // Bail if draggable and droppable are same element

			

			if(this.options.accept.call(this.element,draggable.element)) {

				$.ui.plugin.call(this, 'drop', [e, this.ui(draggable)]);

				this.element.triggerHandler("drop", [e, this.ui(draggable)], this.options.drop);

			}

			

		},

		activate: function(e) {



			var draggable = $.ui.ddmanager.current;

			$.ui.plugin.call(this, 'activate', [e, this.ui(draggable)]);

			if(draggable) this.element.triggerHandler("dropactivate", [e, this.ui(draggable)], this.options.activate);

				

		},

		deactivate: function(e) {

			

			var draggable = $.ui.ddmanager.current;

			$.ui.plugin.call(this, 'deactivate', [e, this.ui(draggable)]);

			if(draggable) this.element.triggerHandler("dropdeactivate", [e, this.ui(draggable)], this.options.deactivate);

			

		}

	});

	

	$.ui.intersect = function(draggable, droppable, toleranceMode) {



		if (!droppable.offset) return false;

		

		var x1 = draggable.positionAbs.left, x2 = x1 + draggable.helperProportions.width,

		    y1 = draggable.positionAbs.top, y2 = y1 + draggable.helperProportions.height;

		var l = droppable.offset.left, r = l + droppable.item.proportions.width, 

		    t = droppable.offset.top,  b = t + droppable.item.proportions.height;



		switch (toleranceMode) {

			case 'fit':

				return (   l < x1 && x2 < r

					&& t < y1 && y2 < b);

				break;

			case 'intersect':

				return (   l < x1 + (draggable.helperProportions.width  / 2)        // Right Half

					&&     x2 - (draggable.helperProportions.width  / 2) < r    // Left Half

					&& t < y1 + (draggable.helperProportions.height / 2)        // Bottom Half

					&&     y2 - (draggable.helperProportions.height / 2) < b ); // Top Half

				break;

			case 'pointer':

				return (   l < (draggable.positionAbs.left + draggable.clickOffset.left) && (draggable.positionAbs.left + draggable.clickOffset.left) < r

					&& t < (draggable.positionAbs.top + draggable.clickOffset.top) && (draggable.positionAbs.top + draggable.clickOffset.top) < b);

				break;

			case 'touch':

				return (   (l < x1 && x1 < r && t < y1 && y1 < b)    // Top-Left Corner

					|| (l < x1 && x1 < r && t < y2 && y2 < b)    // Bottom-Left Corner

					|| (l < x2 && x2 < r && t < y1 && y1 < b)    // Top-Right Corner

					|| (l < x2 && x2 < r && t < y2 && y2 < b) ); // Bottom-Right Corner

				break;

			default:

				return false;

				break;

			}

		

	};

	

	/*

		This manager tracks offsets of draggables and droppables

	*/

	$.ui.ddmanager = {

		current: null,

		droppables: [],

		prepareOffsets: function(t, e) {



			var m = $.ui.ddmanager.droppables;

			for (var i = 0; i < m.length; i++) {

				

				if(m[i].item.disabled || (t && !m[i].item.options.accept.call(m[i].item.element,t.element))) continue;

				m[i].offset = $(m[i].item.element).offset();

				

				if(t) m[i].item.activate.call(m[i].item, e); //Activate the droppable if used directly from draggables

					

			}

			

		},

		drop: function(draggable, e) {

			

			$.each($.ui.ddmanager.droppables, function() {

				

				if (!this.item.disabled && $.ui.intersect(draggable, this, this.item.options.tolerance))

					this.item.drop.call(this.item, e);

					

				if (!this.item.disabled && this.item.options.accept.call(this.item.element,draggable.element)) {

					this.out = 1; this.over = 0;

					this.item.deactivate.call(this.item, e);

				}

				

			});

			

		},

		drag: function(draggable, e) {

			

			//If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.

			if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets();

		

			//Run through all draggables and check their positions based on specific tolerance options

			$.each($.ui.ddmanager.droppables, function() {



				if(this.item.disabled) return false; 

				var intersects = $.ui.intersect(draggable, this, this.item.options.tolerance);



				var c = !intersects && this.over == 1 ? 'out' : (intersects && this.over == 0 ? 'over' : null);

				if(!c) return;

					

				this[c] = 1; this[c == 'out' ? 'over' : 'out'] = 0;

				this.item[c].call(this.item, e);

					

			});

			

		}

	};

	

})(jQuery);

/*  jquery.ui.droppable.ext */

(function($) {



	$.ui.plugin.add("droppable", "activeClass", {

		activate: function(e,ui) {

			$(this).addClass(ui.options.activeClass);

		},

		deactivate: function(e,ui) {

			$(this).removeClass(ui.options.activeClass);

		},

		drop: function(e,ui) {

			$(this).removeClass(ui.options.activeClass);

		}

	});



	$.ui.plugin.add("droppable", "hoverClass", {

		over: function(e,ui) {

			$(this).addClass(ui.options.hoverClass);

		},

		out: function(e,ui) {

			$(this).removeClass(ui.options.hoverClass);

		},

		drop: function(e,ui) {

			$(this).removeClass(ui.options.hoverClass);

		}

	});	



})(jQuery);






