
/* Search Box (Needs to be merged into global) */

C4GTI.SearchBox = C4GTI.SearchBox || {};

/* Data and state storage */
C4GTI.SearchBox.Model = (function($) {

	// Autocomplete options (http://jqueryui.com/demos/autocomplete/)
	var _config = {};
	
	return {
		getConfig: function () {
			return _config;
		},
		setConfig: function (obj) {
			$.extend(_config,obj);
		}
	}

})(C4GTI.jQuery);

/* DOM updates */
C4GTI.SearchBox.View = ( function($) {
	
	var Model = C4GTI.SearchBox.Model;
	var Config = Model.getConfig();

	function _listRenderer( ul, item ) {
		return $( "<li></li>" )
			.data( "item.autocomplete", item )
			.append( "<a>" + item.label + "</a>" )
			.appendTo( ul );
	}
	
	function _addToForm(){
		$("#c"+C4GTI.Config.sitename+"-search-form-"+C4GTI.Config.searchTYPE+" input.search-text")
		.autocomplete(Config)
		.data("autocomplete")
		._renderItem = _listRenderer;

	}
	
	function _squidgeForms() {

		// Get config
		var searchTextDefault = Config["searchTextDefault"];
		var searchTextAttr = Config["searchTextAttr"];

		var formContainerSelector = ".moduleID-SE03 .componentRow";
		var searchTypeSelector = "span.search-type";
		var $selectContainer = $("#search-option-select");

		var searchText = searchTextDefault;
		
		// Hide forms
		var searchData = [];

		$(formContainerSelector).each(function(i){
			
			var thisSearch = {
				"label": $(searchTypeSelector,this).text().toLowerCase(),
				"type": $(searchTypeSelector,this).text().toLowerCase().replace(/ /g,"-"), 
				"action": $("form",this).attr("action"),
				"current": false 
			}
			
			searchData.push(thisSearch);
			
			if (i>0) {
			
				$(this).remove();
			
			} else {
				
				if (searchText == searchTextDefault) {
					$('input.search-text',this).addClass("default-text");
				}
				
				$('input.search-text',this).attr("value",searchText).focus(function(){
					var $e = $(this);
					if ($e.hasClass("default-text")) {
						$e.removeClass("default-text").attr("value","");
					}
				});
				
			}
		});
		
		/*
		if(noMatchFound) {*/

		searchData[0].current = true;

		/*}
		*/
		
		// Update title
		$("h2.search-title").text("Search "+C4GTI.Config.sitename);
		
		// Add radio buttons
		var $list = $("<ul>");

		for (i in searchData) {
			
			if (typeof searchData[i] != "function") {
				var id = "search-radio-" + searchData[i].type;

				var $item = $("<li>");

				var $label = $("<label>", {
					html: "&nbsp;" + searchData[i].label,
					"for": id  
				});
	
				var checked = (searchData[i].current) ? 'checked="checked"' : '' ;
				
				if(searchData[i].label.match('Articles and Video')){
					searchData[i].type = "all"
				}
				var $radio = $('<input type="radio" name="search-type" value="' + searchData[i].type + '" id="' + id + '" ' + checked + '>');
				$($radio).data("action",searchData[i].action);
				
				$($label).prepend($radio);
				$($item).append($label);
				$($list).append($item);
			}
			
		}
		
		$($selectContainer).append($list);
		$(formContainerSelector).delegate("form","submit",C4GTI.SearchBox.Controller.formSubmitHandler);
		
	}
	
	return {
		addToForm: _addToForm,
		squidgeForms: _squidgeForms
	}
	
})(C4GTI.jQuery);

