
var FormUtils = new Class.create({
	unknownDateMessage:"Unknown date",
	currentField:'',
	previousText:'',
	
	initialize: function() {
	},
	
	prepareForRevertText: function(fieldId) {
		var field = $(fieldId);
		this.currentField = fieldId;
		if( fieldId==this.currentField && field ) {
			this.previousText = field.value;
		}
	},
	
	isInteger: function(value) {
		var strValidChars = "0123456789";
		var strChar;
		var blnResult = true;

		if (value.length == 0) return false;
		
		for (i = 0; i < value.length && blnResult == true; i++) {
			strChar = value.charAt(i);
			if( strChar=='-' && i==0 ) {
				continue;
			}
			else if( strValidChars.indexOf(strChar)==-1 ) {
				blnResult = false;
			}
		}
		return blnResult;
  	},
   
   	isNumeric: function(value) {
		var strValidChars = "0123456789";
		var strChar;
		var blnResult = true;
		var dotFound = false;

		if (value.length == 0) return false;
		
		for (i = 0; i < value.length && blnResult == true; i++) {
			strChar = value.charAt(i);
			if( strChar=='-' && i==0 ) {
				continue;
			}
			else if( !dotFound && strChar=='.' ) {
				dotFound = true;
			}
			else if( strValidChars.indexOf(strChar)==-1 ) {
				blnResult = false;
			}
		}
		return blnResult;
	},

	cssMeasureChecker: function(fieldId,allowPx,allowPercent,allowPt,allowPc,allowEx,allowIn,allowCm,allowMm,allowEm) {
		var field = $(fieldId);
		
		if (field) {
			var value = field.value;
			value = value.toLowerCase();
			var unit = 'px';

			if (value=='') {
				return;
			}

			if (allowPx && value.indexOf('px')!=-1) {
				value = value.substr(0,value.length-2);
			}
			else if (allowPercent && value.indexOf('%')!=-1) {
				value = value.substr(0,value.length-1);
				unit = '%';
			}
			else if (allowPt && value.indexOf('pt')!=-1) {
				value = value.substr(0,value.length-2);
				unit = 'pt';
			}
			else if (allowPc && value.indexOf('pc')!=-1) {
				value = value.substr(0,value.length-2);
				unit = 'pc';
			}
			else if (allowEx && value.indexOf('ex')!=-1) {
				value = value.substr(0,value.length-2);
				unit = 'ex';
			}
			else if (allowIn && value.indexOf('in')!=-1) {
				value = value.substr(0,value.length-2);
				unit = 'in';
			}
			else if (allowCm && value.indexOf('cm')!=-1) {
				value = value.substr(0,value.length-2);
				unit = 'cm';
			}
			else if (allowMm && value.indexOf('mm')!=-1) {
				value = value.substr(0,value.length-2);
				unit = 'mm';
			}
			else if (allowEm && value.indexOf('em')!=-1) {
				value = value.substr(0,value.length-2);
				unit = 'em';
			}
			else if (parseInt(value)!=NaN) {
				value = parseInt(value);
				unit = 'px';
			}
			else if (parseInt(value.substr(0,length-1))!=NaN) {	// Por si se ha puesto % pero no se permite usar esa medida
				value=parseInt(value.substr(0,length-1));
				unit = 'px';
			}
			else {	// En el resto de los casos, intentamos substituir cualquier otra medida, que tienen todas dos caracteres de longitud
				value = value.substr(0,value.length-2);
				unit = 'px';
			}

			if (parseInt(value)==NaN) {
				value = '0';
			}
			
			field.value = value + unit;
		}
	},

	numericChecker: function(fieldId,isInteger,minValue) {
		var field = $(fieldId);
		var revert = false;
		if(field) {
			if( !this.isInteger(field.value) && isInteger && field.value!='' ) {
				revert = true;
			}
			else if( !this.isNumeric(field.value) && field.value!='' ) {
				revert = true;
			}
			else if( minValue && field.value<minValue ) {
				revert = true;
			}
		}
		if( revert ) {
			field.value = this.previousText;
		}
		return !revert;
	},

	newPasswordChecker: function(id1, id2, messageContainer, errorMessage, okMessage) {
		var field1 = $(id1);
		var field2 = $(id2);
		var message = $(messageContainer);

		if( field1.value==field2.value && field1.value=='' ) {
			message.innerHTML = '';
		}
		else if( field1.value==field2.value ) {
			message.setStyle( { color:'green' });
			message.innerHTML = okMessage;
		}
		else {
			message.setStyle( { color:'red' });
			message.innerHTML = errorMessage;
		}
	},
	
	getParentForm: function(field) {
		if (!field) return null;
		var frm=field.parentNode;
		while ( (frm) && (frm.nodeName != 'FORM') ) {
			frm=frm.parentNode;
		}
		return frm;		
	},
	
	setError: function(form,error) {
		errorManager.addErrorMessage(form.id + "_Error",form.id);
		errorManager.getError(form.id + "_Error").setError(error);
		// this.clearError();
		// 		this.addError(error);
	},
	
	addError: function(form,error) {
		errorManager.addErrorMessage(form.id + "_Error",form.id);
		errorManager.getError(form.id + "_Error").addError(error);
		
		// var errorFieldId = form.id + "_Error";
		// var errorField = $(errorFieldId);
		// if (errorField) {
		// 	errorField.innerHTML = error;
		// 	errorField.appear();
		// }
		// else {
		// 	var errorField = new Element('p', { 'class':'error', 'id' : errorFieldId });
		// 	errorField.innerHTML = error;
		// 	if (form){
		// 		Element.insert(form, { 'top': errorField } );
		// 	}
		// 	else {
		// 		alert(error);
		// 	}
		// }
	},
	
	clearError: function(form) {
		errorManager.addErrorMessage(form.id + "_Error",form.id);
		errorManager.getError(form.id + "_Error").clearError();
		
		// var errorFieldId = form.id + "_Error";
		// var errorField = $(errorFieldId);
		// if (errorField && errorField.style.display!='none') {
		// 	errorField.fade({ onComplete: function(errorField){ errorField.innerHTML = ""; } });
		// }
	},

	checkDate: function(inputId,fieldId,hintId,inputFormat,finalFormat) {

		if ($(inputId).value=="") return;

		var interpretedDate = parseDate($(inputId).value,true);
		
		if (interpretedDate==null) {
			if ($(hintId)) {
				$(hintId).innerHTML = '<strong style="color: black;">' + this.unknownDateMessage + '</strong>';
			}
			
			$(fieldId).value = "0";
			return;
		}

		if ($(hintId)) {
			if (interpretedDate.toString(finalFormat)!=$(inputId).value){
				$(hintId).innerHTML = interpretedDate.toString(finalFormat);
			}
			else {
				$(hintId).innerHTML = "";
			}
		}
		
		$(fieldId).value = interpretedDate.toString(inputFormat);
	},
	
	checkDateTime: function(inputId,fieldId,hintId,inputFormat,finalFormat) {

		if ($(inputId).value=="") return;

		var interpretedDate = parseDate($(inputId).value,true);
		
		if (interpretedDate==null) {
			if ($(hintId) && ($(inputId).value!="")) {
				$(hintId).innerHTML = '<strong style="color: black;">' + this.unknownDateMessage + '</strong>';
			}
			
			$(fieldId).value = "0";
			return;
		}

		if ($(hintId)) {
			if (interpretedDate.toString(finalFormat)!=$(inputId).value){
				$(hintId).innerHTML = interpretedDate.toString(finalFormat);
			}
			else {
				$(hintId).innerHTML = "";
			}
		}
		
		$(fieldId).value = interpretedDate.toString(inputFormat);
	},
	
	parseTime: function(inputId,format) {

		var interpretedDate = parseDate($(inputId).value,true);
		
		if (interpretedDate==null) {
			return "";
		}

		return interpretedDate.toString(format);
	}
	
	
});


