1/* dynlite ui components library 2 * peter assenov- aip solutions ltd' 2001-201 3 * ver 2.4.1 - 2015-10-27 4 */ 5/* library extensions */ 6if(!dl.cache) 7 dl.cache = {}; 8//hash 9if(!dl.hash) 10 dl.hash = function(key, val, top){ 11 //alert('dl.hash: '+key+' = '+val); 12 if(!key) return false; 13 var res = dl.w.encodeURIComponent(val) || ''; 14 var hash = dl.l.hash; 15 var query = {}; 16 if(!hash || hash == '' || hash == '#') 17 query[key] = res; 18 else { 19 var arr = hash.split('&'); 20 for(var i in arr) { 21 var el = arr[i]; 22 var sub = el.split('='); 23 if(sub[0].indexOf('#') === 0) 24 sub[0] = sub[0].substr(1); 25 query[sub[0]] = sub[1]; 26 } 27 if(val !== undefined) 28 query[key] = res; 29 } 30 if(val !== undefined) { 31 var ohash = []; 32 for(var i in query) 33 ohash.push(i+'='+query[i]); 34 dl.l.hash = '#'+ohash.join('&'); 35 if(top) 36 dl.w.scrollTo(0,0); 37 } else 38 return dl.w.decodeURIComponent(query[key]); 39 } 40//gestures 41if(!dl.gesture) 42 dl.gesture={ 43 d:40,x0:0,y0:0,active:0,block:0, 44 start:function(e){ 45 if(!e.touches.length) return; 46 dl.gesture.x0=e.touches[0].pageX; 47 dl.gesture.y0=e.touches[0].pageY; 48 dl.gesture.active=1; 49 dl.on('touchmove',dl.gesture.move,false); 50 }, 51 move:function(e){ 52 if(!dl.gesture.active) return; 53 if(dl.gesture.block) e.preventDefault(); 54 var dx = dl.gesture.x0-e.touches[0].pageX; 55 var dy = dl.gesture.y0-e.touches[0].pageY; 56 if(Math.abs(dx)>=dl.gesture.d){ 57 dl.gesture.stop(); 58 if(dx>0) dl.fire('wipeRight'); 59 else dl.fire('wipeLeft'); 60 } else 61 if(Math.abs(dy)>=dl.gesture.d){ 62 dl.gesture.stop(); 63 if(dy>0) dl.fire('wipeUp'); 64 else dl.fire('wipeDown'); 65 } 66 }, 67 stop:function(e){ 68 dl.off('touchmove',dl.gesture.move); 69 dl.gesture.x0=dl.gesture.y0=0; 70 dl.gesture.active=0; 71 } 72 } 73if(!dl.uri) { //handles qry string parameter management 74 dl.uri=function(uri){ 75 if(!(this instanceof dl.uri)) 76 return new dl.uri(uri); 77 this.uri = uri || dl.l.href; 78 var arr = this.uri.split('?'); 79 this.url = arr[0]; 80 this.qry = {}; 81 if(arr[1]) { 82 var list = arr[1].split('&'); 83 for(var i in list) { 84 var par = list[i].split('='); 85 if(par[0]) 86 this.qry[par[0]] = par[1]; 87 } 88 } 89 } 90 dl.Uri=dl.uri.prototype; 91 dl.Uri.query=function(par, val){ 92 if(typeof par == 'object') 93 for(i in par) 94 this.qry[i] = par[i]; 95 else 96 this.qry[par] = val; 97 return this._uri(); 98 } 99 //helpers 100 dl.Uri._uri=function(){ 101 var qry = []; 102 for(var i in this.qry) 103 qry.push(i+'='+this.qry[i]); 104 var uri = this.url; 105 if(qry.length) 106 uri+='?'+qry.join('&'); 107 return uri; 108 } 109} 110/* session handling */ 111dl.session = { 112 db : dl.w.sessionStorage, 113 get: function(id){ return this.db.getItem(id); }, 114 set: function(id, item){ 115 this.db.setItem(id, item); 116 return this; 117 }, 118} 119/* popup component */ 120dl.popup=function(url,conf,cb){ 121 cb = (!cb) ? cb : 0; 122 if(!(this instanceof dl.popup)) 123 return new dl.popup(url,conf,cb); 124 if(!conf) conf={}; 125 this.id=conf.id||'popup'; 126 this.el=dl.el(this.id,{id:this.id,cls:this.cls,tag:'IFRAME'}); 127 this.cls=conf.cls||this.id; 128 this.conf=conf||{}; 129 this.close(); 130 if(cb) 131 this.el.cb=cb; 132 if(url) 133 this.open(url); 134 dl.w.popup=this; //static registration 135} 136dl.Popup=dl.popup.prototype; 137dl.Popup.open=function(url){ 138 var self=this; 139 if(!this.el) 140 this.el=dl.el(this.id,{id:this.id,cls:this.cls,tag:'IFRAME'}); 141 this.el.src=url; 142 this.el.center=function(){ 143 if(self.conf.fixed) return false; 144 var w=this.w||this.offsetWidth; 145 var h=this.h||this.offsetHeight; 146 this.css('left', Math.max(10,(dl.width()-w)/2)+'px'); 147 this.css('top', Math.max(10,(dl.height()-h)/2.5)+dl.scroll()+'px'); 148 } 149 this.el.adjust=function(){ 150 var self=this; 151 var body=this.contentDocument.getElementsByTagName('body')[0]; 152 if(!body) return false; 153 if(this.h&&this.h==body.offsetHeight) return; 154 this.h=(body)? body.offsetHeight : 0; 155 this.css('height',this.h+'px'); 156 this.center(null, this.h); 157 setTimeout(function(){self.adjust()}, 200) 158 } 159 this.el.show(); 160 this.el.focus(); 161 this.el.center(); 162 this.el.on('load', function(){ 163 this.adjust(); 164 this.active=true; 165 }) 166 //sugar 167 dl.on('resize', function(){self.el.center()}) 168 //dl.on('scroll', function(){self.el.center()}) 169 dl.on('click', function(e){ 170 if(e.target&&e.target!==self.el) 171 if(self.el&&self.el.active) self.close(); 172 }) 173} 174dl.Popup.close=function(){ 175 this.el.innerHTML='';
176 this.el.h=0; 177 this.el.hide(); 178 this.el.active=false; 179 if(this.el.cb) 180 this.el.cb(); 181 this.el.parentNode.removeChild(this.el); 182 this.el=null; 183 dl.w.popup=null; 184} 185/* rich-text editting */ 186dl.rte=function(id,conf){ 187 if(!(this instanceof dl.rte)) 188 return new dl.rte(id,conf); 189 var self=this; 190 this.id=id||'rte'; 191this.conf=conf||{bold:'\ue6ae',italic:'\ue6b0',underline:'\ue6af'} 192 this.list={}; 193 dl.on('ready', function(){self.init()}) 194} 195dl.Rte=dl.rte.prototype; 196dl.Rte.init=function(){ 197 var self=this; 198 this.src=dl.el(this.id); 199 this.cont=dl.el(this.id+'.cont',{id:this.id+'.cont',cls:'rte',tag:'DIV',parent:this.src.parentNode}) 200 this.cont.css('left', this.src.offsetLeft); this.cont.css('top', this.src.offsetTop); 201 this.cont.css('width', this.src.offsetWidth); this.cont.css('height', this.src.offsetHeight); 202 this.menu=dl.el(this.id+'.menu',{id:this.id+'.menu',cls:'rte-menu',tag:'DIV',parent:this.cont}); 203 for(var i in this.conf) { 204 var icon=dl.el(this.id+'.'+i,{id:this.id+'.'+i,cls:'rte-icon',tag:'A',parent:this.menu}); 205 icon.cmd=i; 206 icon.html(this.conf[i]); 207 icon.onmousedown=function(e){ 208 var so = window.getSelection(); 209 var sr = so.getRangeAt(0); 210 self.exec(this.cmd); 211 setTimeout(function(){ 212 self.edit.focus(); 213 so.removeAllRanges(); 214 so.addRange(sr); 215 },1); 216 }; 217 this.list[i]=icon; 218 } 219 this.edit=dl.el(this.id+'.text',{id:this.id+'.edit',cls:'rte-edit',tag:'DIV',parent:this.cont}); 220 this.edit.css('height', this.cont.offsetHeight-this.menu.offsetHeight-6); 221 this.edit.contentEditable=true; 222 this.edit.onblur=function(){trace('blur')}; 223 this.edit.onfocus=function(){trace('focus')}; 224 this.src.parentNode.removeChild(this.src); 225 //this.edit('keyup') 226 this.exec('rtf'); 227} 228dl.Rte.exec=function(cmd, val){ 229 if(cmd == 'rtf') { 230 this.edit.innerHTML = this.src.value; 231 this.edit.focus(); 232 this.src.hide(); 233 } else 234 if(cmd == 'txt') { 235 this.edit.value = this.src.innerHTML; 236 this.src.focus(); 237 this.edit.hide(); 238 } else { 239 document.execCommand(cmd, false, false); 240 setTimeout(function(){dl.el('rte.edit').focus();},1); 241 } 242} 243/* banner manager class */ 244dl.cache.banner = []; //list of active banners 245dl.banner = function(id, conf) { 246 var id = id||'banner'; 247 if(dl.cache.banner[id]) //cache lookup 248 return dl.cache.banner[id]; 249 if(!(this instanceof dl.banner)) //auto object creation 250 return dl.cache.banner[id] = new dl.banner(id,conf); 251 //finally the class can start :) 252 this.id = id; 253 this.conf = conf || {item:'article', btn:'footer a', delay:10, duration:3, autostart:1, active:0, cls:'active'} 254 this.el = dl.el(this.id); 255 this.btn = this.el.list(this.conf.btn); 256 this.list = this.el.list(this.conf.item); 257 this.loop = null; 258 this.active = null; 259 //init 260 this.trans(this.conf.active); 261 if(this.conf.autostart) 262 this.play(); 263} 264dl.Banner = dl.banner.prototype; 265dl.Banner.play = function(){ //starts the slide-show 266//trace('play'); 267 var self = this; 268 if(this.loop) 269 clearInterval(this.loop); 270 if(this.list.length > 1) 271 this.loop = setInterval(function(){self.next()}, this.conf.delay * 1000) 272 if(this.active === null) 273 this.trans(0); 274} 275dl.Banner.pause = function(){ //stops the loop 276//trace('pause'); 277 if(this.loop) 278 clearInterval(this.loop); 279} 280dl.Banner.next = function(){ //transition to the next element 281trace('next'); 282 this.active++; 283 if(!this.active || this.active < 0 || this.active >= this.list.length) 284 this.active = 0; 285 this.trans(this.active); 286} 287dl.Banner.trans = function(i){ //hides all elements and show the selected one 288trace('trans',i); 289 this.active = i||0; 290 var cls = this.conf.cls; 291 var dur = parseInt(this.conf.duration * 1000); 292 for(var i = this.btn.length;i;) { //process buttons 293 var el = dl.el(this.btn[--i]); 294 (i == this.active)? el.add(cls) : el.remove(cls); 295 } 296 for(var i = this.list.length;i;) { //process banners 297 var el = dl.el(this.list[--i]); 298 (i == this.active)? el.add(cls) : el.remove(cls);//(i == this.active)? el.show() : el.hide(); 299 } 300 var img = this.list[this.active].list('img')[0]; 301 //this.el.css('background-image','url("'+dl.el(img).attr('src')+'")'); 302 303} 304/* image swap class */ 305dl.swapsrc=function(id, el){ 306 if(!id) return false;
307 if(!(this instanceof dl.swapsrc)) 308 return new dl.swapsrc(id, el); 309 this.id = id; 310 this.el = dl.el(el); 311 if(!this.el.src || !this.el.data('swapsrc') || this.el.src.indexOf(this.el.data('swapsrc')) != -1) //missing or same images required no swap 312 return false; 313 //create 314 this.alt = dl.el(this.id+'.alt', { 315 tag: 'IMG', 316 css: { 317 'position': 'absolute', 318 //'left': this.el.offsetLeft+'px', 319 //'top': '0',//this.el.offsetTop+'px', 320 'max-width': this.el.offsetWidth, 321 'max-height': this.el.offsetHeight, 322 'z-index': -1, 323 }, 324 parent: this.el.parentNode 325 }); 326 //bind 327 this.el.css('transition', 'opacity 400ms ease') 328 this.el.on('mouseover', this.swap.bind(this)) 329 this.el.on('mouseout', this.restore.bind(this)) 330} 331dl.Swapsrc = dl.swapsrc.prototype; 332dl.Swapsrc.swap = function(){ 333 if(!this.alt.src) { 334 var self = this; 335 this.alt.src = this.el.data('swapsrc'); 336 this.alt.onload=function(){self.el.css('opacity', 0.01);} //if not delayed the image appears broken if connectio is not good 337 } else 338 this.el.css('opacity', 0.01); 339} 340dl.Swapsrc.restore = function(){ 341 this.el.css('opacity', 0.99); 342} 343//static initialization 344dl.swap=function() 345{ var list = dl.list('img[data-swapsrc]'); 346 for(var i in list) 347 dl.swapsrc('swap.'+i, list[i]); 348} 349/* image zoom class */ 350dl.zoom=function(id){ 351 if(!id) return false; //no element to zoom 352 if(!(this instanceof dl.zoom)) 353 return new dl.zoom(id); 354 this.id = id; 355 this.el = dl.el(this.id); 356 if(!this.el.data('zoomsrc')) 357 return false; //no large image 358 if(this.el.zoom) 359 this.el.zoom.clear(); 360 this.area = this.el.data('zoomarea') ? this.el.data('zoomarea') : 'image';//'image','fixed' 361 if (this.area == 'fixed'){ 362 dl.el(this.el.parentNode).add('fixed'); 363 this.area = { 364 type: 'fixed', 365 t: '0', 366 l: '0', 367 w: this.el.parentNode.offsetWidth, 368 h: this.el.parentNode.offsetHeight, 369 }; 370 } else if (this.area == 'image'){ 371 this.area = { 372 type: 'image', 373 t: this.el.offsetTop+'px', 374 l: this.el.offsetLeft+'px', 375 w: this.el.offsetWidth, 376 h: this.el.offsetHeight, 377 }; 378 } 379 this.cont = dl.el(id+'.cont', { 380 cls: 'zoom', 381 css: { 382 'z-index': 10, 383 'opacity': 90, 384 position: 'absolute', 385 overflow: 'hidden', 386 top: this.area.t, 387 left: this.area.l, 388 width: this.area.w, 389 height: this.area.h, 390 }, 391 parent: this.el.parentNode 392 }); 393 this.cont.remove('active'); 394 this.mover = dl.el(this.id+'.mover', { 395 id : this.id+'.mover', 396 tag: 'IMG', 397 src: this.el.data('zoomsrc'), 398 cls: 'zoom', 399 css: { 400 position: 'absolute', 401 opacity: 0.01, 402 transition: 'opacity 600ms ease', 403 }, 404 parent: this.cont, 405 }); 406 this.mover.on('load', this.init.bind(this)); 407 this.el.zoom = this; 408} 409dl.Zoom = dl.zoom.prototype; 410dl.Zoom.init = function(){ 411 this.k = { 412 x: (this.mover.clientWidth - this.area.w) / this.area.w, 413 y: (this.mover.clientHeight - this.area.h) / this.area.h, 414 } 415 if(this.k.x > 0 && this.k.y > 0) { //makes sense only if the 'bigger' image is actually bigger 416 this.cont.add('active');
417 if(dl.is.touch) { 418 this.cont.on('touchstart', this.start.bind(this)); 419 this.cont.on('touchend', this.stop.bind(this)); 420 this.cont.on('touchmove', this.move.bind(this)); 421 } else { 422 this.cont.on('mouseover', this.start.bind(this)); 423 this.cont.on('mouseout', this.stop.bind(this)); 424 this.cont.on('mousemove', this.move.bind(this)); 425 } 426 } 427 //trigger enlarge - mss2015-11-12: 428 var self = this; 429 this.cont.on('click', function(){ 430 self.el.click(); 431 }); 432} 433dl.Zoom.clear = function(){ 434 this.cont.parentNode.removeChild(this.cont); 435 this.el.zoom = null; 436} 437dl.Zoom.start = function(e){ 438 this.mover.css('opacity', 0.99) 439} 440dl.Zoom.stop = function(e){ 441 this.mover.css('opacity', 0.01) 442} 443dl.Zoom.move = function(e){ 444 e.preventDefault(); 445 var p = this.cont.getBoundingClientRect(); 446 var y = ((e.clientY - p.top) * -this.k.y).toFixed(1); 447 var x = ((e.clientX - p.left) * -this.k.x).toFixed(1); 448 this.mover.css({top: y+'px', left: x+'px'}); 449} 450/* image preview class */ 451dl.preview=function(id){ 452 if(!id) return false; //no element to zoom 453 if(!(this instanceof dl.preview)) 454 return new dl.preview(id); 455 this.id = id; 456 this.el = null; 457 this.lyr = null; 458 this.list = []; 459 this.i = 0; 460 this.link = {prev:null, next:null}; 461 if(this.init()) 462 this.bind(); 463 this.el.preview = this; 464} 465dl.Preview=dl.preview.prototype; 466dl.Preview.init=function(){ 467 this.el = dl.el(this.id); 468 this.list = dl.list("[data-preview='"+this.id+"']"); 469/*2016-12-21mss: 470 for(var i in this.list) { 471 var el = dl.el(this.list[i]); 472 if(this.el.src.indexOf(el.data('previewsrc')) !== -1) { 473 el.add('active'); 474 this.i = i; 475 } else 476 el.remove('active'); 477 } 478*/ 479 var dlel = dl.el('banner.inner.cont');//dl.el(this.el.parentNode.parentNode); 480 var dtel = dl.el('banner.inner.big');//dl.el(this.el.parentNode); 481 var ddel = dl.el('banner.inner.list');//dl.el(this.el.parentNode); 482 if(this.list.length == 1){ 483 dlel.add('one');//dl.image 484 this.set(0); 485 return; 486 } else if(this.list.length > 1){ 487 this.i = 1; 488 dl.el(this.list[parseInt(this.i)+1]).add('next'); 489 this.link.prev = dl.el(this.id+'.prev'); 490 this.link.next = dl.el(this.id+'.next'); 491 this.link.prev.css('width', ((dl.d.body.offsetWidth>1170)? (dl.d.body.offsetWidth-1170)/2-4 : 80)+'px').show(); 492 this.link.next.css('width', ((dl.d.body.offsetWidth>1170)? (dl.d.body.offsetWidth-1170)/2-4 : 80)+'px').show(); 493 this.set(this.i); 494 return true; 495 } 496/* 497 if(this.i == 0) 498 dl.el(this.list[this.list.length-1]).add('prev'); 499 else 500 dl.el(this.list[parseInt(this.i)-1]).add('prev'); 501*/ 502} 503dl.Preview.bind=function(i){ 504 this.el.on('load', this.transition.bind(this)); 505 this.el.on('click', function(){ 506 var i = +this.dataset.enlargeCode; 507 dl.hash('!image', i); 508 dl.hash('image', false); 509 }); 510 for(var i in this.list) 511 dl.el(this.list[i]).on('click', this.set.bind(this, i)); 512 this.link.prev.on('click', this.prev.bind(this)); 513 this.link.next.on('click', this.next.bind(this)); 514 this.render(false); 515} 516dl.Preview.set=function(i){ 517 if(this.lyr) return; 518 this.i = i; 519 var el = dl.el(this.list[i]); 520 var prev = dl.el(this.list[i-1]) || dl.el(this.list[this.list.length-1]); 521 var next = dl.el(this.list[i+1]); 522 dl.el(this.el.parentNode).add('loading'); 523 //handle active state of the link 524 for(var i in this.list) 525 dl.el(this.list[i]).remove('prev').remove('next').remove('active'); 526 el.add('active'); 527 prev.add('prev') 528 next.add('next') 529 //clone big image 530 this.lyr = dl.el(this.el.cloneNode(this.el),{ 531 id: '', 532 css: { 533 position: 'absolute', 534 top: '0px', 535 botom: '0px', 536 left: '0px', 537 right: '0px', 538 width: this.el.offsetWidth, 539 height: this.el.offsetHeight, 540 'margin': 'auto', 541 'z-index':20 542 }, 543 parent: this.el.parentNode, 544 }); 545 //change the src 546 this.el.src = el.data('previewsrc'); 547 //update zoom 548 /* 549 if(this.el.data('zoomsrc')) { 550 this.el.data('zoomsrc', el.data('zoomsrc')); 551 this.el.zoom = dl.zoom(this.id); 552 //force container update: 553 if(1){//mss2015-11-23 the container should always updates: if (this.el.zoom.area.type == 'image') { 554 var self = this; 555 this.el.on('load',function(){ 556 self.el.zoom = dl.zoom(self.id); 557 if(self.el.area) 558 self.el.zoom.cont.css('height', self.el.area.h); 559 }) 560 } 561 } 562 */ 563 this.render(); 564} 565dl.Preview.prev=function(){ 566 if(this.i <= 0) return false;
567 this.set(+this.i-1); 568} 569dl.Preview.next=function(){ 570 if(this.i >= this.list.length - 1) return false; 571 this.set(+this.i+1); 572} 573dl.Preview.render=function(scroll){ 574 if(scroll !== false) 575 this.el.scrollIntoView(); 576 this.link.prev.remove('active'); 577 this.link.next.remove('active'); 578 if(this.i > 0) 579 this.link.prev.add('active'); 580 if(this.i < this.list.length - 1) 581 this.link.next.add('active'); 582 this.el.data('enlargeCode', this.i); 583} 584dl.Preview.set_=function(){ 585 this.el.parentNode.removeChild(this.lyr); 586 this.lyr = null; 587} 588dl.Preview.transition=function(){ 589 //make transition 590 if (this.lyr){ 591 this.lyr.css('opacity', [1,0], 400); 592 dl.el(this.el.parentNode).remove('loading'); 593 setTimeout(this.set_(), 400);//setTimeout(this.set_.bind(this), 400); 594 } 595} 596/* image enlarge class */ 597dl.enlarge=function(id){ 598 if(!(this instanceof dl.enlarge)) 599 return new dl.enlarge(id); 600 this.id=id||'enlarge'; 601 this.i=false; 602 if(this.init()) this.bind(); 603} 604dl.Enlarge=dl.enlarge.prototype; 605dl.Enlarge.init=function(){ 606 this.cont=dl.el(this.id+'.cont',{cls:'enlarge'}); 607 this.list=dl.list('img[data-'+this.id+']'); 608 this.img=dl.el(this.id+'.img',{tag:'IMG',parent:this.cont}); 609 this.bc=dl.el(this.id+'.hide',{tag:'A',cls:'hide',parent:this.cont}); 610 this.title=dl.el(this.id+'.title',{tag:'H3',parent:this.cont}); 611 if(this.list.length>1) { 612 this.bp=dl.el(this.id+'.prev',{tag:'A',cls:'prev',parent:this.cont}); 613 this.bn=dl.el(this.id+'.next',{tag:'A',cls:'next',parent:this.cont}); 614 } 615 this.hash(); 616 return true; 617} 618dl.Enlarge.bind=function(){ 619 this.bc.on('click',this.close.bind(this)); 620 this.img.on('load',this.load.bind(this)); 621 dl.on('resize',this.load.bind(this)); 622 for(var i=this.list.length;i--;) 623 dl.el(this.list[i]).on('click',this._open.bind(this,i)).css('cursor','zoom-in') 624 if(this.list.length>1) { 625 if(dl.is.touch) { 626 dl.on('wipeLeft',this.prev.bind(this)); 627 dl.on('wipeRight',this.next.bind(this)); 628 } else { 629 this.img.on('click',this.calc.bind(this)); 630 this.cont.on('click',this.close.bind(this)); 631 } 632 this.bp.on('click',this.prev.bind(this)); 633 this.bn.on('click',this.next.bind(this)); 634 } else 635 this.cont.on('click',this.close.bind(this)); 636 dl.on('hashchange', this.hash.bind(this)); 637} 638dl.Enlarge.open=function(i, dir){ 639 dl.hash('!image', i); 640 dl.hash('image', false); 641} 642dl.Enlarge.hash=function(){ 643 var img = dl.hash('!image'); 644 if(typeof img !== "undefined" && img != "undefined") 645 this._open(img); 646} 647dl.Enlarge._open = function(i) { 648 var dir = (i>=this.i)? -1: 1; 649 this.i=+i; 650 if(!this.list[this.i]) return false; 651 //this.trans(dir); 652 var el = this.list[this.i]; 653 this.img.src=this.list[this.i].dataset[this.id]; 654 dl.el(this.img).css('opacity', 0.1); 655 this.cont.add('active'); 656 if(dl.gesture) dl.gesture.block=1; 657} 658dl.Enlarge.load=function(){ 659 var el=this.list[this.i]; 660 var im=this.img; 661 if(el&&im) { 662 var name = el.dataset.name || ''; 663 var text = el.dataset.text || ''; 664 dl.el(this.img).css('opacity', 0.1).css('opacity', 0.99, 200)//.css('opacity', 0.99, 600); 665 this.title.html('<b>'+name+'</b>'+text). 666 css({left:im.offsetLeft,top:im.offsetTop+im.offsetHeight-50,width:im.offsetWidth}). 667 css('opacity', 0.99, 600); 668 } 669} 670dl.Enlarge.close=function(){ 671 this.i=false; 672 dl.hash('image', false); 673 this.img.src='#'; 674 this.cont.remove('active'); 675 if(dl.gesture) dl.gesture.block=0; 676} 677dl.Enlarge.prev=function(e){ 678 if(e) e.stopPropagation(); 679 var i=(this.i)? this.i-1:this.list.length-1; 680 this.open(i, 1); 681} 682dl.Enlarge.next=function(e){ 683 if(e) e.stopPropagation(); 684 var i=(this.i>=this.list.length-1)? 0:this.i+1; 685 this.open(i, -1); 686} 687dl.Enlarge.calc=function(e){ 688 e.stopPropagation(); 689 if((e.pageX-e.target.offsetLeft) < e.target.offsetWidth/4) this.prev(e); 690 else this.next(e); 691} 692dl.Enlarge.trans=function(dir){ 693 var im = this.img; 694 if(im.src==''||im.src.indexOf('#')!=-1) return; 695 var img = im.cloneNode(); 696 dl.el(img).css({position:'absolute',left:im.offsetLeft,top:im.offsetTop,width:im.offsetWidth,height:+im.offsetHeight-60}); 697 im.parentNode.appendChild(img); 698 if(dir) 699 dl.el(img).css('left', dir*dl.width(), 6000); 700 dl.el(img).css('opacity', 0.01, 400); 701 dl.delay(function(){img.parentNode.removeChild(img)}); 702} 703/* lazy image loading */ 704dl.lazysrc={state:'idle',wait:1000} 705dl.lazysrc.update=function(){ 706 //trace('dl.dynlist.update: '+this.state); 707 if(this.state == 'idle') 708 this.process(); 709 if(this.state == 'wait') 710 this.state = 'todo'; 711 //not need to do anything if alredy in state 'todo' 712} 713dl.lazysrc.process=function(){ 714 //trace('dl.dynlist.process: '+this.state); 715 this.delay(); 716 var list = dl.list('img[data-lazysrc]'); 717 var vh = dl.height(); 718 for(var i in list) { 719 var el = list[i]; 720 if(!el.dataset || !el.dataset.lazysrc) continue; 721 //if in view loads it and removes it from the search 722 var y = el.getBoundingClientRect().top; 723 if(y > -200 && y < vh + 500) { 724 el.src = el.dataset.lazysrc; 725 el.removeAttribute('data-lazysrc'); 726 } 727 } 728} 729dl.lazysrc.delay=function(){ 730 this.state = 'wait'; 731 setTimeout(this.ready.bind(this), this.wait); 732} 733dl.lazysrc.ready=function(){ 734 if(this.state == 'todo') 735 this.process(); 736 else 737 this.state = 'idle'; 738} 739//static execution 740dl.lazy = function(){ 741 dl.lazysrc.update(); 742} 743/* sticky menu */ 744dl.sticky=function(){ 745 var list = dl.list('[data-sticky]'); 746 for(var i in list) { 747 var el = dl.el(list[i]); 748 var val = el.data('sticky') || el.offsetHeight; 749 if(dl.scroll() > val) 750 el.add('sticky'); 751 else 752 el.remove('sticky'); 753 } 754} 755/* fixed aside */ 756//TODO need to check where these are used 757dl.filter=function(id, multi){ 758 if(!id) return false;
759 if(typeof id === 'object') { 760 var fld = id.field; 761 var val = id.value; 762 } else { 763 //multi = (typeof multi === 'undefined')?1:multi; 764 //gets the data 765 var el = dl.el(id); 766 var fld = el.data('field'); 767 var val = el.data('value'); 768 if(val == 'checked') 769 val = el.checked? 1 : 0; 770 } 771 //resets the page 772 dl.hash('page', 0); 773 //gets the hash 774 var hash = dl.l.hash.replace('#', ''); 775 //transforms it to array 776 var list = hash.split('&'); 777 var found = 0; 778 for(var i in list) { 779 var item = list[i]; 780 var arr = item.split('='); 781 if(arr[0] == fld) { //edit 782 found = 1; 783 //need to process the value list 784 var vlist = '|'+arr[1]+'|'; 785 if(vlist.indexOf('|'+val+'|') !== -1) { //found 786 vlist = vlist.replace('|'+val+'|', '|'); 787 el.remove('active'); 788 } else { // not found 789 if(multi) {//multiple filter values 790 vlist += val+'|'; 791 } else {//one filter value 792 vlist = '|'+val+'|'; 793 } 794 if(el) el.add('active'); 795 } 796 list[i] = (vlist.length > 2)? fld+'='+vlist.replace('||','|').substr(1, vlist.length-2) : ''; 797 } 798 } 799 //adds to it 800 if(!found) { 801 list.push(fld+'='+val); 802 if(el) el.add('active'); 803 } 804 //put it back 805 for(i in list) { if(list[i] == "") list.splice(i, 1)} //cleares the empty spaces 806 dl.l.hash = '#' + list.join('&'); 807} 808dl.select=function(){} 809dl.range=function(id){ 810 if(!(this instanceof dl.range)) 811 return new dl.range(id); 812 this.id = id || 'dl.range'; 813 if(this.init()) 814 this.bind(); 815} 816dl.Range=dl.range.prototype; 817dl.Range.init=function(){ 818 this.cont = dl.el(this.id+'.cont'); 819 this.cont.w = this.cont.offsetWidth 820 this.cont.dragable = false; 821 this.val = {min:this.cont.data('min'),max:this.cont.data('max')} 822 if(!this.val.max || this.val.min == this.val.max) 823 return false; 824 this.min = dl.el(this.id+'.min'); 825 this.min.cv = this.val.min; 826 this.min.innerHTML = this.min.cv; 827 this.min.w = this.min.scrollWidth; 828 this.min.l = 0; 829 this.min.move = false; 830 this.max = dl.el(this.id+'.max'); 831 this.max.cv = this.val.max; 832 this.max.innerHTML = this.max.cv; 833 this.max.w = this.max.scrollWidth; 834 this.max.l = this.cont.w-this.max.w; 835 this.max.move = false; 836 this.bar = dl.el(this.id+'.bar'); 837 //setup 838 this.min.css('left', this.min.l); 839 this.max = dl.el(this.id+'.max'); 840 this.max.css('left', this.max.l); 841 this.bar.css({left:this.min.l, width:this.max.l+this.max.w-this.min.l}) 842 this.val.d = Math.round((this.val.max-this.val.min)/100); 843 this.val.k = (this.val.max-this.val.min)/(this.cont.w-this.max.w); 844 return true; 845} 846dl.Range.bind=function(){ 847 if(dl.is.touch) { 848 this.min.on("touchstart", this.start.bind(this)) 849 this.max.on("touchstart", this.start.bind(this)) 850 this.cont.on("touchend", this.stop.bind(this)) 851 this.cont.on("touchcancel", this.stop.bind(this)) 852 this.cont.on("touchmove", this.move.bind(this)); 853 } else { 854 this.min.on("mousedown", this.start.bind(this)) 855 this.max.on("mousedown", this.start.bind(this)) 856 this.cont.on("mouseup", this.stop.bind(this)) 857 this.cont.on("mouseleave", this.stop.bind(this)) 858 this.cont.on("mousemove", this.move.bind(this)); 859 this.cont.on("dragstart", function(e){e.preventDefault()}, false); 860 } 861} 862dl.Range.start=function(e){ 863 var el = e.target; 864 var left = e.screenX || e.pageX; 865 el.dx = left - el.offsetLeft;//trace(el.dx); 866 el.css('cursor', 'ew-resize'); 867 el.move = true; 868} 869dl.Range.move=function(e){ 870 if(e) e.preventDefault(); 871 var left = e.screenX || e.pageX; 872 if(this.min.move) { 873 this.min.l = left - this.min.dx; 874 this.min.w = this.min.scrollWidth; 875 if(this.min.l <= 0) this.min.l = 0; 876 if(this.min.l + this.min.w >= this.max.l) this.min.l = this.max.l - this.min.w; 877 this.min.css('left', this.min.l+'px'); 878 this.value(this.min); 879 } 880 if(this.max.move) { 881 this.max.l = left - this.max.dx; 882 this.max.w = this.max.scrollWidth; 883 if(this.max.l <= this.min.l + this.min.w) this.max.l = this.min.l + this.min.w; 884 if(this.max.l + this.max.w >= this.cont.w) this.max.l = this.cont.w - this.max.w; 885 this.max.css('left', this.max.l+'px'); 886 this.value(this.max); 887 } 888 this.bar.css({left:this.min.l, width:this.max.l+this.max.w-this.min.l}) 889} 890dl.Range.stop=function(){ 891 if(this.min.move || this.max.move) 892 this.update(); 893 this.min.move = this.max.move = false;
894 this.min.css('cursor', 'default'); 895 this.max.css('cursor', 'default'); 896} 897dl.Range.value=function(el){ 898 var tv = Math.round(this.val.k * el.l); 899 var cv = null; 900 if(Math.abs(this.val.min-tv) < this.val.d) cv = this.val.min; 901 if(Math.abs(this.val.max-tv) < this.val.d) cv = this.val.max; 902 if(Math.abs(el.cv-tv) > this.val.d) cv = tv; 903 if(cv != null){ 904 el.cv = cv; 905 el.innerHTML = el.cv; 906 } 907} 908dl.Range.update=function(el){ 909 dl.filter({field:this.id.replace('filter.',''),value:this.min.cv+'-'+this.max.cv}); 910} 911/* dynamic list management */ 912dl.is.dlist = []; //cache array 913dl.dlist = function(id){ 914 if(dl.is.dlist[id]) return dl.is.dlist[id]; //checks the cache first 915 if(!(this instanceof dl.dlist)) //created the object if called as a function 916 return new dl.dlist(id); 917 this.id = id || 'dlist'; //instance id. used as cache index and as a prefix to dom elements 918 this.el = null; //main dom element 919 this.ref = 0; //reference id 920 this.url = ''; //data management url 921 this.cont = null; //main container 922 dl.on('ready', this.init.bind(this)); //registers the initialization after the dom is ready 923 dl.is.dlist[this.id] = this; //register in cache 924} 925dl.Dlist = dl.dlist.prototype; 926dl.Dlist.init = function(){ 927 this.el = dl.el(this.id); 928 this.ref = this.el.data('id'); 929 this.url = this.el.data('url') || this.id+'.ajax.php'; 930 this.url = dl.uri(this.url).query('Id', this.ref); 931 this.cont = dl.el(this.id+'.cont'); 932 this.list(); 933} 934dl.Dlist.list = function(filter){ 935 var self = this; 936 if(filter) 937 this.url = dl.uri(this.url).query(filter); 938 if(this.ref) 939 this.cont.load(this.url, function(){ 940 dl.delay(self.onload.bind(self), 10); 941 }); 942} 943dl.Dlist.manage = function(par, cls){ 944 var url = this.url.replace('.ajax.', '.popup.'); 945 if(par) 946 url = dl.qryadd(url, par); 947 cls = cls || 'popup'; 948 dl.popup(url, {'cls':cls}); 949} 950dl.Dlist.load = function(par, conf){ 951trace('load') 952 var self = this; 953 if(conf && !confirm(conf)) return; 954 /*mss2015-11-16: popup stay open; delete from *.ajax.php; 955 */ 956 if(dl.w.popup) 957 dl.w.popup.close(); 958 this.cont.load(dl.qryadd(this.url, par), function(data){ 959 dl.delay(self.onload.bind(self), 10); 960 }); 961} 962dl.Dlist.add = function(id){ 963 this.load('addId='+id); 964} 965dl.Dlist.remove = function(id, conf){ 966 this.load('removeId='+id, conf); 967} 968dl.Dlist.onload = function(){ 969 //autoinit of internal sorts if any 970 var list = this.cont.list('[data-sort]'); 971 for(var i in list) 972 dl.sort(list[i].id); 973} 974/* datagrid ui control */ 975dl.is.grid = []; //cache array 976dl.grid = function(id){ 977 if(dl.is.grid[id]) return dl.is.grid[id]; //checks the cache first 978 if(!(this instanceof dl.grid)) //created the object if called as a function 979 return new dl.grid(id); 980 this.id = id || 'grid'; //instance id. used as cache index and as a prefix to dom elements 981 this.el = null; //main dom element 982 this.active = null; //active item id 983 this.list = {}; //list of items 984 dl.on('ready', this.init.bind(this)); //registers the initialization after the dom is ready 985 dl.is.grid[this.id] = this; //register in cache 986} 987dl.Grid = dl.grid.prototype; 988dl.Grid.init = function(){ //on document content loaded and js files parsed execution 989 this.el = dl.el(this.id); 990 var list = this.el.list('tr[id]'); 991 for(var i=list.length;i--;) { 992 var el = dl.el(list[i]); 993 if(el.id == this.id+'.add') 994 continue; 995 this.list[el.id] = el; 996 } 997 this.bind(); 998} 999dl.Grid.bind = function(){ //when initialization done, binds the events 1000 console.log('test'); 1001 dl.el(this.id+'.button.add').on('click', this.add.bind(this)) 1002 dl.el(this.id+'.button.save').on('click', this.save.bind(this)) 1003 dl.el(this.id+'.button.reset').on('click', this.reset.bind(this)) 1004 for(var i in this.list) { 1005 var el = this.list[i]; 1006 var edit= dl.el(el.list('[data-button-edit]')[0]); 1007 edit.show().on('click', this.edit.bind(this, i)); 1008 var save= dl.el(el.list('[data-button-save]')[0]); 1009 save.hide().on('click', this.save.bind(this)); 1010 var remove= dl.el(el.list('[data-button-remove]')[0]); 1011 remove.hide().on('click', this.remove.bind(this, i)); 1012 var reset= dl.el(el.list('[data-button-reset]')[0]); 1013 reset.hide().on('click', this.reset.bind(this, i)); 1014 } 1015} 1016dl.Grid.add = function(){ 1017 this.reset(); 1018 dl.el(this.id+'.add').show('table-row'); 1019 dl.el(this.id+'.button.add').hide(); 1020} 1021dl.Grid.edit = function(e){ 1022 if(!e) return; 1023 this.reset(); 1024 this.active=e; 1025 var id = this.active.replace(this.id+'.', ''); 1026 var parent = dl.el(this.active); 1027 parent.add('edit'); 1028 var list = parent.list('[data-name]'); 1029 for(var i=list.length;i--;){ 1030 var el = dl.el(list[i]); 1031 el.data('text', el.textContent); 1032 var ref = this.id+'.'+el.data('name');
1033 if(dl.is.el(ref)) { 1034 var nel = dl.el(ref).cloneNode(); 1035 nel.removeAttribute('id'); 1036 nel.name = 'frm['+id+']['+el.data('name')+']'; 1037 nel.value = el.data('value') || el.data('text'); 1038 el.innerHTML = ''; 1039 el.appendChild(nel); 1040 } 1041 } 1042 dl.el(parent.list('[data-button-edit]')[0]).hide(); 1043 dl.el(parent.list('[data-button-save]')[0]).show(); 1044 dl.el(parent.list('[data-button-remove]')[0]).show(); 1045 dl.el(parent.list('[data-button-reset]')[0]).show(); 1046 1047} 1048dl.Grid.save = function(){ 1049 dl.submit(); 1050} 1051dl.Grid.remove = function(e){ 1052 dl.url(dl.qryadd(dl.l.href, 'removeId='+e.replace(this.id+'.', ''))); 1053} 1054dl.Grid.reset = function(){ 1055 dl.el(this.id+'.add').hide(); 1056 dl.el(this.id+'.button.add').show(); 1057 if(this.active) { 1058 var parent = dl.el(this.active); 1059 parent.remove('edit'); 1060 var list = parent.list('[data-name]'); 1061 for(var i=list.length;i--;) { 1062 var el = dl.el(list[i]); 1063 el.html(el.data('text')); 1064 } 1065 dl.el(parent.list('[data-button-edit]')[0]).show(); 1066 dl.el(parent.list('[data-button-save]')[0]).hide(); 1067 dl.el(parent.list('[data-button-remove]')[0]).hide(); 1068 dl.el(parent.list('[data-button-reset]')[0]).hide(); 1069 this.active = null; 1070 } 1071} 1072/* sortable list */ 1073dl.is.sort = []; 1074dl.sort = function(id){ 1075 if(dl.is.sort[id]) return dl.is.sort[id]; 1076 if(!(this instanceof dl.sort)) 1077 return new dl.sort(id); 1078 this.id = id || 'sort'; 1079 this.el = null; 1080 this.url = ''; 1081 this.list = []; 1082 this.budy = null; 1083 this.timer = null; 1084 this.active = null; 1085 if(dl.is.ready) 1086 this.init(); 1087 else 1088 dl.on('ready', this.init.bind(this)); 1089 dl.is.sort[this.id] = this; 1090} 1091dl.Sort = dl.sort.prototype; 1092dl.Sort.init = function(){ 1093 this.el = dl.el(this.id); 1094 this.url = this.el.data('url'); 1095 this.list = []; 1096 var list = this.el.list('[data-sort-item]'); 1097 for(var i in list) 1098 this.item(i, list[i]); 1099 var self = this; 1100 this.el.on("dragover", function(e){e.preventDefault();self.move(e)}); 1101} 1102dl.Sort.item = function(i, el){ 1103 if(!el.nodeName) return false; 1104 el = dl.el(el); 1105 el.i = i; 1106 el.ref = el.data('id'); 1107 var list = el.list('[data-sort-handle]'); 1108 el.btn = list.length? dl.el(list[0]) : el; 1109 el.attr('draggable', true); 1110 el.on('dragstart', this.start.bind(this)); 1111 el.on('dragend', this.end.bind(this)); 1112 this.list.push(el); 1113} 1114dl.Sort.start = function(e){ 1115 var format = (e.dataTransfer.mozCursor)?'dl.sort':'Text';//mss2016-01-08 edit bcs IE: e.dataTransfer.setData('dl.sort', this.id); // required otherwise doesn't work 1116 e.dataTransfer.setData(format, this.id); 1117 var el = e.target; 1118 el.style.opacity = 0.2; 1119 el.style.cursor = 'pointer'; 1120 this.active = el; 1121 //trace('start'); 1122} 1123dl.Sort.end = function(e){ 1124 this.active.style.opacity = 0.99; 1125 this.active = null; 1126 var frm = new FormData(); 1127 for(var i=this.list.length;i--;) 1128 frm.append('sort['+i+']', this.list[i].ref); 1129 dl.post(this.url, frm); 1130 //trace('end'); 1131} 1132dl.Sort.move = function(e){ 1133 if(this.busy) return false; 1134 this.busy = 1; 1135 var target = this.check(e); 1136 if(target) 1137 this.place(this.active, target); 1138 var self = this; 1139 setTimeout(function(){self.busy=0}, 100) 1140} 1141dl.Sort.check = function(e){ 1142var p = {x:e.clientX, y:e.clientY} 1143 for(var i = this.list.length;i--;) { 1144 var el = this.list[i]; 1145 if(!el || !el.getBoundingClientRect) return false; 1146 var cr = el.getBoundingClientRect(); 1147 if(p.x > cr.left && p.x < cr.right && p.y > cr.top && p.y < cr.bottom) 1148 return el; 1149 } 1150 return false; 1151} 1152dl.Sort.place = function(s, d){ 1153 if(!s || !d || s.i == d.i) return false; //data not complete 1154 if(s.parentNode != d.parentNode) return false; //not in the same container 1155 d.parentNode.removeChild(s); 1156 if(s.i < d.i) 1157 d.parentNode.insertBefore(s, d.nextSibling); 1158 else 1159 d.parentNode.insertBefore(s, d); 1160 this.list = this.el.list('[data-sort-item]'); 1161 for(var i in this.list) 1162 this.list[i].i = i; 1163} 1164/* google map */ 1165dl.map = {el:null,conf:null} 1166dl.map.load = function(id){ 1167 this.id=id; 1168 this.el = dl.el(this.id); 1169 this.conf = JSON.parse(this.el.data('map')); 1170 if(this.conf.url) 1171 dl.include(this.conf.url+'&callback=dl.map.init') 1172} 1173var map; 1174dl.map.init = function(){ 1175 var conf = dl.map.conf; 1176 var id = dl.map.id || 'map.google'; 1177 var lat = +conf.latitude || 40.704214; 1178 var lng = +conf.longitude || -73.984794; 1179 var zoom= +conf.zoom || 16; 1180 var name= conf.name || 'ZipShop.SE'; 1181 var text= conf.text || '18th Bridge St, Brooklyn NY, USA'; 1182 var icon= conf.icon || ''; 1183 var scroll = conf.scroll || false; 1184 //map 1185 var center = new google.maps.LatLng(lat, lng); 1186 var mapOptions = { 1187 zoom: zoom, 1188 center: center, 1189 scrollwheel: scroll, 1190 }; 1191 map = new google.maps.Map(dl.el(id), mapOptions); 1192 //markers 1193 var marker = new google.maps.Marker({ 1194 position: new google.maps.LatLng(lat, lng), 1195 map: map, 1196 title: name, 1197 icon: icon, 1198 }); 1199 //info window 1200 var infowindow = new google.maps.InfoWindow({ 1201 content: text, 1202 }); 1203 google.maps.event.addListener(marker, 'click', function() { 1204 infowindow.open(map, marker); 1205 }); 1206} 1207/* helpers */ 1208dl.qryadd = function(url, par){ 1209 var s = (url.indexOf('?') != -1)? '&' : '?'; 1210 var u = url+s+par; 1211 return u; 1212} 1213dl.money=function(number, currency) { 1214 var number = parseFloat(number) || 0; 1215 number = number.toFixed(2); 1216 if(currency=='BGN') return number+" лв."; 1217 if(currency=='EUR') return "â¬"+number; 1218 if(currency=='USD') return "$"+number; 1219 if(currency=='GBP') return "£"+number; 1220 return number; 1221} 1222/* custom code for darik */ 1223aip = {is:{}} 1224 1225//article gallery 1226aip.is.gallery=[]; 1227aip.gallery=function(id){ 1228 if(aip.is.gallery[id]) 1229 return aip.is.gallery[id]; 1230 if(!(this instanceof aip.gallery)) 1231 return new aip.gallery(id); 1232 this.id = id; 1233 this.el = null; 1234 this.list = []; 1235 this.cont = null; 1236 this.active = 0; 1237 this.init(); 1238} 1239aip.Gallery=aip.gallery.prototype; 1240aip.Gallery.init=function(){
1241 this.el = dl.el(this.id); 1242 var list = this.el.list('article[data-item]'); 1243 if(!list.length) return false; 1244 var item = {}; 1245 for(var i = list.length;i--;) { 1246 var el = dl.el(list[i]); 1247 item[el.data('item')] = el; 1248 } 1249 var list = this.el.list('a[data-link]'); 1250 if(!list.length) return false; 1251 for(var i = list.length;i--;) { 1252 var el = { 1253 link: dl.el(list[i]), 1254 item: item[i] || false, 1255 img : item[i].list('img[data-src]')[0], 1256 } 1257 el.img.src = dl.el(el.img).data('src'); 1258 this.list[el.link.data('link')] = el; 1259 } 1260 this.cont = dl.el(this.el.list('dt')[0]); 1261 this.nextLink = dl.el('nextSlide',{id:'nextSlide',cls:'next',parent:this.el,style:'display:none;'}); 1262 this.prevLink = dl.el('prevSlide',{id:'prevSlide',cls:'prev',parent:this.el,style:'display:none;'}); 1263 this.bind(); 1264} 1265aip.Gallery.bind=function(){ 1266 for(var i in this.list) 1267 this.list[i].link.on('click', this.set.bind(this, i)); 1268 //2015-10-14mss - enlarge instead: this.cont.on('click', this.next.bind(this)); 1269 this.nextLink.on('click', this.nextSlide.bind(this) ); 1270 this.prevLink.on('click', this.prevSlide.bind(this) ); 1271} 1272aip.Gallery.set=function(id){ 1273 if(this.active == id) return true; 1274 var el = null; 1275 if(this.active !== false) { 1276 el = this.list[this.active]; 1277 el.link.remove('active'); 1278 el.item.remove('active'); 1279 } 1280 this.active = id; 1281 el = this.list[this.active]; 1282 el.link.add('active'); 1283 el.item.add('active'); 1284 //scroll to top of the image 1285 var pos = this.el.getBoundingClientRect(); 1286 if(pos.top < 0) { 1287 dl.w.scrollBy(0, pos.top-50); 1288 } 1289} 1290aip.Gallery.next=function(e){ 1291 var px = (e.layerX - e.target.offsetLeft)/e.target.offsetWidth; 1292 var i = this.active; 1293 if(px > 0.3) { 1294 i++; 1295 if(i >= this.list.length) 1296 i = 0; 1297 } else { 1298 i--; 1299 if(i <= 0) 1300 i = this.list.length - 1; 1301 } 1302 this.set(i); 1303} 1304aip.Gallery.nextSlide=function(e){ 1305 var i = this.active; 1306 if(++i >= this.list.length){ 1307 i = 0; 1308 } 1309 var left = this.list[i].item.offsetLeft; 1310 var leftValue = ((this.cont.scrollWidth-left)>this.cont.parentNode.offsetWidth) ? -left+'px' : -this.cont.scrollWidth+this.cont.parentNode.offsetWidth+'px' ; 1311 this.cont.css('margin-left',leftValue);//this.cont.parentNode.scrollLeft = el.item.offsetLeft; 1312 this.set(i); 1313} 1314aip.Gallery.prevSlide=function(){ 1315 var i = this.active; 1316 if(--i < 0){ 1317 i = this.list.length - 1; 1318 } 1319 var el = this.list[i]; 1320 var left = this.list[i].item.offsetLeft; 1321 var leftValue = ((this.cont.scrollWidth-left)>this.cont.parentNode.offsetWidth) ? -left+'px' : -this.cont.scrollWidth+this.cont.parentNode.offsetWidth+'px' ; 1322 this.cont.css('margin-left',leftValue);//this.cont.parentNode.scrollLeft = el.item.offsetLeft; 1323 this.set(i); 1324} 1325 1326//brands scrollHor 1327/*aip.is.scrollHor=[]; 1328aip.scrollHor=function(id){ 1329 if(aip.is.scrollHor[id]) 1330 return aip.is.scrollHor[id]; 1331 if(!(this instanceof aip.scrollHor)) 1332 return new aip.scrollHor(id); 1333 this.id = id; 1334 this.el = null; 1335 this.cont = null; 1336 this.list = []; 1337 this.prev = null; 1338 this.next = null; 1339 this.visible = 0; 1340 this.scrollable = 0; 1341 this.init(); 1342} 1343aip.ScrollHor=aip.scrollHor.prototype; 1344aip.ScrollHor.init=function(){ 1345 this.el = dl.el(dl.el(this.id).list('section')[0]); 1346 this.cont = dl.el(this.el.list('table')[0]); 1347 this.visible = this.cont.offsetWidth;//this.el.scrollWidth; 1348 this.scrollable = this.cont.scrollWidth; 1349 if(this.visible>=this.scrollable) 1350 return false; 1351 var list = this.el.list('[data-item]'); 1352 trace(list = this.el.list('[data-item]')); 1353 if(!list.length) return false; 1354 for(var i = list.length;i--;) { 1355 var el = dl.el(list[i]); 1356 this.list[i] = el; 1357 } 1358 this.prev = dl.el(this.el.list('[data-prev]')[0],{ id:'prevSlide', tag: 'a', cls:'prev', parent:this.cont.parentNode}); 1359 this.next = dl.el(this.el.list('[data-next]')[0],{ id:'nextSlide', tag: 'a', cls:'next', parent:this.cont.parentNode}); 1360 this.bind(); 1361} 1362aip.ScrollHor.bind=function(){ 1363 this.prev.on('click', this.scrollPrev.bind(this)).add('inactive'); 1364 this.next.on('click', this.scrollNext.bind(this)); 1365} 1366aip.ScrollHor.scrollNext=function(){ 1367 var px = -this.visible/2; 1368 this.next.remove('inactive'); 1369 this.prev.remove('inactive'); 1370 for(var i = this.list.length;i--;) { 1371 var newMargin = parseInt(this.list[i].css('margin-left')) + px; 1372 if (Math.abs(newMargin) > (this.scrollable-this.visible)){ 1373 newMargin = -(this.scrollable-this.visible); 1374 this.next.add('inactive'); 1375 } 1376 this.list[i].css({ 1377 'margin-left': newMargin+'px' 1378 }); 1379 } 1380} 1381aip.ScrollHor.scrollPrev=function(){ 1382 var px = this.visible/2; 1383 this.prev.remove('inactive'); 1384 this.next.remove('inactive'); 1385 for(var i = this.list.length;i--;) { 1386 var newMargin = parseInt(this.list[i].css('margin-left')) + px; 1387 if (Math.abs(newMargin-this.visible) < this.visible){ 1388 newMargin = 0; 1389 this.prev.add('inactive'); 1390 } 1391 this.list[i].css({ 1392 'margin-left': newMargin+'px' 1393 }); 1394 } 1395}*/ 1396//carousel 1397aip.carousel=function(id){ 1398 if(!(this instanceof aip.carousel)) 1399 return new aip.carousel(id); 1400 this.id = id || 'carousel'; 1401 this.el = null; 1402 this.list = []; 1403 this.active = 0; 1404 this.visibleWidth = 0; 1405 this.scrollWidth = 0; 1406 this.init(); 1407} 1408aip.Carousel=aip.carousel.prototype; 1409aip.Carousel.init=function(){
1410 this.el = dl.el(this.id) 1411 this.list = this.el.list('[data-item]'); 1412 this.bind(); 1413 this.render(); 1414} 1415aip.Carousel.bind=function(){ 1416 dl.el(this.id+'.prev').add('prev').on('click', this.prev.bind(this)); 1417 dl.el(this.id+'.next').add('next').on('click', this.next.bind(this)); 1418 1419} 1420aip.Carousel.render=function(){ 1421 if(this.active > 0) 1422 dl.el(this.id+'.prev').add('active'); 1423 else 1424 dl.el(this.id+'.prev').remove('active'); 1425 1426//trace('left:', this.el.offsetLeft); 1427//trace('width:', this.el.offsetWidth); 1428//trace('left+width:'); 1429//trace('visible:', this.el.parentNode.offsetWidth); 1430 1431 this.visibleWidth = this.el.offsetWidth+this.list[this.active].offsetWidth; 1432 trace(this.visibleWidth); 1433 //this.scrollWidth = this.el.offsetWidth + this.visibleWidth - this.visibleWidth; 1434 if(this.active >= this.list.length-1) //if(visibleWidth <= this.el.parentNode.offsetWidth)// 1435 dl.el(this.id+'.next').remove('active'); 1436 1437 else 1438 dl.el(this.id+'.next').add('active'); 1439 var left = (this.active)? +this.list[this.active].offsetWidth + this.el.offsetLeft - this.visibleWidth:0; 1440 this.active+'->'+left; 1441 this.el.css('left', left +'px'); 1442 this.el.style.transition = "all 10s"; 1443} 1444aip.Carousel.prev=function(){ 1445 this.active--; 1446 if(this.active < 0) 1447 this.active = 0; 1448 this.render(); 1449} 1450aip.Carousel.next=function(){ 1451 this.active++; 1452 if(this.active >= this.list.length-1) 1453 this.active = this.list.length-1; 1454 this.render(); 1455 //trace('ggg'); 1456} 1457/* custom code*/ 1458 1459 1460 1461//aip = {is:{}} 1462//product tabs 1463aip.svg=function(id){ 1464 if(!(this instanceof aip.svg)) 1465 return new aip.svg(id); 1466 this.id=id || 'svg'; 1467 this.init(); 1468} 1469aip.Svg=aip.svg.prototype; 1470aip.Svg.init=function(){ 1471 this.list = dl.el(this.id).list('[data-svg-image]'); 1472 this.bind(); 1473}
1474aip.Svg.bind=function(){ 1475 //dl.el(this.id).on('click', this.active.bind(this)); 1476 for(var i = this.list.length;i--;) { 1477 var item = dl.el(this.list[i]); 1478 var svgPath = '../img/svg/icon-'+item.data('svgImage')+'.svg'; 1479 //use css cache instead of http-request: item.load(svgPath, function(data) { trace('load end'); }); 1480 item.css('background-image','url("'+svgPath+'")'); 1481 } 1482} 1483/* source #url: http://jsfiddle.net/wuSF7/462/ 1484 jQuery.get(imgURL, function(data) { 1485 // Get the SVG tag, ignore the rest 1486 var $svg = jQuery(data).find('svg'); 1487 1488 // Add replaced image's ID to the new SVG 1489 if(typeof imgID !== 'undefined') { 1490 $svg = $svg.attr('id', imgID); 1491 } 1492 // Add replaced image's classes to the new SVG 1493 if(typeof imgClass !== 'undefined') { 1494 $svg = $svg.attr('class', imgClass+' replaced-svg'); 1495 } 1496 1497 // Remove any invalid XML tags as per http://validator.w3.org 1498 $svg = $svg.removeAttr('xmlns:a'); 1499 1500 // Check if the viewport is set, if the viewport is not set the SVG wont't scale. 1501 if(!$svg.attr('viewBox') && $svg.attr('height') && $svg.attr('width')) { 1502 $svg.attr('viewBox', '0 0 ' + $svg.attr('height') + ' ' + $svg.attr('width')) 1503 } 1504 1505 // Replace image with new SVG 1506 $img.replaceWith($svg); 1507 1508 }, 'xml'); 1509 1510*/ 1511aip.Svg.active=function(e){ 1512 var el = e.target; 1513 if(el.dataset.tabButton) { 1514 var list = dl.el(this.id).children; 1515 for(var i=list.length;i--;) 1516 dl.el(list[i]).remove('active'); 1517 dl.el(el).add('active'); 1518 dl.el(el.dataset.tabButton).add('active'); 1519 } 1520} 1521//mailchimp newsletter 1522newsletter={id:'', state:0, fixed:false} 1523newsletter.init=function(id){ 1524trace('newsletter init()') 1525 this.id = id || 'newsletter'; 1526 this.bind(); 1527} 1528newsletter.bind=function(id){ 1529 dl.el(this.id+'.email').on('change', this.update.bind(this)) 1530 dl.el(this.id+'.accept').on('click', this.update.bind(this)) 1531 dl.el(this.id+'.button').on('click', this.captcha.bind(this)) 1532 dl.el(this.id+'.captcha.button').on('click', this.submit.bind(this)) 1533 dl.el(this.id+'.captcha.reload').on('click', this.reload.bind(this)) 1534} 1535newsletter.update=function(){ 1536 if(dl.el(this.id+'.email').validity.valid && dl.el(this.id+'.accept').checked) 1537 dl.el(this.id+'.error').hide(); 1538} 1539newsletter.reload=function(){ 1540 //dl.el(this.id+'.captcha.image').src = 'res/captcha/image.php?'+Math.random(); 1541 dl.el(this.id+'.captcha.image').src = 'ajax.captcha.php?'+Math.random(); 1542} 1543newsletter.captcha=function(){ 1544 var self = this; 1545 this.captchaPopup = dl.el(this.id+'.captcha'); 1546 1547 if(!dl.el(this.id+'.email').value || !dl.el(this.id+'.email').validity.valid || !dl.el(this.id+'.accept').checked) { 1548 dl.el(this.id+'.error').show(); 1549 return false; 1550 } 1551 this.reload(); 1552 this.fixed = (this.captchaPopup.css('position') == 'fixed') ? true : false; 1553 this.captchaPopup.center=function(){ 1554 if(self.fixed) return false; 1555 var w=this.w||this.offsetWidth; 1556 var h=this.h||this.offsetHeight; 1557 this.css('left', Math.max(10,(dl.width()-w)/2)+'px'); 1558 this.css('top', Math.max(10,(dl.height()-h)/2.5)+dl.scroll()+'px'); 1559 } 1560 1561 dl.el(this.id+'.loading').hide(); 1562 dl.el(this.id+'.success').hide(); 1563 dl.el(this.id+'.failure').hide(); 1564 this.captchaPopup.show(); 1565 this.captchaPopup.center(); 1566 dl.el(this.id+'.captcha.field').value = ''; 1567} 1568newsletter.submit=function(){ 1569 if(!dl.el(this.id+'.captcha.field').value) 1570 return false; 1571 dl.el(this.id+'.captcha').hide(); 1572 if(!dl.el(this.id+'.email').validity.valid || !dl.el(this.id+'.accept').checked) { 1573 dl.el(this.id+'.error').show(); 1574 return false; 1575 } 1576 var self = this; 1577 var lang = 0; 1578 dl.el(this.id+'.loading').show(); 1579 dl.el(this.id+'.success').hide(); 1580 dl.el(this.id+'.failure').hide(); 1581 //dl.submit(this.id+'.frm'); 1582 dl.submit(new FormData(dl.el(this.id+'.frm')), 'newsletter.ajax.php?action=subscribe&lang='+lang, function(data){ 1583//trace('self.submit') 1584 1585 dl.el(self.id+'.loading').hide(); 1586 if(data.indexOf('success') != -1) { 1587 dl.el(self.id+'.success').show(); 1588 dl.el(self.id+'.failure').hide(); 1589 } else { 1590 dl.el(self.id+'.success').hide(); 1591 dl.el(self.id+'.failure').html(data.replace('failure', '')); 1592 dl.el(self.id+'.failure').show(); 1593 } 1594 }) 1595} 1596 1597/* dl.ext - experimental functionality */ 1598//end of code, enjoy...
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.