/* Class DynamicForm
 * 
 * Place all form ID's in the FORMS property. All elements defined by SELECTOR will be assigned a handler
 * for clearing field upon focus and switching color (and vice versa). The default value is defined in the alt
 * attribute of the element.
 *
 * @author: Tomas Beke
 *
 * */

var DynamicFormOptions;
var DynamicFormDefaultOptions = {
	DARK: '#000000',
	LIGHT: '#B7B7B7',
	FORMS: '#form',
	SELECTOR: '.contained_label',
	ONLY_ERROR_HIGHGLIGHT: false
};

window.DynamicForm = {
	DARK: '#000000',
	LIGHT: '#B7B7B7',
	FORMS: '#form',
	SELECTOR: '.contained_label',
	ONLY_ERROR_HIGHGLIGHT: false,
	exists: false,
	
	create: function(options)
	{
		DynamicForm._init_options(options);
		DynamicForm.exists = true;
	},
	
	events: {
		ready: function ()
		{
			DynamicForm.custom_init();
			DynamicForm.parse_fields();
		}
	},

	_hash_merge: function(hashes)
	{
		var r = {};
		for (var h in hashes)
		{
			for (var k in hashes[h])
			{
				r[k] = hashes[h][k]
			}
		}
		return r;
	},
	
	_init_options: function(opts)
	{
		DynamicFormOptions = DynamicForm._hash_merge([DynamicFormDefaultOptions, opts || {}]);
	},
	
	custom_init: function ()
	{

	},
	
	parse_fields: function()
	{
		if(DynamicFormOptions.ONLY_ERROR_HIGHGLIGHT == false)
		{
			var fields = $(DynamicFormOptions.FORMS).find(DynamicFormOptions.SELECTOR);
	
			for(var i = 0; i < fields.length; i++)
			{
				var field = $(fields[i]);
				if(field[0].tagName == 'SELECT')
				{
					if(field.val() != field.attr('title'))
						DynamicForm.focus_handler(field, 'title');
					field.bind("focus blur change", function(){ DynamicForm.focus_handler($(this), 'title') });
				}
				else if(field[0].tagName == 'INPUT')
				{
					if(field.val() != field.attr('alt'))
						DynamicForm.focus_handler(field, 'alt');
					field.bind("focus blur change", function(){ DynamicForm.focus_handler($(this), 'alt') });
				}
				else if(field[0].tagName == 'TEXTAREA')
				{
					if(field.text() != field.attr('alt'))
						DynamicForm.focus_handler_textarea(field, 'alt');
					field.bind("focus blur change", function(){ DynamicForm.focus_handler_textarea($(this), 'alt') });
				}
			}
		}
		if(window.errors != undefined)
		{
			DynamicForm.highlight_errors();
		}
	},
	
	highlight_errors: function ()
	{
		for(var i = 0; i < window.errors.length; i++)
		{
			var field = $(window.errors[i]);
			field.attr('class', field.attr('class') + ' field_error');
			$('.error_caption.' + field.attr('name')).show();
		}		
	},
	
	set_color: function (color, field)
	{
		field.css('color', color);
	},
	
	switch_type: function (id, type)
	{
		var input = document.getElementById(id);
		var input2 = input.cloneNode(false);
		input2.type ='password';
		input.parentNode.replaceChild(input2,input);
		$(input2).unbind();
		input2.focus();
		input2.select();
	},
	
	focus_handler_textarea: function (field, attr)
	{
		var text = field.attr(attr);
		if(field.val() == text)
		{
			field.val('');
			DynamicForm.set_color(DynamicFormOptions.DARK, field);
			return;
		}
		else if(field.val() == '')
		{
			field.val(text);
			//field.text(text);
			DynamicForm.set_color(DynamicFormOptions.LIGHT, field);
			return;
		}
		else
		{
			DynamicForm.set_color(DynamicFormOptions.DARK, field);
		}		
	},
	
	focus_handler: function (field, attr)
	{
		var text = field.attr(attr);
		if(field.val() == text)
		{
			field.val('');
			DynamicForm.set_color(DynamicFormOptions.DARK, field);
			if(text == 'Confirm Password' || text == 'Password')
			{
				DynamicForm.switch_type(field.attr('id'), "password");
			}			
			return;
		}
		else if(field.val() == '')
		{
			field.val(text);
			DynamicForm.set_color(DynamicFormOptions.LIGHT, field);
			return;
		}
		else
		{
			DynamicForm.set_color(DynamicFormOptions.DARK, field);
		}
	},
	
	enumerate_fields: function ()
	{
		var fields = $(DynamicFormOptions.FORMS).find("input");	
		var txt = '';
		for(var i = 0; i < fields.length; i++)
		{
			var field = $(fields[i]);
			txt = txt + "'" + field.attr("name") + "' => array('required' => false, 'type' => 'string', 'caption' => '" + field.attr("alt") +"'), ";
		}
		return txt;
	}
};