var DateField = new Class.create({

	fieldId:null, // Id del campo visible
	timeFieldId: null, // Id del div con el tiempo (se usa porque el datepicker borra el tiempo al seleccionar un día, y hay que restaurarlo)
	valueFieldId:null, // Id del campo oculto que se leerá en la acción
	hintId: null,
	internalFormat: null, // Formato de fecha/hora de la bd en metaformato de date.js
	format: null, // Formato visible en metaformato de date.js
	timeFormat: null,

	initialize: function(fieldId,timeFieldId,valueFieldId,hintId,internalFormat,format,timeFormat) {
		this.fieldId = fieldId;
		this.timeFieldId = timeFieldId;
		this.valueFieldId = valueFieldId;
		this.hintId = hintId;
		this.internalFormat = internalFormat;
		this.format = format;
		this.timeFormat = timeFormat;
	}
	
});


var DateFieldManager = new Class.create({
	unknownDateMessage:"Unknown date",
	dateFields:null,
	
	initialize: function() {
		this.dateFields = new Array();
	},
	
	addDateField: function(fieldId,timeFieldId,valueFieldId,hintId,internalFormat,format,timeFormat) {
		this.dateFields[fieldId] = new DateField(fieldId,timeFieldId,valueFieldId,hintId,internalFormat,format,timeFormat);
	},
	
	updateDateValue: function (fieldId){
		var dateField = this.dateFields[fieldId];
		if (!dateField || (dateField.value=="")) return;
		formUtils.checkDateTime(fieldId,dateField.valueFieldId,dateField.hintId,dateField.internalFormat,dateField.format);
	},
	
	saveTime: function (fieldId){
		var dateField = this.dateFields[fieldId];
		if (!dateField || (dateField.value=="")) return;
		$(dateField.timeFieldId).innerHTML = formUtils.parseTime(fieldId,dateField.timeFormat);
	},
	
	restoreTime: function (fieldId){
		var dateField = this.dateFields[fieldId];
		if (!dateField) return;
		
		$(fieldId).value = $(fieldId).value + ' ' + $(dateField.timeFieldId).innerHTML;
	}
	
});

