(function($) {
	// static constructs
	$.tools = $.tools || {version: {}};

	$.tools.version.form_realtor_propertycontact = '1.0';

	var current = null;

	// constructor
	function FORM_REALTOR_PROPERTYCONTACT(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 formpropertyid = self.getFieldValue("propertyid");
				var formfirstname  = self.getFieldValue("firstname");
				var formlastname   = self.getFieldValue("lastname");
				var formemail      = self.getFieldValue("emailAddress");
				var formphone      = self.getFieldValue("phone");
				var formbesttime   = self.getFieldValue("best_time");
				var forminterested = self.getFieldValue("interested");
				var formcomments   = self.getFieldValue("comments");

				self.disableSubmitBtn();

				if($.trim(formpropertyid) == "") {
					self.setFormStatus("There is an error. Please refresh the page.");
					self.enableSubmitBtn();
					return false;
				}

				if($.trim(formfirstname) == "") {
					self.setFormStatus("Please enter your first name.");
					self.enableSubmitBtn();
					return false;
				}

				if($.trim(formlastname) == "") {
					self.setFormStatus("Please enter your last name.");
					self.enableSubmitBtn();
					return false;
				}

				if($.trim(formemail) == "") {
					self.setFormStatus("Please enter your email address.");
					self.enableSubmitBtn();
					return false;
				}

				params = params + "&propertyid=" + escape(formpropertyid) + "&firstname=" + escape(formfirstname) + "&lastname=" + escape(formlastname) + "&emailAddress=" + escape(formemail) + "&phone=" + escape(formphone) + "&best_time=" + escape(formbesttime) + "&interested=" + escape(forminterested) + "&comments=" + escape(formcomments);

				if(conf.remote == 1) {
					params = params + "&accountid=" + conf.accountid + "&callerdomain=" + conf.callerdomain + "&" + 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.form_realtor_propertycontact = function(conf) {
		// already constructed --> return API
		var el = this.eq(typeof conf == 'number' ? conf : 0).data("form_realtor_propertycontact");
		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 FORM_REALTOR_PROPERTYCONTACT($(this), opts);
			$(this).data("form_realtor_propertycontact", el);
		});

		return opts.api ? el: this;
	};
})(jQuery);
