PageSourceSearch

https://stellenmarkt.wuv.de/api/js/jwtpljslib.noli-0.1.js?cb=b68592391ca08696051551e9002c536d

js wuv.de collected 2026-09-24 15:17:17 UTC 24,105 bytes, 765 lines download raw bytes

1'use strict';
2var JwTplJsLibNoli = (function(){
3	var 
4		appName = 'JwTplJsLibNoli',
5		appId = 'noli-2',
6		appVersion = 1,
7		firstCall = false,
8		migration = true,
9		emptyValue = 'noAds',
10		noliItemClass = 'jwtpl-gc-noliitem',
11		markedClass = 'jwtpl-gc-nolimarked',
12		idRegex = new RegExp("([0-9]+)\.html"),
13		blockRegex = new RegExp("jwtpl-([a-z0-9]+)-block"),
14		itemRegex = new RegExp("jwtpl-gc-noliitem([0-9]+)"),
15		emptyList = new RegExp(/{"(.*?)":{"order":\[\]}}/), 
16		maxEntries = 50,
17		defaultMsg = '<p class="jwtpl-sysNoli-noItem">Mit Klick auf einen Stern in der Trefferliste können Sie sich die Anzeige merken</p>',
18		_api = false;
19	
20	if (typeof JwTplJsLib == "object") { 
21		_api = JwTplJsLib; 
22	} 
23	
24	if(_api !== false) {
25		function touch() {
26			if(firstCall === false){
27				firstCall = true;
28				if(_api.getLcItem(appId) === false) {
29					_api.setLcItem(appId, emptyValue);
30				}
31			}
32		} 
33
34		function getId(url) {
35			var match = idRegex.exec(url);
36			if(_api.type(match) === 'Array' && match.length > 1){
37				return match[1];
38			} else {
39				return false;
40			}
41		}
42		
43		function checkData(url, title, date, adv, loc) {
44			var 
45				datum = 'Keine Angabe', 
46				advetiser = 'Keine Angabe', 
47				location = 'Keine Angabe',
48				json = {};
49
50			
51			if(_api.isString(url) === false){
52				JwTplJsLibNoli.printErrorMsg(".checkData(url, title, date, adv, loc) - url must be a string type, [" + _api.type(url) + "] given instead");
53				return false;
54			} else {
55				json['url'] = url;
56			}
57			
58			if(_api.isString(title) === false){
59				JwTplJsLibNoli.printErrorMsg(".checkData(url, title, date, adv, loc) - title must be a string type, [" + _api.type(title) + "] given instead");
60				return false;
61			} else {
62				json['title'] = title;
63			}
64			
65			if(_api.type(date) === 'String' && date.length > 0){
66				json['date'] = date;
67			} else {
68				json['date'] = datum;
69			}
70			
71			if(_api.type(adv) === 'String' && adv.length > 0){
72				json['adv'] = adv;
73			} else {
74				json['adv'] = advetiser;
75			}
76			
77			if(_api.type(loc) === 'String' && loc.length > 0){
78				json['loc'] = loc;
79			} else {
80				json['loc'] = location;
81			}
82
83			json['addon'] = '';
84			json['advUrl'] = '';
85			json['br'] = '';
86			json['company-profile-url'] = '';
87			json['companyTitleText'] = '';
88			json['logo'] = '';
89			json['param'] = '';
90			json['pt'] = '';
91			
92			return json;
93		}
94				
95		function migrate(){
96			var storage = _api.getLcItem(appId);
97			if(storage !== false){
98				var 
99					lcItem,
100					json = _api.jsonParse(storage),
101					reverse = Object.keys(json).reverse();
102				
103				for(var i = reverse.length - 1; i > 0; i--){
104					delete json[reverse[i]];
105				}
106				
107				lcItem = _api.jsonStringify(json);
108				
109		    	if(lcItem !== false) {
110		    		_api.setLcItem(appId, lcItem);
111		    		return true;
112		    	} else {
113		    		JwTplJsLibNoli.printErrorMsg(".migrate() - cannot stringify object. migration fails");
114		    		return false;
115		    	}
116			}
117		}
118
119		function getModData(eventData) {
120			if(_api.isString(eventData.modName) !== false) {
121				var 
122					data,
123					func = eventData.modName  + '_getNoliData';
124				
125				try {
126					data = window[_api.getBaseName()][func](eventData);		
127					return data;
128				} catch(e){
129					return ".getModData (eventData) - can not call function [" + func + "] from namespace [" + _api.getBaseName() + "] err: " + e;
130				}
131			} else {
132				return ".getModData (eventData) - eventData.modName must be a string type, [" + _api.type(modName) + "] given instead";
133			}
134		}
135		
136		function entryExists(id){
137			if(_api.isString(id) === false){
138				JwTplJsLibNoli.printErrorMsg('.doNoli(eventData) - id must be a string type, [' + _api.type(id) + '] given instead');
139				return '';
140			}
141			var 
142				match = false,
143				noli = JwTplJsLibNoli.getNoli();
144			
145			for (var index in noli) {
146                if(index === id) {
147                	match = true;
148                	break;
149                }
150            }
151			
152			return match;
153		}
154		
155		function doNoli (eventData) {
156			if(_api.type(eventData) === 'Object'){
157				if(_api.type(eventData.id) !== undefined && _api.type(eventData.cssClass) !== undefined && _api.type(eventData.modName) !== undefined){
158					touch();
159					var lcItem = _api.getLcItem(appId);
160					
161					if(lcItem === emptyValue) {
162						var result = getModData(eventData);
163
164						if(_api.isArray(result) === true && result.length == 5){
165							var added = JwTplJsLibNoli.addNoli(result[0], result[1], result[2], result[3], result[4]);
166							if(added === true){
167								JwTplJsLibNoli.markNoli(eventData.cssClass);
168							}
169							
170						} else {
171							JwTplJsLibNoli.printErrorMsg('.doNoli(eventData) - getModData must return an array with 5 entries');
172							return false;
173						}
174					} else {
175						var json = _api.jsonParse(lcItem);
176						if(json !== false){
177							if(_api.type(json[appVersion]) !== undefined){
178					        	var match = entryExists(eventData.id);
179					        	
180								if(match === true) {
181									var removed = JwTplJsLibNoli.removeNoli(eventData.id);
182									if(removed === true){
183										JwTplJsLibNoli.unmarkNoli(eventData.cssClass);
184									}
185								} else {
186									var result = getModData(eventData);
187									if(_api.isArray(result) === true && result.length == 5){
188										var added = JwTplJsLibNoli.addNoli(result[0], result[1], result[2], result[3], result[4]);
189
190										if(added === true){
191											JwTplJsLibNoli.markNoli(eventData.cssClass);
192										}
193										
194									} else {
195										JwTplJsLibNoli.printErrorMsg('.doNoli(eventData) - getModData must return an array with 5 entries')
196										return false;
197									}
198								}
199							} else {
200								var result = getModData(eventData);
201								if(_api.isArray(result) === true && result.length == 5){
202									var added = JwTplJsLibNoli.addNoli(result[0], result[1], result[2], result[3], result[4]);
203
204									if(added === true){
205										JwTplJsLibNoli.markNoli(eventData.cssClass);
206									}
207									
208								} else {
209									JwTplJsLibNoli.printErrorMsg('.doNoli(eventData) - getModData must return an array with 5 entries')
210									return false;
211								}
212							}
213				        	
214						} else {
215							JwTplJsLibNoli.printErrorMsg(".doNoli() - cannot parse string to json");
216				    		return false;
217						}
218					}
219				} else {
220					JwTplJsLibNoli.printErrorMsg(".doNoli(eventData) - must contain proprties: id, ccsClass, modName")
221					return false;
222				}
223			} else {
224				JwTplJsLibNoli.printErrorMsg(".doNoli(eventData) - must be a object type, [" + _api.type(eventData) + "] given instead")
225				return false;
226			}
227		}
228		
229		return {		
230			getNoli: function(){
231				if(_api.getLcItem(appId) === false){
232					this.printErrorMsg(".getNoli() - localStorage entry for [" + appId + "] doesnt exists, try to add items");
233					return false;
234				}
235				
236				var 
237					json, 
238					noli = _api.getLcItem(appId);
239				
240				if(noli !== false) {
241					if(noli === 'noAds'){
242						return false;
243					} else {
244						json = _api.jsonParse(noli);
245						if(json !== false){
246							if(_api.type(json[appVersion]) !== undefined){
247								if(Object.entries(json[appVersion]).length == 0){
248									return false;
249								} else {
250									return json[appVersion];
251								}
252							} else {
253					    		this.printErrorMsg(".getNoli() - no entries found for version = [" + appVersion +"], try to add items");
254					    		return false;
255							}
256							
257						} else {
258				    		this.printErrorMsg(".getNoli() - cannot parse string to json");
259				    		return false;
260						}
261					}
262				} else {
263					return false;
264				}
265			},
266			
267			addNoli: function(url, title, date, adv, loc) {			
268				var job = checkData(url, title, date, adv, loc);
269				
270				if(_api.type(job) === false){
271					JwTplJsLibNoli.printErrorMsg(".addNoli(url, title, date, adv, loc) - " + job);
272					return false;
273				}
274
275		    	var id = getId(job.url);
276		    	
277		    	if(id === false) {
278		    		JwTplJsLibNoli.printErrorMsg(".addNoli(url, title, date, adv, loc) - url must contain [0-9]+\.html$ pattern");
279		    		return false;
280		    	}
281		    	
282		    	var storage = _api.getLcItem(appId);
283		    	
284		    	if(storage === emptyValue) {
285			    	var 
286			    		ts,
287			    		lcItem,
288			    		order = [],
289			    		entry = {},
290			    		vc = {};
291			    	
292			    	ts = new Date().getTime();
293			    	job['ts'] = ts;
294			    	entry[id] = job;
295			    	vc[appVersion] = entry;
296			    	order.push(id);
297			    	Object.defineProperty(vc[appVersion], "order", {value : order, writable : true, enumerable : true, configurable : true});
298			    	lcItem = _api.jsonStringify(vc);
299
300			    	if(lcItem !== false) {
301			    		_api.setLcItem(appId, lcItem);
302			    		return true;
303			    	} else {
304			    		JwTplJsLibNoli.printErrorMsg(".addNoli(url, title, date, adv, loc) - cannot stringify object");
305			    		return false;
306			    	}
307		    	} else {
308		    		var entry = _api.jsonParse(storage);
309		    		if(entry !== false){
310		    			if(_api.type(entry[appVersion]) !== undefined){
311		    				if(_api.len(entry[appVersion]) > maxEntries) {
312		    					JwTplJsLibNoli.printErrorMsg('.addNoli(url, title, date, adv, loc) - maximum of [' + maxEntries + '] entries reached');
313		    					return false;
314		    				}
315		    				
316			    			var match = entryExists(id);
317			    			if(match === false){
318			    				var 
319			    					ts,
320			    					lcItem,
321			    					order = {};
322			    				
323			    				ts = new Date().getTime();
324			    				job['ts'] = ts;
325			    				entry[appVersion]['order'].push(id);
326			    				entry[appVersion][id] = job;
327			    				lcItem = _api.jsonStringify(entry);			    						    				
328			    				
329						    	if(lcItem !== false) {
330						    		_api.setLcItem(appId, lcItem);
331						    	} else {
332						    		JwTplJsLibNoli.printErrorMsg(".addNoli(url, title, date, adv, loc) - cannot stringify object");
333						    		return false;
334						    	}
335			    				
336			    			} else {
337			    				JwTplJsLibNoli.printErrorMsg(".addNoli(url, title, date, adv, loc) - item with id=[" + id + "] is already stored");
338					    		return false;
339			    			}
340		    			} else {
341		    				var 
342		    					ncMerge,
343		    					vc = {},
344		    					newEntry = {};
345
346				    		entry = _api.jsonParse(storage);
347		    				job['ts'] = new Date().getTime();
348		    				newEntry[id] = job;
349		    				vc[appVersion] = newEntry;		    				
350		    				ncMerge = Object.assign(entry, vc);
351		    				
352		    				item = _api.jsonStringify(ncMerge);
353		    				
354					    	if(item !== false) {
355					    		_api.setLcItem(appId, item);
356					    		if(migration === true) {
357						    		migrate();
358						    	}
359					    		return true;
360					    	} else {
361					    		JwTplJsLibNoli.printErrorMsg(".addNoli(url, title, date, adv, loc) - cannot stringify object");
362					    		return false;
363					    	}
364		    			}
365		    			
366		    		} else {
367		    			JwTplJsLibNoli.printErrorMsg(".addNoli(url, title, date, adv, loc) - cannot parse string to json");
368			    		return false;
369		    		}
370		    		return true;
371		    	}
372				
373			},
374			
375			removeNoli: function (id){
376				if(_api.isString(id) == false){
377					JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - url must be a string type, [" + _api.type(id) + "] given instead");
378					return false;
379				}
380				
381				if(_api.getLcItem(appId) === false){
382					JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - localStorage entry for [" + appId + "] doesnt exists, try to add items");
383					return false;
384				}
385				
386				var 
387					json, 
388					noli = _api.getLcItem(appId);
389				
390				if(noli !== false) {
391					if(noli === 'noAds'){
392						JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - no noli items to remove, is empty");
393						return false;
394					}
395				}
396				
397		    	var 
398		    		json,
399		    		orderEntry,
400		    		entry = _api.getLcItem(appId);
401		    	
402		    	json = _api.jsonParse(entry);
403		    	
404		    	if(json !== false){
405		    		if(_api.type(json[appVersion]) !== undefined){
406			    		if(_api.type(json[appVersion][id]) === undefined){
407			    			JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - item with id=[" + id + "] doesnt exist or already deleted");
408			    			return false;
409			    		}
410
411			    		if(_api.isArray(json[appVersion]['order']) === false){
412			    			JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - there is no array for the sequence");
413			    			return false;
414			    		} else if(_api.isArray(json[appVersion]['order']) === true && json[appVersion]['order'].length == 0) {
415			    			JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - there is no order sequence for that list");
416			    			return false;
417			    		}
418
419			    		var 
420			    			order = [],
421			    			delEntry = delete json[appVersion][id];
422			    	
423				    	if(delEntry === true){
424				    		for(var i=0; i<json[appVersion]['order'].length; i++){
425				    			if(json[appVersion]['order'][i] !== id){
426				    				order.push(json[appVersion]['order'][i]);
427				    			}
428				    		}
429			    			json[appVersion]['order'] = order;
430				    		var lcItem = _api.jsonStringify(json);
431
432				    		if(lcItem !== false) {
433				    			var match = emptyList.exec(lcItem); 
434				    			if(match !== null){
435				    				_api.setLcItem(appId, emptyValue);
436				    			} else {
437				    				_api.setLcItem(appId, lcItem);
438				    			}
439					    		return true;
440					    	} else {
441					    		JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - cannot stringify object");
442					    		return false;
443					    	}
444				    	} else {
445				    		JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - cannot be deleted for id=[" + id + "]");
446				    		return false;	
447				    	}
448		    		} else {
449		    			JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - no entries found for version =[" + appVersion + "], try to add items");
450						return false;
451		    		}
452			    	
453		    	} else {
454		    		JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - cannot parse string to json");
455		    		return false;
456		    	};
457			},
458					
459			clearNoli :function(){
460				if(_api.getLcItem(appId) === false){
461					this.printErrorMsg(".removeNoliJob(job) - localStorage entry for [" + appId + "] doesnt exists, try to add items");
462					return false;
463				} else {
464					_api.setLcItem(appId, emptyValue);
465					return true;
466				}
467			},
468			
469			refreshNoli: function(reverse){
470				var refreshItems = this.getNoli();
471				if(_api.isObject(refreshItems) === true){
472					var 
473						markedItems = [],
474						keys = Object.keys(refreshItems);
475					
476					_api.each(keys, function(item){
477						markedItems.push(' .' + noliItemClass + item );
478					});
479					
480					markedItems = markedItems.join();
481					
482					if(_api.isString(markedItems) === true){
483						if(_api.isString(reverse) === true && reverse === 'reverse'){
484							var toUnMark = _api.get(markedItems);
485							if(toUnMark.length > 0){
486								_api.each(toUnMark, function(item){
487									_api.removeClass(item, markedClass);
488								});
489							}
490						} else {
491							var toMark = _api.get(markedItems);
492							if(toMark.length > 0){
493								_api.each(toMark, function(item){
494									_api.addClass(item, markedClass);
495								});
496							}
497						}
498					} else {
499						this.printErrorMsg('.refreshNoli() - markedItems must be a not empty string');
500					}
501				} else {
502					this.printErrorMsg('.refreshNoli() - no items to refresh');
503				}
504			},
505
506			renderNoli: function(){
507				var noli = this.getNoli();
508				this.noliMetrics();
509				if(noli !== false) {
510					if(_api.type(noli['order']) === 'Array') {
511						var 
512							orderReverse = noli['order'],
513							noliRender = '';
514						
515						_api.each(orderReverse.reverse(), function(orderEntry){
516							if(_api.isNull(noli[orderEntry]) === false && _api.isObject(noli[orderEntry])=== true){
517								var 
518									entry, deleteIcon, link, title, date, company, location;
519								
520								title = _api.assignTpl({
521									'tag': 'div', 
522									'tagData': noli[orderEntry]['title'], 
523									'tagAttr': {
524										'class': 'jwtpl-sysNoli-title' 
525									}
526								});
527								
528								link = _api.assignTpl({
529									'tag': 'a', 
530									'tagData': title, 
531									'tagAttr': {
532										'class': 'jwtpl-sysNoli-url', 
533										'href': noli[orderEntry]['url'],
534										'target': _api.getAppGenAsInt() >= 2 ? '_self' : '_blank'
535									}
536								});
537								
538								date = _api.assignTpl({
539									'tag': 'div', 
540									'tagData': noli[orderEntry]['date'], 
541									'tagAttr': {
542										'class': 'jwtpl-sysNoli-date' 
543									}
544								});
545								
546								company = _api.assignTpl({
547									'tag': 'div', 
548									'tagData': noli[orderEntry]['adv'], 
549									'tagAttr': {
550										'class': 'jwtpl-sysNoli-company' 
551									}
552								});
553								
554								location = _api.assignTpl({
555									'tag': 'div', 
556									'tagData': noli[orderEntry]['loc'], 
557									'tagAttr': {
558										'class': 'jwtpl-sysNoli-location' 
559									}
560								});
561								
562								deleteIcon = _api.assignTpl({
563									'tag': 'span', 
564									'tagData': "", 
565									'tagAttr': {
566										'class': 'jwtpl-sysNoli-delete',  
567										'data-jwtpl-sys-noliid': orderEntry	
568									}
569								});
570								
571								entry = _api.assignTpl({
572									'tag': 'div', 
573									'tagData': deleteIcon + link + date + company + location, 
574									'tagAttr': {
575										'class': 'jwtpl-sysNoli-item' 
576									}
577								});
578								noliRender += entry;
579							}
580						});
581						
582						noliRender = _api.parseHTML(noliRender);
583						if(_api.type(noliRender) === 'HTMLCollection') {
584							var body = _api.get('body');
585							if(body.length > 0){
586								_api.event(body[0], 'click', function(e){
587									if(_api.hasClass(e.target, 'jwtpl-sysNoli-delete') === true) {
588										var delTarget = e.target;
589										if(delTarget.hasAttribute('data-jwtpl-sys-noliid') === true){
590											var advId = delTarget.getAttribute('data-jwtpl-sys-noliid');
591											if(_api.isString(advId) !== false){
592												var delItem = delTarget.parentElement;
593												if(_api.isNull(delItem) === false){
594													var itemList = delItem.parentElement;
595													if(_api.isNull(itemList) === false){	
596														itemList.removeChild(delItem);
597														JwTplJsLibNoli.removeNoli(advId);
598														JwTplJsLibNoli.unmarkNoli(noliItemClass + advId);
599														JwTplJsLibNoli.noliMetrics();
600														if(itemList.children.length == 0) {
601															itemList.innerHTML = JwTplJsLibNoli.getDefaultMsg();
602														}
603													} else {
604														JwTplJsLibNoli.printErrorMsg('.renderNoli() - no jwtpl-sysNoli-itemList found. error');
605														return false;
606													}
607												} else {
608													JwTplJsLibNoli.printErrorMsg('.renderNoli() - no jwtpl-sysNoli-item found. error');
609													return false;
610												}
611											} else {
612												JwTplJsLibNoli.printErrorMsg('.renderNoli() - [data-jwtpl-sys-noliid] attribute must be a string type on [jwtpl-sysNoli-delete] Element');
613												return false;
614											}
615										} else {
616											JwTplJsLibNoli.printErrorMsg('.renderNoli() - no [data-jwtpl-sys-noliid] attribute found on [jwtpl-sysNoli-delete] Element');
617											return false;
618										}
619									}
620								});
621								return noliRender;
622							} else {
623								this.printErrorMsg('.renderNoli() - no body tag found. error');
624								return false;
625							}
626						} else {
627							this.printErrorMsg('.renderNoli() - cannot parse given html. error');
628							return false;
629						}
630					} else {
631						this.printErrorMsg('.renderNoli() - order prop must be an array type, [' + _api.type(noli['order']) + '] given instead');
632						return false;
633					}
634				} else {
635					return false;
636				}
637			},
638			
639			markNoli: function(cssClass) {
640				var toMark = _api.get('.' + cssClass);
641				if(toMark.length > 0){
642					_api.each(toMark, function(item){
643						_api.addClass(item, markedClass);
644					});
645				}
646			},
647			
648			unmarkNoli: function(cssClass) {
649				var toUnmark = _api.get('.' + cssClass);
650				if(toUnmark.length > 0){
651					_api.each(toUnmark, function(item){
652						_api.removeClass(item, markedClass);
653					});
654				}
655			},
656			
657			noliMetrics: function(){
658				var metrics = _api.get('[data-jwtpl-sys-nolisize], [data-jwtpl-sys-nolisizemax]');
659				if(metrics.length > 0){
660					_api.each(metrics, function(ele){
661						if(ele.hasAttribute('data-jwtpl-sys-nolisize') === true && ele.hasAttribute('data-jwtpl-sys-nolisizemax') === true){
662							var 
663								min = ele.getAttribute('data-jwtpl-sys-nolisize'), 
664								max = ele.getAttribute('data-jwtpl-sys-nolisizemax'); 
665							
666							ele.setAttribute('data-jwtpl-sys-nolisize', JwTplJsLibNoli.getNoliSize());
667							ele.setAttribute('data-jwtpl-sys-nolisizemax', JwTplJsLibNoli.getNoliSizeMax());
668						}
669					});
670				}
671			},
672			
673			initNoli: function() {
674				var 
675					refresh,
676					noliMods = document.querySelectorAll('.jwtpl-gc-noli');
677
678				if(noliMods.length > 0){
679					_api.each(noliMods, function(item){
680						if(_api.type(item.classList.value) !== undefined){
681							var modName = blockRegex.exec(item.classList.value);
682							if(modName.length == 2){
683								modName = modName[1];
684								var noliItems = item.querySelectorAll("[class*='jwtpl-gc-noliitem']");
685								if(noliItems.length > 0){
686									_api.each(noliItems, function(item){
687										if(_api.type(item.classList.value) !== undefined){
688											var match = itemRegex.exec(item.classList.value); 
689											if(_api.type(match) !== undefined && match.length == 2){
690												_api.event(item, 'click', function(e){
691													
692													var 
693														noliBox = _api.get('.jwtpl-sysNoli-block');
694
695													if(noliBox.length > 0) {
696														_api.each(noliBox, function(item){
697															if(_api.hasClass(item, 'open') === true) {
698																_api.removeClass(item, 'open');
699																_api.hide(item);
700															}
701															
702															 if(_api.hasClass(item, 'fadeIn') === true) {
703																_api.removeClass(item, 'fadeIn');
704																_api.addClass(item, 'jwtpl-gc-hidden1');
705															}
706														});	
707													}
708													
709													e.preventDefault();
710													e.stopPropagation();
711													var data = {};
712													data["cssClass"] = match[0],
713													data["id"] = match[1], 
714													data["trigger"] = this;
715													data["modName"] = modName;
716													doNoli(data);
717												});
718											}
719										}
720									});
721								}
722							}
723						}
724					});
725				}
726			},
727			
728			getDefaultMsg: function(){
729				return defaultMsg;
730			},
731			
732			getNoliSize: function(){
733				return this.getNoli() !== false ? _api.len(this.getNoli()) - 1 : 0; 
734			},
735			
736			getNoliSizeMax: function(){
737				return maxEntries;
738			},
739			
740			printErrorMsg :function(msg){
741		    	if (_api.isLocalHost() === true) {
742			    	if(_api.type(msg) === 'String' && msg.length > 0){
743			    		console.log("%c" + appName + msg, "color: #ce0000;");
744			    	}
745		    	}
746		    }
747		}
748	} else {
749		return {
750			getNoli: function() { return false; },
751			addNoli: function() { return false; },
752			removeNoli: function() { return false; },
753			clearNoli: function() { return false; },
754			refreshNoli: function() { return false; },
755			markNoli: function() { return false; },
756			unmarkNoli: function() { return false; },
757			renderNoli: function() {return false;},
758			initNoli: function() { return false; },
759			getDefaultMsg: function() {return defaultMsg;},
760			getNoliSize: function(){return 0},
761			getNoliSizeMax: function(){return maxEntries;},
762			printErrorMsg: function(){ return false; }
763		}
764	}
765})();

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.