$(document).ready(function () {

$.fn.GHSelectImage = function(settings) {
	if (this.length > 1){
		this.each(function() { $(this).GHSelectImage(settings) });
		return this;
	}

	settings = $.extend({
		input_name : "",
		selected_callback: 0
	}, settings || {});
	var self = this;
	
	function load() {
		settings.input = $("<input type='hidden' name='"+settings.input_name+"' value=''/>");
		settings.selected = $(".selected", self);
		self.after(settings.input);
		$('img', self).click(function(){
			if (settings.selected) 
				settings.selected.removeClass("selected");

			settings.selected = $(this);
			settings.selected.addClass('selected');
			settings.input.val(settings.selected.attr('src'));

			if (settings.selected_callback) 
				settings.selected_callback.apply(this, [self.attr('id'), 1]);
		});
	}
	
	self.getSelectedSrc = function() {
		return settings.selected.attr('src');
	}

	load();
	return this;
}

$.fn.GHAddChild = function(settings) {
	settings = $.extend({
		input_handler : 0,
		remove_input_handler : 0,
		inputs : [],
		max_inputs : 4,
		num_inputs : 0
	}, settings || {});
	var self = this;

	self.bind('click', function() {
		addChildInput();
		return false;
	});

	function addChildInput() {
		if (settings.num_inputs >= settings.max_inputs) {
			alert("only "+settings.max_inputs+" children allowed");
			return false;
		}

		settings.num_inputs++;
		var id = 'child' + settings.num_inputs;
		var li = "<li class='add-child-li'><p>" +
			"<label for='email'>Child "+settings.num_inputs+"'s Username</label>" +
			"<input type='text' value='' id='"+id+"' name='child[]' />";
		if (settings.num_inputs > 1)
			li += "&nbsp;<a class='remove' href='#'>[remove]</a>";
		li += "</p></li>";
		li = $(li);
		$('#add-child-li').before(li);

		$('.remove', li).bind('click',function(){
			removeChildInput(li,id);
			return false;
		});
		
		$('#'+id).GHValidator({callback: settings.input_handler, unique: 1});
		if (settings.num_inputs >= settings.max_inputs) {
			self.hide();
		}
	}
	
	function removeChildInput(li, id) {
		li.remove();
		if (GHValidatorUniques) delete GHValidatorUniques[id];
		if (settings.remove_input_handler) {
			settings.remove_input_handler.apply(this,[id]);
		}
		// update count
		settings.num_inputs--;
		// renumber inputs
		var c = 1;
		$(".add-child-li").each(function(){
			$("label", this).html("Child "+c+"'s Username");
			$("input", this).attr("id", "child"+c);
			c++;
		});
		self.show();
	}

	self.addFirstChildInput = function() {
		addChildInput();
	}

	return this;
}

// object used to make sure children don't have the same names with
// k:v as input_field:value
var GHValidatorUniques = {};
$.fn.GHValidator = function(settings) {

	if (this.length > 1){
		this.each(function() { $(this).GHValidator(settings) });
		return this;
	}

    settings = $.extend({
		           callback: 0,
		           validate_on_load: 1,
		           unique: 0,
		           validator_url: 'signup_validator.php'
    }, settings || {});

	function load() {
		settings.feedback = $('<span></span>');
		self.after(settings.feedback);
		self.keyup(function () {
			validate(this);
		});
		
		if (settings.validate_on_load) validate(self.get(0));
	}
	
	function validate(t) {
		settings.feedback.removeClass('error success');
		if (t.value != t.lastValue) {
			if (t.timer) clearTimeout(t.timer);
			settings.feedback.html("checking...").addClass('checking');



			// first do local checks, then hit the server
			if (!isUnique(t)) {
				setFeedback(false, " Usernames must be unique");
				return;
			}

			t.timer = setTimeout(function () {
				var r_obj = {};
				r_obj.url = settings.validator_url;
				r_obj.dataType = 'json';
				r_obj.type = 'post';
				r_obj.data = {name: self.attr('name'), value: self.val()};
				r_obj.success = function(json) {
					setFeedback(json.proceed, json.message);
				}
				$.ajax(r_obj);
			}, 500);
		}
	}
	
	function setFeedback(proceed, msg) {
		settings.feedback.html(msg);

		if (!proceed) {
			settings.feedback.addClass('error');
		} else {
			settings.feedback.addClass('success');
		}

		if (settings.callback) {
			settings.callback.apply(this,[self.attr('id'), proceed]);
		}

	}

	function isUnique(t) {
		var rv = true;

		if (settings.unique) {
			GHValidatorUniques[t.id] = t.value;
			$.each(GHValidatorUniques, function(k, v) {
				if (k != t.id && v == t.value) {
					rv = false;
					return false;
				}
			});
		}

		return rv;
	}

	

	var self = this;
	load();
	return this;
}

$.fn.GHPwdValidator = function(settings) {
    settings = $.extend({
		           callback: 0,
		           confirm_input: $('#confirm'),
		           validate_on_load: 0
    }, settings || {});

	function load() {
		settings.feedback = $('<span></span>');
		self.after(settings.feedback);
		self.keyup(function () {
			validate(this);
		});
		if (settings.validate_on_load) validate(self.get(0));

		if (settings.confirm_input) {
			settings.confirm_feedback = $('<span></span>');
			settings.confirm_input.after(settings.confirm_feedback);
			settings.confirm_input.keyup(function () {
				validateConfirm(this);
			});
			if (settings.validate_on_load) validateConfirm(settings.confirm_input.get(0));
		}
	}
	
	function validate(t) {
		settings.feedback.removeClass('success error').addClass('checking').html("checking...");
		if (t.timer) clearTimeout(t.timer);
		t.timer = setTimeout(function() {
			if (t.value.length > 3) {
				settings.feedback.html("Password okay").addClass('success');
				if (settings.callback) {
					settings.callback.apply(this,[self.attr('id'), 1]);
				}
			} else {
				settings.feedback.html("Password must be at least four characters long").addClass('error');
				if (settings.callback) {
					settings.callback.apply(this,[self.attr('id'), 0]);
				}
			}
		}, 500);
	}

	function validateConfirm(t) {
		settings.confirm_feedback.removeClass('success error').addClass('checking').html("checking...");
		if (t.timer) clearTimeout(t.timer);
		t.timer = setTimeout(function() {
			if (t.value == self.val()) {
				settings.confirm_feedback.html("Passwords match").addClass('success');
				if (settings.callback) {
					settings.callback.apply(this,[settings.confirm_input.attr('id'), 1]);
				}
			} else {
				settings.confirm_feedback.html("Passwords don't match!").addClass('error');
				if (settings.callback) {
					settings.callback.apply(this,[settings.confirm_input.attr('id'), 0]);
				}
			}
		}, 500);
	}

	var self = this;
	load();
	return this;
}

$.fn.GHContinueCheck = function(settings) {
    settings = $.extend({
		conditions : {}
    }, settings || {});

	function setButton() {
		var cont = true;
		$.each(settings.conditions, function (k, v) {
			if (!v) {
				cont = false;
				return false;
			}
			return true;
		});
		
		if (cont) {
			self.attr('disabled', 0);
		} else {
			self.attr('disabled', 1);
		}
	}

	this.setContinue = function(id, val){
		settings.conditions[id] = val;
		setButton();
	}

	this.removeCheck = function(id){
		delete settings.conditions[id];
		setButton();
	}

	var self = this;
	self.attr('disabled', 1);
	return this;
}

});

