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 href = $wrap.next().attr('href'); 94 var code = href.replace('javascript:', ''); 95 eval(code); 96 return false; 97 }); 98 }; 99 100 $('.searchInputContainer a.dnnSearchBoxClearText').on('click', function () { 101 var $this = $(this); 102 var $wrap = $this.parent(); 103 $('.searchInputContainer input').val('').focus(); 104 $this.removeClass('dnnShow'); 105 $('.searchSkinObjectPreview', $wrap).remove(); 106 return false; 107 }); 108 109 $('.searchInputContainer').next().on('click', function() { 110 var $this = $(this); 111 var inputBox = $this.prev().find('input[type="text"]'); 112 var val = inputBox.val(); 113 if (val.length) { 114 return true; 115 } 116 return false; 117 }); 118 119 $('.searchInputContainer input').on('keyup', function(e) { 120 var k = e.keyCode || e.witch; 121 if (self._ignoreKeyCodes.indexOf(k) > -1) return; 122 123 var $this = $(this); 124 var $wrap = $this.parent(); 125 var val = $this.val(); 126 if (!val) { 127 128 $('a.dnnSearchBoxClearText', $wrap).removeClass('dnnShow'); 129 $('.searchSkinObjectPreview', $wrap).remove(); 130 } else { 131 $('a.dnnSearchBoxClearText', $wrap).addClass('dnnShow'); 132 133 if (self.settings.searchType != 'S' || 134 val.length < self.settings.minCharRequiredTriggerAutoSearch) return; 135 136 if (throttle) { 137 clearTimeout(throttle); 138 delete throttle; 139 } 140 141 throttle = setTimeout(function() { 142 var service = $.dnnSF ? $.dnnSF(-1) : null; 143 var url = makeUrl(val, service); 144 if (url) { 145 $.ajax({
146 url: url, 147 beforeSend: service ? service.setModuleHeaders : null, 148 success: function(result) { 149 if (result) 150 generatePreviewTemplate(result); 151 }, 152 error: function() { 153 }, 154 type: 'GET', 155 dataType: 'json', 156 contentType: "application/json" 157 }); 158 } 159 }, self.settings.delayTriggerAutoSearch); 160 } 161 }) 162 .on('paste', function() { 163 $(this).triggerHandler('keyup'); 164 }) 165 .on('keypress', function(e) { 166 var k = e.keyCode || e.which; 167 if (k == 13) { 168 var $this = $(this); 169 var $wrap = $this.parent(); 170 var val = $this.val(); 171 if (val.length) { 172 var href = $wrap.next().attr('href'); 173 if (!href) { 174 // dropdown search 175 href = $wrap.parent().next().attr('href'); 176 } 177 var code = href.replace('javascript:', ''); 178 eval(code); 179 e.preventDefault(); 180 } else { 181 e.preventDefault(); 182 } 183 } 184 }); 185 } 186 }; 187 } 188})(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.