// MANUEL: aggiunti i metodi disable/enable
// MANUEL: fix riga 97: aggiunto this.element.getOffsetParent()
// MANUEL: fix riga 51: $lang.get
// MANUEL: commentate righe 124 e 126->
// MANUEL: cambiate formule 137-138
/*
---
script: element.file.js

decription: Make petty much anything clickable and behaves like a input="file" element. Inspired by how FancyUpload covers elements with flash, and Shaun Inman's example of styling file-form elements.

license: MIT-style license.

authors:
- Robin Grass (http://kodlabbet.net/)

requires:
core:1.2.3:
- Array
- Function
- Number
- String
- Hash
- Event
- Class
- Element
- Element.Event

provides: [Element.File]

...
*/

/**
 *	Element.File
 *
 *	Flash is obscolete.
 */
(function() {
	
	/**
	 *	Localization
	 */
	var default_language = {
		file_already_in_queue: 'File {file_name} is already in queue.',
		file_type_not_allowed: 'File type ({file_type}) is not allowed. Allowed types are {allowed_file_types}.',
		file_size_too_big: 'File size too big, allowed file size {max_file_size} bytes.'
	};
	
	if(MooTools.lang)
		MooTools.lang.set('en-US', 'Element.File', default_language);
	
	var $lang = (MooTools.lang) ? { get: function(key) { return MooTools.lang.get('Element.File', key);}} : new Hash(default_language);
	
	
	
	/**
	 *	Class
	 */
	Element.File = new Class({
	
		Implements: [Options, Events],
		
		options: {
			inputName: 'files[]',
			file: {
				extensionFilter: [],
				maxSize: 4096000
			},
			queue: {
				element: null,
				itemElementType: 'div'
			},
			onAttach: $empty,
			onQueued: $empty,
			onError: $empty
		},
		
		fileQueue: new Hash({}),
		
		initialize: function(element, options) {
			this.setOptions(options);
			this.element = element;
		
		this.setup();
		},
		
		setup: function() {
			this.createElements();
			if(typeOf(this.options.queue.element) == 'element')
				this.queueElement = document.id(this.options.queue.element);
		}.protect(),
		
		createElements: function() {
			var self = this;
			originalElement = this.element.getCoordinates(this.element.getOffsetParent());
			originalElement.zIndex = (this.element.getStyle('z-index') && this.element.getStyle('z-index') != 'auto') ? this.element.getStyle('z-index') : 1;
			new Element('div', {
				'styles': {
					'width': originalElement.width,
						'height': originalElement.height,
						'position': 'absolute',
						'left': originalElement.left,
						'top': originalElement.top,
						'overflow': 'hidden',
						'z-index': originalElement.zIndex + 1
					}
			}).inject(self.element, 'before').adopt(
				new Element('label', {
					'styles': {
						'width': originalElement.width,
						'height': originalElement.height,
						'overflow': 'hidden',
						'display': 'block',
						'position': 'relative'
					},
					'events': {
						'mousemove': function(event) {
							var element = this;
							// var offset = { x: 0, y: 0 };
							var size = this.getElement('input').getSize();
							/*if(element.getOffsetParent()) {
								offset.x = element.getPosition().x;
								offset.y = element.getPosition().y;
								while(element = element.getOffsetParent()) {
									offset.x += element.getPosition().x;
									offset.y += element.getPosition().y;
								}
							}*/
	
							var position = this.getParent('div').getPosition();
							this.getElement('input').setStyles({
								'left': (event.page.x - position.x) - (size.x - 30),
								'top':	(event.page.y - position.y) - (size.y / 2)
							});
						}
					},
					'title': this.options.title
				}).grab(self.createInputElement(), 'top')
			);
			if (self.options.queue.element != null) {
				var els = self.options.queue.element.getElements(self.options.queue.itemElementType);
				for(var i = 0; i < els.length; i++) {
					console.log(els[i]);
					var element = els[i].getElements("input")[0];
					var key = element.get('value');
					this.fileQueue.set(key, element);
					self.fireEvent('onQueued', [key, self]);
				}
			}
		}.protect(),
		
		createInputElement: function(previousElement) {
			var self = this;
			this.file = new Element('input', {
				'name': this.options.inputName,
				'type': 'file',
				'styles': {
					'width': 'auto',
					'height': '100%',
					'position': 'absolute',
					'opacity': 0,
					'visibility': 'visible',
					'cursor': 'pointer'
				},
				'events': {
					'change': function(event) {
						if(!self.isQueued(this.get('value'))) {
							
							if(self.options.file.extensionFilter.length > 0 && !self.options.file.extensionFilter.contains(this.get('value').split('.').getLast())) {
								self.fireEvent('onError', $lang.get('file_type_not_allowed').substitute({
									'file_type': this.get('value').split('.').getLast(),
									'allowed_file_types': self.options.file.extensionFilter.join(', ')
								}));
								return false;
							}
							
							// Internet Explorer doesnt support the files-property
							if(!Browser.Engine.trident && this.files) {
								var currentFile = (self.fileQueue.length > 0) ? this.files[self.fileQueue.length - 1] : this.files[0];
								if(currentFile.size > self.options.file.maxSize) {
									self.fireEvent('onError', $lang.get('file_size_too_big').substitute({
										'max_file_size': '4'
									}));
									return false;
								}
							}
							
							self.fireEvent('onAttach', [this.get('value'), self]);
							
							if(self.queueElement) {
								self.addInputFileToQueueElement();
								self.fireEvent('onQueued', [this.get('value'), self]);
							}
						
						} else {
							this.fireEvent('onError', $lang.get('file_already_in_queue').substitute({
								'file_name': this.get('value')
							}));
						}
					}		
				},
				'title': this.options.title
			});
		return this.file;
		}.protect(),
		
		addInputFileToQueueElement: function() {
			var previousValue = this.file.get('value');
			if(!this.isQueued(previousValue)) {
				var parentElement = this.file.getParent('label');
				this.queueElement.adopt(new Element(this.options.queue.itemElementType).wraps(this.file));
				this.file.removeEvents().removeProperty('style');
				this.addToQueue(previousValue, this.file);
				parentElement.adopt(this.createInputElement());
			}
		},
		
		isQueued: function(key) {
			return !!(this.fileQueue.get(key));
		},
	
		addToQueue: function(key, element) {
			if(!this.isQueued(key))
				this.fileQueue.set(key, element);
		},
	
		removeFromQueue: function(key) {
			if(this.isQueued(key)) {
				document.id(this.fileQueue.get(key)).getParent(this.options.queue.itemElementType).destroy();
					this.fileQueue.erase(key);
			}
		},
		
		flushQueue: function() {
			this.queueElement.empty();
			this.fileQueue.empty();
		},
		
		getFromQueue: function(key) {
			if(this.isQueued(key))
				return document.id(this.fileQueue.get(key));
		},
		
		toElement: function() {
			return this.element;
		},
		
		disable: function() {
			this.element.addClass("disabled");
			this.file.disabled = 'disabled';
		},
		
		enable: function() {
			this.element.removeClass("disabled");
			this.file.disabled = '';
		}
	
	});

})();
