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 itemSnippet = item.Snippet; 56 markup += '<li data-url="' + itemUrl + '">'; 57 if (item.Attributes.Avatar) { 58 markup += '<span><img src="' + item.Attributes.Avatar + '" class="userpic" /></span>'; 59 } 60 markup += '<span>' + itemTitle + '</span>'; 61 if (itemSnippet) 62 markup += '<p>' + itemSnippet + '</p></li>'; 63 else 64 markup += '</li>'; 65 } // end for group items 66 } 67 } // end for group 68 69 var moreResults = $wrap.attr('data-moreresults'); 70 markup += '<li><a href="javascript:void(0)" class="searchSkinObjectPreview_more">' + moreResults + '</a></li>'; 71 markup += '</ul>'; 72 } 73 else { 74 var noResult = $wrap.attr('data-noresult'); 75 markup += '<li>' + noResult + '</li></ul>'; 76 } 77 78 $wrap.append(markup); 79 preview = $('.searchSkinObjectPreview', $wrap); 80 81 //attach click event 82 $('li', preview).on('click', function () { 83 var navigateUrl = $(this).attr('data-url'); 84 if (navigateUrl) { 85 window.location.href = navigateUrl; 86 } 87 return false; 88 }); 89 90 //attach see more 91 $('.searchSkinObjectPreview_more', $wrap).on('click', function () { 92 var $searchButton = $wrap.parents('.SearchContainer').length ? $wrap.parent().next() : $wrap.next(); 93 var href = $searchButton.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 ($.inArray(k, self._ignoreKeyCodes) > -1) return; 122 123 var $this = $(this); 124 var $wrap = $this.parent(); 125 var val = $this.val(); 126 var container = $this.parent('.searchInputContainer'); 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, container); 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.