$(document).ready(function() {
	$(".labeled-input").each(function() {
		this.label = this.value;

		this.onfocus = function() {
			if(this.value==this.label) {
				this.value = "";
				$(this).removeClass("labeled-input");
			}
		};

		this.onblur = function() {
			if(this.value=="") {
				this.value = this.label;
				$(this).addClass("labeled-input");
			}
		};
	});

	$("textarea").elastic();
});

function Validator(form) {
	if(typeof(form)=="string") 
		form = $(form).get(0);

	this.errors = "";
	this.form = form;
	this.originalColor = $(form).find("input[type='text']").css("border-left-color");

	this.reset = function() {
		this.errors = "";
	};

	this.validate = function(noscroll) {
		if(this.errors.length==0) {
			return true;
		}
		else {
			//alert("Please fix the following errors:\n\n" + this.errors);
			this.errors = "";
			if(noscroll==null)
				window.scrollTo(0, 0);
			return false;
		}
	};

	this.email = function(fieldName, field) {
		var val = $(form[fieldName]).val();
		if(validateEmail(email)) {
			this.error(fieldName, false);
			return true;
		}
		else {
			this.error(fieldName, true, field + " is invalid");
			return false;
		}
	};
	
	this.showError = function(fieldName, errormessage) {
		this.error(fieldName, true, errormessage);
		return false;
	}

	this.require = function(fieldName, field) {
		var val = $(form[fieldName]).val();
		if(isEmpty(val) || (form[fieldName].label && form[fieldName].label==val)) {
			this.error(fieldName, true, field + " is required");
			return false;
		}
		else {
			this.error(fieldName, false);
			return true;
		}
	};

	this.requireRadio = function(fieldName, field) {
		   var val = $(form).find('input[name=' + fieldName + ']:checked').val();
		   if(isEmpty(val)) {
			   this.error(fieldName, true, field + " is required");
			   return false;
		   }
		   else {
			   this.error(fieldName, false);
			   return true;
		   }
	};
	
	this.requireAlphanumeric = function(fieldName, field) {
		var myRegxp = /^([a-zA-Z0-9_-]+)$/; 
		var val = $(form[fieldName]).val();
		if(myRegxp.test(val)==false) {
			this.error(fieldName, true, field + " contains invalid character");
			return false;
		}
		else {
			this.error(fieldName, false);
			return true;
		}
	};
	
	this.requireStartAlpha = function(fieldName, field) {
		var myRegxp  = /^([a-zA-Z])/; 
		var val = $(form[fieldName]).val();
		if(myRegxp.test(val)==false) {
			this.error(fieldName, true, field + " starts with a non alphabet character.");
			return false;
		}
		else {
			this.error(fieldName, false);
			return true;
		}
	};

	this.regex = function(fieldName, exp, error) {
		var val = $(form[fieldName]).val();
		var reg = new RegExp(exp);
		if(val.match(reg)) {
			this.error(fieldName, false);
			return true;
		}
		else {
			this.error(fieldName, true, error);
			return true;
		}
	};

	this.date = function(fieldName, field) {
		var val = $(form[fieldName]).val();
		if(isEmpty(val)) {
			this.error(fieldName, false);
			return true;
		}

		var d = parseDatepicker(val);
		if(d) {
			this.error(fieldName, false);
			return true;
		}
		else {
			this.error(fieldName, true, field + " is invalid");
			return false;
		}
	};	
	
	/**
	 * this.error("fieldName1" [, "fieldName2" ], error: boolean [, "msg" ])
	 */
	this.error = function() {
		var fields = new Array();
		var iserror;

		var j = 0;
		for(;j<arguments.length;j++) {
			if(typeof arguments[j]=="boolean") {
			   iserror = arguments[j];	
				break;
			}
		}

		if(iserror) {
			if(j+1<arguments.length)
				this.errors += "- " + arguments[j+1] + "\n";
			for(var i=0;i<j;i++) {
				var c = $(this.form[arguments[i]]);
				//c.css("border-color", "red");
				//c.parent().css("border", "solid 1px red");
				var span = c.parent().parent().find(".input-msg");
				span.addClass("input-error");
				span.removeClass("input-ok");
				if(j+1<arguments.length)
					span.html(arguments[j+1]);
			}
		}
		else {
			for(var i=0;i<j;i++) {
				var c = $(this.form[arguments[i]]);
				//c.css("border-color", this.originalColor);
				//c.parent().css("border", "none");
				var span = c.parent().parent().find(".input-msg");
				span.removeClass("input-error");
				span.addClass("input-ok");
				span.html("&nbsp;");
			}
		}
	};
}

function isEmpty(e) {
	if(e==null) return true;
	return $.trim(e)=="";
}

function makeDatepicker(element_selector, value) {
	$(element_selector).datepicker();
	$(element_selector).datepicker('option', { dateFormat: 'd MM yy' });
	$(element_selector).val(value);
}

function parseDatepicker(val) {
	if(isEmpty(val)) return null;

	var reg = /^\s*([1-9]|[12][0-9]|3[01]) +(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) +(\d{4})\s*$/;
	if(!reg.test(val)) return null;

	try {
		var day = parseInt(val.replace(reg, "$1"));
		var month = val.replace(reg, "$2");
		var year = parseInt(val.replace(reg, "$3"));

		var months = { Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5, Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11 };
		month = months[month];

		var d = new Date();
		d.setDate(day);
		d.setMonth(month);
		d.setFullYear(year);
		return d;
	} catch(e) {
		return null;
	}
}

function validateEmail(email) {
	var filter = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; 
	// /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
	return filter.test(email);
}

function randInt(i) {
	return Math.floor(Math.random() * i);
}

$(document).ready(function() {
	var re = new RegExp("[\"'=]?https?://[\\w\\d:#@%/;$()~_?\+-=\\\.&]+", "gm");

	$(".auto-url").each(function() {
		var html = this.innerHTML;
		var res = html.match(re);
		if(res==null) return;

		for(var i=0;i<res.length;i++) {
			var url = res[i];
			var c = url.charAt(0);
			if(c=='h')
				html = html.replace(url, "<a href='" + url + "' target='_blank'>" + url + "</a>");
		}
		this.innerHTML = html;
	});
});