var SegmentedControl = new Class.create({
	
	id: null,
	firstId: null,
	lastId: null,
	selectedId: null,
	options: null,
	numOptions: null,
	selectionAction: null,
	
	initialize: function(fieldId,firstId,lastId,selectedId){
		this.id = fieldId;
		this.firstId = firstId;
		this.lastId = lastId;
		this.selectedId = selectedId;
		this.fields = new Array();
		this.numOptions = 0;
	},
	
	select: function(id){
		if (id!=this.selectedId){
			$(this.selectedId).className = 'SegmentedControlValue';

			if (this.selectedId==this.firstId){
				$(this.id + '_begin').className = 'SegmentedControlBegin';
			}
			
			if (this.selectedId==this.lastId){
				$(this.id + '_end').className = 'SegmentedControlEnd';
			}
			
			$(id).className = 'SegmentedControlSelectedValue';

			if (id==this.firstId){
				$(this.id + '_begin').className = 'SegmentedControlSelectedBegin';
			}
			
			if (id==this.lastId){
				$(this.id + '_end').className = 'SegmentedControlSelectedEnd';
			}
			
			this.selectedId = id;
			
			if (this.selectionAction){
				this.selectionAction();
			}
		}
	},
	
	addOption: function(fieldId,value){
		// TODO Hacer que esto funcione como un campo combobox
		this.options[this.numOptions] = value;
		this.numOptions++;
	},
		
});

var SegmentedControlManager = Class.create({

	controls: null,
	
	initialize: function(){
		this.controls = new Array();
	},
	
	addControl: function(fieldId,firstId,lastId,selectedId){
		this.controls[fieldId] = new SegmentedControl(fieldId,firstId,lastId,selectedId);
	},
	
	control: function(fieldId){
		return this.controls[fieldId];
	}
	
});

var ColorPicker = new Class.create({
	
	id:null,
	value: '#ffffff',
	pickerObject:null,
	
	initialize: function(id,colorWellId,value,closeText) {
		this.id = id;
		this.value = value;
	
		var field = document.getElementById(id);
		this.pickerObject = new jscolor.color(field, {required:false,adjust:false,hash:true,caps:false});
		this.pickerObject.fromString(value);
		field.color = this.pickerObject;
	},
	
	show: function() {
		this.pickerObject.showPicker();
	},
	
	hide: function() {
		this.pickerObject.hidePicker();
	}
});


var ColorPickerManager = new Class.create({

	colorPickers:new Object(),

	addColorPicker: function (id,colorWellId,value,closeText) {
		this.colorPickers[id] = new ColorPicker(id,colorWellId,value,closeText);
	},
	
	removeColorPicker: function (id) {
		this.colorPickers[id] = null;
	},
	
	getColorPicker: function (id) {
		return this.colorPickers[id];
	},
	
	showAll: function(){
		for (var i in this.colorPickers){
			this.colorPickers[i].show();
		}
	},
	
	hideAll: function(){
		for (var i in this.colorPickers){
			this.colorPickers[i].hide();
		}		
	}
	
});


