'use strict';

var SimpleBlogSearch = function(args) {
   'use strict';
   $.ajax({
      url: args.searchDataPath,
      dataType: args.dataType,
      success: function( response ) {
         // get the contents from search data
         var datas = args.processDataFunc(response);
         var $input = document.getElementById(args.searchInputID);
         if (!$input) return;
         var $resultContent = document.getElementById(args.resultsDivID);
         if ($("#" + args.searchInputID).length > 0) {
            $input.addEventListener('input', function () {
               var str = `<ul class="${args.resultULClass}">`;
               var keywordRegex = new RegExp(this.value.toLowerCase(), "g")
               $resultContent.innerHTML = "";
               if (this.value.trim().length <= 0) {
                  return;
               }
               // perform local searching
               var count = 0
               datas.some(function (data) {
                  var isMatch = false;
                  var content_index = [];
                  if (!data.title || data.title.trim() === '') {
                     data.title = "Untitled";
                  }
                  var data_title = data.title.trim().toLowerCase();
                  var data_content = data.content.trim().replace(/(\r\n\t|\n|\r\t|\s)+/gm, " ")
                  var data_content_lowercase = data_content.toLowerCase()
                  var data_url = data.url;
                  var index_content = -1;
                  var first_occur = -1;
                  // only match artiles with not empty contents
                  if (data_content_lowercase !== '') {
                     var matchTitles = data_title.match(keywordRegex)
                     var matchContents = data_content_lowercase.match(keywordRegex)
                     if (matchTitles != null) {
                        isMatch = true
                     }
                     if (matchContents != null) {
                        isMatch = true
                        index_content = data_content_lowercase.indexOf(matchContents[0]);
                     }
                     if (index_content < 0) {
                        index_content = 0
                     }
                     first_occur = index_content
                  }

                  // show search results
                  if (isMatch) {
                     str += `<li><a href='${data_url}'>${data.title}</a>`;
                     var content = data.content.trim();
                     if (first_occur >= 0) {
                        // cut out 100 characters
                        var start = first_occur - 20;
                        var end = first_occur + 80;

                        if (start < 0) {
                           start = 0;
                        }

                        if (start == 0) {
                           end = 100;
                        }

                        if (end > data_content.length) {
                           end = data_content.length;
                        }
                        var match_content = data_content.substring(start, end);


                        // highlight search result
                        if (matchContents != null) {
                           var regStr;
                           if (match_content.toLowerCase().includes(matchContents[0])) {
                              regStr = matchContents[0]
                           } else {
                              regStr = match_content.substring(20)
                           }
                           var reg = new RegExp(regStr.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "gi");
                           match_content = match_content.replace(reg,
                              `<em class="${args.highlightKeywordClass}">${regStr}</em>`);
                        }

                        str += `<p class="${args.resultParagraphClass}">${match_content}...</p>`
                     }
                     str += "</li>";
                     count += 1;
                  }
                  return count == args.limit;
               });
               str += "</ul>";
               $resultContent.innerHTML = str;
            });
         }
      }
   });
}

module.exports = SimpleBlogSearch;