
var Autotext = new Class({
	object: null, text: null,
	enabled: true,
	initialize: function(object, text, focus_now) {
		if(object == null) return;
		object = $(object);
		if(object == null) return;
		
		this.text = text;
		this.object = object;
		
		object.addEvent('blur',this.onBlur.bind(this));
		object.addEvent('focus',this.onFocus.bind(this));
		object.getValue = function() { if(this.object.value == this.text) return ''; return this.object.value; }.bind(this);
		
		if(focus_now)
			object.focus();
		else
			this.onBlur();
	},
	
	disable: function() {
		this.enabled=false;
		if(this.object.value == this.text){
			this.object.value = '';
			this.object.removeClass('disabledText');
		}
	},
	
	enable: function() {
		this.enabled=true;
	},
	
	onBlur: function() {
		if(this.enabled && this.object.value==''){
			this.object.addClass('disabledText');
			this.object.value = this.text;
		}
	},
	
	onFocus: function() {
		if(this.enabled && this.object.value == this.text) {
			this.object.value = '';
			this.object.removeClass('disabledText');
		}
	}
});

var ValueWatcher = new Class({
	initialize: function(object, cb) {
		this.object=  $(object);
		this.object.addEvent('keyup', function() { cb(); });
		this.object.addEvent('change', function() { cb(); });
	}
});

var FormValidator = new Class({
	formEnabled: true,
	
	initialize: function(options) {
		this.options = options;
		
		for(var i=0; i<this.options.fields.length; i++) {
			var field=this.options.fields[i];
			var elem = $(field.id);
			if(elem == null) continue;
			
			elem.addEvent('keyup', function() { this[0].validate(this[1]); }.bind([this,i]));
			elem.addEvent('change', function() { this[0].validate(this[1]); }.bind([this,i]));
		}
		
		
		this.validate();
	},
	
	disableForm: function() {
		if(!this.formEnabled) return false;
		
		for(var i=0; i<this.options.fields.length; i++) {
			var field=this.options.fields[i];
			var elem = $(field.id);
			if(elem == null) continue;
			elem.disabled = true;
		}
		
		this.formEnabled = false;
		$(this.options.button).disabled = true;
		return true;
	},
	
	enableForm: function() {
		if(this.formEnabled)
			return false;
		
		for(var i=0; i<this.options.fields.length; i++) {
			var field=this.options.fields[i];
			var elem = $(field.id);
			if(elem == null) continue;
			elem.disabled = false;
		}
		
		this.formEnabled = true;
		this.validate();
		
		return true;
	},
	
	validate: function(e) {
		var messages = [];
		if(!this.formEnabled) return;
		
		if(typeof e != 'undefined' && e != null && typeof this.options.fields[e]!='undefined') {
			var message =this.validateField(e);
			if(message!=null)
				messages.push(message);
		} else { 
			for(var i=0; i<this.options.fields.length; i++) {
				var message =this.validateField(i);
				if(message!=null)
					messages.push(message);
			}
		}
		
		var isvalid = true;
		for(var i=0; i<this.options.fields.length; i++) {
			var field=this.options.fields[i];
			if(!field.valid) {
				isvalid = false;
				break;
			}
		}
		
		if(!isvalid) {
			$(this.options.button).disabled = true;
			$(this.options.button).addClass('disabled');
			if(typeof this.options.message != 'undefined' && messages.length > 0) {
				$(this.options.message).set('text',messages[0]);
			}
		} else {
			$(this.options.button).disabled = false;
			$(this.options.button).removeClass('disabled');
			if(typeof this.options.message != 'undefined')
				$(this.options.message).set('text','');
		}
	},
	
	validateField: function(e) {
		var field = this.options.fields[e];
		var elem = $(field.id);
		var val;
		
		if(typeof elem.getValue == 'function')
			val = elem.getValue();
		else
			val = elem.value;
		
		var reg = new RegExp(field.regex);
		var tr = null;
		
		if(elem.parentNode.parentNode.tagName == "TR")
			tr= elem.parentNode.parentNode;
		
		var message = null;
		
		if(reg.test(val)) {
			field.valid = true;
			if(tr)
				tr.removeClass('error');
		} else {
			if(tr)
				tr.addClass('error');
			field.valid = false;
			if(typeof field.message != 'undefined')
				message=field.message;
		}
		
		return message;
	}
});

var InplaceEditor = new Class({
	object: null,
	callback: null,
	editmode: false,
	editbox: null,
	
	initialize: function(object, callback) {
		this.object = $(object);
		this.callback = callback;
		if(this.object == null) return;
		
		this.object.addEvent('click', function() {
			if(!this.editmode) this.setEditMode();
		}.bind(this));
		
		this.object.addEvent('mouseover', function() { this.onMouseOver(); }.bind(this));
		this.object.addEvent('mouseout', function() { this.onMouseOut(); }.bind(this));
	},
	
	onMouseOver: function() {
		if(!this.editmode)
			this.object.addClass('inplaceHover');
	},
	
	onMouseOut: function() {
		this.object.removeClass('inplaceHover');
	},
	
	setEditMode: function() {
		this.editmode = true;
		this.mytext = this.object.get('text').replace(/(^[\s]*)|([\s]*$)/g,'');
		this.object.innerHTML = '';
		this.editbox = new Element('input',{
			'type':'text',
			'class':'inputText',
			'style': 'width: 480px;',
			'value': this.mytext
		});
		this.editbox.addEvent('keyup', function(event) { if(event.key=='enter') {this.setDisplayMode();} }.bind(this));
		this.editbox.addEvent('blur', function() { this.setDisplayMode(); }.bind(this));
		this.object.appendChild(this.editbox);
		this.editbox.focus();
	},
	
	setDisplayMode: function() {
		var new_value = this.editbox.value;
		if(this.callback != null) {
			if(!this.callback(new_value))
				new_value = this.mytext;
		}
		
		this.mytext = new_value;
		this.object.set('text', this.mytext);
		this.editmode=  false;
	}

});