var FileField = new Class.create({

	uploaderId: null,
	id:null,
	actionFile: null,
	clearErrorCallback: null,
	setErrorCallback: null,
	addErrorCallback: null,
	
	initialize: function(uploaderId,id,actionFile) {
		this.uploaderId = uploaderId;
		this.id = id;
		this.actionFile = actionFile;
	},
	
	mustBeRemoved: function(){
		if (!$(this.id)) {
			return true;
		}
		else {
			return false;			
		}
	},
	
	uploadStart: function() {
		var auxFileField = $('aux_' + this.id);
		fileUploadersManager.getUploaderMovie(this.uploaderId).addPostParam('previousFile',auxFileField.value);
	},
	
	updateFileQueue: function() {
		
		if (!$(this.id)){
			return;
		}
		
		var file = new Object();
		file.id = 1;
		file.name = $(this.id).value;

		if (file.name!=""){
			var fileProgress = null;
			if (fileUploadersManager.getUploaderMovie(this.uploaderId)) {
				fileProgress = fileUploadersManager.getUploaderMovie(this.uploaderId).customSettings.progressTarget;
				$(fileProgress).innerHTML = '';
				var progress = new FileProgress(file, fileProgress);
				progress.setComplete();
			}			
		}
	},

	uploadSuccess: function(message) {
		
		if (!$(this.id)){
			return;
		}
		
		var auxFileField = $('aux_' + this.id);
		
		system.getActionManager().execute(this.actionFile,{ command: 'deleteTemporalFile',temporalFile: auxFileField.value,style: system.getCurrentStyle() });

		$(this.id).value = message;
		auxFileField.value = message;
		this.updateFileQueue();
	},
	
	clearError: function(event) {
		
		if (!$(this.id)){
			return;
		}
		
		// Show form error
		var form = formUtils.getParentForm($(this.id));
		formUtils.clearError(form);
	},
	
	uploadError: function (error) {	
		if (!$(this.id)){
			return;
		}
		
		// Show form error
		var form = formUtils.getParentForm($(this.id));
		formUtils.setError(form,error);
	}
	
});

var FileFieldManager = new Class.create({
	fileFields:new Object(),
	
	addFileField: function(uploaderId,id,actionFile) {
		this.fileFields[uploaderId] = new FileField(uploaderId,id,actionFile);
	},
	
	removeFileField: function(id) {
		this.fileFields[id] = null;
	},
	
	fileField: function(id) {
		return this.fileFields[id];
	},

	updateFileQueues: function(){
		for (var key in this.fileFields) {
			if (this.fileFields[key]){
				if (this.fileFields[key].mustBeRemoved()){
					//delete this.fileFields[key];
					this.fileFields[key] = null;

				}
				else {
					this.fileFields[key].updateFileQueue();					
				}
			}
		}
	},
	
	uploadStart: function (event) {
		// Tell the file filed about the error
		var fileField = this.fileFields[event.memo.uploaderId];
		if (fileField){
			fileField.uploadStart(event.memo.message);	
		}
	},
	
	uploadSuccess: function (event) {
		
		// Clear previous error
		this.clearError(event);

		
		// Tell the file filed about the error
		var fileField = this.fileFields[event.memo.uploaderId];
		if (fileField){
			fileField.uploadSuccess(event.memo.message);	
		}

		// Show errors if there was any
		this.uploadError(event);
	},
	
	clearError: function(event) {

		var fileField = this.fileFields[event.memo.uploaderId];
		if (fileField){
			fileField.clearError();
		}		
	},
	
	uploadError: function (event) {	
		if (event.memo.error) {						
			var fileField = this.fileFields[event.memo.uploaderId];
			if (fileField){
				fileField.uploadError(event.memo.error);
			}
		}
	}
	
});


var formUtils = new FormUtils();
var dateFieldManager = new DateFieldManager();
var colorPickerManager = new ColorPickerManager();
var fileFieldManager = new FileFieldManager();
var segmentedControlManager = new SegmentedControlManager();

document.observe('ws:datepicker_changedate',function (event){  dateFieldManager.saveTime(event.memo.id); } );
document.observe('ws:datepicker_datechanged',function (event){ dateFieldManager.restoreTime(event.memo.id); dateFieldManager.updateDateValue(event.memo.id);  } );

document.observe('ws:swf_loaded',function (event) { fileFieldManager.updateFileQueues(); });

document.observe('ws:file_upload_start',function (event) { fileFieldManager.uploadStart(event); });
document.observe('ws:file_upload_success',function (event) { fileFieldManager.uploadSuccess(event); });
document.observe('ws:file_upload_error',function (event) { fileFieldManager.uploadError(event); });

