/*  Contact Auto Complete
 *  (c) 2010 Vinh Do <vdo@esolutionsgroup.ca>
 *
 *  Require jquery.autocomplete.js
 *
 */

(function($){

	$.fn.contact_autocomplete = function(p) {

		var p = p||{};

		var _container = p && p.container ? p.container : "contactContainer",
			_containerHeader = p && p.containerHeader ? p.containerHeader : "contactHeader",
			_containerBody = p && p.containerBody ? p.containerBody : "contactBody",
			_containerFooter = p && p.containerFooter ? p.containerFooter : "contactFooter",
			_autoCompleteContainer = p && p.autoCompleteContainer ? p.autoCompleteContainer : "autoCompleteContainer",
			_iCreateToken = p && p.iCreateToken ? p.iCreateToken : "iCreateToken",
			_source = p && p.source ? p.source : "",
			_data = p && p.data ? p.data : [ {id: "1", name: "eSolutions Group", title: "", address: "651 Colby Drive, Waterloo, ON, CA N2V 1C2", phone: "519-884-3352", tty: "1-800-265-6102", fax: "519-725-1394", mapAddress: "651 Colby Drive, Waterloo, ON, N2V 1C2", mapLinkText: "View Map", email: "info@esolutionsgroup.ca", linkText: "Email", websiteLink: "http://www.esolutionsgroup.ca", websiteLinkText: "Website", description: ""} ],
			_hiddenKey = p && p.hiddenKey ? p.hiddenKey : "hdnId",
			_defaultId = p && p.defaultId ? p.defaultId : "1",
			_title = p && p.title ? p.title : "Contacts",
			_errorMsg = p && p.errorMsg ? p.errorMsg : "Contact is already displayed.",
			_hideToken = p && p.hideToken ? p.hideToken : "true",
			_loadDefault = p && p.loadDefault ? p.loadDefault : "true";

		var element = $(this);

		var _txtAutoComplete = $(element).attr("id") + "_AutoComplete",
			_containerClone = $(element).attr("id") + "_Clone",
			_btnClear = $(element).attr("id") + "_Clear";

		if ($(element).find("." + _container + " ." + _iCreateToken).length > 0) {
			UpdateInfo($(element).find("." + _container + " ." + _iCreateToken + ":first"));

			var container = $(element).find("." + _container),
				containerHead = $(container).find("." + _containerHeader + ":first"),
				containerBody = $(container).find("." + _containerBody + ":first"),
				containerClone = $("<div id='" + _containerClone + "'></div>").append($(container).clone().html()),
				autoCompleteContainer = $("<div class='" + _autoCompleteContainer + "'></div>").append("<label for='" + _txtAutoComplete + "' style='display: none;'>" + _title + "</label><input type='text' id='" + _txtAutoComplete + "' /><input type='button' id='" + _btnClear + "' value='Clear' />");

			$(containerClone).addClass(_container);
			$(containerClone).find("." + _containerHeader + ":first").prepend(autoCompleteContainer);
			$(containerClone).find("." + _containerBody + ":first").empty();
			$(containerClone).find("." + _containerBody + ":first").append($(containerBody).find("." + _iCreateToken).clone().html())

			$(containerClone).find("#" + _btnClear).click(function() {
				$(containerClone).find("#" + _txtAutoComplete).val("");
				$(containerClone).find("." + _containerBody).empty();
				$(container).find("." + _iCreateToken).empty();
			});

			$(container).after(containerClone);
			if (_hideToken == "true") {
			    $(container).hide();
			}

			if (_source != "") {
		        $(containerClone).find("#" + _txtAutoComplete).autocomplete(_source, {
			        multiple: false,
			        dataType: "json",
			        parse: function(data) {
				        return $.map(data, function(row) {
					        return {
						        data: row,
						        value: row.name,
						        result: row.name
					        }
				        });
			        },
			        formatItem: function(item) {
				        return item != null ? item.name : '';
			        }
		        }).result(function(evnt, data, formatted) {
				    if (ContainContact(data.id, $(containerClone).find("." + _containerBody + ":first"))) {
					    alert(_errorMsg);
				    }
				    else {
                        $(containerClone).find("." + _containerBody + ":first").append(LoadContactTemplate(data, _hiddenKey));

					    $(containerBody).find("." + _iCreateToken).empty();
					    $(containerBody).find("." + _iCreateToken).append($(containerClone).find("." + _containerBody + ":first").html());
				    }
				    $(containerClone).find("#" + _txtAutoComplete).val('');
			    });
			}
			else {
			    $(containerClone).find("#" + _txtAutoComplete).autocomplete(_data, {
				    formatItem: function(item) {
					    return item.name;
				    }
			    }).result(function(evnt, item) {
				    if (ContainContact(item.id, $(containerClone).find("." + _containerBody + ":first"))) {
					    alert(_errorMsg);
				    }
				    else {
                        $(containerClone).find("." + _containerBody + ":first").append(LoadContactTemplate(item, _hiddenKey));

					    $(containerBody).find("." + _iCreateToken).empty();
					    $(containerBody).find("." + _iCreateToken).append($(containerClone).find("." + _containerBody + ":first").html());
				    }
				    $(containerClone).find("#" + _txtAutoComplete).val('');
			    });
			}
		}
		else {
		    UpdateInfo($(element).find("." + _container + " ." + _containerBody + ":first"));
		}

		function UpdateInfo(containerBody) {
			if($(containerBody).find("." + _hiddenKey).length > 0) {
				var content = new Array();
				$(containerBody).find("." + _hiddenKey).each( function() {
					content.push(LoadContactInfo($(this).val()));
				});
				$(containerBody).empty();
				$(containerBody).append(content.join(""));
			}
			else {
				$(containerBody).empty();
				if (_loadDefault == "true") {
				    $(containerBody).append(LoadContactInfo(_defaultId));
				}
			}
		}

		function LoadContactInfo(id) {
			var content = new Array();
            if (_source != "") {
                $.ajax({
                    url: _source + id,
                    dataType: "json",
                    async: false,
                    success: function(item) {
                        content.push(LoadContactTemplate(item[0], _hiddenKey));
                    }
                });
            }
            else {
			    $.each(_data, function() {
				    if (this.id == id) {
					    content.push(LoadContactTemplate(this, _hiddenKey));
				    }
			    });
            }
			return content.join("");
    	}

    	function ContainContact(id, containerBody) {
    		var output = false;
    		if($(containerBody).find("." + _hiddenKey).length > 0) {
    			$(containerBody).find("." + _hiddenKey).each( function() {
    				if ($(this).val() == id) {
    					output = true;
    				}
    			});
    		}
    		return output;
    	}

	};

})(jQuery);
