(function($) {
	
	$.fn.fileInput = function(options) {
		
		var opts = $.extend(defaults, options);
		
		return this.each(function () {
			
			var $this = $(this);
			
			var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
			
			// Add ID to item if it doesn't exist
			if (!$this.attr('id')) {
				$this.attr('id',$this.attr('name'));
			}
			
			// Wrap input in <div> and set styles
			$this.wrap('<div class="'+defaults.windowClass+'">');
			$this.parent('div').before('<div class="'+defaults.fileClass+'">');
			$this.parent('div').css({
				height:defaults.height+'px',
				overflow:'hidden',
				position:'relative',
				outline:'none',
				width:defaults.width+'px'
			});
			
			// Set initial position of file input
			var itemPos = $this.parent('div').position();
			var offset = $this.parent('div').offset();

			$this.css({
				left:'-'+($this.width()-defaults.width)+'px',
				opacity:'0.0',
				position:'absolute',
				top:'0px'
			});
			
			// File input actions
			$this.parent('div').hover(
				function() { if (defaults.windowHover) $(this).addClass(defaults.windowHover); },
				function() { if (defaults.windowHover) $(this).removeClass(defaults.windowHover); }
			).mousedown(
				function() { if (defaults.windowClick) $(this).addClass(defaults.windowClick); }
			).mouseup(
				function() { if (defaults.windowClick) $(this).removeClass(defaults.windowClick); }
			).mousemove(function(e) {
				var x = e.pageX - offset.left;
				var y = e.pageY - offset.top;
				
				$this.css({
					top:(y - $this.height())+'px',
					left:(x - ($this.width()-40))+'px'
				});
			});
			
			// Display file name in window
			$.fn.fileInput.reBind($this);
			
		});
		
	};
	
	// Public function to bind change event to file input
	$.fn.fileInput.reBind = function(myItem) {
		$(myItem).bind('change',function() {
			var myString = $(myItem).val();
			if ($.browser.safari) {
				var myArray = myString.split('/');
			} else if (myString.indexOf('\\')) { // Detect for Windows file pattern
				var myArray = myString.split('\\');
			} else {
				var myArray = myString.split('/');
			}

			var myFile = myArray[myArray.length-1];
			$(myItem).parent('div').prev('.'+defaults.fileClass).html(myFile);
		});
	};
	
	// Plugin defaults
	var defaults = {
		width: 75,						// Width of button
		height: 30,						// Height of button
		windowClass: 'myWindow',	// Class applied to input field wrapper
		windowHover: null,			// Class to be applied on hover (optional)
		windowClick: null,			// Class to be applied on mousedown/mouseup (optional)
		fileClass: 'myFileText'		// Class applied to returned filename text
	};
	
})(jQuery);


$(document).ready(function() {
	$('input[type=file]').fileInput({
		height: 30,
		width: 83
	});
});
