PageSourceSearch

https://exportusa.us/dom/dl.ui-213.js

js exportusa.us collected 2026-10-01 14:32:04 UTC 46,817 bytes, 1,598 lines download raw bytes

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.