


	
 
    function fileFromPath(file){
        return file.replace(/.*(\/|\\)/, "");
    }
    
  
    function getExt(file){
        return (-1 !== file.indexOf('.')) ? file.replace(/.*[.]/, '') : '';
    }


    window.AjaxUpload = function(button, options){
		
		
		
        this._settings = {
            action: 'upload.php',
            name: 'userfile',
            data: {},
            autoSubmit: true,
            responseType: false,           
            disabledClass: 'disable',            
            onChange: function(file, extension){},
            onSubmit: function(file, extension){},
            onComplete: function(file, response){}
        };
                        
        for (var i in options) {
            if (options.hasOwnProperty(i)){
                this._settings[i] = options[i];
            }
        }
        		        				
        
		if (button.nodeName.toUpperCase() == 'A') {
			$.event.add(document, 'click', function() {return false});
		}
		
        this._button = button;                    
        this._input = null;
        this._disabled = false;
        this.enable();               
		
		var self = this;
		
		
		
		$.event.add(self._button, 'mouseover', function(){
			
			if (self._disabled) return;                                
			if (!self._input) self._createInput();                
			var div = self._input.parentNode;                                            								
			var o = $(self._button).offset();		        
			$(div).css({position: 'absolute', left : o.left + 'px', top : o.top + 'px', width : self._button.offsetWidth + 'px', height : self._button.offsetHeight + 'px'});				
			div.style.visibility = 'visible';
		});
		
    };
    
    AjaxUpload.prototype = {        
        disable: function(){            
            $(this._button).addClass(this._settings.disabledClass);
            this._disabled = true;
            
            var nodeName = this._button.nodeName.toUpperCase();            
            if (nodeName == 'INPUT' || nodeName == 'BUTTON'){
                $(this._button).attr('disabled', 'disabled');
            }            
                       
            if (this._input){
                this._input.parentNode.style.visibility = 'hidden';
            }
        },
        enable: function(){
            $(this._button).removeClass(this._settings.disabledClass);
            this._button.removeAttribute('disabled');
            this._disabled = false;            
        },
        _createInput: function(){ 			
            var self = this;                        
            var input = $('<input>');
            input.attr('type', 'file');
            input.attr('name', this._settings.name);            
			input.css({position: 'absolute', right: 0, margin: 0, padding: 0, fontSize: '480px', cursor: 'pointer'});
            var div = document.createElement("div");			
            $(div).css({display: 'block', position: 'absolute', overflow: 'hidden', margin: 0, padding: 0, opacity: 0, direction: 'ltr', zIndex: 2147483583, cursor: 'pointer'});
			input[0].onchange = function() {				
                if (!input || input.value === '') return;                
                var file = fileFromPath(input[0].value);																
                if (false === self._settings.onChange.call(self, file, getExt(file))){
                    self._clearInput();                
                    return;
                }
                if (self._settings.autoSubmit) {
                    self.submit();
                }
            };          
	        div.appendChild(input[0]);
            document.body.appendChild(div);              
            this._input = input[0];
        },
        _clearInput : function(){
            if (!this._input) return;   
            document.body.removeChild(this._input.parentNode);
            this._input = null;                                                                  
            this._createInput();                        
        },

		
		
	

        _getResponse : function(iframe, file) {         
            var self = this, settings = this._settings;			
			$.event.add(iframe, 'load', function() {
				
				if (iframe.src == "javascript:'%3Chtml%3E%3C/html%3E';" || iframe.src == "javascript:'<html></html>';") {
					if (toDeleteFlag) {
						setTimeout(function() {document.body.removeChild(iframe);}, 0);
					}                                                
					return;
                }				
				var doc = iframe.contentWindow.document;                				
                if (doc.readyState && doc.readyState != 'complete') return;
                if (doc.body && doc.body.innerHTML == "false") return;                
                var response = doc.body.innerHTML;				           				
                settings.onComplete.call(self, file, response);               				
				toDeleteFlag = true;
				iframe.src = "javascript:'<html></html>';";
            });          
        },        

        submit: function(){                        
            var self = this, settings = this._settings;            
			
            if (!this._input || this._input.value === '') return;                                         
			
            var file = fileFromPath(this._input.value);
			
            if (false === settings.onSubmit.call(this, file, getExt(file))){
                this._clearInput();                
                return;
            }              
			
			
			var iframe = $('<iframe src="javascript:false;" name="'+(++$.guid)+'" id="'+$.guid+'" style="display:none;" />');
            document.body.appendChild(iframe[0]);
			
			var form = $('<form method="post" enctype="multipart/form-data" action="'+settings.action+'" target="'+iframe[0].name+'" style="display:none;"></form>');                                              
            document.body.appendChild(form[0]);       
			
            for (var prop in settings.data) {
                if (settings.data.hasOwnProperty(prop)){
                    var el = $('<input type="hidden" name="'+prop+'" value="'+settings.data[prop]+'" />')
                    form[0].appendChild(el[0]);
                }
            }
            
			form[0].appendChild(this._input);
			
            form[0].submit();
			
            document.body.removeChild(form[0]);			
			form = null;			
			this._input = null;

            this._getResponse(iframe[0], file);       			
            this._createInput();
        }
    };

