(function($){
	$.fn.myDock = function(options){
		if ( this.length > 1 ){
			this.each(function(){ $(this).myDock(options); });
			return this;
		}
		
		var defaults = {
			scale : 2.0,
			proximity: 100,
			max_horizontal: 523,
			direction: 'v'
		};
		
		var opts = $.extend({}, defaults, options);
		var dock = this;
		var dock_items = dock.find('li.item>a');
		
		var calculate_iconsize = function(link, event)
		{
			var ih = parseFloat($(link).data('iHeight'));
			var iw = parseFloat($(link).data('iWidth'));
			var eh = parseFloat($(link).data('eHeight'));
			var ew = parseFloat($(link).data('eWidth'));
			
			if ( opts.direction == 'h' )
				var proximity = Math.abs((event.pageX + dock.height()) - $(link).position().left - (eh/opts.scale));
			else
				var proximity = Math.abs((event.pageY + dock.width()) - $(link).position().top - (ew/opts.scale));
			
			if ( proximity<opts.proximity ){
				var ratio = ((opts.proximity-proximity)/opts.proximity);
				
				var ah = ratio * (eh-ih);
				var aw = ratio * (ew-iw);
				
				return {'width': iw+aw, 'height': ih+ah};
			} else {
				return {'width': iw, 'height': ih};
			}
		}
		
		this.initialize = function(){
			$.each(dock_items, function(){
				var i_height = parseFloat($(this).height());
				var i_width = parseFloat($(this).width());
				
				$(this).data('iHeight', i_height);
				$(this).data('iWidth', i_width);
				$(this).data('eHeight', i_height * opts.scale);
				$(this).data('eWidth', i_width * opts.scale);
			});	
		};
		
		dock.bind('mouseleave', function(event){
			$.each(dock_items, function(){
				$(this).height($(this).data('iHeight')+'px');
				$(this).width($(this).data('iWidth')+'px');
				$(this).animate({'height':$(this).data('iHeight')+'px', 'width':$(this).data('iWidth')+'px'},'fast');
			});
		}).bind('mousemove', function(event){
			$.each(dock_items, function(){
				if ( event.pageX < opts.max_horizontal ){
					var size = calculate_iconsize(this, event);
					$(this).stop();
					$(this).width(size.width);
					$(this).height(size.height);
				}
			});
		});
		
		return this.initialize();
	};
})(jQuery);
