// Create closure.
(function( $ ) {

    /**
     * helper funtion, extend jQ
     */
    $.extend({
        /**
         * Get Url parameter
         * @param url
         * @param paramKey
         * @returns {*}
         */
        getSearchQuery:function(url,paramKey) {

            var getParams = '',
                paramIndex = 0,
                paramsLength = 0,
                aParam = undefined;
            url = decodeURI(url);
            if(content && url )
            {
                getParams = url.split('?');
                if(getParams[1])
                {
                    getParams = getParams[1].split('&');
                    paramsLength = getParams.length;
                    while(paramIndex < paramsLength )
                    {
                        aParam = getParams[paramIndex].split('=');

                        if(aParam && aParam.length && aParam[0] == paramKey)
                            return aParam[1];

                        paramIndex++;
                    }
                }
            }
            return undefined;
        },
        /**
         * Replace a GET parameter
         * @param url
         * @param paramKey
         * @param newValue
         * @returns {string}
         */
        replaceQueryParam:function(url,paramKey,newValue) {
            if(url.indexOf('&'+paramKey) === -1) {
                return url+'&'+paramKey+'='+newValue;
            }
            return url.split("&"+paramKey)[0]+'&'+paramKey+'='+newValue;
        }
    });

    // Plugin definition. fn=jQ Namespace
    $.fn.seekerSearch = function( options ) {

        var defaults = {
            projectShortcut:'AP',
            currentUrl: null,
            amountResultItemsPerPage: 10,
            currentPageIndex: 1
        };

        var settings = $.extend( {}, defaults, options );

        /**
         * @param query, search
         * @param currentIndex current page
         * @returns {*}
         */
        var looUpResult = function getSearchResult(query,currentIndex) {

            var params =  {
                shortcut: settings.projectShortcut,
                q: query,
                start: currentIndex
            };
            return $.getJSON( settings.apiUrl , params);
        };

        /**
         * Transform result json into objects
         * @param items
         * @returns {Array}
         */
        var parseResult = function (items)
        {
            var result = [];
            $.each( items, function( i, resultItem )
            {
                result.push({
                    title: resultItem.htmlTitle,
                    link: resultItem.link,
                    snippet: resultItem.htmlSnippet
                });
            });

            return result;
        };

        /**
         * Rendering of search results
         * @param queryParam
         * @param parsedResult
         * @returns {string}
         */
        var generateResultTable = function (queryParam,parsedResult)
        {
            var resultList ="<p class=\"j-search-result-subtitle\">Searched for: <strong id=\"search-query-param\">"+queryParam+"</strong>, "+parsedResult.total+" items found</p>";
            $.each(parsedResult.resultItems,function(indexKey, item)
            {
                resultList +="<div class=\"j-search-result-item\">";
                resultList +=   "<h3>"+item.title+"</h3>";
                resultList +=   "<p>";
                resultList +=   " <a class=\"j-search-result-link\" href=\""+item.link+"\"><span class=\"j-search-result-teaser\">"+item.snippet.replace(/[<]br[^>]*[>]/gi,"")+"</span></a>";
                resultList +=   " <a href=\""+item.link+"\"><span class=\"toggle-arrow\"></span></a>";
                resultList +=   "</p>";
                resultList +="</div>";
            });

            return resultList;
        };
        /**
         * Pagination
         * @param data
         * @param parsedResult
         * @param maxResultPerPage
         * @param startAtParam
         */
        var setUpPagination = function (data,parsedResult,maxResultPerPage,startAtParam)
        {
            var currentPage = 0,
                itemsPerPage = 10,
                totalResultItems = parseInt(parsedResult.total,itemsPerPage),

                startAt = parseInt(startAtParam,itemsPerPage),
                maxPageNum = Math.ceil(totalResultItems/maxResultPerPage);

            currentPage = false;
            //is first page because there is no previous one
            if(data.queries.previousPage === undefined)
                currentPage = 1;
            //is last page because the is no next page
            if(data.queries.nextPage === undefined)
                currentPage = maxPageNum;
            //It's not first or last page, so calculate current page number
            if(currentPage === false) {
                currentPage = Math.ceil(startAt / maxResultPerPage)+1;
            }

            $('#search-result-pagination').removeClass('co-hidden');

            //there are prev pages, create navigation for previous items
            if(data.queries.previousPage)
            {
                $('#result-previous').removeClass('co-hidden');
                $(document).on('click', '#result-previous',function(){
                    var nextStartIndex = data.queries.previousPage[0].startIndex;
                    window.location = $.replaceQueryParam(settings.currentUrl,'startAt',nextStartIndex);
                });
                $('#result-step-backward').removeClass('co-hidden');
                $(document).removeClass('co-hidden').on('click','#result-step-backward', function(){
                    window.location = $.replaceQueryParam(settings.currentUrl,'startAt',0);//link to first page
                });
            }

            //there are next pages, create navigation for next items
            if(data.queries.nextPage)
            {
                var nextStartIndex;
                $('#result-next').removeClass('co-hidden');
                $(document).on('click', '#result-next',function()
                {
                    nextStartIndex = data.queries.nextPage[0].startIndex;
                    window.location = $.replaceQueryParam(settings.currentUrl, 'startAt',nextStartIndex);
                });

                $('#result-step-forward').removeClass('co-hidden');
                $(document).on('click', '#result-step-forward',function()
                {
                    nextStartIndex = (maxPageNum-1)  * itemsPerPage;
                    window.location = $.replaceQueryParam(settings.currentUrl,'startAt',nextStartIndex);//link to last page
                });
            }

            $('#result-sitelist').removeClass('co-hidden').html(currentPage+'/'+maxPageNum);
        };

        return this.each(function() {
            var queryParam = $.getSearchQuery(settings.currentUrl,'q'),
                startAtParam = $.getSearchQuery(settings.currentUrl, 'startAt') || 0,
                resultList = "<p><strong>We are sorry but an error occured during the search. Please try again.</strong></p>"
            elem = $(this);

            if(queryParam)
            {
                $.when(looUpResult(queryParam,startAtParam)).done(function(data)
                {
                    if(data.items)
                    {
                        var resultRequest = data.searchInformation,
                            total = resultRequest.totalResults,
                            items = data.items,
                            maxResultPerPage = settings.amountResultItemsPerPage,
                            title = 'AP site search',
                            parsedResult = {};
                        parsedResult.success = true;
                        parsedResult.title = title;
                        parsedResult.total = total;
                        parsedResult.resultItems =  parseResult(items),
                            resultList = "<h1>"+parsedResult.title+"</h1>";

                        //json Resultlist 2 html
                        resultList += generateResultTable(queryParam,parsedResult);

                        //create pagination
                        setUpPagination(data,parsedResult,maxResultPerPage,startAtParam);

                        const pagination = $('#search-result-pagination').html();
                        //set result
                        elem.html(resultList + pagination);
                    }
                    else
                    {
                        elem.html("<p>There are no results for your search.</p>");
                    }
                });
            }
            else
            {
                var html = '<h1>AP site search</h1><p>Please provide a search term.</p><div class="j-site-search j-widget"><form action="site_search_result.html" method="get">' +
                    '<input type="search" placeholder=" Search" name="q" class="jo_search" id="search_query"> ' +
                    '<button title="Start site search" id="start_site_search" class="g-press" onclick="trimInput(\'search_query\')"><span class="j-icon icon-search"></span></button>' +
                    '<input type="hidden" name="pid" value="5974">' +
                    '</form></div>';

                elem.html(html);
            }
        });
    };
// End of closure.
})( jQuery );
