(function($) {
	// Depends on: 	1) jquery 2) filterSettings.js 3) ___.widget.template.cfm 
	// 				4) hashmap.js 5) jquery.json-2.2.js
	//
	// Example: lodgingX.cfm and lodgingX.widget.template.cfm 
	$.fn.ecommwidget = function(optionsIn) {
		
		var ecommwidget = this;
		var defaultOptions = {
			type: 			'lodging',
			template: 		'/_ecomm/lodgingX.widget.template.cfm',
			search:			function () { }, 		// default search method, used to search db
			filter:			function () { }, 		// default filter method, used to filter cached search results
			restrictions:	{},
			errorShow:		function (message) { },	// show error message
			errorHide:		function () { },		// hide all error messages
			postrender:		function () { }			// default postrender method, used for post rendering tasks
		};
		
		var options = $.extend({}, defaultOptions, optionsIn);
		
		var initWidgetSettings = function(opts){
			
			var initWS = function(){
				// get saved or default settings
				var settings = filterSettings.getSettings(opts.type);
				var keys = settings.keySet();
				for(var i = 0, len = keys.length; i < len; i++){
					var idSelector = keys[i], value = settings.get(keys[i]), $node = $(idSelector);
					if ( $node.attr('type') === 'text' || $node.attr('type') === 'select-one' ) {
						$node.val(value);
					} else if ( $node.attr('type') === 'checkbox' || $node.attr('type') === 'radio' ) {
						$node.attr('checked',value);
					}
				}
			};
			if(isIE6){
				var t=setTimeout(initWS,750); // wait .75 sec for DOM to render
			} else {
				initWS();
			}
		};
		
		var saveSettings = function(optionsIn, settings){
			var keys = settings.keySet();
			for (var i = 0, len = keys.length; i < len; i++) {
				var idSelector = keys[i], value = settings.get(keys[i]), $node = $(idSelector);
				if ( $node.attr('type') === 'text' || $node.attr('type') === 'select-one' ){
					settings.put(idSelector, $node.val());
				} else if ( $node.attr('type') === 'checkbox' || $node.attr('type') === 'radio' ){
					settings.put(idSelector, $node.attr('checked'));
				}
			}
			filterSettings.setSettings(optionsIn.type, settings);
		};
		
		// hide/show applicable widget filters
		var handleRestrictions = function() {
			var filterMessage = '';
			if ( options.restrictions !== undefined ) {
				for (var restrict in options.restrictions) {
					var newMessage = ( options.restrictions[restrict](restrict, options, this) || '' );
					filterMessage += ( filterMessage && newMessage ? '<br />' : '' ) + newMessage;
				}
			}
			options.errorHide();
			if ( filterMessage ) {
				options.errorShow(filterMessage);
			} else if ( $(this).hasClass('filter') ) {
				saveSettings(options, filterSettings.getSettings(options.type));
				options.filter();
			} else if ( $(this).hasClass('search') ) {
				saveSettings(options, filterSettings.getSettings(options.type));
				options.search();
			}
		};
		
		// listens for widget events and saves its settings when modified
		var addWidgetListener = function(opts){
			// get saved or default settings
			var settings = filterSettings.getSettings(opts.type),
				keys = settings.keySet(),
				metRestrictions = true;
			//saveSettings(opts, settings);
			for(var i = 0, len = keys.length; i < len; i++){
				var idSelector = keys[i],
					$node = $(idSelector);
				if($node.attr('type') === 'text' || $node.attr('type') === 'select-one'){
					$node.change(handleRestrictions);
				} else if ($node.attr('type') === 'checkbox' || $node.attr('type') === 'radio' || $node.attr('type') === 'button'){
					$node.click(handleRestrictions);
				}
				$node.data('restrictions', handleRestrictions)
			}
		};
		
		this.renderWidget = function(opts, jNode){
			// render template
			$.get(opts.template, function(data){
			 	jNode.html(data);
			 	initWidgetSettings(opts);
			 	addWidgetListener(opts);
			 	if(opts.postrender !== undefined){
			 		opts.postrender();
			 	}
			 	handleRestrictions({data:{opts:opts}});
			 	opts.search();
			});
		};
		
		this.each(function(){
			var jNode = $( this );
			ecommwidget.renderWidget(options, jNode);
		});
		
		
		return this;
	};
})(jQuery);
