
/*
		$('#waves').sortAnimate({
			sortFromClass : 'waves_sorted',
			speed: 1000
		});
*/	

(function($){

	$.fn.sortAnimate = function(options){
	
		var settings = {
			wrapId			: 'wrap_sorted',
			sortFromClass	: 'sorted',
			speed			: 500,
			callback		: null
		}
		
		$.extend(settings, options || {});

		var _sortObject = null;
		var _object = null;

		/**
		 * Готовим элемент сортировки
		 */
		var _prepareSortElement = function () {

			_sortObject = $('.' + settings.sortFromClass);

			if (!_sortObject.length) {
				throw ('Sorted elements not found. ' + '$(".' + settings.sortFromClass + '")');
			}

			if (!_sortObject.parents('#' + settings.wrapId).length) {

				/*
				 * выставляем объект с отсортированными элементами на позицию оригинального объекта 
				 */

				_sortObject.css({
					display: 'block',
					visibility: 'hidden',
					width: _object.width(),
					height: _object.height()
				});

				_sortObject.wrap('<div/>').parents('div:first')
					.attr('id', settings.wrapId)
					.css({
						position: 'absolute',
						overflow: 'hidden',
						height: '0px',
						width: '0px',
						top: _object.position().top,
						left: _object.position().left
					});
				
				return true;

			}
			
			return false;

		}

		/**
		 * Сортируем
		 */
		var _sort = function () {
			
			if (_object.children().length != _sortObject.children().length) {
				throw ('Count elements in objects not equals');
			}

			_object
				.width(_sortObject.width())
				.height(_sortObject.height());
			
			var _startAnimateCounter = 0;
				
			_object.children()
				.each(function () {
					$(this).css({
						left : $(this).position().left,
						top : $(this).position().top
					})
					.addClass('sort-moved');
				})
				.css('position', 'absolute')
				.each(function () {
					var id = $(this).attr('rel');
					
					if (!_sortObject.children('*[rel=' + id + ']').length) {
						$(this).hide();
						return;
					}
					
					_startAnimateCounter += 1;
					
					$(this).animate({
						top : _sortObject.children('*[rel=' + id + ']').position().top,
						left : _sortObject.children('*[rel=' + id + ']').position().left
					}, settings.speed, function () {
						
						_startAnimateCounter -= 1;
						
						_object
							.html(_sortObject.html())
							.css({
								'width' : 'auto',
								'height' : 'auto'
							});
						
						if (_startAnimateCounter == 0) {
							$('.sort-moved').removeClass('sort-moved');
						
							if (settings.callback != null) {
								settings.callback();
							}
						}
						
					})
					
				});
			
		}


		return this.each(function() {

			_object = $(this);
			
			if (_prepareSortElement()) {
				_sort();
			}
			
		});  
	
	}

})(jQuery);
