(function($) {
	// static constructs
	$.tools = $.tools || {version: {}};

	$.tools.version.form_realtor_searchlistings = '1.0';

	var current = null;

	// constructor
	function 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 keyword      = self.getFieldValue("keyword");
				var type         = self.getFieldValue("type");
				var buildingtype = self.getFieldValue("buildingtype");

				var bed = self.getFieldValue("bed");
				if(bed != "") { bed = bed.split("-"); }

				var bath = self.getFieldValue("bath");
				if(bath != "") { bath = bath.split("-"); }

				var price = self.getFieldValue("price");
				if(price != "") { price = price.split("-"); }

				var sqft = self.getFieldValue("sqft");
				if(sqft != "") { sqft = sqft.split("-"); }

				var year = self.getFieldValue("year");
				var city = self.getFieldValue("city");

				if(keyword != "") { params = self.paramAppend(params,"keyword",escape(keyword)); }
				if(type != "") { params = self.paramAppend(params,"type",type); }
				if(buildingtype != "") { params = self.paramAppend(params,"buildingtype",buildingtype); }
				if(year != "") { params = self.paramAppend(params,"year",year); }
				if(bed[0] > 0) { params = self.paramAppend(params,"bedsmin",bed[0]); }
				if(bed[1] > 0) { params = self.paramAppend(params,"bedsmax",bed[1]); }
				if(bath[0] > 0) { params = self.paramAppend(params,"bathsmin",bath[0]); }
				if(bath[1] > 0) { params = self.paramAppend(params,"bathsmax",bath[1]); }
				if(price[0] > 0) { params = self.paramAppend(params,"pricemin",price[0]); }
				if(price[1] > 0) { params = self.paramAppend(params,"pricemax",price[1]); }
				if(sqft[0] > 0) { params = self.paramAppend(params,"sqftmin",sqft[0]); }
				if(sqft[1] > 0) { params = self.paramAppend(params,"sqftmax",sqft[1]); }
				if(city != "") { params = self.paramAppend(params,"city",city); }

				if(conf.remote == 1) {
					if(params != "") {
						params = params.split("?");
						params = params[1];
					}

					var fdata = { 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];

						fdata[pname] = pval;
					}

					mySnipApps.postTo("realtor","datagrid",fdata);
				} 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.form_realtor_searchlistings = function(conf) {
		// already constructed --> return API
		var el = this.eq(typeof conf == 'number' ? conf : 0).data("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 FORM_REALTOR_SEARCHLISTINGS($(this), opts);
			$(this).data("form_realtor_searchlistings", el);
		});

		return opts.api ? el: this;
	};
})(jQuery);