var GrafiaCommon = {
	applyValuesToForm: function(values, formElement) {
		/*	Takes an object of key=>value pairs or a query string, and
			fills a form accordingly. Currently works with textfields
			and radiobuttons only. */
		if (typeof values == 'string') {
			values = values.parseQueryString();
		}
		for (var key in values) {
			if(values.hasOwnProperty(key)) {
				var inputElement = formElement.getElement('input[name='+key+']');
				if (inputElement) {
					if (inputElement.type == 'text' || inputElement.type == 'hidden') {
						inputElement.value = values[key];
					} else if (inputElement.type == 'radio') {
						inputElement.getParent().getElement('input[name='+key+'][value='+values[key]+']').checked = true;				
					}
				}
			}
		}
	},
	
	buttonGroups: {},
	radioButtonGroupPrefix: 'radio_button_group_',
	
	refreshButtonGroupButtons: function(buttonGroupName) {
		var refreshGroups = [];
		
		if (buttonGroupName) {
			refreshGroups.push(buttonGroupName);
		} else {
			for (var group in this.buttonGroups) {
				if(this.buttonGroups.hasOwnProperty(group)) {
					refreshGroups.push(group);
				}
			}
		}
		
		for (var i=0; i<refreshGroups.length; i++) {
			this.buttonGroups[refreshGroups[i]].each(function(item) {
				if (item.radioButton.checked) {
					item.button.addClass('down');
				} else {
					item.button.removeClass('down');
				}
			});
		}
	},
	
	convertRadioButtonsToTogglableButtons: function(radioButtons, buttonClass, defaultValue, hideDefault) {
		if (!hideDefault) {
			hideDefault = false;
		}
		if (!buttonClass) {
			buttonClass = 'button';
		}
		var buttons = [];
		radioButtons.each(function(radioButton) {
			var formElement = radioButton.getParent('form');
			if (!formElement.id) {
				formElement.id = 'form'+Math.floor(Math.random()*10000000);
			}
			
			var buttonGroupId = this.radioButtonGroupPrefix+formElement.id+'_'+radioButton.name;
			
			if (!this.buttonGroups[buttonGroupId]) {
				this.buttonGroups[buttonGroupId] = [];
			}
			
			var label = radioButton.getParent('label');
			var labelText = '';
			
			if (!label) {
				label = $$('label[for='+radioButton.id+']')[0];
				labelText = label.innerHTML;
			}
			else {
				var clonedLabel = label.clone();
				clonedLabel.getElement('input[type=radio]').dispose();
				labelText = clonedLabel.innerHTML;
			}
			
			label.setStyle('display', 'none');
			radioButton.setStyle('display', 'none');
			
			if (!(hideDefault && radioButton.value == defaultValue)) {
				var button = new Element('div', {
					'class': buttonClass,
					'html': '<span>'+labelText+'</span>'
				});
				
				if (radioButton.checked) {
					button.addClass('down');
				}
				
				button.addEvent('click', function(event, radioButton, defaultValue) {
					if (radioButton.checked) {
						if (defaultValue && radioButton.value != defaultValue) {
							var defaultRadioButton = radioButton.getParent('form').getElement('input[type=radio][value='+defaultValue+']');
							if (defaultRadioButton) {
								defaultRadioButton.checked = true;
								defaultRadioButton.fireEvent('change');
							}
						}					
					} else {
						radioButton.checked = true;
						radioButton.fireEvent('change');
					}					
					this.refreshButtonGroupButtons(this.radioButtonGroupPrefix+radioButton.getParent('form').id+'_'+radioButton.name);
				}.bindWithEvent(this, [radioButton, defaultValue]));
			
				button.cloneEvents(radioButton);
			
				button.inject(label, 'before');
				buttons.push(button);
				this.buttonGroups[buttonGroupId].push({'button': button, 'radioButton': radioButton });
			}
		}.bind(this));
		
		return buttons;
	},
	
	
	prettifyButtons: function() {
		$$('button.prettify').each(function(buttonElement) {
			buttonElement.setStyle('display', 'none');
			var prettyButton = new Element('div', {
				'class': buttonElement.className,
				'html': '<span>'+buttonElement.innerHTML+'</span>'
			});
			
			prettyButton.removeClass('prettify');
			prettyButton.addClass('button');
			
			prettyButton.addEvent('click', function(event) {
				var fakeEventObject = {
					defaultActionPrevented: false,
					preventDefault: function() {
						this.defaultActionPrevented = true;
					}
				};

				this.fireEvent('click', fakeEventObject);
				if (!fakeEventObject.defaultActionPrevented) {
					fakeEventObject.defaultActionPrevented = false;
					this.getParent('form').fireEvent('submit', fakeEventObject);
					if (!fakeEventObject.defaultActionPrevented) {
						this.getParent('form').submit();
					}
				}
			}.bind(buttonElement));
			prettyButton.inject(buttonElement, 'after');		}.bind(this));
	},
	
	prettifyFileInput: function(fileInput, wrapperClass) {
	if (!wrapperClass) {
		wrapperClass = 'file-input-container';
	}
	fileInput.style.opacity = '0';
	fileInput.style.filter = 'alpha(opacity=0)';
	var inputContainer = new Element('div', {
		'class': wrapperClass,
		'html': '<div class="button"><span><img src="/common_files/images/icons/buttons/add_file.png" alt=""/>'+fileInput.alt+'</span></div>'
	});
	inputContainer.setStyles({
		'position': 'relative',
		'overflow': 'hidden'
	});
	inputContainer.setStyle('cursor', 'pointer');
	fileInput.setStyles({
		'position': 'absolute',
		'top': '0px',
		'left': '0px',
		'width': 'auto',
		'height': '100%',
		'cursor': 'pointer'
	});
	
	fileInput.addEvent('mousedown', function(fileInputContainer) {
		fileInputContainer.getElement('.button').addClass('active');
	}.bind(this, inputContainer));

	fileInput.addEvent('mouseup', function(fileInputContainer) {
		fileInputContainer.getElement('.button').removeClass('active');
	}.bind(this, inputContainer));
	
	inputContainer.addEvent('mousemove', function(event, fileInputContainer) {
		var fileInput = fileInputContainer.getElement('input[type=file]');
		if (fileInput) {
		var parentPosition = fileInput.getParent().getPosition();
		var fileInputSize = fileInput.getSize();
		var xPos = event.page.x - parentPosition.x - (fileInputSize.x - 30);
		var yPos = event.page.y - parentPosition.y - fileInputSize.y/2;
		fileInput.setStyles({
			'left': xPos+'px',
			'top': yPos+'px'
		});
		}
	}.bindWithEvent(this, inputContainer));
	
	inputContainer.inject(fileInput, 'after');
	inputContainer.grab(fileInput);
	
	return inputContainer;
	},
	
	initialize: function(event) {
		$$('.system-message .close').each(function(element) {
			element.addEvent('click', function(event) {
//				event.target.getParent('.system-message').dispose();
				event.target.getParent('.system-message').dissolve();
			}.bind(this));
		}.bind(this));
		this.prettifyButtons();
	}
};

