/*
 *    Default Values Trigger, v.03, Konrad Gmurek
 *	  history:
 *		- .03 - register function can accept data in two formats:
 *				oldfashioned: {'selector':'value', 'selector':'value'}
 *				newstyle: [{tag:$(tag), value:'value'}, {selector:'selector', value:'value'}]
 *				both styles can be mixed - keys are ignored for newstyle declarations:
 *				{'selector':'value', '0':{tag:$(tag), value:'value'}}
 *		- .02 - added removeDefaultValues function
 *		      - if input contains default value a class 'defaultValue' is assigned
 */
var defaultValuesTrigger = {
	register: function(data) {
		for (var tagSelector in data) {
			if (typeof(data[tagSelector]) == 'string') { // data set as selector:defaultValue pair
				var tag = $(tagSelector).eq(0); /* TODO: chaining..! */
				var defaultValue = data[tagSelector];
			}
			else {	// data set as object
				var defaultValue = data[tagSelector].value;
				var tag = $();
				if (typeof(data[tagSelector].selector) == 'string') {
					var tag = $(data[tagSelector].selector).eq(0); /* TODO: chaining..! */
				} 
				else if (typeof(data[tagSelector].tag) == 'object' && typeof(data[tagSelector].tag.selector) == 'string') {	// make sure it's jQ
					var tag = data[tagSelector].tag;
				}
			}

			if (tag) {
				if (tag.attr('type') == 'password') {	/* password input */
					var tag_class = tag.attr('class');
					var tag_display = tag.css('display');
					var fake_tag = $('<input type="text" class="'+tag_class+'"/>');

					/* TODO: fix saved password under opera */
					if (tag.val()) {
						fake_tag.addClass('hiddenPassword');
					}
					else {
						tag.addClass('hiddenPassword');
					}
					tag.after(fake_tag);

					fake_tag.val(defaultValue).addClass('fakePassword');
					fake_tag.focus(this.attachPasswordOnFocus(tag, fake_tag));
					tag.blur(this.attachPasswordOnBlur(tag, fake_tag));
				}
				else {	/* text input */
					if (!tag.val() || tag.val() == defaultValue) {
						tag.val(defaultValue);
						tag.addClass('defaultValue');
					}
					tag.data('defaultValue', defaultValue);
					tag.focus(this.attachOnFocus(defaultValue));
					tag.blur(this.attachOnBlur(defaultValue));
				}
			}
		}
	},
	resetToDefault: function(data) { // this takes selectors list only, TODO: should be more universal
		for (var tagSelector in data) {
			var tag = $(data[tagSelector]).eq(0); /* TODO: chaining..! */
			if (tag) {
				if (tag.attr('type') == 'password') {	/* password input */
					tag.val('').addClass('hiddenPassword').next().removeClass('hiddenPassword');
				}
				else {
					var defVal = tag.data('defaultValue');
					if (defVal) { // && !tag.hasClass('fakePassword')) {  <-- may be useful in future
						tag.val(defVal);
					}
				}
			}
		}
	},
	removeDefaultValues: function(data) { // this takes selector only, TODO: should be more universal
		$(data).each(function(i, el) {
			var node = $(this);
			if (node.val() == node.data('defaultValue')) {
				node.val('');
			}
		});
	},
//	remove: function(data, search_within)
//	{
//		search_func = {children: $};
//		if (search_within) {
//			search_func = $(search_within);
//		}
//
//		search_func.children('.fakePassword').remove();
//		search_func.children('input[type="password"]').removeClass('hiddenPassword');
//
//		for (var tagSelector in data) {
//			var tag = search_func.children(tagSelector).eq(0); /* TODO: chaining..! */
//			// TODO: unbind focus and blur events...
//			if (tag) {
//				if (tag.attr('type') != 'password') {	/* no password input */
//					var defaultValue = tag.data('defaultValue');
//					if (defaultValue) {
//						if (tag.val() == defaultValue) {
//							tag.val('');
//						}
//					}
//					tag.data('defaultValue');
//					tag.focus(this.attachOnFocus(data[tagSelector]));
//					tag.blur(this.attachOnBlur(data[tagSelector]));
//				}
//			}
//		}
//	},
	attachPasswordOnFocus: function(tag, fake_tag) {
		return function() {
			fake_tag.addClass('hiddenPassword');
			tag.removeClass('hiddenPassword').focus();
		}
	},
	attachPasswordOnBlur: function(tag, fake_tag, tag_display) {
		return function() {
			if (!$(tag).val()) {
				fake_tag.removeClass('hiddenPassword');
				tag.addClass('hiddenPassword');
			}
		}
	},
	attachOnFocus: function(defaultValue) {
		return function() {
			if ($(this).val() == defaultValue) {
				$(this).val('').removeClass('defaultValue');
			}
		}
	},
	attachOnBlur: function(defaultValue) {
		return function() {
			if ($(this).val() == '') {
				$(this).val(defaultValue).addClass('defaultValue');
			}
		}
	}
}
