/* combine : /javascript/desktop/common/jdw_search.js*/
var jdw = jdw || {};
var NBROWN = NBROWN || {};
var ENDECA_AUTOSUGGEST_URL = "/shop/search/typeahead/search.action";	
var MAX_AUTOSUGGEST_KEYWORDS = 5;

var AUTO_CORRECT_CONTAINER = "[data-autocorrectedsearchterm]";
var AUTO_CORRECT_TEMPLATE = "#page-templates [data-autocorrectedsearchterm]";

//-----------------------------------------------------------------------------------------
// Search - Defines function to apply search triggers to top navigation bar
//-----------------------------------------------------------------------------------------

jdw.SearchFunction = function(options) {
	
	this.searchAreaSelector = options.searchAreaSelector;
	this.searchKeywordSelector = options.searchKeywordSelector;
	this.searchButtonSelector = options.searchButtonSelector;
	this.defaultSearchText = options.defaultSearchText;
	this.autoCompleteEnabled = options.autoCompleteEnabled;
	this.showSearchText = options.showSearchText;
	this.searchApiEnabled = options.searchApiEnabled;
	this.searchTextLastValue = '';

	// Inside jquery function callbacks, 'this' is reassigned; so we assign a variable here in 
	//  order that we can always get hold of this containing object.
	var options = this;

	// === PUBLIC ==============================================================================
	
	// Bind search and autocomplete events
	this.load = function() {
		bindSearchEvents();
		if(this.enableBloomReachAutosuggest()) {
			// Do BR autosuggest.
		} else if (this.autoCompleteEnabled) {
			bindAutoComplete();
		}
	};
	
	// Enable non-bloomreach autocomplete functionality
	this.enableAutoComplete = function() {
		this.autoCompleteEnabled = true;
	};
	
	// Enable bloomreach autocomplete functionality
	this.enableBloomReachAutosuggest = function() {
		var enabled = false;
		jsInput = document.querySelector(".js-gui-search-input");
		if (typeof jsInput !== 'undefined') {
			var searchAutosuggestEnabled = jsInput.getAttribute('data-search-autosuggest-enabled');
			if (typeof jsInput !== 'undefined') {
				if(searchAutosuggestEnabled === 'true'){
					enabled = true; 
				}
			}
		}
		return enabled;
	}
	
	// Enable search api functionality
	this.enableSearchApiEnabled = function() {
		this.searchApiEnabled = true;
	};
	
	// Get the URL for the search page
	this.buildSearchUrl = function(searchKeywords) {
		return getSearchPageUrl(searchKeywords);
	};
	
	
	// === CALLBACK FUNCTIONS ==================================================================
	
	// Submits the search	
	var submitSearch = function(event,suggestionText,renderedItem) {
		// Update search term on page if new one is specified
		if (typeof(event) == 'string') {
			$(options.searchKeywordSelector).val(event);
		}
		
		// If valid input
		if (validateSearchKeywords()) {
			if (typeof NBROWN !== 'undefined' && typeof NBROWN.searchHistoryService !== 'undefined') {
	            NBROWN.searchHistoryService.controller.addKeyword(getSearchKeywords().toLowerCase(), new Date().getTime());
			}

			//push Search to DataLayer 
			pushSearchEventToDataLayer(suggestionText);
			//hide auto-suggest if visible
			$(".autocomplete-suggestions").hide();
			//re-direct to search page url
			var searchKeywords = getSearchKeywords();
			var searchUrl = getSearchPageUrl(searchKeywords);
			var isMobile = $('meta[name=jdw-isMobileDevice]').attr("value") == "true";
			var isTablet = $('meta[name=jdw-isTablet]').attr("value") == "true";
			if (!isMobile &&!isTablet && options.searchApiEnabled

					&& typeof NBROWN.plp_ajax_search !== 'undefined') {
				// Already on search results page - use Ajax
				NBROWN.plp_ajax_search.getSearchResultsAndRender(searchUrl, false);
			} else {
				// Full page load
				window.location = searchUrl;
			}
		}
	};
	
	var pushSearchEventToDataLayer = function (autoSuggestedText) {
	    window.dataLayer = window.dataLayer || [];
	    if(autoSuggestedText){
	    	window.dataLayer.push({event:"autoSuggestionsSearch",searchKeyword:options.searchTextLastValue,autoSuggestionsKeyword : autoSuggestedText});
	    } else {
	    	window.dataLayer.push({event:"search",searchKeyword:options.searchTextLastValue});
	    }
	};
	
	var getSearchKeywords = function(){
		var searchKw = options.searchKeywordSelector.split(",");
		var searchKeywords = $(options.searchKeywordSelector).val();
		if($("#topSearch").css("display")=='none'){
			searchKeywords = $(searchKw[1]).val();
		};
		return searchKeywords;
	};
	
	// Perform Ajax call to populate the autocomplete terms
	var getAutoCompleteTermsFunction = function( request, response ) {
		var searchKeywords = getSearchKeywords();
        if (options.searchApiEnabled){
            // Fetch auto-suggestion terms from Bloomreach
            var bloomreachAutosuggestUrl = getBloomreachAutosuggestUrl(searchKeywords);
            if (bloomreachAutosuggestUrl != null) {
                $.ajax({
                    type: "GET",
                    url: bloomreachAutosuggestUrl,
                    dataType: "json",
                    crossDomain : true,
                    success: function( data ) {
                        var datamodel = [];
                        if (data.response && data.response.suggestions) {
                            for (var i=0; i<data.response.suggestions.length; i++) {
                                if (i < MAX_AUTOSUGGEST_KEYWORDS) {
                                    var suggestion = data.response.suggestions[i].q;
                                    datamodel.push(suggestion.toString());
                                }
                            }
                        }
                        response(datamodel);
                    }
                });
            }

        } else {
            // Fetch auto-suggestion terms from Endeca
        	var searchPageUrl = getSearchPageUrl(searchKeywords)
        	var params = searchPageUrl.substring(
                    searchPageUrl.indexOf('_'),
                    searchPageUrl.indexOf("/products/show.action"));

            $.ajax({
                type: "GET",
                url: ENDECA_AUTOSUGGEST_URL,
                dataType: "json",
                data: {
                    term: request, endecaParams: params
                },
                contentType: "application/json; charset=utf-8",
                success: function( data ) {
                    response(data.model);
                }
            });
        }

    };
	
	// === PRIVATE ==============================================================================
		
	// Run search on hitting return or clicking the search icon
	var bindSearchEvents = function() {
		$(options.searchButtonSelector).unbind('click').bind('click', submitSearch);
		applyEventOnEnterKey($(options.searchButtonSelector), $(options.searchAreaSelector));
		options.searchTextLastValue = '';
		//backup the user input value so that, later it can be added to dataLayer
		$(options.searchKeywordSelector).on('input', function() {options.searchTextLastValue = $(this).val();});
	};
	
	// Bind autocomplete functionality to search	
	var bindAutoComplete = function() {	
		var aoptions = {
			"selectTermCallback" : submitSearch,
			"getTermsCallback" : getAutoCompleteTermsFunction,
			"callingTextBox"   : options.searchKeywordSelector
		};
		if(typeof autoComplete !== 'undefined') {
				new autoComplete({
				selector: options.searchKeywordSelector,
				source: getAutoCompleteTermsFunction,
				onSelect: submitSearch
			});
		}
	};
	
	// Get the URL for the search page
	var getSearchPageUrl = function(searchKeywords) {
		var escapedSearchKeywords = encodeURIComponent(searchKeywords.replace(/;|\//g,"")).replace(/%20/g, "+");
		var searchAction;
		var $searchInput = $("#searchString");
		if($searchInput.length>0 && typeof $searchInput.attr("data-search-service-enabled") !== "undefined"){
			if($searchInput.attr("data-search-service-enabled") === "true"){
				searchAction = getSearchUrlForSearchService(escapedSearchKeywords);
			}else{
				searchAction = getSearchUrlForEndeca(globalCategoryUrl, escapedSearchKeywords);
			}
		} else if(options.searchApiEnabled){
			searchAction = getSearchUrlForSearchService(escapedSearchKeywords);
		} else{
			searchAction = getSearchUrlForEndeca(globalCategoryUrl, escapedSearchKeywords);
		}
		return searchAction;
	};

	var getSearchUrlForEndeca = function(globalCategoryUrl, escapedSearchKeywords){
		var productAction = "/products/show.action";
		var categoryUrl = globalCategoryUrl;
		// Append Ntt parameter into URL - immediately before product action component
		var replacement = "/Ntt-" + escapedSearchKeywords + productAction;
		return categoryUrl.replace(productAction, replacement);
	}
	var getSearchUrlForSearchService = function(escapedSearchKeywords){
		return "/shop/s/?text="+escapedSearchKeywords + "&nofollowind=true";
	}
	
	// Validate the current keywords
	var validateSearchKeywords = function() {
		var searchKeywords = getSearchKeywords();
	 	// If search value equals default value then set to empty string
		if( options.showSearchText && searchKeywords == options.defaultSearchText) {
			$(options.searchKeywordSelector).val('');
		}else{
			 // Validate empty input
		   	var idx;
		   	if ( searchKeywords.length > 1) {
		     	for(idx=0;idx < searchKeywords.length;idx++) {
		       		if ( searchKeywords.charAt(idx) != " " ) {	       			
		   				return true;
		       		}
		     	}
		   	} 	
		}
		if ($(options.searchKeywordSelector).val().length == 0) {
			$(options.searchKeywordSelector).focus();
			alert("Please enter a search value");
		}else{			
			$(options.searchKeywordSelector).focus();
			alert("Please enter a bigger search value");	
		}	   	
	 	return false;			   	
	};

    var getBloomreachAutosuggestUrl = function(params) {
        var url = null;
        var domainkey = "nbrown_en_" + jTitle.toLowerCase();
        var currenturl = document.location.href;
        var requestid = getRequestId();
        var cookie = "";
        var match = document.cookie.match(new RegExp('(^| )_br_uid_2=([^;]+)'));
        if (match) {
            cookie = decodeURIComponent(match[2]);
        }

        searchBox = document.querySelector(".js-gui-search-input");
        var autosuggestUrl = searchBox.getAttribute("data-search-autosuggest-url");
        if (autosuggestUrl == null || autosuggestUrl == "") {
            return null;
        } else {
            return autosuggestUrl +
            	"&domain_key=" + domainkey +
                "&request_id=" + requestid +
                "&br_uid_2=" + cookie +
                "&q=" + params +
                "&url=" + currenturl;
        }
    };

    var getRequestId = function() {
        var id = sessionStorage.getItem('autosuggestId');
        if (!id) {
            var id = Math.floor(100000000000 + Math.random() * 900000000000);
            sessionStorage.setItem('autosuggestId', id);
        }

        var date = new Date();
        var dateTime = 
            ("00" + date.getDate()).slice(-2) + "-"
            + ("00" + (date.getMonth() + 1)).slice(-2) + "-"
            + date.getFullYear() + "-"
            + ("00" + date.getHours()).slice(-2) + ":" 
            + ("00" + date.getMinutes()).slice(-2) + ":"
            + ("00" + date.getSeconds()).slice(-2) + "." 
            + ("000" + date.getMilliseconds()).slice(-3);

        return id + "-BAUS-" + dateTime;
    };
};

//-----------------------------------------------------------------------------------------
// Setup - Applies search to page based on CSS selectors
//-----------------------------------------------------------------------------------------

// Apply search events to search again
jdw.ApplySearchEventsToSearchAgain = function() {
	var optionsAgain = {
			"searchAreaSelector" : "#searchAgainBox #searchAgainForm",
			"searchKeywordSelector" : "#searchAgainBox #searchAgainForm #searchString, #searchAgainBox #searchAgainForm #searchString",
			"searchButtonSelector" : "#searchAgainBox #searchAgainForm #button",
			"showSearchText" : false,
	        "searchApiEnabled" : true
	};		
	jdw.searchAgain = new jdw.SearchFunction( optionsAgain );
	jdw.searchAgain.load();
};

(function () {
	// Defaults have multiple selectors because of differences on desktop and mobile sites
	var options = {
			"searchAreaSelector" : "#searchArea-4 #searchForm, #headerSearch #searchForm, .gui-search-box input[type='text']",
			"searchKeywordSelector" : "#searchArea-4 #searchForm #searchKeyWords, #headerSearch #searchKeyWords, .gui-search-box input[type='text']",
			"searchButtonSelector" : "#searchArea-4 #searchForm #searchButton, #headerSearch .searchBtn, .gui-search-box button",
			"defaultSearchText" : "Keyword or Catalogue Number",
			"autoCompleteEnabled" : this.autoCompleteEnabled,
			"showSearchText" : true,
	        "searchApiEnabled" : this.searchApiEnabled
	};		
	jdw.search = new jdw.SearchFunction( options );

	$(document).ready(function() {
		var initSearch = function() {
			jdw.search.load();
			$(options.searchKeywordSelector).unbind('focusin', initSearch); // run once then unbind
		};
		$(options.searchKeywordSelector).focusin(initSearch);
		
		if($(AUTO_CORRECT_CONTAINER).not(AUTO_CORRECT_TEMPLATE).length > 0){
			var originalSearchTerm = $(".searchTermMsgContainer").attr("data-originalsearchterm");
			var autoCorrectedSearchTerm = $(".searchTermMsgContainer").attr("data-autocorrectedsearchterm");
			if (typeof NBROWN !== 'undefined' && typeof NBROWN.searchHistoryService !== 'undefined') {
				NBROWN.searchHistoryService.controller.init();
				NBROWN.searchHistoryService.controller.deleteKeyword(originalSearchTerm);
	            NBROWN.searchHistoryService.controller.addKeyword(autoCorrectedSearchTerm, new Date().getTime());
			}
		}
	});
})();


/* complete : /javascript/desktop/common/jdw_search.js*/


