(function($) {
	// static constructs
	$.tools = $.tools || {version: {}};

	$.tools.version.ai_form_realtor_agentcontact = '1.0';

	var current = null;

	// constructor
	function AI_FORM_REALTOR_AGENTCONTACT(formtag, conf) {
		// current instance
		var self = this;
		if(!current) { current = self; }

		// generic binding function
		function bind(name, fn){
			$(self).bind(name, function(e, args){
				if(fn && fn.call(this, args.index) === false && args) {
					args.proceed = false;
				}
			});
			
			return self;
		}

		// bind all callbacks from configuration
		$.each(conf, function(name, fn){
			if ($.isFunction(fn)) {
				bind(name, fn);
			}
		});

		// Children
		var submitbtn = $("input[name='submit_btn']",formtag);
		var statusdiv = $("div[name='definition']",formtag);

		// Properties

		// Selection

		// Attributes

		/* ----------------- */
		/*   API Functions   */
		/* ----------------- */

		$.extend(self, {
			// Accessors
			getId: function() { return $(formtag).attr("id"); },

			setFormStatus: function(v) { $(statusdiv).html(v); },

			disableSubmitBtn: function() { $(submitbtn).attr("disabled","disabled").css("cursor","default").animate({opacity:0.4},"fast"); },

			enableSubmitBtn: function() { $(submitbtn).attr("disabled","").css("cursor","pointer").animate({opacity:1},"fast"); },

			// Submit Form
			submit: function() {
				var link     = conf.action;
				var params   = "json=1&mode=submit&source=" + conf.source;
				var formdata = {
					agentid: self.getFieldValue("agentid"),
					firstname: $.trim(self.getFieldValue("firstname")),
					lastname: $.trim(self.getFieldValue("lastname")),
					emailAddress: $.trim(self.getFieldValue("emailAddress")),
					phone: $.trim(self.getFieldValue("phone")),
					best_time: $.trim(self.getFieldValue("best_time")),
					interested: $.trim(self.getFieldValue("interested")),
					comments: $.trim(self.getFieldValue("comments"))
				};

				self.disableSubmitBtn();

				if(formdata.agentid == "") {
					self.setFormStatus("There is an error. Please refresh the page.");
					self.enableSubmitBtn();
					return false;
				}

				if(formdata.firstname == "" || formdata.lastname == "") {
					self.setFormStatus("Please enter your full name.");
					self.enableSubmitBtn();
					return false;
				}

				if(formdata.emailAddress == "") {
					self.setFormStatus("Please enter your email address.");
					self.enableSubmitBtn();
					return false;
				}

				params += "&agentid=" + escape(formdata.agentid);
				params += "&firstname=" + escape(formdata.firstname);
				params += "&lastname=" + escape(formdata.lastname);
				params += "&emailAddress=" + escape(formdata.emailAddress);
				params += "&phone=" + escape(formdata.phone);
				params += "&best_time=" + escape(formdata.best_time);
				params += "&interested=" + escape(formdata.interested);
				params += "&comments=" + escape(formdata.comments);

				if(conf.remote == 1) {
					params += "&accountid=" + conf.accountid;
					params += "&callerdomain=" + conf.callerdomain;
					params += "&" + mySnipApps.session_key;
				}

				params = params + "&format=json&jsoncallback=?";

				$.getJSON(link, params, function(json) {
					var DoCommit   = json.data.docommit[0];
					var definition = json.data.definition[0];

					if(DoCommit == 1) {
						$(formtag).hide().html("<DIV CLASS='ai-realtor-form_body' STYLE='padding:10px;margin-top:15px;'><B>" + definition + "</B></DIV>").fadeIn("fast");
					} else {
						self.setFormStatus(definition);
						self.enableSubmitBtn();
					}
				});
			},

			getFieldValue: function(fid) {
				var f = $("[name='" + fid + "']", formtag);
				var v = "";

				if(f.length > 0) {
					if(f.length > 1) {
						f.each(function() {
							if(v == "") {
								v = $(this).val();
							} else {
								v = v + "," + $(this).val();
							}
						});
					} else {
						v = f.val();
					}
				} else {
					v = "";
				}

				return v;
			}
		});

		// Initialize Search Form
		var init = function() {
			/* enable the submit button */
			self.enableSubmitBtn();

			/* enable enter key press to submit form */
			var epress = function(e) {
				var doContinue = true;
				var keyCode    = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;

				if(keyCode == 13) {
					self.submit();
					doContinue = false;
				}

				return doContinue;
			}

			$("#firstname",formtag).keypress(epress);
			$("#lastname",formtag).keypress(epress);
			$("#emailAddress",formtag).keypress(epress);
			$("#phone",formtag).keypress(epress);
		}

		init();
	}

	// $ plugin implementation
	$.fn.ai_form_realtor_agentcontact = function(conf) {
		// already constructed --> return API
		var el = this.eq(typeof conf == 'number' ? conf : 0).data("ai_form_realtor_agentcontact");
		if(el) { return el; }

		var opts = {
			action: "",
			method: "",
			remote: 0,
			accountid: 0,
			callerdomain: ""
		};

		$.extend(opts, conf);

		opts.method = opts.method.toLowerCase();

		if(opts.action == "") {
			// Set action to FORM Action if no Target.
			opts.action = $(this).attr("action");
		}

		if(opts.method != "get" && opts.action != "post") {
			// Set method to FORM method if no Target.
			opts.method = $(this).attr("method");
		}

		opts.method = opts.method.toLowerCase();

		this.each(function() {
			el = new AI_FORM_REALTOR_AGENTCONTACT($(this), opts);
			$(this).data("ai_form_realtor_agentcontact", el);
		});

		return opts.api ? el: this;
	};
})(jQuery);
