(function($) {
	// static constructs
	$.tools = $.tools || {version: {}};

	$.tools.version.ai_form_realtor_searchlistings = '1.0';

	var current = null;

	// constructor
	function AI_FORM_REALTOR_SEARCHLISTINGS(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

		// Properties
		var citylimit = 3;

		// Selection

		// Attributes

		/* ----------------- */
		/*   API Functions   */
		/* ----------------- */

		$.extend(self, {
			// Accessors
			getId: function() {
				return $(formtag).attr("id");	
			},

			getCityFields: function() {
				return $("select[name='city']",formtag);
			},

			// City Field Functions
			addCityField: function() {
				var value   = "";
				var cfields = self.getCityFields();

				if(arguments.length > 0) {
					value = arguments[0];
				}

				if($(cfields).length < citylimit) {
					$(cfields[0]).parent("div").clone(true).insertBefore("div[name='morecities']",formtag);

					$("span[name='removecity']",formtag).show().click(function() {
						self.removeCityField($(this));
					});
				}

				if((($(cfields).length) + 1) >= citylimit) {
					$("div[name='morecities']",formtag).hide();
				} else {
					$("div[name='morecities']",formtag).show();
				}
			},

			removeCityField: function(i) {
				i.parent("div").remove();

				var cfields = self.getCityFields()

				if(cfields.length == 1) {
					$("span[name='removecity']",formtag).hide();
				}

				if($(cfields).length >= citylimit) {
					$("div[name='morecities']",formtag).hide();
				} else {
					$("div[name='morecities']",formtag).show();
				}
			},

			// Submit Form
			submit: function() {
				var params   = "";
				var formdata = {
					keyword: self.getFieldValue("keyword"),
					type: self.getFieldValue("type"),
					style: self.getFieldValue("style"),
					buildingtype: self.getFieldValue("buildingtype"),
					bed: self.getFieldValue("bed"),
					bed_split: "",
					bath: self.getFieldValue("bath"),
					bath_split: "",
					price: self.getFieldValue("price"),
					price_split: "",
					sqft: self.getFieldValue("sqft"),
					sqft_split: "",
					year: self.getFieldValue("year"),
					city: self.getFieldValue("city")
				};

				if(formdata.bed != "") { formdata.bed_split = formdata.bed.split("-"); }
				if(formdata.bath != "") { formdata.bath_split = formdata.bath.split("-"); }
				if(formdata.price != "") { formdata.price_split = formdata.price.split("-"); }
				if(formdata.sqft != "") { formdata.sqft_split = formdata.sqft.split("-"); }

				if(formdata.keyword != "") { params = self.paramAppend(params,"keyword",escape(formdata.keyword)); }
				if(formdata.type != "") { params = self.paramAppend(params,"type",formdata.type); }
				if(formdata.style != "") { params = self.paramAppend(params,"style",escape(formdata.style)); }
				if(formdata.buildingtype != "") { params = self.paramAppend(params,"buildingtype",escape(formdata.buildingtype)); }
				if(formdata.year != "") { params = self.paramAppend(params,"year",formdata.year); }
				if(formdata.bed_split[0] > 0) { params = self.paramAppend(params,"bedsmin",formdata.bed_split[0]); }
				if(formdata.bed_split[1] > 0) { params = self.paramAppend(params,"bedsmax",formdata.bed_split[1]); }
				if(formdata.bath_split[0] > 0) { params = self.paramAppend(params,"bathsmin",formdata.bath_split[0]); }
				if(formdata.bath_split[1] > 0) { params = self.paramAppend(params,"bathsmax",formdata.bath_split[1]); }
				if(formdata.price_split[0] > 0) { params = self.paramAppend(params,"pricemin",formdata.price_split[0]); }
				if(formdata.price_split[1] > 0) { params = self.paramAppend(params,"pricemax",formdata.price_split[1]); }
				if(formdata.sqft_split[0] > 0) { params = self.paramAppend(params,"sqftmin",formdata.sqft_split[0]); }
				if(formdata.sqft_split[1] > 0) { params = self.paramAppend(params,"sqftmax",formdata.sqft_split[1]); }
				if(formdata.city != "") { params = self.paramAppend(params,"city",formdata.city); }

				if(conf.remote == 1) {
					if(params != "") {
						params = params.split("?");
						params = params[1];
					}

					var fstruct = { method: conf.method };

					params = params.split("&");

					var parray = "";
					var pname  = "";
					var pval   = "";

					for(var p = 0; p < params.length; p++) {
						parray = params[p].split("=");
						pname  = parray[0];
						pval   = parray[1];

						fstruct[pname] = pval;
					}

					mySnipApps.postTo("realtor","datagrid",fstruct);
				} else {
					location.href = conf.action + "/" + params;
				}
			},

			// Helper Functions
			paramAppend: function(str,pname,pval) {
				str   = $.trim(str);
				pname = $.trim(pname);

				if(typeof pval == "string") {
					pval = $.trim(pval);
				}

				if(pname != "" && pname != "undefined" && pval != "" && pval != "undefined") {
					if(conf.remote == 1) {
						str = mySnipApps.paramAppend(str, pname, pval);
					} else {
						if(str != "") {
							str = str + "/";
						}
						str = str + pname + "/" + pval;
					}
				}

				return str;
			},

			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() {
			$("span[name='removecity']",formtag).click(function() {
				self.removeCityField($(this));
			});

			var cfields = self.getCityFields();

			if($(cfields).length > 1) {
				$("span[name='removecity']",formtag).show();
			}

			/* enable the search button and city drop downs */
			jQuery("select[name='city']",formtag).removeAttr("disabled");
			jQuery("input#submit_btn",formtag).removeAttr("disabled");

			if($(cfields).length >= citylimit) {
				$("div[name='morecities']",formtag).hide();
			} else {
				$("div[name='morecities']",formtag).show();
			}

			/* clone the city drop down up to 3 times */
			$("div[name='morecities'] a",formtag).click(function() {
				self.addCityField();
			});

			/* Enable Enter Key Press to Submit Form */
			jQuery("#keyword",formtag).keypress(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;
			})
		}

		init();
	}

	// $ plugin implementation
	$.fn.ai_form_realtor_searchlistings = function(conf) {
		// already constructed --> return API
		var el = this.eq(typeof conf == 'number' ? conf : 0).data("ai_form_realtor_searchlistings");
		if(el) { return el; }

		var opts = {
			action: "",
			method: "",
			remote: 0
		};

		$.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_SEARCHLISTINGS($(this), opts);
			$(this).data("ai_form_realtor_searchlistings", el);
		});

		return opts.api ? el: this;
	};
})(jQuery);
