1(function ($) { 2 if (typeof dnn == 'undefined') window.dnn = {}; 3 if (typeof dnn.searchSkinObject == 'undefined') { 4 dnn.searchSkinObject = function (options) { 5 var settings = { 6 delayTriggerAutoSearch: 100, 7 minCharRequiredTriggerAutoSearch: 2, 8 searchType: 'S', 9 enableWildSearch: true, 10 cultureCode: 'en-US' 11 }; 12 this.settings = $.extend({}, settings, options); 13 }; 14 dnn.searchSkinObject.prototype = { 15 _ignoreKeyCodes: [9, 13, 16, 17, 18, 19, 20, 27, 33, 34, 35, 36, 37, 38, 39, 40, 45], 16 init: function () { 17 var throttle = null, self = this; 18 var makeUrl = function (val, service) { 19 var url = service ? service.getServiceRoot('internalservices') + 'searchService/preview' : null; 20 if (!url) return null; 21 var params = {}; 22 params['keywords'] = val.replace(/^\s+|\s+$/g, ''); 23 if (!self.settings.enableWildSearch) params["forceWild"] = "0"; 24 params['culture'] = self.settings.cultureCode; 25 if (self.settings.portalId >= 0) 26 params['portal'] = self.settings.portalId; 27 var urlAppend = []; 28 $.each(params, function (index, value) { 29 urlAppend.push([index, encodeURIComponent(value)].join('=')); 30 }); 31 32 if (urlAppend.length) { 33 url += url.indexOf('?') === -1 ? '?' : '&'; 34 url += urlAppend.join('&'); 35 } 36 return url; 37 }; 38 39 var generatePreviewTemplate = function (data, $wrap) { 40 var preview = $('.searchSkinObjectPreview', $wrap); 41 if (preview.length) 42 preview.remove(); 43 44 var markup = '<ul class="searchSkinObjectPreview">'; 45 if (data && data.length) { 46 for (var i = 0; i < data.length; i++) { 47 var group = data[i]; 48 if (group.Results && group.Results.length) { 49 var groupTitle = group.DocumentTypeName; 50 markup += '<li class="searchSkinObjectPreview_group">' + groupTitle + '</li>'; 51 for (var j = 0; j < group.Results.length; j++) { 52 var item = group.Results[j]; 53 var itemTitle = item.Title; 54 var itemUrl = item.DocumentUrl; 55 var itemDescription = item.Description; 56 var itemSnippet = item.Snippet; 57 markup += '<li data-url="' + itemUrl + '">'; 58 if (item.Attributes.Avatar) { 59 markup += '<span><img src="' + item.Attributes.Avatar + '" class="userpic" /></span>'; 60 } 61 markup += '<span>' + itemTitle + '</span>'; 62 if (itemDescription) { 63 markup += '<p>' + itemDescription + '</p>'; 64 } 65 if (itemSnippet) { 66 markup += '<p>' + itemSnippet + '</p>'; 67 } 68 markup += '</li>'; 69 } // end for group items 70 } 71 } // end for group 72 73 var moreResults = $wrap.attr('data-moreresults'); 74 markup += '<li><a href="javascript:void(0)" class="searchSkinObjectPreview_more">' + moreResults + '</a></li>'; 75 markup += '</ul>'; 76 } 77 else { 78 var noResult = $wrap.attr('data-noresult'); 79 markup += '<li>' + noResult + '</li></ul>'; 80 } 81 82 $wrap.append(markup); 83 preview = $('.searchSkinObjectPreview', $wrap); 84 85 //attach click event 86 $('li', preview).on('click', function () { 87 var navigateUrl = $(this).attr('data-url'); 88 if (navigateUrl) { 89 window.location.href = navigateUrl; 90 } 91 return false; 92 }); 93 94 //attach see more 95 $('.searchSkinObjectPreview_more', $wrap).on('click', function () { 96 var $searchButton = $wrap.next(); 97 if (!$searchButton.length) { 98 $searchButton = $wrap.parent().next(); 99 } 100 $searchButton[0].click(); 101 return false; 102 }); 103 }; 104 105 $('.searchInputContainer a.dnnSearchBoxClearText').on('click', function () { 106 var $this = $(this); 107 var $wrap = $this.parent(); 108 $('.searchInputContainer input').val('').focus(); 109 $this.removeClass('dnnShow'); 110 $('.searchSkinObjectPreview', $wrap).remove(); 111 return false; 112 }); 113 114 $('.searchInputContainer').next().on('click', function() { 115 var $this = $(this); 116 var inputBox = $this.prev().find('input[type="text"]'); 117 var val = inputBox.val(); 118 if (val.length) { 119 return true; 120 } 121 return false; 122 }); 123 124 $('.searchInputContainer input').on('keyup', function(e) { 125 var k = e.keyCode || e.witch; 126 if ($.inArray(k, self._ignoreKeyCodes) > -1) return; 127 128 var $this = $(this); 129 var $wrap = $this.parent(); 130 var val = $this.val(); 131 var container = $this.parent('.searchInputContainer'); 132 if (!val) { 133 134 $('a.dnnSearchBoxClearText', $wrap).removeClass('dnnShow'); 135 $('.searchSkinObjectPreview', $wrap).remove(); 136 } else { 137 $('a.dnnSearchBoxClearText', $wrap).addClass('dnnShow'); 138 139 if (self.settings.searchType != 'S' || 140 val.length < self.settings.minCharRequiredTriggerAutoSearch) return; 141 142 if (throttle) { 143 clearTimeout(throttle); 144 delete throttle; 145 } 146 147 throttle = setTimeout(function() { 148 var service = $.dnnSF ? $.dnnSF(-1) : null; 149 var url = makeUrl(val, service); 150 if (url) { 151 $.ajax({
152 url: url, 153 beforeSend: service ? service.setModuleHeaders : null, 154 success: function(result) { 155 if (result) 156 generatePreviewTemplate(result, container); 157 }, 158 error: function() { 159 }, 160 type: 'GET', 161 dataType: 'json', 162 contentType: "application/json" 163 }); 164 } 165 }, self.settings.delayTriggerAutoSearch); 166 } 167 }) 168 .on('paste', function() { 169 $(this).triggerHandler('keyup'); 170 }) 171 .on('keypress', function(e) { 172 var k = e.keyCode || e.which; 173 if (k == 13) { 174 var $this = $(this); 175 var $wrap = $this.parent(); 176 var val = $this.val(); 177 if (val.length) { 178 var $searchButton = $wrap.next(); 179 if (!$searchButton.length) { 180 $searchButton = $wrap.parent().next(); 181 } 182 $searchButton[0].click(); 183 e.preventDefault(); 184 } else { 185 e.preventDefault(); 186 } 187 } 188 }); 189 } 190 }; 191 } 192})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.