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.