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) { 40 var $wrap = $('.searchInputContainer'); 41 var preview = $('.searchSkinObjectPreview', $wrap); 42 if (preview.length) 43 preview.remove(); 44 45 var markup = '<ul class="searchSkinObjectPreview">'; 46 if (data && data.length) { 47 for (var i = 0; i < data.length; i++) { 48 var group = data[i]; 49 if (group.Results && group.Results.length) { 50 var groupTitle = group.DocumentTypeName; 51 markup += '<li class="searchSkinObjectPreview_group">' + groupTitle + '</li>'; 52 for (var j = 0; j < group.Results.length; j++) { 53 var item = group.Results[j]; 54 var itemTitle = item.Title; 55 var itemUrl = item.DocumentUrl; 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 (itemSnippet) 63 markup += '<p>' + itemSnippet + '</p></li>'; 64 else 65 markup += '</li>'; 66 } // end for group items 67 } 68 } // end for group 69 70 var moreResults = $wrap.attr('data-moreresults'); 71 markup += '<li><a href="javascript:void(0)" class="searchSkinObjectPreview_more">' + moreResults + '</a></li>'; 72 markup += '</ul>'; 73 } 74 else { 75 var noResult = $wrap.attr('data-noresult'); 76 markup += '<li>' + noResult + '</li></ul>'; 77 } 78 79 $wrap.append(markup); 80 preview = $('.searchSkinObjectPreview', $wrap); 81 82 //attach click event 83 $('li', preview).on('click', function () { 84 var navigateUrl = $(this).attr('data-url'); 85 if (navigateUrl) { 86 window.location.href = navigateUrl; 87 } 88 return false; 89 }); 90 91 //attach see more 92 $('.searchSkinObjectPreview_more', $wrap).on('click', function () { 93 var $searchButton = $wrap.parents('.SearchContainer').length ? $wrap.parent().next() : $wrap.next(); 94 var href = $searchButton.attr('href'); 95 var code = href.replace('javascript:', ''); 96 eval(code); 97 return false; 98 }); 99 }; 100 101 $('.searchInputContainer a.dnnSearchBoxClearText').on('click', function () { 102 var $this = $(this); 103 var $wrap = $this.parent(); 104 $('.searchInputContainer input').val('').focus(); 105 $this.removeClass('dnnShow'); 106 $('.searchSkinObjectPreview', $wrap).remove(); 107 return false; 108 }); 109 110 $('.searchInputContainer').next().on('click', function() { 111 var $this = $(this); 112 var inputBox = $this.prev().find('input[type="text"]'); 113 var val = inputBox.val(); 114 if (val.length) { 115 return true; 116 } 117 return false; 118 }); 119 120 $('.searchInputContainer input').on('keyup', function(e) { 121 var k = e.keyCode || e.witch; 122 if ($.inArray(k, self._ignoreKeyCodes) > -1) return; 123 124 var $this = $(this); 125 var $wrap = $this.parent(); 126 var val = $this.val(); 127 if (!val) { 128 129 $('a.dnnSearchBoxClearText', $wrap).removeClass('dnnShow'); 130 $('.searchSkinObjectPreview', $wrap).remove(); 131 } else { 132 $('a.dnnSearchBoxClearText', $wrap).addClass('dnnShow'); 133 134 if (self.settings.searchType != 'S' || 135 val.length < self.settings.minCharRequiredTriggerAutoSearch) return; 136 137 if (throttle) { 138 clearTimeout(throttle); 139 delete throttle; 140 } 141 142 throttle = setTimeout(function() { 143 var service = $.dnnSF ? $.dnnSF(-1) : null; 144 var url = makeUrl(val, service); 145 if (url) { 146 $.ajax({
147 url: url, 148 beforeSend: service ? service.setModuleHeaders : null, 149 success: function(result) { 150 if (result) 151 generatePreviewTemplate(result); 152 }, 153 error: function() { 154 }, 155 type: 'GET', 156 dataType: 'json', 157 contentType: "application/json" 158 }); 159 } 160 }, self.settings.delayTriggerAutoSearch); 161 } 162 }) 163 .on('paste', function() { 164 $(this).triggerHandler('keyup'); 165 }) 166 .on('keypress', function(e) { 167 var k = e.keyCode || e.which; 168 if (k == 13) { 169 var $this = $(this); 170 var $wrap = $this.parent(); 171 var val = $this.val(); 172 if (val.length) { 173 var href = $wrap.next().attr('href'); 174 if (!href) { 175 // dropdown search 176 href = $wrap.parent().next().attr('href'); 177 } 178 var code = href.replace('javascript:', ''); 179 eval(code); 180 e.preventDefault(); 181 } else { 182 e.preventDefault(); 183 } 184 } 185 }); 186 } 187 }; 188 } 189})(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.