/**
 * Image JS Klasse die das hochladen und entfernen von Bildern realisiert
 * 
 * @param pickerType
 * @param actualNumber
 * @param Form
 * @param ElementPath
 * @return
 */
var Download = new Class({
	
	iUniqueId : null,
	element   : null,
	sUrl      : null,
	targetForm: null,
	iFrame    : null,
	
	initialize: function(element, sUrl) {
		// erzeuge eine unique id für Iframe-Name bzw. Formular-Target
		this.iUniqueId = Math.round((Math.random() * 1000)) + new Date().getTime();
		this.element = $(element);
		this.sUrl = sUrl;
	},

	getActualNumber: function() {
		var fieldset = this.element.getParent().getParent().getParent();
		var fieldsetHash = fieldset.toQueryString().parseQueryString();
		var sBelongsTo = 'Downloads';
		
		var elementPath = sBelongsTo;
		var resultHash = $H(fieldsetHash).getFromPath(elementPath);
		var aKeys = $H(resultHash).getKeys();
		
		var iMax = aKeys.max();
		if(iMax == '-Infinity') {
			iMax = 0;
		}
		return iMax+1;
	},
	
	change: function() {
		//layer aus class.clform.js über formular legen
		oEditForms.submitLayer(this.element);
		
		var sourceFieldset = this.element.getParent().getParent().getParent();
		var parentFieldset = sourceFieldset.getParent();

		var iIndex = new RegExp(/^.*?\[(\d+)\]/g).exec(sourceFieldset.getElement('input').getProperty('name'))[1];
		var sUrl = this.sUrl + '/' + iIndex;

		this.send(sUrl, {
			'onComplete': function(response) {
				var div = new Element('div').set('html', response);
				var newFieldset = div.getElement('fieldset').replaces(sourceFieldset);
				//layer aus class.clform.js löschen
				oEditForms.destroyLayer();
			}.bind(this)
		});
	},
	
	upload: function() {
		//layer aus class.clform.js über formular legen
		oEditForms.submitLayer(this.element);
		
		var sourceFieldset = this.element.getParent().getParent();
		var parentFieldset = sourceFieldset.getParent();
		var iIndex = this.getActualNumber();
		var sUrl = this.sUrl;
		
		// erzeuge ein neues InputFileElement mit den gleichen Eigenschaften und setze es vor element
		var newInputFileElement = new Element('input', {
			'id': 'upload',
			'type': 'file',
			'name': this.element.getProperty('name'),
			'size': '1',
			'class': 'upload_invis'
		});

		//add onchange event after object creation to keep IE happy
		newInputFileElement.addEvent('change', function() {
			new Download(this, sUrl).upload();
		});

		newInputFileElement.inject(this.element, 'before');

		
		this.send(sUrl + '/' + iIndex, {
			'onComplete': function(response) {
				var div = new Element('div').set('html', response);
				var newFieldset = div.getElement('fieldset');

				newFieldset.inject(parentFieldset.getLast(), 'before');
				//layer aus class.clform.js löschen
				oEditForms.destroyLayer();
			}.bind(this)
		});
	},
	
	remove: function(bRemoveFlag) {
		if (true == bRemoveFlag) {
			var sourceFieldset = this.element.getParent().getParent().getParent();
			sourceFieldset.dispose();
		} else {
			var sourceFieldset = this.element.getParent().getParent().getParent();
			sourceFieldset.getElement('input.id').setProperty('value', '');
			sourceFieldset.getElement('input.name').setProperty('value', '');
			var tools = sourceFieldset.getElement('div.upload_area');
			tools.getElement('label').destroy();
			
		}
	},
	
	send: function(sUrl, options) {
		options = $merge({
			'onComplete': function(response) {}
		}, options);
		
		this.createForm(sUrl);
		this.createIFrame();

		// füge dem Iframe ein Load-Event hinzu (sobald die Src (= action vom Form-Element) des Iframes geladen wurde, ist der Upload fertig
		this.iFrame.addEvent('load', function() {
			(function() {
				this.targetForm.dispose();
				this.iFrame.dispose();
			}.bind(this)).delay(250);

			//var oUpload = Json.evaluate(iframeElement.contentWindow.document.body.innerHTML);
			var response = $(this.iFrame.contentWindow.document.body).get('html');

			if (response) {
				options.onComplete(response);
			} else {
				this.showError(MooTools.lang.get('core', 'error_occured'));
			}

		}.bind(this));
		
		this.targetForm.submit();
	},
	
	createForm: function(sUrl) {
		// erstelle ein eigenes Formular nur für das Input-File-Element und füge dieses dort ein
		// patch for IE
		try {
			this.targetForm = document.createElement('<form class="hidden" action="' + sUrl + '" method="post" enctype="multipart/form-data" target="file_upload_' + this.iUniqueId + '">');
		}
		catch(e) {
			this.targetForm = new Element('form', {
				'action' : sUrl,
				'method' : 'post',
				'enctype': 'multipart/form-data',
				'target' : 'file_upload_' + this.iUniqueId,
				'class'	 : 'hidden'
			});
		}
		$(this.targetForm).inject(document.body).adopt(this.element);
	},
	
	createIFrame: function() {
		// erstelle ein Iframe, an welches das erzeugte Formular geschickt werden soll
		this.iFrame = new Element('iframe', {
			'class': 'hide',
			'src': 'about:blank',
			'name': 'file_upload_' + this.iUniqueId
		}).inject(document.body);
	},
	
	showError: function(message) {
		var m = new Confirmbox({
			'onOkay': function() {
			},
			'onClosed': function() {
				m.remove();
				m = null;
			},
			'close': '',
			'okay': MooTools.lang.get('core', 'okay'),
			'abort': MooTools.lang.get('core', 'abort'),
			'message': '<div class="alert"><img src="' + IMG_DIR + '/mb_icon_alert.gif" alt="' + MooTools.lang.get('core', 'attention') + '" width="62" height="55" />' + message + '</div>',
			'width': 520,
			'height': 230
		});
		m.show();
	}
	
});
