PageSourceSearch

https://www.e-tribune.fr/media/com_hikashop/js/hikashop.js?v=444

js e-tribune.fr collected 2026-10-02 12:25:56 UTC 60,996 bytes, 1,899 lines download raw bytes

1/**
2 * @package    HikaShop for Joomla!
3 * @version    4.4.4
4 * @author     hikashop.com
5 * @copyright  (C) 2010-2021 HIKARI SOFTWARE. All rights reserved.
6 * @license    GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
7 */
8(function() {
9
10function preventDefault() { this.returnValue = false; }
11function stopPropagation() { this.cancelBubble = true; }
12
13var Oby = {
14	version: 20171104,
15	ajaxEvents : {},
16
17	hasClass: function(o,n) {
18		if(o.classList && o.classList.contains)
19			return o.classList.contains(n);
20		if(o.className == '' ) return false;
21		var reg = new RegExp("(^|\\s+)"+n+"(\\s+|$)");
22		return reg.test(o.className);
23	},
24	addClass: function(o,n) {
25		if(o.classList && o.classList.add)
26			return o.classList.add(n);
27		if( !this.hasClass(o,n) ) {
28			if( o.className == '' ) {
29				o.className = n;
30			} else {
31				o.className += ' '+n;
32			}
33		}
34	},
35	trim: function(s) {
36		if(s.trim) return s.trim();
37		return (s ? '' + s : '').replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
38	},
39	removeClass: function(e, c) {
40		if(e.classList && e.classList.remove)
41			return e.classList.remove(c);
42		var t = this;
43		if( t.hasClass(e,c) ) {
44			var cn = ' ' + e.className + ' ';
45			e.className = t.trim(cn.replace(' '+c+' ',' '));
46		}
47	},
48	toggleClass: function(e,c) {
49		if(e.classList && e.classList.toggle)
50			return e.classList.toggle(c);
51		var t = this;
52		if( t.hasClass(e,c) ) {
53			return t.removeClass(e,c);
54		}
55		return t.addClass(e,c);
56	},
57	addEvent: function(d,e,f) {
58		if( d.attachEvent )
59			d.attachEvent('on' + e, f);
60		else if (d.addEventListener)
61			d.addEventListener(e, f, false);
62		else
63			d['on' + e] = f;
64		return f;
65	},
66	removeEvent: function(d,e,f) {
67		try {
68			if( d.detachEvent )
69				d.detachEvent('on' + e, f);
70			else if( d.removeEventListener)
71				d.removeEventListener(e, f, false);
72			else
73				d['on' + e] = null;
74		} catch(e) {}
75	},
76	cancelEvent: function(e) {
77		if( !e ) {
78			e = window.event;
79			if( !e )
80				return false;
81		}
82		if(e.stopPropagation)
83			e.stopPropagation();
84		else
85			 e.cancelBubble = true;
86		if( e.preventDefault )
87			e.preventDefault();
88		else
89			e.returnValue = false;
90		return false;
91	},
92	fireEvent: function(obj,e,data) {
93		var d = document, evt = null;
94		if(document.createEvent) {
95			evt = d.createEvent('HTMLEvents');
96			evt.initEvent(e, false, true);
97			if(data) evt.data = data;
98			obj.dispatchEvent(evt);
99			return;
100		}
101		if(data && d.createEventObject) {
102			evt = d.createEventObject();
103			evt.data = data;
104			obj.fireEvent('on'+e, evt);
105			return;
106		}
107		obj.fireEvent('on'+e);
108	},
109	fireAjax: function(name,params) {
110		var t = this, ev, r = null, ret = [];
111		if( t.ajaxEvents[name] === undefined )
112			return false;
113		for(var e in t.ajaxEvents[name]) {
114			if( e == '_id' )
115				continue;
116			ev = t.ajaxEvents[name][e];
117			if(!ev || typeof(ev) != 'function')
118				continue;
119			try {
120				r = ev(params);
121				if(r !== undefined)
122					ret.push(r);
123			}catch(e){}
124		}
125		return ret;
126	},
127	registerAjax: function(name, fct) {
128		var t = this;
129		if(typeof(name) == 'object') {
130			var r = [];
131			for(var k = name.length - 1; k >= 0; k--) {
132				r[r.length] = t.registerAjax(name[k], fct);
133			}
134			return r;
135		}
136		if( t.ajaxEvents[name] === undefined )
137			t.ajaxEvents[name] = {'_id':0};
138		var id = t.ajaxEvents[name]['_id'];
139		t.ajaxEvents[name]['_id'] += 1;
140		t.ajaxEvents[name][id] = fct;
141		return id;
142	},
143	unregisterAjax: function(name, id) {
144		if( t.ajaxEvents[name] === undefined || t.ajaxEvents[name][id] === undefined)
145			return false;
146		t.ajaxEvents[name][id] = null;
147		return true;
148	},
149	ready: function(fct) {
150		var w = window, d = document, t = this;
151		if(d.readyState === "complete") {
152			fct();
153			return;
154		}
155		var done = false, top = true, root = d.documentElement,
156			init = function(e) {
157				if(e.type == 'readystatechange' && d.readyState != 'complete') return;
158				t.removeEvent((e.type == 'load' ? w : d), e.type, init);
159				if(!done && (done = true))
160					fct();
161			},
162			poll = function() {
163				try{ root.doScroll('left'); } catch(e){ setTimeout(poll, 50); return; }
164				init('poll');
165			};
166		if(d.createEventObject && root.doScroll) {
167			try{ top = !w.frameElement; } catch(e){}
168			if(top) poll();
169		}
170		t.addEvent(d,'DOMContentLoaded',init);
171		t.addEvent(d,'readystatechange',init);
172		t.addEvent(w,'load',init);
173	},
174	evalJSON: function(text, secure) {
175		if( typeof(text) != "string" || !text.length) return null;
176		if(JSON !== undefined && typeof(JSON.parse) == 'function') {
177			try { var ret = JSON.parse(text); return ret; } catch(e) { }
178		}
179		if(secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(text.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null;
180		try { var ret = eval('(' + text + ')'); return ret; } catch(e) { }
181		return null;
182	},
183	getXHR: function() {
184		var xhr = null, w = window;
185		if(w.XMLHttpRequest || w.ActiveXObject) {
186			if(w.ActiveXObject) {
187				try {
188					xhr = new ActiveXObject("Microsoft.XMLHTTP");
189				} catch(e) {}
190			} else
191				xhr = new w.XMLHttpRequest();
192		}
193		return xhr;
194	},
195	xRequest: function(url, options, cb, cbError) {
196		var t = this, xhr = t.getXHR();
197		if(!options) options = {};
198		if(!cb) cb = function(){};
199		options.mode = options.mode || 'GET';
200		options.update = options.update || false;
201		options.replace = options.replace === undefined || options.replace;
202		xhr.onreadystatechange = function() {
203			if(xhr.readyState != 4)
204				return;
205			if( xhr.status == 200 || (xhr.status == 0 && xhr.responseText > 0) || !cbError ) {
206				if(cb)
207					cb(xhr,options.params);
208				if(options.update)
209					t.updateElem(options.update, xhr.responseText, options.replace);
210			} else {
211				cbError(xhr,options.params);
212			}
213		};
214		xhr.open(options.mode, url, true);
215		if(options.mode.toUpperCase() == 'POST' && typeof(options.data) == 'string') {
216			xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
217		}
218		xhr.send( options.data );
219	},
220	getFormData: function(target, encoded) {
221		var d = document, ret = {};
222		if(encoded === undefined) encoded = true;
223		if( typeof(target) == 'string' )
224			target = d.getElementById(target);
225		if( target === undefined )
226			target = d;
227		var typelist = ['input','select','textarea'];
228		for(var t in typelist) {
229			if(!typelist.hasOwnProperty(t))
230				continue;
231			t = typelist[t];
232			var inputs = target.getElementsByTagName(t);
233			for(var i = 0; i < inputs.length; i++) {
234				if( !inputs[i].name || inputs[i].disabled )
235					continue;
236				var evalue = inputs[i].value, n = inputs[i].name, etype = '';
237				if( t == 'input' )
238					etype = inputs[i].type.toLowerCase();
239				if( (etype == 'radio' || etype == 'checkbox') && !inputs[i].checked )
240					evalue = null;
241				if(t == 'select' && inputs[i].multiple) {
242					for(var k = inputs[i].options.length - 1; k >= 0; k--) {
243						if(!inputs[i].options[k].selected)
244							continue;
245						//if( ret != '' ) ret += '&';
246						//ret += encodeURI(inputs[i].name) + '=' + encodeURIComponent(inputs[i].options[k].value);
247						if(ret.hasOwnProperty(n)) {
248							if(typeof(ret[n]) != 'object')
249								ret[n] = [ ret[n] ];
250							ret[n][ ret[n].length ] = inputs[i].options[k].value;
251						} else
252							ret[ n ] = inputs[i].options[k].value;
253						evalue = null;
254					}
255				}
256				if( (etype != 'file' && etype != 'submit') && evalue != null ) {
257					//if( ret != '' ) ret += '&';
258					//ret += encodeURI(inputs[i].name) + '=' + encodeURIComponent(evalue);
259
260					if(ret.hasOwnProperty(n)) {
261						if(typeof(ret[n]) != 'object')
262							ret[n] = [ ret[n] ];
263						ret[n][ ret[n].length ] = evalue;
264					} else
265						ret[ n ] = evalue;
266				}
267			}
268		}
269		if(encoded)
270			return this.encodeFormData(ret);
271		return ret;
272	},
273	encodeFormData: function(data) {
274		var ret = '', v = null;
275		if(typeof(data) == "string")
276			return data;
277		for(var k in data) {
278			if(!data.hasOwnProperty(k))
279				continue;
280			v = data[k];
281			if(typeof(v) == 'object') {
282				for(var i in v) {
283					if(!v.hasOwnProperty(i))
284						continue;
285					if( ret != '' ) ret += '&';
286					ret += encodeURI(k) + '=' + encodeURIComponent(v[i]);
287				}
288			} else {
289				if( ret != '' ) ret += '&';
290				ret += encodeURI(k) + '=' + encodeURIComponent(v);
291			}
292		}
293		return ret;
294	},
295	updateElem: function(elem, data, replace = true) {
296		var d = document, scripts = '', json = '';
297		if( typeof(elem) == 'string' )
298			elem = d.getElementById(elem);
299
300		// extract the javascript files and scripts from the HTML
301		var files = [];
302		var scriptsAlreadyLoaded = document.getElementsByTagName("script");
303		var text = data.replace(/<script([^>]*)>([\s\S]*?)<\/script>/gi, function(all, attributes, code){
304			if(all.indexOf('type="application/json"') != -1) {
305				json += code + '\n';
306				return '';
307			}
308			if(all.indexOf('type="application/ld+json"') != -1)
309				return '';
310			regex = RegExp('src="([^"]+)"', 'gi');
311			result = regex.exec(attributes);
312			if(result) {
313				result[1] = result[1].replace(/\.js\?[0-9a-f]{32}/gi, '.js');
314				for(var i = 0; i < scriptsAlreadyLoaded.length; i++) {
315					var src = scriptsAlreadyLoaded[i].getAttribute('src');
316					if(src && src.includes(result[1]))
317						return '';
318				}
319				files.push(result[1]);
320				return '';
321			}
322			scripts += code.replace('document.addEventListener(\'DOMContentLoaded\',', 'window.hikashop.ready(', 'find("select").chosen(').replace('$(document).ready(', 'window.hikashop.ready(', 'find("select").filter(":visible").chosen(') + '\n';
323			return '';
324		});
325
326		// add the HTML without the javascript elements to the element on the page
327		if(text.indexOf('id="hikashop_main_content"')) {
328			var wrapper = document.createElement('div');
329			wrapper.innerHTML = text;
330			var mainArea = wrapper.querySelector('#hikashop_main_content');
331			if(mainArea) {
332				if(replace)
333				elem.innerHTML = '';
334				elem.appendChild(mainArea);
335				text = '';
336			}
337		}
338		if(text) {
339			if(!replace)
340				elem.insertAdjacentHTML('beforeend',text);
341			else
342			elem.innerHTML = text;
343		}
344
345		// add the javascript elements and run them
346		if( json != '' && Joomla) {
347			var option = JSON.parse(json);
348			if (option) {
349				Joomla.loadOptions(option);
350			}
351		}
352
353		if(files.length) {
354			this.loadScripts(files, function() {
355				if( scripts != '' ) {
356					var script = d.createElement('script');
357					script.setAttribute('type', 'text/javascript');
358					script.text = scripts;
359					d.head.appendChild(script);
360					d.head.removeChild(script);
361				}
362			});
363		} else {
364			if( scripts != '' ) {
365				var script = d.createElement('script');
366				script.setAttribute('type', 'text/javascript');
367				script.text = scripts;
368				d.head.appendChild(script);
369				d.head.removeChild(script);
370			}
371		}
372	},
373	loadScripts: function(scripts, complete) {
374		var loadScript = function( src ) {
375			var xmlhttp, next;
376			if (window.XMLHttpRequest)  {
377				xmlhttp = new XMLHttpRequest();
378			} else {
379				try {
380					 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
381				} catch(e) {
382					return;
383				}
384			}
385			xmlhttp.onreadystatechange = function() {
386				if (xmlhttp.readyState != 4)
387					return;
388				if (xmlhttp.status == 200)
389					eval(xmlhttp.responseText);
390				next = scripts.shift();
391				if ( next ) {
392					loadScript(next);
393				} else if ( typeof complete == 'function' ) {
394					complete();
395				}
396			}
397			xmlhttp.open("GET", src , true);
398			xmlhttp.send();
399		};
400		loadScript( scripts.shift() );
401	},
402	ease: function(v) {
403		return 1+Math.pow(v-1,3);
404	},
405	easeInOut: function(t,s,dt,du) {
406		return dt/2 * (1 - Math.cos(Math.PI*t/du)) + s;
407	},
408	scrollTo: function(name, anim, visible, margin) {
409		var t = this, d = document, w = window,
410			elem = d.getElementById(name);
411		if(!elem)
412			return;
413		if(margin === undefined) margin = 0;
414		if(!anim) {
415			window.scrollTo(0, elem.offsetTop - margin);
416			return;
417		}
418		if( t.anim && t.anim.timer )
419			clearInterval( t.anim.timer );
420		t.anim = { timer:null, s:null, dt:0, du:500, t:0, inc:10 };
421		if( w.scrollY )
422			t.anim.s = w.scrollY;
423		else if( d.documentElement.scrollTop )
424			t.anim.s = d.documentElement.scrollTop;
425		else
426			t.anim.s = d.body.scrollTop;
427		if(visible) {
428			if( d.documentElement.scrollTop )
429				h = d.documentElement.clientHeight;
430			else
431				h = d.body.clientHeight;
432			if(t.anim.s <= elem.offsetTop && (t.anim.s + h - 150) > elem.offsetTop)
433				return;
434		}
435		t.anim.dt = elem.offsetTop - t.anim.s - margin;
436		var o = this;
437		t.anim.timer = setInterval( function() {
438			var a = o.anim;
439			if( !a || !a.timer )
440				return;
441			a.t += a.inc;
442			if( a.t < a.du ) {
443				window.scrollTo(0, o.easeInOut(a.t, a.s, a.dt, a.du), false, margin);
444			} else {
445				window.scrollTo(0, a.s + a.dt, false, margin);
446				clearInterval(a.timer);
447				a.timer = null;
448			}
449		}, t.anim.inc );
450	}
451};
452if((typeof(window.Oby) == 'undefined') || window.Oby.version < Oby.version) {
453	window.Oby = Oby;
454	window.obscurelighty = Oby;
455}
456
457var oldHikaShop = window.hikashop || hikashop;
458
459var hikashop = {
460	translations: {},
461	translations_url: null,
462	submitFct: null,
463	filterRefreshTimer: false,
464	submitBox: function(data) {
465		var t = this, d = document, w = window;
466		if( t.submitFct ) {
467			try {
468				t.submitFct(data);
469			} catch(err) {}
470		}
471		t.closeBox();
472	},
473	deleteId: function(id) {
474		var t = this, d = document, el = id;
475		if( typeof(id) == "string") {
476			el = d.getElementById(id);
477		}
478		if(!el)
479			return;
480		el.parentNode.removeChild(el);
481	},
482	dup: function(tplName, htmlblocks, id, extraData, appendTo) {
483		var d = document, tplElem = d.getElementById(tplName);
484		if(!tplElem) return;
485		var container = tplElem.parentNode;
486		elem = tplElem.cloneNode(true);
487		if(!appendTo) {
488			container.insertBefore(elem, tplElem);
489		} else {
490			if(typeof(appendTo) == "string")
491				appendTo = d.getElementById(appendTo);
492			appendTo.appendChild(elem);
493		}
494		elem.style.display = "";
495		elem.id = '';
496		if(id)
497			elem.id = id;
498		for(var k in htmlblocks) {
499			elem.innerHTML = elem.innerHTML.replace(new RegExp("{"+k+"}","g"), htmlblocks[k]);
500			elem.innerHTML = elem.innerHTML.replace(new RegExp("%7B"+k+"%7D","g"), htmlblocks[k]);
501		}
502		if(extraData) {
503			for(var k in extraData) {
504				elem.innerHTML = elem.innerHTML.replace(new RegExp('{'+k+'}','g'), extraData[k]);
505				elem.innerHTML = elem.innerHTML.replace(new RegExp('%7B'+k+'%7D','g'), extraData[k]);
506			}
507		}
508		return elem;
509	},
510	deleteRow: function(id) {
511		var t = this, d = document, el = id;
512		if( typeof(id) == "string") {
513			el = d.getElementById(id);
514		} else {
515			while(el != null && el.tagName.toLowerCase() != 'tr') {
516				el = el.parentNode;
517			}
518		}
519		if(!el)
520			return;
521		var table = el.parentNode;
522		table.removeChild(el);
523		if( table.tagName.toLowerCase() == 'tbody' )
524			table = table.parentNode;
525		t.cleanTableRows(table);
526		return;
527	},
528	dupRow: function(tplName, htmlblocks, id, extraData) {
529		var d = document, tplLine = d.getElementById(tplName),
530				tableUser = tplLine.parentNode;
531		if(!tplLine) return;
532		trLine = tplLine.cloneNode(true);
533		tableUser.insertBefore(trLine, tplLine);
534		trLine.style.display = "";
535		trLine.id = "";
536		if(id)
537			trLine.id = id;
538		for(var i = tplLine.cells.length - 1; i >= 0; i--) {
539			if(trLine.cells[i]) {
540				for(var k in htmlblocks) {
541					if(!htmlblocks.hasOwnProperty(k))
542						continue;
543					trLine.cells[i].innerHTML = trLine.cells[i].innerHTML.replace(new RegExp("{"+k+"}","g"), htmlblocks[k]);
544					trLine.cells[i].innerHTML = trLine.cells[i].innerHTML.replace(new RegExp("%7B"+k+"%7D","g"), htmlblocks[k]);
545				}
546				if(extraData) {
547					for(var k in extraData) {
548						if(!extraData.hasOwnProperty(k))
549							continue;
550						trLine.cells[i].innerHTML = trLine.cells[i].innerHTML.replace(new RegExp('{'+k+'}','g'), extraData[k]);
551						trLine.cells[i].innerHTML = trLine.cells[i].innerHTML.replace(new RegExp('%7B'+k+'%7D','g'), extraData[k]);
552					}
553				}
554			}
555		}
556		if(tplLine.className == "row0") tplLine.className = "row1";
557		else if(tplLine.className == "row1") tplLine.className = "row0";
558		return trLine;
559	},
560	cleanTableRows: function(id) {
561		var d = document, el = id;
562		if(typeof(id) == "string")
563			el = d.getElementById(id);
564		if(el == null || el.tagName.toLowerCase() != 'table')
565			return;
566
567		var k = 0, c = '', line = null, lines = el.getElementsByTagName('tr');
568		for(var i = 0; i < lines.length; i++) {
569			line = lines[i];
570			if( line.style.display != "none") {
571				c = ' '+line.className+' ';
572				if( c.indexOf(' row0 ') >= 0 || c.indexOf(' row1 ') >= 0 ) {
573					line.className = c.replace(' row'+(1-k)+' ', ' row'+k+' ').replace(/^\s*|\s*$/g, '');
574					k = 1 - k;
575				}
576			}
577		}
578	},
579	checkRow: function(id) {
580		var t = this, d = document, el = id;
581		if(typeof(id) == "string")
582			el = d.getElementById(id);
583		if(el == null || el.tagName.toLowerCase() != 'input')
584			return;
585		if(this.clicked) {
586			this.clicked = null;
587			t.isChecked(el);
588			return;
589		}
590		el.checked = !el.checked;
591		t.isChecked(el);
592	},
593	isChecked: function(id,cancel) {
594		var d = document, el = id;
595		if(typeof(id) == "string")
596			el = d.getElementById(id);
597		if(el == null || el.tagName.toLowerCase() != 'input')
598			return;
599		if(el.form.boxchecked) {
600			if(el.checked)
601				el.form.boxchecked.value++;
602			else
603				el.form.boxchecked.value--;
604		}
605	},
606	checkAll: function(checkbox, stub) {
607		stub = stub || 'cb';
608		if(!checkbox.form)
609			return false;
610		var o = window.Oby, cb = checkbox.form, c = 0;
611		for(var i = 0, n = cb.elements.length; i < n; i++) {
612			var e = cb.elements[i];
613			if (e != checkbox && e.type == checkbox.type && ((stub && e.id.indexOf(stub) == 0) || !stub)) {
614				e.checked = checkbox.checked;
615				o.fireEvent(e, 'change');
616				o.fireEvent(e, 'click');
617				c += (e.checked == true ? 1 : 0);
618			}
619		}
620		if (cb.boxchecked) {
621			cb.boxchecked.value = c;
622		}
623		return true;
624	},
625	submitform: function(task, form, extra) {
626		var d = document;
627		if(typeof form == 'string') {
628			var f = d.getElementById(form);
629			if(!f)
630				f = d.forms[form];
631			if(!f)
632				return true;
633			form = f;
634		}
635		if(task) {
636			form.task.value = task;
637		}
638		if(typeof form.onsubmit == 'function')
639			form.onsubmit();
640		form.submit();
641		return false;
642	},
643	get: function(elem, target) {
644		window.Oby.xRequest(elem.getAttribute('href'), {update: target});
645		return false;
646	},
647	form: function(elem, target) {
648		var data = window.Oby.getFormData(target);
649		window.Oby.xRequest(elem.getAttribute('href'), {update: target, mode: 'POST', data: data});
650		return false;
651	},
652	openBox: function(elem, url, jqmodal) {
653		var w = window;
654		if(typeof(elem) == "string")
655			elem = document.getElementById(elem);
656		if(!elem)
657			return false;
658		try {
659			var hkpopup = elem.getAttribute('data-hk-popup');
660			if(jqmodal === undefined) {
661				jqmodal = false;
662				var test_rel = elem.getAttribute('rel');
663				if(test_rel == null && hkpopup == null && typeof(jQuery) != "undefined")
664					jqmodal = true;
665			}
666			if(hkpopup) {
667				var fct = this['openBox_' + hkpopup.toLowerCase()];
668				if(fct) {
669					var ret = fct(elem, url);
670					if(ret == true)
671						return false;
672				}
673			}
674			if(!jqmodal && this.openBox_squeezebox(elem, url))
675				return false;
676			if(this.openBox_bootstrap(elem, url))
677				return false;
678			console.log('no popup system found');
679		} catch(e) { console.log(e); }
680		return false;
681	},
682	openBox_squeezebox: function(elem, url) {
683		if(window.SqueezeBox === undefined)
684			return false;
685		if(url !== undefined && url !== null)
686			elem.href = url;
687		if(!elem.rel && elem.getAttribute('data-hk-popup') == 'squeezebox')
688			elem.rel = elem.getAttribute('data-squeezebox');
689		if(window.SqueezeBox.open !== undefined)
690			SqueezeBox.open(elem, {parse: 'rel'});
691		else if(window.SqueezeBox.fromElement !== undefined)
692			SqueezeBox.fromElement(elem);
693		setTimeout(function(){
694			jQuery('#sbox-content').find('iframe').attr('name', 'hikashop_popup_iframe');
695		},500);
696		return true;
697	},
698	openBox_bootstrap: function(elem, url) {
699		if(typeof(jQuery) == "undefined")
700			return false;
701		var id = elem.getAttribute('id');
702		jQuery('#modal-' + id).modal('show');
703		if(!url)
704			return true;
705		if(document.getElementById('modal-' + id + '-container'))
706			jQuery('#modal-' + id + '-container').find('iframe').attr('src', url);
707		else
708			jQuery('#modal-' + id).find('iframe').attr('src', url);
709		jQuery('#modal-' + id).find('iframe').attr('name', 'hikashop_popup_iframe');
710		return true;
711	},
712	openBox_vex: function(elem, url) {
713		if(typeof(vex) == "undefined")
714			return false;
715		var href = elem.href || null;
716		if(url !== undefined && url !== null)
717			href = url;
718		if(!href) href = elem.getAttribute('href');
719		settings = window.Oby.evalJSON(elem.getAttribute('data-vex'));
720		if(settings.x && settings.y && href) {
721			settings.content = '<iframe style="border:0;margin:0;padding:0;" name="hikashop_popup_iframe" width="'+settings.x+'px" height="'+settings.y+'px" src="'+href+'"></iframe>';
722			settings.afterOpen = function(context) { context.width(settings.x + 'px'); };
723		}
724		vex.defaultOptions.className = 'vex-theme-default';
725		vex.open( settings );
726		return true;
727	},
728	closeBox: function(parent) {
729		var d = document, w = window;
730		if(parent) {
731			d = window.parent.document;
732			w = window.parent;
733		}
734		try {
735			var e = d.getElementById('sbox-window');
736			if(e && typeof(e.close) != "undefined") {
737				e.close();
738			} else if(typeof(w.jQuery) != "undefined" && w.jQuery('div.modal.in') && w.jQuery('div.modal.in').hasClass('in')) {
739				w.jQuery('div.modal.in').modal('hide');
740			} else if(typeof(vex) != 'undefined' && vex.close && vex.close() === true) {
741				return;
742			} else if(w.SqueezeBox !== undefined) {
743				w.SqueezeBox.close();
744			}
745		} catch(err) {}
746	},
747	submitPopup: function(id, task, form) {
748		var d = document, t = this, el = d.getElementById('modal-'+id+'-iframe');
749		if(!el) {
750			if(document.getElementById('modal-' + id + '-container'))
751				el = jQuery('#modal-' + id + '-container').find('iframe').get(0);
752			else
753				el = jQuery('#modal-' + id).find('iframe').get(0);
754		}
755		if(el && el.contentWindow.hikashop) {
756			if(task === undefined) task = null;
757			if(form === undefined) form = 'adminForm';
758			el.contentWindow.hikashop.submitform(task, form);
759		}
760		return false;
761	},
762	tabSelect: function(m,c,id) {
763		var d = document, sub = null;
764		if(typeof m == 'string')
765			m = d.getElementById(m);
766		if(!m) return;
767		if(typeof id == 'string')
768			id = d.getElementById(id);
769		sub = m.getElementsByTagName('div');
770		if(sub) {
771			for(var i = sub.length - 1; i >= 0; i--) {
772				if(sub[i].getAttribute('class') == c) {
773					sub[i].style.display = 'none';
774				}
775			}
776		}
777		if(id) id.style.display = '';
778	},
779	changeState: function(el, id, url) {
780		var d = document;
781		if(!d.getElementById(id + '_container'))
782			return false;
783		var mainDiv = el.closest('.hikashop_checkout_address');
784		if(mainDiv)
785			window.checkout.setLoading(mainDiv, true, true);
786		window.Oby.xRequest(url, null, function(xhr){
787			var w = window;
788			w.Oby.updateElem(id + '_container', xhr.responseText);
789			var defaultVal = '', defaultValInput = d.getElementById(id + '_default_value'), stateSelect = d.getElementById(id);
790			if(defaultValInput) { defaultVal = defaultValInput.value; }
791			if(stateSelect && w.hikashop.optionValueIndexOf(stateSelect.options, defaultVal) >= 0)
792				stateSelect.value = defaultVal;
793			if(typeof(jQuery) != "undefined" && jQuery().chosen) { jQuery('#'+id).chosen(); }
794			if(mainDiv)
795				window.checkout.setLoading(mainDiv, false);
796			w.Oby.fireAjax('hikashop.stateupdated', {id: id, elem: stateSelect});
797		});
798	},
799	optionValueIndexOf: function(options, value) {
800		for(var i = options.length - 1; i >= 0; i--) {
801			if(options[i].value == value)
802				return i;
803		}
804		return -1;
805	},
806	getOffset: function(el) {
807		var x = 0, y = 0;
808		while(el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop )) {
809			x += el.offsetLeft - el.scrollLeft;
810			y += el.offsetTop - el.scrollTop;
811			el = el.offsetParent;
812		}
813		return { top: y, left: x };
814	},
815	dataStore: function(name, value) {
816		if(localStorage) {
817			localStorage.setItem(name, value);
818		} else {
819			var expire = new Date(); expire.setDate(expire.getDate() + 5);
820			document.cookie = name+"="+value+"; expires="+expire;
821		}
822	},
823	dataGet: function(name) {
824		if(localStorage) {
825			return localStorage.getItem(name);
826		}
827		if(document.cookie.length > 0 && document.cookie.indexOf(name+"=") != -1) {
828			var s = name+"=", o = document.cookie.indexOf(s) + s.length, e = document.cookie.indexOf(";",o);
829			if(e == -1) e = document.cookie.length;
830			return unescape(document.cookie.substring(o, e));
831		}
832		return null;
833	},
834	setArrayDisplay: function(fields, displayValue) {
835		var d = document, e = null;
836		if(displayValue === true) displayValue = '';
837		if(displayValue === false) displayValue = 'none';
838		for(var i = 0; i < fields.length; i++) {
839			e = d.getElementById(fields[i]);
840			if(e) e.style.display = displayValue;
841		}
842	},
843	ready: function(fct) {
844		var w = window, d = w.document;
845		if(d.readyState === "complete") {
846			fct();
847			return;
848		}
849		if(w.jQuery !== undefined) {
850			jQuery(d).ready(fct);
851		} else if(window.addEvent) {
852			w.addEvent("domready", fct);
853		} else
854			w.Oby.ready(fct);
855	},
856	noChzn: function() {
857		if(!window.jQuery)
858			return false;
859		jQuery('.no-chzn').each(function(i,el) {
860			var id = el.getAttribute('id'), chzn = null;
861			if(id) {
862				id = id.replace('{','_').replace('}','_');
863				chzn = jQuery('#'+id+'_chzn');
864			} else {
865				chzn = el.nextSibling;
866			}
867			if(chzn) chzn.remove();
868			jQuery(el).removeClass('chzn-done').show();
869		});
870		return true;
871	},
872	switchTab: function(el) {
873		if(!el || !el.parentNode || !el.parentNode.parentNode) return false;
874		var d = document, w = window, o = w.Oby,
875			c = el.parentNode.parentNode,
876			r = c.getAttribute('rel'),
877			current = el.getAttribute('rel'),
878			dest = null;
879		if(!r || r.substring(0,5) != 'tabs:') return false;
880		if(current.substring(0,4) != 'tab:') return false;
881		var id = r.substring(5),
882			tabs = c.childNodes;
883		current = current.substring(4);
884		dest = d.getElementById(id + current);
885		if(!dest) return false;
886		for(var k = 0; k < tabs.length; k++) {
887			if(!tabs[k] || tabs[k].nodeName.toLowerCase() != 'li') continue;
888			var i = 0, l = tabs[k].childNodes[i], lr = null;
889			while(l.nodeName.toLowerCase() != 'a' && i < tabs[k].childNodes.length)
890				l = tabs[k].childNodes[++i];
891			if(l.nodeName.toLowerCase() == 'a')
892				lr = l.getAttribute('rel');
893			if(!lr || lr.substring(0,4) != 'tab:')
894				continue;
895			var lid = lr.substring(4);
896			if(lid == current) continue;
897			o.removeClass(tabs[k], 'active');
898			var ld = d.getElementById(id + lid);
899			if(ld) ld.style.display = 'none';
900		}
901		dest.style.display = '';
902		o.addClass(el.parentNode, 'active');
903		el.blur();
904		return false;
905	},
906	dlTitle: function(parent) {
907		var t = this, d = document, w = window;
908		if(parent && typeof(parent) == 'string')
909			parent = d.getElementById(parent);
910		if(!parent)
911			parent = d;
912		var dt = parent.getElementsByTagName('dt'), val = null,
913			hkTip = (typeof(hkjQuery) != "undefined" && hkjQuery().hktooltip);
914		for(var i = 0; i < dt.length; i++) {
915			if(dt[i].offsetWidth === 0) {
916				dt[i].dlTitleFct = function(evt){
917					t.dlTitle(this.parentNode);
918					if(hkTip)
919						hkjQuery(this).hktooltip('show');
920					this.removeEventListener('mouseover', this.dlTitleFct);
921					this.dlTitleFct = null;
922				};
923				dt[i].addEventListener('mouseover', dt[i].dlTitleFct);
924			}
925			if(dt[i].offsetWidth < dt[i].scrollWidth && !dt[i].getAttribute('title')) {
926				val = (dt[i].innerText !== undefined) ? dt[i].innerText : dt[i].textContent;
927
928				if(hkTip) {
929					dt[i].setAttribute('data-title', val);
930					hkjQuery(dt[i]).hktooltip({"html": true,"container": "body"});
931				} else
932					dt[i].setAttribute('title', val);
933			}
934		}
935	},
936	checkConsistency: function() {
937		if(!document.querySelectorAll)
938			return;
939		var s = null, elems = null,
940			parents = document.querySelectorAll('[data-consistencyheight]');
941		if(!parents || !parents.length)
942			return;
943		for(var i = parents.length - 1; i >= 0; i--) {
944			s = parents[i].getAttribute('data-consistencyheight');
945			if(s == '' || s == 'true')
946				continue;
947			var reg = new RegExp('^\.[-_a-z0-9]+$', 'i');
948			if(reg.test(s) && document.getElementsByClassName)
949				elems = parents[i].getElementsByClassName(s.substring(1));
950			else
951				elems = parents[i].querySelectorAll(s);
952			if(!elems || !elems.length)
953				continue;
954			if(this.setConsistencyHeight(elems, 'min') === false)
955				continue;
956			parents[i].setAttribute('data-consistencyheight-done', s);
957			parents[i].removeAttribute('data-consistencyheight');
958		}
959	},
960	setConsistencyHeight: function(elems, mode) {
961		if(!elems || !elems.length || elems.length == 0)
962			return;
963		var maxHeight = 0, cpt = 0, h = 0, w = window;
964		for(var i = elems.length - 1; i >= 0; i--) {
965			try {
966				h = parseFloat( w.getComputedStyle(elems[i], '').getPropertyValue('height') );
967				h = Math.ceil(h);
968			} catch(e) {
969				h = NaN;
970			}
971			if(isNaN(h))
972				h = (elems[i].currentStyle ? elems[i].currentStyle.height : elems[i].clientHeight);
973
974			if(maxHeight > 0 && h < maxHeight) {
975				cpt++;
976			} else if(h > maxHeight) {
977				maxHeight = h;
978				cpt++;
979			}
980		}
981		if(maxHeight <= 0)
982			return false;
983
984		if(cpt <= 1)
985			return;
986		for(var i = elems.length - 1; i >= 0; i--) {
987			if(mode !== undefined && mode == 'min')
988				elems[i].style.minHeight = maxHeight + 'px';
989			else
990				elems[i].style.height = maxHeight + 'px';
991		}
992	},
993	refreshFilters: function (el, skipSelf) {
994		"use strict";
995		var d = document, t = this, o = window.Oby,
996		container = null, data = null, containerName = el.getAttribute('data-container-div');
997
998		if(containerName)
999			container = d.forms[containerName];
1000
1001		if(!container)
1002			return false;
1003
1004		var url = container.getAttribute('action');
1005		var scrollToTop = container.getAttribute('data-scroll');
1006
1007		// delay timer to avoid too many ajax calls
1008		if(t.filterRefreshTimer !== false) clearTimeout(t.filterRefreshTimer);
1009		t.filterRefreshTimer = setTimeout(function() {
1010
1011			data = o.getFormData(container);
1012			data += '&tmpl=raw';
1013			o.xRequest(url, {mode:'POST', data: data}, function(xhr) {
1014				var resp = o.evalJSON(xhr.responseText);
1015
1016				if(resp.newURL) {
1017					var urlInHistory = resp.newURL.replace('tmpl=raw&', '', 'g').replace('filter=1&', '', 'g').replace('&tmpl=raw', '', 'g').replace('&filter=1', '', 'g');
1018					window.history.pushState(data, d.title, urlInHistory);
1019
1020					window.addEventListener('popstate', function(e) {
1021						if(window.location.href.includes('hikashop_url_reload=1')) {
1022							window.location.href.replace('&hikashop_url_reload=1','').reload();
1023						}
1024					});
1025				}
1026
1027				var refreshAreas = document.querySelectorAll('.filter_refresh_div');
1028
1029				var triggers = o.fireAjax('filters.update', {el: el, refreshAreas : refreshAreas, resp: resp});
1030				if(triggers !== false && triggers.length > 0)
1031					return true;
1032
1033				var refreshUrl = null;
1034				t.refreshCounter = 0;
1035				for(let i = 0; i < refreshAreas.length; i++) {
1036					var currentArea = refreshAreas[i];
1037					if(skipSelf && currentArea.querySelector('#'+el.id))
1038						continue;
1039
1040					if(resp.newURL && currentArea.getAttribute('data-use-url')) {
1041						refreshUrl = resp.newURL;
1042					} else {
1043						refreshUrl = currentArea.getAttribute('data-refresh-url');
1044						if(resp.params) {
1045							refreshUrl += '&' + resp.params + '&return_url=' + encodeURIComponent(window.location.href);
1046						}
1047					}
1048					if(!refreshUrl)
1049						continue;
1050					t.refreshCounter++;
1051					var className = currentArea.getAttribute('data-refresh-class');
1052					if(className) o.addClass(currentArea, className);
1053					t.refreshOneArea(refreshUrl, currentArea, el, refreshAreas, resp);
1054				}
1055
1056				if(scrollToTop) {
1057					window.hikashop.smoothScroll();
1058				}
1059			});
1060			t.filterRefreshTimer = false;
1061		}, 300);
1062		return false;
1063	},
1064	smoothScroll: function(target) {
1065		var target = document.querySelector('div[id^="hikashop_category_information_menu_"]');
1066		if(!target)
1067			return;
1068	    var currentScroll = document.documentElement.scrollTop || document.body.scrollTop;
1069	    if (currentScroll > target.offsetTop) {
1070	         window.requestAnimationFrame(window.hikashop.smoothScroll);
1071	         window.scrollTo (target.offsetTop, currentScroll - (currentScroll/5));
1072	    }
1073	},
1074	refreshOneArea: function(refreshUrl, currentArea, el, refreshAreas, resp) {
1075		var d = document, t = this, o = window.Oby;
1076		o.xRequest(refreshUrl, {mode:'GET'}, function (xhr2) {
1077			var div = d.createElement('div');
1078			var scripts = '';
1079			var text = xhr2.responseText.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(all, code){
1080				if(all.indexOf('type="application/json"') != -1)
1081					return '';
1082				if(all.indexOf('type="application/ld+json"') != -1)
1083					return '';
1084				scripts += code + '\n';
1085				return '';
1086			});
1087
1088			var body = /<body.*?>([\s\S]*)<\/body>/.exec(text);
1089			if(!body)
1090				body = text;
1091			else
1092				body = body[1];
1093			o.updateElem(div, body);
1094			var newElem = div.querySelector('.filter_refresh_div');
1095
1096			// to avoid scroll in chrome
1097			setTimeout(function(){
1098				if(!currentArea) {
1099					t.refreshCounter--;
1100					return;
1101				}
1102				var className = currentArea.getAttribute('data-refresh-class');
1103				if(className) o.removeClass(currentArea, className);
1104				if(!newElem) {
1105					t.refreshCounter--;
1106					return;
1107				}
1108				var parentNode = currentArea.parentNode;
1109				if(!parentNode) {
1110					t.refreshCounter--;
1111					return;
1112				}
1113				parentNode.replaceChild(newElem, currentArea);
1114				if( scripts != '' ) {
1115					var script = d.createElement('script');
1116					script.setAttribute('type', 'text/javascript');
1117					script.text = scripts;
1118					d.head.appendChild(script);
1119					d.head.removeChild(script);
1120				}
1121
1122				if(!window.localPage) window.localPage = {};
1123				window.localPage.infiniteScrollPage = 1;
1124
1125				setTimeout(function(){
1126					var elems = parentNode.querySelectorAll('.hikashop_subcontainer');
1127					if(elems && elems.length)
1128						window.hikashop.setConsistencyHeight(elems, 'min');
1129
1130					if(window.hikaVotes)
1131						initVote(currentArea);
1132					if(hkjQuery && hkjQuery.hktooltip)
1133						hkjQuery('[data-toggle="hk-tooltip"]').hktooltip({"html": true,"container": "body"});
1134
1135					t.refreshCounter--;
1136					if(t.refreshCounter == 0) {
1137						o.fireAjax('filters.updated', {el: el, refreshAreas : refreshAreas, resp: resp});
1138					}
1139				}, 200);
1140			}, 0);
1141		});
1142	},
1143	addToCart: function(el, type) {
1144		var d = document, t = this, o = window.Oby,
1145			product_id = 0, container = null, data = null,
1146			url = el.getAttribute('href'),
1147			cart_type = ((type !== 'wishlist') ? 'cart' : 'wishlist'),
1148			containerName = el.getAttribute('data-addTo-div'),
1149			extraContainer = el.getAttribute('data-addTo-extra'),
1150			dest_id = el.getAttribute('data-addTo-cartid');
1151
1152		product_id = (cart_type == 'cart') ? el.getAttribute('data-addToCart') : el.getAttribute('data-addToWishlist');
1153		dest_id = (dest_id ? parseInt(dest_id) : 0);
1154
1155		// Avoid bots and crawlers to add products in the cart
1156		var r = /bot|googlebot|crawler|spider|robot|crawling/i;
1157		if(navigator && navigator.userAgent && r.test(navigator.userAgent))
1158			return false;
1159
1160		// No product ID - fallback mode
1161		if(!product_id || !url) {
1162			if(containerName && d.forms[containerName]) {
1163				d.forms[containerName].submit();
1164				return false;
1165			}
1166			return true;
1167		}
1168
1169		if(containerName && product_id)
1170			container = d.forms['hikashop_product_form_' + product_id + '_' + containerName] || d.forms[containerName];
1171
1172		url += (url.indexOf('?') >= 0 ? '&' : '?') + 'tmpl=raw';
1173
1174		if(container) {
1175			if(window.FormData)
1176				data = new FormData(container);
1177			else
1178				data = o.getFormData(container);
1179			if(extraContainer) {
1180				extraContainer = d.forms[extraContainer] || d.getElementById(extraContainer);
1181				if(window.FormData) {
1182					extra = o.getFormData(extraContainer, false);
1183					for(var k in extra) {
1184						if(!extra.hasOwnProperty(k))
1185							continue;
1186						if(k == 'product_id')
1187							extra[k] = product_id;
1188						if(typeof(extra[k]) == 'object') {
1189							for(var i in extra[k]) {
1190								data.append(k, extra[k][i]);
1191							}
1192						} else
1193							data.append(k, extra[k]);
1194					}
1195				} else {
1196					var extra = o.getFormData(extraContainer);
1197					if(extra)
1198						data += '&' + extra;
1199					data += '&product_id='+product_id;
1200				}
1201			}
1202			if(window.FormData) {
1203				data.append('cart_type', cart_type);
1204				if(dest_id)
1205					data.append('cart_id', dest_id);
1206			} else {
1207				data += '&cart_type=' + cart_type;
1208				if(dest_id)
1209					data += '&cart_id+' + dest_id;
1210			}
1211		} else {
1212			data = 'cart_type=' + cart_type;
1213			if(dest_id)
1214				data += '&cart_id+' + dest_id;
1215		}
1216
1217		var className = el.getAttribute('data-addTo-class');
1218		if(className) o.addClass(el, className);
1219
1220		o.xRequest(url, {mode:'POST', data: data}, function(xhr) {
1221			var className = el.getAttribute('data-addTo-class');
1222			if(className) o.removeClass(el, className);
1223
1224			var resp = Oby.evalJSON(xhr.responseText);
1225			var cart_id = (resp && (resp.ret || resp.ret === 0)) ? resp.ret : parseInt(xhr.responseText);
1226			if(isNaN(cart_id)) {
1227				console.log('cart_id was not returned in addToCart AJAX call');
1228				console.log(resp);
1229				return false;
1230			}
1231
1232			var triggers = window.Oby.fireAjax(cart_type+'.updated', {id: cart_id, el: el, product_id: product_id, type: cart_type, resp: resp});
1233			if(triggers !== false && triggers.length > 0)
1234				return true;
1235			if(window.localPage && cart_type == 'cart' && window.localPage.cartRedirect && typeof(window.localPage.cartRedirect) == 'function')
1236				return window.localPage.cartRedirect(cart_id, product_id, resp);
1237			if(window.localPage && cart_type == 'wishlist' && window.localPage.
1237wishlistRedirect && typeof(window.localPage.wishlistRedirect) == 'function')
1238				return window.localPage.wishlistRedirect(cart_id, product_id, resp);
1239		});
1240		return false;
1241	},
1242	addToWishlist: function(el) {
1243		return this.addToCart(el, 'wishlist');
1244	},
1245	checkQuantity: function(el) {
1246		var value = parseInt(el.value), old = el.getAttribute('data-hk-qty-old'),
1247			min = parseInt(el.getAttribute('data-hk-qty-min')),
1248			max = parseInt(el.getAttribute('data-hk-qty-max')),
1249			allowZero = el.getAttribute('data-hk-allow-zero') == 'true';
1250		if(old)
1251			old = parseInt(old);
1252		// No values - return
1253		if(isNaN(value)) {
1254			el.value = old || (isNaN(min) ? 1 : min);
1255			return false;
1256		}
1257		if(''+value != el.value)
1258			el.value = value;
1259		if(isNaN(min) || isNaN(max))
1260			return false;
1261		var triggers = window.Oby.fireAjax("quantity.checked", {el:el, value:value, max:max, min:min});
1262		if(triggers !== false && triggers.length > 0)
1263			return true;
1264		if(value == 0 && allowZero)
1265			return true;
1266		if((value <= max || max == 0) && value >= min)
1267			return true;
1268		if(max > 0 && value > max) {
1269			el.value = max;
1270			if(hkjQuery.notify) {
1271				this.translate(['QUANTITY_CHANGE_IMPOSSIBLE', 'MAXIMUM_FOR_PRODUCT_IS_X'], function(trans){
1272					hkjQuery(el).notify({title:trans[0],text:trans[1].replace('%s', max), image:'<i class="fa fa-3x fa-exclamation-circle"></i>'},{style:"metro",className:"warning",arrowShow:true});
1273				});
1274			}
1275		} else if(value < min) {
1276			el.value = min;
1277			if(hkjQuery.notify) {
1278				this.translate(['QUANTITY_CHANGE_IMPOSSIBLE', 'MINIMUM_FOR_PRODUCT_IS_X'], function(trans){
1279					hkjQuery(el).notify({title:trans[0],text:trans[1].replace('%s', min), image:'<i class="fa fa-3x fa-exclamation-circle"></i>'},{style:"metro",className:"warning",arrowShow:true});
1280				});
1281			}
1282		}
1283		return true;
1284	},
1285	translate: function(keys, callback) {
1286		var t = this, trans = {}, missingKeys = [], o = window.Oby;
1287
1288		for(var c = 0; c < keys.length; c++) {
1289			var key = keys[c];
1290			if(!t.translations[key]) {
1291				missingKeys.push(key);
1292			} else {
1293				trans[c] = t.translations[key];
1294			}
1295		}
1296
1297		if(!missingKeys.length) {
1298			callback(trans);
1299			return;
1300		}
1301
1302		if(!t.translations_url) {
1303			console.log('missing translations URL');
1304			return;
1305		}
1306		o.xRequest(t.translations_url, {mode:'POST', data: 'translations=' + missingKeys.join(',')}, function(xhr) {
1307			var resp = o.evalJSON(xhr.responseText);
1308			foundKeys = Object.getOwnPropertyNames(resp);
1309			for(var c = 0; c < foundKeys.length; c++) {
1310				var key = foundKeys[c];
1311				trans[keys.indexOf(key)] = resp[key];
1312				t.translations[key] = resp[key];
1313			}
1314			callback(trans);
1315		});
1316	},
1317	addTrans: function(data) {
1318		for(var k in data) {
1319			if(!data.hasOwnProperty(k)) continue;
1320			this.translations[k] = data[k];
1321		}
1322	},
1323	updateQuantity: function(el, dataInput, mod) {
1324		var d = document, input = el;
1325		if(!el)
1326			return false;
1327		if(dataInput === undefined || !dataInput)
1328			dataInput = el.getAttribute('data-hk-qty-input');
1329		if(d.getElementById(dataInput))
1330			input = d.getElementById(dataInput);
1331		if(mod === undefined || !mod)
1332			mod =  parseInt(el.getAttribute('data-hk-qty-mod'));
1333		if(isNaN(mod) || mod == 0)
1334			mod = 1;
1335		var value = parseInt(input.value);
1336		if(isNaN(value))
1337			value = 0;
1338		input.value = (value + mod);
1339		this.checkQuantity(input);
1340		if(el.tagName.toLowerCase() == 'a')
1341			el.blur();
1342		return false;
1343	},
1344	deleteFromCart: function(el, cart_type, container) {
1345		if(el.processing)
1346			return false;
1347
1348		var d = document, t = this, o = window.Oby,
1349			url = el.getAttribute('href');
1350		if(!cart_type || cart_type === undefined)
1351			cart_type = el.getAttribute('data-cart-type');
1352		if(!cart_type || cart_type == '')
1353			return true;
1354
1355		url += (url.indexOf('?') >= 0 ? '&' : '?') + 'tmpl=raw';
1356		var cart_id = parseInt(el.getAttribute('data-cart-id')),
1357			cart_product_id = parseInt(el.getAttribute('data-cart-product-id'));
1358		if(cart_id === NaN || cart_product_id === NaN)
1359			return true;
1360
1361		if(container && typeof(container) == 'string')
1362			container = d.getElementById(container);
1363
1364		el.processing = true;
1365		if(container)
1366			o.addClass(container, "hikashop_checkout_loading");
1367		var data = 'cart_type=' + cart_type + '&cart_id' + cart_id + '&cart_product_id=' + cart_product_id;
1368
1369		o.xRequest(url, {mode:'POST', data: data}, function(xhr) {
1370			el.processing = false;
1371			if(container)
1372				o.removeClass(container, "hikashop_checkout_loading");
1373
1374			var resp = Oby.evalJSON(xhr.responseText);
1375			cart_id = (resp && resp.ret) ? resp.ret : ((resp && resp.empty && resp.empty == 'true') ? cart_id : parseInt(xhr.responseText));
1376			if(cart_id === NaN)
1377				return;
1378			window.Oby.fireAjax(cart_type+'.updated', {id: cart_id, type: cart_type, resp: resp, notify: false});
1379		});
1380		return false;
1381	},
1382	submitCartModule: function(form, container, cart_type) {
1383		this.formAjaxSubmit(form, container, function(data) {
1384			var resp = window.Oby.evalJSON(data);
1385			var cart_id = (resp && resp.ret) ? resp.ret : parseInt(data);
1386			if(cart_id === NaN)
1387				return;
1388			window.Oby.fireAjax(cart_type+'.updated', {id: cart_id, type: cart_type, resp: resp, notify: false});
1389		});
1390		return false;
1391	},
1392	formAjaxSubmit: function(form, container, cb) {
1393		var d = document, o = window.Oby,
1394			url = form.action;
1395		if(form.processing)
1396			return false;
1397		if(container && typeof(container) == 'string')
1398			container = d.getElementById(container);
1399		if(window.FormData) {
1400			data = new FormData(form);
1401			data.append('tmpl', 'raw');
1402		} else {
1403			data = o.getFormData(form);
1404			data += '&tmpl=raw';
1405		}
1406		form.processing = true;
1407		if(container)
1408			o.addClass(container, "hikashop_checkout_loading");
1409		o.xRequest(url, {mode:'POST', data: data}, function(xhr) {
1410			form.processing = false;
1411			if(container)
1412				o.removeClass(container, "hikashop_checkout_loading");
1413			if(!cb)
1414				o.updateElem(container, xhr.responseText);
1415			cb(form, container, xhr.responseText);
1416		});
1417		return false;
1418	},
1419	toggleOverlayBlock: function(el, type, state) {
1420		var t = this, d = document, w = window, o = w.Oby;
1421		if(typeof(el) == 'string')
1422			el = d.getElementById(el);
1423		if(!el)
1424			return false;
1425		var open = !!el.toggleOpen; // (el.style.display != 'none');
1426		if(type != 'hover' && type != 'toggle')
1427			type = 'click';
1428		if(type == 'hover' && (!state && open) || (state && !open))
1429			return;
1430		if(jQuery) {
1431			jQuery(el).slideToggle('fast');
1432		} else {
1433			el.style.display = (el.style.display == 'none')?'block':'none';
1434		}
1435		el.toggleOpen = !el.toggleOpen;
1436
1437		if(open) {
1438			if(type == 'hover') {
1439				o.removeEvent(el, "mouseout", el.toggleFunctionHover);
1440				el.toggleFunctionHover = null;
1441			}
1442			if(el.toggleFunction)
1443				o.removeEvent(document, "click", el.toggleFunction);
1444			el.toggleFunction = null;
1445			return true;
1446		}
1447		if(type == 'hover') {
1448			el.toggleFunctionHover = function(event) {
1449				if(event.target && this != event.target)
1450					return false;
1451				window.hikashop.toggleOverlayBlock(el, 'hover', true);
1452			};
1453			if(jQuery) {
1454				jQuery(el).mouseleave(el.toggleFunctionHover);
1455			} else {
1456				o.addEvent(el, "mouseout", el.toggleFunctionHover);
1457			}
1458		}
1459		var f = function(evt) {
1460			if (!evt) var evt = window.event;
1461			var trg = (window.event) ? evt.srcElement : evt.target;
1462			while(trg != null) {
1463				if(trg == el)
1464					return;
1465				trg = trg.parentNode;
1466			}
1467			t.toggleOverlayBlock(el);
1468			o.removeEvent(document, "click", f);
1469			el.toggleFunction = null;
1470		};
1471		el.toggleFunction = f;
1472		setTimeout(function(){ o.addEvent(document, "click", f); }, 100);
1473		return true;
1474	},
1475	addToCompare: function(el) {
1476		var t = this, d = document, w = window, o = w.Oby;
1477		if(!t.compare_list)
1478			t.compare_list = {};
1479
1480		if(el.disabled)
1481			return false;
1482
1483		var product_id = parseInt(el.getAttribute('data-addToCompare')),
1484			product_name = el.getAttribute('data-product-name'),
1485			css = el.getAttribute('data-addTo-class');
1486
1487		if(isNaN(product_id) || product_id <= 0)
1488			return false;
1489		if(!css || css == '')
1490			css = 'hika-compare';
1491
1492		var adding = !t.compare_list.hasOwnProperty(product_id);
1493		if(adding)
1494			t.compare_list[product_id] = product_name;
1495		else
1496			delete t.compare_list[product_id];
1497
1498		var elems = d.querySelectorAll('[data-addToCompare="'+product_id+'"]');
1499		if(elems && elems.forEach) {
1500			elems.forEach(function(e){
1501				if(e.nodeName.toLowerCase() == 'input' && e.type.toLowerCase() == 'checkbox')
1502					e.checked = adding;
1503				if(adding)
1504					o.addClass(e, css);
1505				else
1506					o.removeClass(e, css);
1507			});
1508		}
1509		var size = 0;
1510		if(Object.keys) {
1511			size = Object.keys(t.compare_list).length;
1512		} else {
1513			for(var k in t.compare_list) {
1514				if(compare_list.hasOwnProperty(k))
1515					size++;
1516			}
1517		}
1518		var triggers = window.Oby.fireAjax('compare.updated', {el: el, product_id: product_id, added: adding, list: t.compare_list, size: size});
1519		if(triggers !== false && triggers.length > 0)
1520			return false;
1521		return false;
1522	},
1523	toggleOptions: function() {
1524		var d = document, btnText = d.getElementById('openSearch_btn'),
1525		tagsDiv = d.getElementById('hikashop_listing_filters_id');
1526		if(tagsDiv.classList.contains("hidden-features") ) {
1527			tagsDiv.classList.remove("hidden-features");
1528			tagsDiv.classList.add("show-features");
1529			btnText.innerHTML = "<i class='fas fa-chevron-up'></i>";
1530		} else {
1531			tagsDiv.classList.remove("show-features");
1532			tagsDiv.classList.add("hidden-features");
1533			btnText.innerHTML = "<i class='fas fa-chevron-down'></i>";
1534		}
1535		return false;
1536	},
1537	clearOptions: function(options, defaults) {
1538		var d = document, btnText = d.getElementById('openSearch_btn'),
1539		tagsDiv = d.getElementById('hikashop_listing_filters_id');
1540		if(!options)
1541			return false;
1542		for(var i = options.length - 1; i >= 0; i--) {
1543			var name = 'filter_' + options[i];
1544			var el = d.getElementById(name);
1545			if(!el) {
1546				console.log('Filter option '+name+' not found');
1547				continue;
1548			}
1549			el.value = defaults[i];
1550		}
1551		return true;
1552	},
1553	clearSearch: function(el, id, all) {
1554		if(el.form.limitstart)
1555			el.form.limitstart.value = 0;
1556		var search = document.getElementById(id);
1557		if(search)
1558			search.value = '';
1559		if(all) {
1560			var v, els = el.form.querySelectorAll('[data-search-clear]');
1561			for(var i = els.length - 1; i >= 0; i--) {
1562				v = els[i].getAttribute('data-search-clear');
1563				els[i].value = v;
1564			}
1565		} else
1566			all = false;
1567		var triggers = window.Oby.fireAjax('search.cleared', {el: el, id: id, all: all});
1568		if(triggers !== false && triggers.length > 0)
1569			return false;
1570		el.form.submit();
1571		return true;
1572	},
1573	compareProducts: function(el, elems) {
1574		var t = this, params = '',
1575			url = el.getAttribute('data-compare-href');
1576		if(!url)
1577			return false;
1578		if(!elems)
1579			elems = t.compare_list;
1580		if(!elems)
1581			return false;
1582		for(var k in elems) {
1583			if(!elems.hasOwnProperty)
1584				continue;
1585			if(params != '') params += '&';
1586			params += 'cid[]=' + k;
1587		}
1588		el.href = url + ((url.indexOf('?') >= 0) ? '&' : '?') + params;
1589		return true;
1590	},
1591	toggleField: function(new_value, namekey, field_type, id, prefix, type) {
1592		var d = document, checked = 0, size = 0, obj = null, specialField = false,
1593			checkedGood = [], count = [], el = null,
1594			arr = d.getElementsByName('data['+field_type+']['+namekey+'][]');
1595
1596		if(!arr)
1597			return false;
1598
1599		if( new_value === null) {
1600			if(d.getElementById(type + namekey))
1601				new_value = d.getElementById(type + namekey).value;
1602			else {
1603				inputs = d.getElementsByName('data['+field_type+']['+namekey+']');
1604				for(var i = inputs.length - 1; i >= 0; i--) {
1605					if(inputs[i].checked)
1606						new_value = inputs[i].value;
1607				}
1608			}
1609		}
1610
1611		if(!this.fields_data && window.hikashopFieldsJs) {
1612			this.fields_data = window.hikashopFieldsJs;
1613		} else {
1614			for(var n in window.hikashopFieldsJs) {
1615				if(!window.hikashopFieldsJs.hasOwnProperty(n)) continue;
1616				if(this.fields_data[n]) continue;
1617				this.fields_data[n] = window.hikashopFieldsJs[n];
1618			}
1619		}
1620		if(this.fields_data === undefined || this.fields_data[field_type] === undefined)
1621			return false;
1622
1623		size = (arr[0] && arr[0].length !== undefined) ? arr[0].length : arr.length;
1624
1625		if(prefix === undefined || !prefix || prefix.length == 0 || prefix.substr(-1) != '_')
1626			prefix = 'hikashop_';
1627
1628		var elementName = prefix + field_type + '_' + namekey;
1629		if(id)
1630		    elementName = elementName + '_' + id;
1631		el = document.getElementById(elementName);
1632		var parentHidden = (el && el.style.display && el.style.display == 'none');
1633
1634		for(var c = 0; c < size; c++) {
1635			if(arr && arr[0] != undefined && arr[0].length != undefined)
1636				obj = d.getElementsByName('data['+field_type+']['+namekey+'][]').item(0).item(c);
1637			else
1638				obj = d.getElementsByName('data['+field_type+']['+namekey+'][]').item(c);
1639
1640			if(obj.checked || obj.selected)
1641				checked++;
1642
1643			if((obj.type && obj.type == 'checkbox') || obj.selected)
1644				specialField = true;
1645		}
1646		var data = this.fields_data[field_type][namekey];
1647		for(var k in data) {
1648			if(typeof data[k] != 'object')
1649				continue;
1650
1651			for(var l in data[k]) {
1652				if(typeof data[k][l] != 'string')
1653					continue;
1654
1655				if (typeof count[k] == 'undefined') {
1656					count[k] = 0;
1657					checkedGood[k] = 0;
1658				}
1659				count[k]++;
1660				newEl = d.getElementById(namekey + '_' + k);
1661				if(newEl && (newEl.checked || newEl.selected)) {
1662					checkedGood[k]++;
1663					break;
1664				}
1665			}
1666		}
1667
1668		specialField = specialField || (arr[0] && arr[0].length && count.length > 1);
1669
1670		for(var j in data) {
1671			if(typeof data[j] != 'object')
1672				continue;
1673			for(var i in data[j]) {
1674				if(typeof data[j][i] != 'string')
1675					continue;
1676
1677				var elementName = prefix + field_type + '_' + data[j][i];
1678				if(id)
1679					elementName = elementName + '_' + id;
1680				el = document.getElementById(elementName);
1681				if(!el)
1682					continue;
1683
1684				if( !parentHidden &&
1685					(
1686						(specialField && checkedGood[j] == count[j] && new_value != '')
1687						||
1688						(!specialField &&
1689							(
1690								j == new_value
1691								||
1692								(checkedGood[j] && count[j] && checkedGood[j] == count[j])
1693							)
1694						)
1695					)
1696				) {
1697					el.style.display = '';
1698					this.toggleField(el.value, data[j][i], field_type, id, prefix);
1699				} else {
1700					el.style.display = 'none';
1701					this.toggleField('', data[j][i], field_type, id, prefix);
1702				}
1703			}
1704		}
1705	}
1706};
1707window.hikashop = hikashop;
1708
1709if(oldHikaShop && oldHikaShop instanceof Object) {
1710	for (var attr in oldHikaShop) {
1711		if (oldHikaShop.hasOwnProperty(attr) && !window.hikashop.hasOwnProperty(attr))
1712			window.hikashop[attr] = oldHikaShop[attr];
1713	}
1714}
1715})();
1716
1717function tableOrdering(order, dir, task) {
1718	var form = document.adminForm;
1719	form.filter_order.value = order;
1720	form.filter_order_Dir.value	= dir;
1721	submitform(task);
1722}
1723
1724function submitform(pressbutton) {
1725	var d = document;
1726	if(!d.adminForm)
1727		return false;
1728	if(pressbutton)
1729		d.adminForm.task.value = pressbutton;
1730	if(typeof(CodeMirror) == 'function') {
1731		for(x in CodeMirror.instances) {
1732			d.getElementById(x).value = CodeMirror.instances[x].getCode();
1733		}
1734	}
1735	if(typeof(d.adminForm.onsubmit) == "function")
1736		d.adminForm.onsubmit();
1737	d.adminForm.submit();
1738	return false;
1739}
1740
1741if(!window.submitbutton) {
1742	window.submitbutton = function(name) { submitform(name); };
1743}
1744
1745function hikashopCheckChangeForm(type, form) {
1746	if(!form)
1747		return true;
1748	var varform = document[form];
1749
1750	if(typeof(hikashopFieldsJs) == 'undefined' || typeof(hikashopFieldsJs['reqFieldsComp']) == 'undefined' || typeof(hikashopFieldsJs['reqFieldsComp'][type]) == 'undefined' || hikashopFieldsJs['reqFieldsComp'][type].length <= 0)
1751		return true;
1752
1753	var d = document;
1754	for(var i = 0; i < hikashopFieldsJs['reqFieldsComp'][type].length; i++) {
1755		elementName = 'data['+type+']['+hikashopFieldsJs['reqFieldsComp'][type][i]+']';
1756		if(typeof(varform.elements[elementName]) == 'undefined')
1757			elementName = type+'_'+hikashopFieldsJs['reqFieldsComp'][type][i];
1758
1759		elementToCheck = varform.elements[elementName];
1760		elementId = 'hikashop_'+type+'_'+ hikashopFieldsJs['reqFieldsComp'][type][i];
1761		el = d.getElementById(elementId);
1762
1763		if(elementToCheck && (typeof el == 'undefined' || el == null || typeof el.style == 'undefined' || el.style.display!='none') && !hikashopCheckField(elementToCheck,type,i,elementName,varform.elements)) {
1764			if(typeof(hikashopFieldsJs['entry_id']) == 'undefined')
1765				return false;
1766
1767			for(var j = 1; j <= hikashop['entry_id']; j++) {
1768				elementName = 'data['+type+'][entry_'+j+']['+hikashopFieldsJs['reqFieldsComp'][type][i]+']';
1769				elementToCheck = varform.elements[elementName];
1770				elementId = 'hikashop_'+type+'_'+ hikashopFieldsJs['reqFieldsComp'][type][i] + '_' + j;
1771				el = d.getElementById(elementId);
1772				if(elementToCheck && (typeof el == 'undefined' || el == null || typeof el.style == 'undefined' || el.style.display != 'none') && !hikashopCheckField(elementToCheck,type,i,elementName,varform.elements)) {
1773					return false;
1774				}
1775			}
1776		}
1777	}
1778
1779	if(type == 'register') {
1780		// check the password confirmation field only if we are in selector registration and that the user selected "registration" or "simplified registration", or that the registration is on "all in one page" and that the password confirmation field is there
1781		var register = d.getElementById('data_register_registration_method0');
1782		if(!register)
1783			register = d.getElementById('data[register][registration_method]0');
1784
1785		var simplified_pwd = d.getElementById('data_register_registration_method3');
1786		if(!simplified_pwd)
1787			simplified_pwd = d.getElementById('data[register][registration_method]3');
1788
1789		if((simplified_pwd && simplified_pwd.checked) || (register && register.checked) || (!simplified_pwd && !register)) {
1790			// check password
1791			if(typeof(varform.elements['data[register][password]']) != 'undefined' && typeof(varform.elements['data[register][password2]']) != 'undefined') {
1792				passwd = varform.elements['data[register][password]'];
1793				passwd2 = varform.elements['data[register][password2]'];
1794				if(passwd.value != passwd2.value) {
1795					alert(hikashopFieldsJs['password_different']);
1796					return false;
1797				}
1798			}
1799		}
1800
1801		//check email
1802		var emailField = varform.elements['data[register][email]'];
1803		emailField.value = emailField.value.replace(/ /g,"");
1804		var filter = /^([a-z0-9_'&\.\-\+])+\@(([a-z0-9\-])+\.)+([a-z0-9]{2,14})+$/i;
1805		if(!emailField || !filter.test(emailField.value)) {
1806			alert(hikashopFieldsJs['valid_email']);
1807			return false;
1808		}
1809	} else if(type == 'address' && typeof(varform.elements['data[address][address_telephone]']) != 'undefined') {
1810		var phoneField = varform.elements['data[address][address_telephone]'], filter = /[0-9]+/i;
1811		if(phoneField) {
1812			phoneField.value = phoneField.value.replace(/ /g,"");
1813			if(phoneField.value.length > 0 && !filter.test(phoneField.value)) {
1814				alert(hikashopFieldsJs['valid_phone']);
1815				return false;
1816			}
1817		}
1818	}
1819
1820	return true;
1821}
1822
1823function hikashopCheckField(elementToCheck, type, i, elementName, form) {
1824	if(!elementToCheck)
1825		return true;
1826
1827	var d = document, isValid = false;
1828	if(typeof(elementToCheck.value) != 'undefined') {
1829		if(elementToCheck.value == ' ' && typeof(form[elementName+'[]']) != 'undefined') {
1830			if(form[elementName+'[]'].checked) {
1831				isValid = true;
1832			} else {
1833				for(var a = form[elementName+'[]'].length - 1; a >= 0; a--) {
1834					if(form[elementName+'[]'][a].checked && form[elementName+'[]'][a].value.length > 0)
1835						isValid = true;
1836				}
1837			}
1838		} else if(elementToCheck.value.length > 0){
1839			var found = false;
1840			for(var j in hikashopFieldsJs['regexFieldsComp'][type]) {
1841				if(hikashopFieldsJs['regexFieldsComp'][type][j] == hikashopFieldsJs['reqFieldsComp'][type][i]) found = j;
1842			}
1843			if(typeof(hikashopFieldsJs['regexFieldsComp']) != 'undefined' && typeof(hikashopFieldsJs['regexFieldsComp'][type]) != 'undefined' && found){
1844				myregexp = new RegExp(hikashopFieldsJs['regexValueFieldsComp'][type][found]);
1845				if(myregexp.test(elementToCheck.value)){
1846					isValid = true;
1847				}
1848			}else{
1849				isValid = true;
1850			}
1851		}
1852	} else {
1853		for(var a = elementToCheck.length - 1; a >= 0; a--) {
1854			 if(elementToCheck[a].checked && elementToCheck[a].value.length > 0)
1855			 	isValid = true;
1856		}
1857	}
1858
1859	// Case for the switcher display, ignore check according to the method selected
1860	// joomla 3 ids are differents than joomla 1.5...
1861	var simplified_pwd = d.getElementById('data_register_registration_method3');
1862	if(!simplified_pwd) simplified_pwd = d.getElementById('data[register][registration_method]3');
1863
1864	var simplified = d.getElementById('data_register_registration_method1');
1865	if(!simplified) simplified = d.getElementById('data[register][registration_method]1');
1866
1867	var guest = d.getElementById('data_register_registration_method2');
1868	if(!guest) guest = d.getElementById('data[register][registration_method]2');
1869
1870	if(!isValid && ((simplified && simplified.checked) || (guest && guest.checked) ) && (elementName == 'data[register][password]' || elementName == 'data[register][password2]')){
1871		window.Oby.addClass(elementToCheck, 'invalid');
1872		return true;
1873	}
1874
1875	if(!isValid && ( (simplified && simplified.checked) || (guest && guest.checked) || (simplified_pwd && simplified_pwd.checked) ) && (elementName == 'data[register][name]' || elementName == 'data[register][username]')) {
1876		window.Oby.addClass(elementToCheck, 'invalid');
1877		return true;
1878	}
1879	if(!isValid) {
1880		window.Oby.addClass(elementToCheck, 'invalid');
1881		alert(hikashopFieldsJs['validFieldsComp'][type][i]);
1882		return false;
1883	} else {
1884		window.Oby.removeClass(elementToCheck, 'invalid');
1885	}
1886	return true;
1887}
1888
1889window.hikashop.ready(function(){
1890	if(window.jQuery && typeof(jQuery.noConflict) == "function" && !window.hkjQuery) {
1891		window.hkjQuery = jQuery.noConflict();
1892	}
1893	if(window.hikaVotes && typeof(initVote) == 'function')
1894		initVote();
1895	window.hikashop.checkConsistency();
1896});
1897if(window.jQuery && typeof(jQuery.noConflict) == "function" && !window.hkjQuery) {
1898	window.hkjQuery = jQuery.noConflict();
1899}

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.