(function($) {
	// JERS jQuery plugins
	// ajax random generator (really a date time converter)
	$.ajaxRan = function(interval){
		var date = new Date(); 
		if (typeof interval == 'undefined'){
			return date.getTime();
		}
		date.setSeconds(0,0); 
		date.setMinutes(Math.round((date.getMinutes()/interval)-0.5)*interval);
		return date.getTime();
	};
	
	// custom filters:
	// a filter for external links
	$.expr[':'].external = function(obj){
	    return !obj.href.match(/^mailto\:/) && !obj.href.match(/^javascript\:/) && (obj.hostname != location.hostname);
	};
	
	// debugging things
	$.showInputName = function(){
		$("input").each(function(){
			$(this).qtip({
				content: $(this).attr("name"), show: { ready: true },hide: false,
				style: {name: 'cream', tip: 'leftMiddle', border: {width:1},padding:0},
				position: {corner: {tooltip: 'leftMiddle',target: 'rightMiddle'}} 
			});
		});
	};
	
	// The tag name form the first element
	$.fn.tag = function() {
		return $(this)[0].tagName.toLowerCase();
	};

	$.fn.message = function(type, message, options){
	   return this.jersMessage(type, message, options);
	}
	// Make any element a message element by adding type (success,error,loading) and message it will generate a nice message block
    // There is a short code for error message $().jersMessage("error",JSON.errors)
	$.fn.jersMessage = function(type,message,options){
		var defaults = {prefix:"",form:"",scrollTo:true};
		var opts = $.extend(defaults,options);
		$(".all_input_error").removeClass("all_input_error");
		return this.each(function() {
			$(this).removeClass().html("");
			if(type.toLowerCase() != 'clear'){
				$(this).removeClass().addClass("all_message_block all_"+type+"_message_block").html("<div class=\"all_"+type+"_message_header\"><span class=\"all_message_text\"></span></div>").show();
				if(typeof message == "string"){
					$(this).find("span.all_message_text").html(message);
				}
				if(type.toLowerCase() == 'error'){
					if(typeof message != "string"){
						opts.errors = message;
						message = opts.errors.error
					}
					$(this).find("span.all_message_text").html("<b>LET OP: </B>"+message);
					if(typeof opts.errors != 'undefined'){
						$(this).append($("<ul class=\"all_error_list\"></ul>"));
						for (var key in opts.errors) {
							if(key!="error"){
								if(opts.prefix==""){
									if (typeof opts.form == "string" && opts.form!=""){
										$("#"+opts.form).find("input[name="+key+"]").addClass("all_input_error");
									} else {
										if($("input[name="+key+"]").addClass("all_input_error").length==0){
                                            $("textarea[name="+key+"]").addClass("all_input_error");
										}
										if($("input[name="+key+"]").attr("type") == "file"){
											$("input[name="+key+"]").parent().find("div.fakefile").find("input").addClass("all_input_error");
										}
									}								
								} else {
									$("#"+opts.prefix+"_"+key).addClass("all_input_error");
								}
								if(opts.errors[key]!="") {
								    $(this).find("ul.all_error_list").append($("<li>"+opts.errors[key]+"</li>"));
								}
							}
						}
					}
				}
				if ($.scrollTo && opts.scrollTo) {
					$.scrollTo(this);
				}
			}
		});
	}
	
    $.fn.jersAjaxForm = function(wcId,jersMessageContainer,options){
		if ($().ajaxForm) {
			var defaults = {
				loadingMessage: "Uw gegevens worden opgeslagen.",
				hideForm: true,
				redirect: true,
				jersMessage: {},
				success: function(JSONResponse){
				},
				error: function(JSONResponse){
				},
				jersMessageContainer: {},
				jersForm: {},
				ajaxFormOptions: {}
			};
			var opts = $.extend({},defaults, options);
			opts.jersMessageContainer = jersMessageContainer;
			opts.jersForm = this;
			var postUrl;
			if (typeof wcId == "string") {
				postUrl = wcId;
			}
			else {
				postUrl = "/controller/WebController/?wcId=" + wcId;
			}
			var ajaxFormDefaults = {
				url: postUrl,
				jersAjaxFormOpts: opts,
				dataType: "json",
				type: "POST",
				beforeSubmit: function(){
					this.jersAjaxFormOpts.jersMessageContainer.message("loading", this.jersAjaxFormOpts.loadingMessage,this.jersAjaxFormOpts.jersMessage);
				},
				success: function(JSON){
					if (JSON.errors.error || (JSON.errors[0] && JSON.errors[0].error)) {
						this.jersAjaxFormOpts.jersMessageContainer.message("error", (JSON.errors.error) ? JSON.errors : JSON.errors[0],this.jersAjaxFormOpts.jersMessage);
						this.jersAjaxFormOpts.error(JSON);
					}
					else {
						this.jersAjaxFormOpts.jersMessageContainer.message("success", JSON.data.message,this.jersAjaxFormOpts.jersMessage);
						if (this.jersAjaxFormOpts.hideForm) {
							opts.jersForm.hide();
						}
						if (this.jersAjaxFormOpts.redirect && JSON.data.redirectUrl) {
							document.location = JSON.data.redirectUrl;
						}
						this.jersAjaxFormOpts.success(JSON);
					}
				}
			};
			var ajaxFormOpts = $.extend({},ajaxFormDefaults, opts.ajaxFormOptions);
			return $(this).ajaxForm(ajaxFormOpts);
		} else {
            throw "jquery.form.js is not loaded.";			
		}
	}
})(jQuery);