/* Application flow and logic */
C4GTI.SearchBox.Controller = ( function($) {

	var Model = C4GTI.SearchBox.Model;
	var View = C4GTI.SearchBox.View;
	var Config = Model.getConfig();

	// Before a request (source-option) is started, after minLength and delay are met.
	function _searchTriggered() {
		
		//console.warn("AC: Search triggered.");
		
	}
	
	// Menu has opened
	function _menuOpened(event, ui) {
		//$("#search-option-select").hide();
		//console.info("AC: Menu opened.");
	}
	
	// Menu has closed (escape pressed or no more matching suggestions available)
	function _menuClosed(event, ui) {
		//$("#search-option-select").show();
		//console.info("AC: Menu closed.");
	}
	
	// A suggestion has been highlighted or hovered over
	function _menuItemFocus(event, ui) {
		// console.warn("AC: Menu item focus.");
		// console.debug(ui.item.label);
		//$('#ac-test').html(ui.item.label);
		//return false;
	}
	 
	function _menuItemSelect(event, ui) {
		// console.warn("AC: Menu item selected.");
		// console.debug(ui.item);
	}
	
	// Fires "after" when a suggestion is selected (using the return key or a mouse click)
	function _searchValueChanged(event, ui) {
		// console.info("AC: Menu closed.");
		// console.debug(ui.item);
	}
	
	// Get and format the response
	function _responseFormatter(request,response){
		var url = "/"+C4GTI.Config.sitename+"/";
		var data = "searchText=" + (("term" in request) ? request.term : "") + "&searchAjax=true&size=10";
		var isAllChecked = $("#search-option-select input#search-radio-all").prop("checked");
		
		if (isAllChecked) {
			$.getJSON(url, data, function(data){
			
				if ("page" in data) {
					if ("results" in data.page) {
						var results = data.page.results;
						
						if (typeof results == "object") {
						
							var tagList = results;
							var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
							response($.map(tagList, function(item, index){
								if (!request.term || matcher.test(item)) {
									var searchTerm = request.term.replace(/^\s+/g, '').replace(/\s+$/g, '');
									return {
										label: item.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + $.ui.autocomplete.escapeRegex(searchTerm) + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>"),
										value: item
									};
								}
							}));
							
						}
						
					}
				}
			});
		}		
	}
	
	function _formSubmitHandler(){
		
		var searchTypeSelector = '#search-option-select input:checked';
	
		var action = $(searchTypeSelector).data("action");

		$("#c"+C4GTI.Config.sitename+"-search-form-"+C4GTI.Config.searchTYPE).attr("action",action);
		
		return true;
	}
	
	function _restoreFormState () {

		// Get config
		var searchTextDefault = Config["searchTextDefault"];
		var searchTextAttr = Config["searchTextAttr"];
		
		// Get search query if there is one
		var queryString = window.location.search.substr(1);
		var queryArray = queryString.split("&");
		var searchText = "";
		
		for (i=0;i<queryArray.length;i++) {
			var query = queryArray[i];
			if ( query != "" ) {
				var q = query.split("=");
				if (q.length>0) {
					if (q[0] == searchTextAttr) {
						var searchText = unescape(q[1]).replace(/[+]/g," ");
					}
				}
			}
		}
		
		if (searchText!="") {
			$(".c"+C4GTI.Config.sitename+"-search-input input").removeClass("default-text").attr("value",searchText);
		}

		var path = window.location.pathname;
		var noMatchFound = true;
		
		$("#search-option-select input").each(function(){
			var action = $(this).data("action");
			var thisPage = path.indexOf(action);
			$(this).prop("checked",false);
			
			if (thisPage!=-1) {
				$(this).prop("checked",true);
				noMatchFound = false;
			}
		});
		
		if (noMatchFound) {
			$("#search-option-select input").first().attr("checked","checked");
		}
		
	}
	
	return {
		init: function init() {

			Model.setConfig({
				//source: C4GTI.Model.getAutocompleteLocalData(), // Data source
				appendTo: "#c"+C4GTI.Config.sitename+"-ac-results",
				source: _responseFormatter,
				minLength: 2, // Minimum number of characters
				delay: 0, // Delay (ms) after typing
				search: _searchTriggered,  
				open: _menuOpened,
				close: _menuClosed,
				focus: _menuItemFocus, 
				select: _menuItemSelect,
				change: _searchValueChanged,
				searchTextDefault: C4GTI.Config.searchText,
				searchTextAttr: "freetext"
			});
			
			$(document).ready(function(){
				C4GTI.SearchBox.Controller.restoreFormState();
			});
			
			View.squidgeForms();
			if(C4GTI.Config.autoComplete) {
				View.addToForm();
			}
			// console.info("C4GTI: Autocomplete form initialised.");			
		},
		formSubmitHandler: _formSubmitHandler,
		restoreFormState: _restoreFormState
	};

})(C4GTI.jQuery);