GrafiaCommon.EditableFileList = new Class({
	Implements: [Events],
	inputElement: null,
	container: null,
	fileList: null,
	fileInput: null,
	fileInputContainer: null,
	
	onRemoveExistingFileClick: function(fileIndex) {
	var files = JSON.decode(this.inputElement.get('value'));
	files[fileIndex].remove = true;
	this.inputElement.set('value', JSON.encode(files));
	this.refresh();
	},
	
	onRemoveUploadedFileClick: function(fileIndex) {
	var files = JSON.decode(this.inputElement.get('value'));
	files.splice(fileIndex, 1);
	this.inputElement.set('value', JSON.encode(files));
	this.refresh();
	},
	
	moveFile: function(filename, targetFileList, refresh) {
		var files = JSON.decode(this.inputElement.get('value'));
		var targetFiles = JSON.decode(targetFileList.inputElement.get('value'));
		for (var i=0; i<files.length; i++) {
			if (files[i].name == filename) {
			targetFiles = targetFiles.concat(files.splice(i, 1));
			break;
			}
		}
		this.inputElement.set('value', JSON.encode(files));
		targetFileList.inputElement.set('value', JSON.encode(targetFiles));
		if (refresh) {
			this.refresh();
			targetFileList.refresh();
		}
	},
	
	moveAllFiles: function(targetFileList) {
		var files = JSON.decode(this.inputElement.get('value'));
		var targetFiles = JSON.decode(targetFileList.inputElement.get('value'));
		for (var i=0; i<files.length; i++) {
			if (!files[i].remove) {
				targetFiles = targetFiles.concat(files.splice(i, 1));
				i--;
			}
		}
		this.inputElement.set('value', JSON.encode(files));
		targetFileList.inputElement.set('value', JSON.encode(targetFiles));
		this.refresh();
		targetFileList.refresh();
		},
		
		refresh: function() {
		this.fileList.innerHTML = '';
		var files = JSON.decode(this.inputElement.get('value'));
		for (var i=0; i<files.length; i++) {
			if (!files[i].remove) {
			var fileElement = new Element('li');
	
			if (files[i].uploading) {
				fileElement.innerHTML = 'Lähetetään tiedostoa...';
				fileElement.addClass('sending');
			} else {
				fileElement.innerHTML = files[i].name;
				var removeElement = new Element('div', {
				'class': 'remove',
				'html': '<span>Poista tiedosto</span>'
				});
				
				if (!files[i].tempName) {
					removeElement.addEvent('click', this.onRemoveExistingFileClick.bind(this, i));
				} else {
					removeElement.addEvent('click', this.onRemoveUploadedFileClick.bind(this, i));
				}
				
				removeElement.inject(fileElement);
			}	
			
			fileElement.inject(this.fileList);
			}
		}	
	},
	
	fileExists: function(filename) {
		var files = JSON.decode(this.inputElement.get('value'));
		for (var i=0; i<files.length; i++) {
			if (files[i].name == filename) {
			return true;
			}
		}
		return false;
	},
	
	getFileIndex: function(filename) {
		var files = JSON.decode(this.inputElement.get('value'));
		for (var i=0; i<files.length; i++) {
			if (files[i].name == filename) {
			return i;
			}
		}
		return null;
	},
	
	onFileInputChange: function(event) {
		var newFileInput = new Element('input', {
			'name': 'file',
			'type': 'file',
			'alt': 'Liitä tiedosto'
		});
		
		newFileInput.inject(this.container);
		newFileInput.addEvent('change', this.onFileInputChange.bind(this));
		var newFileInputContainer = GrafiaCommon.prettifyFileInput(newFileInput);
	
		var fileUploadForm = new Element('form', {
			'method': 'post',
			'enctype': 'multipart/form-data',
			'action': Env.root+'/upload_file',
			'style': 'display: none'
		});
		fileUploadForm.inject($$('body')[0]);
		this.fileInput.inject(fileUploadForm);
		this.fileInputContainer.dispose();
		
		var iframeId = 'file_upload_iframe_'+(new Date().getTime());
	
		var iframe = new Element('iframe', {
			'style': 'display: none',
			'id': iframeId,
			'name': iframeId
		});
	
		iframe.inject($$('body')[0]);
		fileUploadForm.target = iframeId;
		
		var files = JSON.decode(this.inputElement.get('value'));
	
		filename = this.fileInput.get('value').match(/[^\/\\]+$/)[0];
	
		fileUploadForm.submit();
		
		var file = {
			'name': filename,
			'tempName': null,
			'remove': false,
			'uploading': true,
			'uploadId': new Date().getTime()
		};
		
		iframe.addEvent('load', GrafiaCommon.EditableFileList.onFileUploadComplete.bind(GrafiaCommon.EditableFileList, [iframe, file]));
	
		var fileIndex = this.getFileIndex(file.name);
	
		if (fileIndex === null) {
			files.push(file);
		} else {
	//		files[fileIndex].uploading = true;
			files[fileIndex] = file;
		}
	
		this.inputElement.set('value', JSON.encode(files));
		
		this.fileInput = newFileInput;
		this.fileInputContainer = newFileInputContainer;
	
		this.refresh();
		this.fireEvent('uploadstart');
	},
	
	initialize: function(inputElement, buttonText) {
		if (!buttonText) {
			buttonText = 'Liitä tiedosto';
		}
		
		this.inputElement = inputElement;
		this.container = new Element('div', {
			'class': 'editable-file-list'
		});
		this.fileList = new Element('ul', {
			'class': 'file-list'
		});
		
		this.fileInput = new Element('input', {
			'type': 'file',
			'name': 'file',
			'alt': buttonText
		});
		this.fileList.inject(this.container);
		this.fileInput.inject(this.container);
		this.fileInput.addEvent('change', this.onFileInputChange.bind(this));
		this.fileInputContainer = GrafiaCommon.prettifyFileInput(this.fileInput);
	
		this.container.inject(this.inputElement, 'after');
		
		this.refresh();
		
		GrafiaCommon.EditableFileList.fileLists.push(this);
	}
});
GrafiaCommon.EditableFileList.fileLists = [];
GrafiaCommon.EditableFileList.getFileListForInput = function(inputElement) {
	var fileList;
	for (var i=0; i<GrafiaCommon.EditableFileList.fileLists.length; i++) {
		fileList = GrafiaCommon.EditableFileList.fileLists[i];
		if (fileList.inputElement == inputElement) {
			return fileList;
		}
	}
};
GrafiaCommon.EditableFileList.onFileUploadComplete = function(iframe, file) {
	var response = JSON.decode($(iframe.contentWindow.document.body).get('text'));
	var fileList = 0;
	var fileIndex = null;
	var files = [];
	for (var i=0; i<GrafiaCommon.EditableFileList.fileLists.length; i++) {
		fileList = GrafiaCommon.EditableFileList.fileLists[i];
		files = JSON.decode(fileList.inputElement.get('value'));
		for (var j=0; j<files.length; j++) {
			if (files[j].uploadId == file.uploadId) {
				fileIndex = j;
				break;
			}
		}
		if (fileIndex !== null) {
			break;
		}
	}
	if (!response) {
		files.splice(fileIndex, 1);
		alert('Tiedoston lähettäminen epäonnistui.');
	}
	if (response.success) {
		files[fileIndex].name = response.name;
		files[fileIndex].tempName = response.tempName;
		files[fileIndex].uploading = false;
	} else {
		files.splice(fileIndex, 1);
		alert('Tiedoston lähettäminen epäonnistui.');
	}
	fileList.inputElement.set('value', JSON.encode(files));
	iframe.dispose();
	fileList.refresh();
	fileList.fireEvent('uploadcomplete');
};

window.addEvent('domready', GrafiaCommon.initialize.bind(GrafiaCommon));