(function( $ ){

  var methods = {
    init : function( options ) {
      var settings={topCorrection: 0,leftCorrection: 0,overlaySelector:'.file-overlay',zIndex: 100,cursor: 'pointer'};
      $.extend(settings,options);
      
      if (window.opera)
      { 
        return; 
      }
      
      $(this).each(function(){
        var input=$(this);
        var offset=$(this).offset();
        var overlay=$(settings.overlaySelector+':eq(0)').clone();
        
        overlay.insertBefore(input).css('display','block').css('cursor',settings.cursor);
        input.css('opacity',0).css('filter','alpha(opacity=0)').css('z-index',settings.zIndex).css('position','absolute').
          css('cursor',settings.cursor);
        
        overlay.mousemove(function(e){
          $(input).css('top',(e.pageY-2)+'px').css('left',(e.pageX-2)+'px');
        });

        var overlayOffset=overlay.offset();
        var constraints={
          left: overlayOffset.left+settings.leftCorrection,
          top: overlayOffset.top+settings.topCorrection,
          right: overlayOffset.left+overlay.outerWidth()+settings.leftCorrection,
          bottom: overlayOffset.top+overlay.outerHeight()+settings.topCorrection
        };
        
        function resetPosition()
        {
          $(input).css('top', (offset.top + settings.topCorrection) + 'px').css('left', (offset.left + settings.leftCorrection) + 'px');
        }
        
        $(document).mousemove(function(e){
          if (e.pageX > constraints.right || e.pageX < constraints.left || e.pageY < constraints.top || e.pageY > constraints.bottom) {
            resetPosition();
          }
        });
        
        {
          input.change(function(){
        	settings.changeCallback(input,overlay);
          })
        }
        
        overlay.click(function(){
          input.click();
        });
        
        resetPosition();
      });
    }
  };

  $.fn.fileInput = function( method ) {
    
    if ( methods[method] ) {
      return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Method ' +  method + ' does not exist on jQuery.fileInput' );
    }    
  
  };

})( jQuery );

