/* class extensions */

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); }
String.prototype.add_class = function(name) { return this.replace(/$/g, ' ' + name); }
String.prototype.remove_class = function(name) { return this.replace(new RegExp('\s*' + name + '\s*', 'g'), '').trim(); }



/* event handling */

function event_handler()
{
	var self = this;
	var handlers = new Array();

	this.add = function(h) { handlers.push(h); }
	this.handle = function(e1, e2, e3) { for (i in handlers) handlers[i](e1, e2, e3); }
};

init_handler = function(elem, name)
{
	var new_name = name + "_handler";
	if (elem[new_name] != undefined) return;
	
	elem[new_name] = new event_handler();
	elem[name] = function(e) { elem[new_name].handle(e); }
}
add_handler = function(elem, name, proc)
{
	init_handler(elem, name);
	elem[name + "_handler"].add(proc);
}

/* empty state */

function emptystate(parent, text, empty_class)
{
	var self = this;

	add_handler(parent, "onfocus", function() { self.hide(); } );
	add_handler(parent, "onblur", function() { update_state(); } );
	add_handler(window, "onunload", function() { self.hide(); } )
	
	update_state();
	
	this.hide = function() { if (self.active) { parent.value = ""; parent.className = parent.className.remove_class(empty_class); } }
	function update_state()
	{ 
		self.active = parent.value.trim() == "";
		if (self.active) 
		{
			parent.value = text; 
			parent.className = parent.className.add_class(empty_class);
		}
		else parent.className = parent.className.remove_class(empty_class);
	}
}

function emptystate_password(password, input)
{
	var self = this;
	
	this.hide = function() 
	{ 
		password.style.display = "inline";
		input.style.display = "none";
	}
	
	this.show = function()
	{
		password.style.display = "none";
		input.style.display = "inline";
	}
	
	function update_state()
	{ 
		self.active = password.value.trim() == "";
		if (self.active) self.show();
		else self.hide();
	}
		
	add_handler(input, "onfocus", function() { self.hide(); password.focus(); } );
	add_handler(password, "onblur", function() { update_state(); } );
	add_handler(window, "onunload", function() { self.hide(); } )
	
	update_state();
}

