/* jQuery Resizable Columns v0.1.0 | http://dobtco.github.io/jquery-resizable-columns/ | Licensed MIT | Built Wed Apr 30 2014 14:24:25 */
var __bind = function(fn, me) {
	return function() {
		return fn.apply(me, arguments);
	};
},
		__slice = [].slice;

(function($, window) {
	var ResizableColumns, parseWidth, pointerX, setWidth;
	parseWidth = function(node) {
		return parseFloat(node.style.width.replace('%', ''));
	};
	setWidth = function(node, width) {
		width = width.toFixed(2);
		return node.style.width = "" + width + "%";
	};
	pointerX = function(e) {
		if (e.type.indexOf('touch') === 0) {
			return (e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]).pageX;
		}
		return e.pageX;
	};
	ResizableColumns = (function() {
		ResizableColumns.prototype.defaults = {
			selector: 'tr th:visible',
			store: window.store,
			syncHandlers: true,
			resizeFromBody: true,
			maxWidth: null,
			minWidth: null
		};

		function ResizableColumns($table, options) {
			this.pointerdown = __bind(this.pointerdown, this);
			this.constrainWidth = __bind(this.constrainWidth, this);
			this.options = $.extend({}, this.defaults, options);
			this.$table = $table;
			this.setHeaders();
			this.restoreColumnWidths();
			this.syncHandleWidths();
			$(window).on('resize.rc', ((function(_this) {
				return function() {
					return _this.syncHandleWidths();
				};
			})(this)));
			if (this.options.start) {
				this.$table.bind('column:resize:start.rc', this.options.start);
			}
			if (this.options.resize) {
				this.$table.bind('column:resize.rc', this.options.resize);
			}
			if (this.options.stop) {
				this.$table.bind('column:resize:stop.rc', this.options.stop);
			}
		}

		ResizableColumns.prototype.triggerEvent = function(type, args, original) {
			var event;
			event = $.Event(type);
			event.originalEvent = $.extend({}, original);
			return this.$table.trigger(event, [this].concat(args || []));
		};

		ResizableColumns.prototype.getColumnId = function($el) {
			return this.$table.data('resizable-columns-id') + '-' + $el.data('resizable-column-id');
		};

		ResizableColumns.prototype.setHeaders = function() {
			this.$tableHeaders = this.$table.find(this.options.selector);
			this.assignPercentageWidths();
			return this.createHandles();
		};

		ResizableColumns.prototype.destroy = function() {
			this.$handleContainer.remove();
			this.$table.removeData('resizableColumns');
			return this.$table.add(window).off('.rc');
		};

		ResizableColumns.prototype.assignPercentageWidths = function() {
			return this.$tableHeaders.each((function(_this) {
				return function(_, el) {
					var $el;
					$el = $(el);
					return setWidth($el[0], $el.outerWidth() / _this.$table.width() * 100);
				};
			})(this));
		};

		ResizableColumns.prototype.createHandles = function() {
			var _ref;
			if ((_ref = this.$handleContainer) != null) {
				_ref.remove();
			}
			this.$table.before((this.$handleContainer = $("<div class='rc-handle-container' />")));
			this.$tableHeaders.each((function(_this) {
				return function(i, el) {
					var $handle;
					if (_this.$tableHeaders.eq(i + 1).length === 0 || (_this.$tableHeaders.eq(i).attr('data-noresize') != null) || (_this.$tableHeaders.eq(i + 1).attr('data-noresize') != null)) {
						return;
					}
					$handle = $("<div class='rc-handle' />");
					$handle.data('th', $(el));
					return $handle.appendTo(_this.$handleContainer);
				};
			})(this));
			return this.$handleContainer.on('mousedown touchstart', '.rc-handle', this.pointerdown);
		};

		ResizableColumns.prototype.syncHandleWidths = function() {
			return this.$handleContainer.width(this.$table.width()).find('.rc-handle').each((function(_this) {
				return function(_, el) {
					var $el;
					$el = $(el);
					return $el.css({
						left: $el.data('th').outerWidth() + ($el.data('th').offset().left - _this.$handleContainer.offset().left),
						height: _this.options.resizeFromBody ? _this.$table.height() : _this.$table.find('thead').height()
					});
				};
			})(this));
		};

		ResizableColumns.prototype.saveColumnWidths = function() {
			return this.$tableHeaders.each((function(_this) {
				return function(_, el) {
					var $el;
					$el = $(el);
					if ($el.attr('data-noresize') == null) {
						if (_this.options.store != null) {
							return _this.options.store.set(_this.getColumnId($el), parseWidth($el[0]));
						}
					}
				};
			})(this));
		};

		ResizableColumns.prototype.restoreColumnWidths = function() {
			return this.$tableHeaders.each((function(_this) {
				return function(_, el) {
					var $el, width;
					$el = $(el);
					if ((_this.options.store != null) && (width = _this.options.store.get(_this.getColumnId($el)))) {
						return setWidth($el[0], width);
					}
				};
			})(this));
		};

		ResizableColumns.prototype.totalColumnWidths = function() {
			var total;
			total = 0;
			this.$tableHeaders.each((function(_this) {
				return function(_, el) {
					return total += parseFloat($(el)[0].style.width.replace('%', ''));
				};
			})(this));
			return total;
		};

		ResizableColumns.prototype.constrainWidth = function(width) {
			if (this.options.minWidth != null) {
				width = Math.max(this.options.minWidth, width);
			}
			if (this.options.maxWidth != null) {
				width = Math.min(this.options.maxWidth, width);
			}
			return width;
		};

		ResizableColumns.prototype.pointerdown = function(e) {
			var $currentGrip, $leftColumn, $ownerDocument, $rightColumn, newWidths, startPosition, widths;
			e.preventDefault();
			$ownerDocument = $(e.currentTarget.ownerDocument);
			startPosition = pointerX(e);
			$currentGrip = $(e.currentTarget);
			$leftColumn = $currentGrip.data('th');
			$rightColumn = this.$tableHeaders.eq(this.$tableHeaders.index($leftColumn) + 1);
			widths = {
				left: parseWidth($leftColumn[0]),
				right: parseWidth($rightColumn[0])
			};
			newWidths = {
				left: widths.left,
				right: widths.right
			};
			this.$handleContainer.add(this.$table).addClass('rc-table-resizing');
			$leftColumn.add($rightColumn).add($currentGrip).addClass('rc-column-resizing');
			this.triggerEvent('column:resize:start', [$leftColumn, $rightColumn, newWidths.left, newWidths.right], e);
			$ownerDocument.on('mousemove.rc touchmove.rc', (function(_this) {
				return function(e) {
					var difference;
					difference = (pointerX(e) - startPosition) / _this.$table.width() * 100;
					setWidth($leftColumn[0], newWidths.left = _this.constrainWidth(widths.left + difference));
					setWidth($rightColumn[0], newWidths.right = _this.constrainWidth(widths.right - difference));
					if (_this.options.syncHandlers != null) {
						_this.syncHandleWidths();
					}
					return _this.triggerEvent('column:resize', [$leftColumn, $rightColumn, newWidths.left, newWidths.right], e);
				};
			})(this));
			return $ownerDocument.one('mouseup touchend', (function(_this) {
				return function() {
					$ownerDocument.off('mousemove.rc touchmove.rc');
					_this.$handleContainer.add(_this.$table).removeClass('rc-table-resizing');
					$leftColumn.add($rightColumn).add($currentGrip).removeClass('rc-column-resizing');
					_this.syncHandleWidths();
					_this.saveColumnWidths();
					return _this.triggerEvent('column:resize:stop', [$leftColumn, $rightColumn, newWidths.left, newWidths.right], e);
				};
			})(this));
		};

		return ResizableColumns;

	})();
	return $.fn.extend({
		resizableColumns: function() {
			var args, option;
			option = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
			return this.each(function() {
				var $table, data;
				$table = $(this);
				data = $table.data('resizableColumns');
				if (!data) {
					$table.data('resizableColumns', (data = new ResizableColumns($table, option)));
				}
				if (typeof option === 'string') {
					return data[option].apply(data, args);
				}
			});
		}
	});
})(window.jQuery, window);
