jQuery.validator.addMethod("url_with_prefix", function(value, element) { 
    return this.optional(element) || value == 'http://' || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(element.value);
}, "Please enter a valid URL");

jQuery.validator.addMethod("alphabets_and_number", function(value, element) { 
    return this.optional(element) || /^(\d|[a-z])+$/i.test(value);
}, "Please enter only alphabets and numbers, no symbols like underscore or dot");

jQuery.validator.addMethod("ajax_remote", function(value, element, param) {
    if ( this.optional(element) )
		return "dependency-mismatch";
	
	var previous = this.previousValue(element);
	
    // check required
    if (typeof param["required"] != 'undefined') {
		for (var i=0; i<param["required"].length; i++) {
		    var name = param["required"][i];
		    var val = $(":input[name='" + name + "']").val();
		    if (! val.length) {
		        return previous.valid;
		    }
		}
	}
	
	if (!this.settings.messages[element.name] )
		this.settings.messages[element.name] = {};
	this.settings.messages[element.name].remote = typeof previous.message == "function" ? previous.message(value) : previous.message;
	
	if ( previous.old !== value ) {
		previous.old = value;
		var validator = this;
		this.startRequest(element);
		var data = {};
		data[element.name] = value;
		if (typeof param["data"] != 'undefined') {
		    for (var i=0; i<param["data"].length; i++) {
		        var name = param["data"][i];
		        data[name] = $(":input[name='" + name + "']").val();
		    }
		}
		$.ajax({
			url: param["url"],
			mode: "abort",
			port: "validate" + element.name,
			dataType: "text",
			data: data,
			type: 'POST',
			success: function(response) {
				if ( response == 'true' || response == 'OK' ) {
					var submitted = validator.formSubmitted;
					validator.prepareElement(element);
					validator.formSubmitted = submitted;
					validator.successList.push(element);
					validator.showErrors();
					previous.valid = true;
				} else {
				    var err = response || validator.defaultMessage( element, "remote" );
				    validator.settings.messages[element.name] = err;
				    var errors = {};
					errors[element.name] = err;
					validator.showErrors(errors);
					previous.valid = false;
				}
				validator.stopRequest(element, response);
			}
		});
		return "pending";
	} else if( this.pending[element.name] ) {
		return "pending";
	}
	return previous.valid;
}, 'There is an error!' );