var dropboxClass = {
	loadTimeout : false,
	chkInterval : false,
	url : '/upload',
	xhr : false,
	upload : true,
	time : false,
	interval : 1000, // intervallo in millisecondi per il prossimo upload
	init : function() {
		$('body').append('<textarea id="dropbox"></textarea>');
		$('#dropbox').css( {
			'color' : 'transparent',
			'resize' : 'none',
			'opacity' : 0.05
		});
		if (($.client.os == "Windows" && $.client.browser == "Safari") 
				|| ($.client.browser == "Opera") || ($.browser.msie && $.browser.version < 8)) {
		} else {
			$('#dropbox').attr( {
				'ondrop' : 'return dropboxClass.dropCapture(event);',
				'ondragenter' : 'stopPropagationFunction(event);',
				'ondragover' : 'stopPropagationFunction(event);'
			});
		}
		$(document, window).bind('mouseleave', function(e) {
			dropboxClass.enableCapture();
		}).bind('mouseenter', function(e) {
			dropboxClass.disableCapture();
			stopPropagationFunction(e);
		});
		this.time = new Date().getTime() - this.interval;
	},
	enableCapture : function() {
		clearTimeout(this.loadTimeout);
		clearInterval(this.chkInterval);
		$('#dropbox').show();
		this.chkInterval = setInterval('dropboxClass._chkURL()', 20);
	},
	disableCapture : function(e) {
		clearInterval(this.chkInterval);
		this.loadTimeout = setTimeout('dropboxClass._stopchkURL()', 200);
	},
	abort : function(e) {
		if (this.xhr) {
			this.xhr.abort();
			this.xhr = false;
			this.upload = true;
			$('#dropbox').trigger({ 'type':'action','_action': false});
		}
	},
	dropCapture : function(e) {
		if (this.upload == false) {
			this.time = new Date().getTime();
			stopPropagationFunction(e);
			return false;
		}
		var time = new Date().getTime();
		if ((dropboxClass.time + dropboxClass.interval) >= time) {
			stopPropagationFunction(e);
			return false;
		}
		var files = e.dataTransfer.files, pattern = /(href|src)=["\'](.*?)["\']/i, img = null, i = 0;
		if(e.dataTransfer.getData("Text")){
			stopPropagationFunction(e);
			$('#dropbox').val(e.dataTransfer.getData("Text"));
			dropboxClass._chkURL();
			return false;
		}
		if(e.dataTransfer.getData("URL")){
			stopPropagationFunction(e);
			$('#dropbox').val(e.dataTransfer.getData("Text"));
			dropboxClass._chkURL();
			return false;
		}
		if($.browser.msie){ stopPropagationFunction(e); return false; }
		if (e.dataTransfer.files) {
			for (i = 0; i < files.length; i++) {
				var file = files[i];
				this.xhr = new XMLHttpRequest();
				this.xhr.upload.addEventListener("progress", function(e) {
					dropboxClass.upload = false;
					if (e.lengthComputable) {
						var loaded = Math.ceil((e.loaded / e.total) * 100);
						$('#dropbox').trigger({ 'type':'progress','_progress': loaded});
					}
				}, false);
				this.xhr.addEventListener("error", function(e) {
					$('#dropbox').trigger({ 'type':'error','_error': true});
					$('#dropbox').trigger({ 'type':'action','_action': false});
					dropboxClass.upload = true;
				}, false);
				this.xhr.addEventListener("load", function(e) {
					var data = JSON.parse(e.target.responseText);
					if (data.error > 0) {
						$('#dropbox').trigger({ 'type':'error','_error': data});
						$('#dropbox').trigger({ 'type':'action','_action': false});
					} else {
						$('#dropbox').trigger({ 'type':'action','_action': false});
						$('#dropbox').trigger({ 'type':'upload','_upload': data});
					}
					dropboxClass.upload = true;
					dropboxClass.time = new Date().getTime();
				}, false);
				this.xhr.open("post", this.url, true);
				this.xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
				var fd = new FormData();
				fd.append("file", file), fd.append("type", 'chat'), fd.append(
						"name", file.name), fd.append("size", file.size);
				this.xhr.send(fd);
				$('#dropbox').trigger({ 'type':'action','_action': true});
				return false;
			}
			if (e.dataTransfer.getData('text'))
				img = e.dataTransfer.getData('text');
			if (e.dataTransfer.getData('url'))
				img = e.dataTransfer.getData('url');
			if (e.dataTransfer.getData('text/plain'))
				img = e.dataTransfer.getData('text/plain');
			if (e.dataTransfer.getData('text/uri-list'))
				img = e.dataTransfer.getData('text/uri-list');
			if (e.dataTransfer.getData('text/html').match(/href|src/i))
				img = e.dataTransfer.getData('text/html').match(pattern)[2];
			if (img) {
				$('#dropbox').val(img);
				dropboxClass._chkURL();
			}
		}
		stopPropagationFunction(e);
		return false;
	},
	_chkURL : function() {
		if ($('#dropbox').val()) {
			if (this.upload == false) {
				this.time = new Date().getTime();
				$('#dropbox').val('');
				return;
			}
			var time = new Date().getTime();
			if ((this.time + this.interval) >= time) {
				$('#dropbox').val('');
				return;
			}
			$.cacheImage($('#dropbox').val(), {
				load : function(e) {
					dropboxClass.xhr = $.ajax( {
						type : 'POST',
						url : dropboxClass.url,
						timeout : null,
						data : {
							type : 'chat',
							url : this.src
						},
						statusCode : {
							404 : function() {
								dropboxClass.upload = true;
								$('#dropbox').trigger({ 'type':'error','_error': '404 page not found'});
								$('#dropbox').trigger({ 'type':'action','_action': false});
							}
						},
						beforeSend : function(xhr) {
							dropboxClass.upload = false;
							$('#dropbox').trigger({ 'type':'action','_action': true});
							$('#dropbox').trigger({ 'type':'progress','_progress': 25});
							setTimeout("$('#dropbox').trigger({ 'type':'progress','_progress': 50})", 50);
							setTimeout("$('#dropbox').trigger({ 'type':'progress','_progress': 75})", 75);
							setTimeout("$('#dropbox').trigger({ 'type':'progress','_progress': 100})", 100);
						},
						error : function(xhr, ajaxOptions, thrownError) {
							dropboxClass.upload = true;
							$('#dropbox').trigger({ 'type':'error','_error': xhr.status + " " + thrownError});
							$('#dropbox').trigger({ 'type':'action','_action': false});
						},
						success : function(data) {
							dropboxClass.upload = true;
							dropboxClass.time = new Date().getTime();
							if (data.error > 0) {
								$('#dropbox').trigger({ 'type':'error','_error': data});
								$('#dropbox').trigger({ 'type':'action','_action': false});
							} else {
								$('#dropbox').trigger({ 'type':'upload','_upload': data});
								$('#dropbox').trigger({ 'type':'action','_action': false});
							}
						}
					});
				}
			});
			$('#dropbox').val('');
		}
	},
	_stopchkURL : function() {
		this._chkURL();
		$("#dropbox").hide();
	}
};
