PageSourceSearch

http://primzavod.ru/highslide/highslide-with-gallery.js

js primzavod.ru collected 2026-10-07 10:07:13 UTC 77,255 bytes, 2,643 lines download raw bytes

1/******************************************************************************
2Name:    Highslide JS
3Version: 4.1.8 (October 27 2009)
4Config:  default +slideshow +positioning +transitions +viewport +thumbstrip
5Author:  Torstein Hønsi
6Support: http://highslide.com/support
7
8Licence:
9Highslide JS is licensed under a Creative Commons Attribution-NonCommercial 2.5
10License (http://creativecommons.org/licenses/by-nc/2.5/).
11
12You are free:
13	* to copy, distribute, display, and perform the work
14	* to make derivative works
15
16Under the following conditions:
17	* Attribution. You must attribute the work in the manner  specified by  the
18	  author or licensor.
19	* Noncommercial. You may not use this work for commercial purposes.
20
21* For  any  reuse  or  distribution, you  must make clear to others the license
22  terms of this work.
23* Any  of  these  conditions  can  be  waived  if  you  get permission from the 
24  copyright holder.
25
26Your fair use and other rights are in no way affected by the above.
27******************************************************************************/
28if (!hs) { var hs = {
29// Language strings
30lang : {
31	cssDirection: 'ltr',
32	loadingText : 'Загрузка...',
33	loadingTitle : 'Клик отказаться',
34	focusTitle : 'Поставить на передний план',
35	fullExpandTitle : 'Актуальный размер (f)',
36	creditsText : '',
37	creditsTitle : '',
38	previousText : 'Предыдущая',
39	nextText : 'Следующая', 
40	moveText : 'Двигать',
41	closeText : 'Закрыть', 
42	closeTitle : 'Закрыть (esc)', 
43	resizeTitle : 'Изменить размер',
44	playText : 'Играть',
45	playTitle : 'Играть слайдшоу (пробел)',
46	pauseText : 'Пауза',
47	pauseTitle : 'Пауза слайдшоу (пробел)',
48	previousTitle : 'Предыдущая (стрелка влево)',
49	nextTitle : 'Следующая (стрелка вправо)',
50	moveTitle : 'Двигать',
51	fullExpandText : '1:1',
52	number: 'Фото %1 из %2',
53	restoreTitle : 'Клик закрыть фото, клик и удержание двигать фото. Используйте стрелки для просмотра фотографий.'
54},
55// See http://highslide.com/ref for examples of settings  
56graphicsDir : 'highslide/graphics/',
57expandCursor : 'zoomin.cur', // null disables
58restoreCursor : 'zoomout.cur', // null disables
59expandDuration : 250, // milliseconds
60restoreDuration : 250,
61marginLeft : 15,
62marginRight : 15,
63marginTop : 15,
64marginBottom : 15,
65zIndexCounter : 1001, // adjust to other absolutely positioned elements
66loadingOpacity : 0.75,
67allowMultipleInstances: true,
68numberOfImagesToPreload : 5,
69outlineWhileAnimating : 2, // 0 = never, 1 = always, 2 = HTML only 
70outlineStartOffset : 3, // ends at 10
71padToMinWidth : false, // pad the popup width to make room for wide caption
72fullExpandPosition : 'bottom right',
73fullExpandOpacity : 1,
74showCredits : true, // you can set this to false if you want
75creditsHref : 'http://highslide.com/',
76creditsTarget : '_self',
77enableKeyListener : true,
78openerTagNames : ['a'], // Add more to allow slideshow indexing
79transitions : [],
80transitionDuration: 250,
81dimmingOpacity: 0, // Lightbox style dimming background
82dimmingDuration: 50, // 0 for instant dimming
83
84anchor : 'auto', // where the image expands from
85align : 'auto', // position in the client (overrides anchor)
86targetX: null, // the id of a target element
87targetY: null,
88dragByHeading: true,
89minWidth: 200,
90minHeight: 200,
91allowSizeReduction: true, // allow the image to reduce to fit client size. If false, this overrides minWidth and minHeight
92outlineType : 'drop-shadow', // set null to disable outlines
93skin : {
94	controls:
95		'<div class="highslide-controls"><ul>'+
96			'<li class="highslide-previous">'+
97				'<a href="#" title="{hs.lang.previousTitle}">'+
98				'<span>{hs.lang.previousText}</span></a>'+
99			'</li>'+
100			'<li class="highslide-play">'+
101				'<a href="#" title="{hs.lang.playTitle}">'+
102				'<span>{hs.lang.playText}</span></a>'+
103			'</li>'+
104			'<li class="highslide-pause">'+
105				'<a href="#" title="{hs.lang.pauseTitle}">'+
106				'<span>{hs.lang.pauseText}</span></a>'+
107			'</li>'+
108			'<li class="highslide-next">'+
109				'<a href="#" title="{hs.lang.nextTitle}">'+
110				'<span>{hs.lang.nextText}</span></a>'+
111			'</li>'+
112			'<li class="highslide-move">'+
113				'<a href="#" title="{hs.lang.moveTitle}">'+
114				'<span>{hs.lang.moveText}</span></a>'+
115			'</li>'+
116			'<li class="highslide-full-expand">'+
117				'<a href="#" title="{hs.lang.fullExpandTitle}">'+
118				'<span>{hs.lang.fullExpandText}</span></a>'+
119			'</li>'+
120			'<li class="highslide-close">'+
121				'<a href="#" title="{hs.lang.closeTitle}" >'+
122				'<span>{hs.lang.closeText}</span></a>'+
123			'</li>'+
124		'</ul></div>'
125},
126// END OF YOUR SETTINGS
127
128
129// declare internal properties
130preloadTheseImages : [],
131continuePreloading: true,
132expanders : [],
133overrides : [
134	'allowSizeReduction',
135	'useBox',
136	'anchor',
137	'align',
138	'targetX',
139	'targetY',
140	'outlineType',
141	'outlineWhileAnimating',
142	'captionId',
143	'captionText',
144	'captionEval',
145	'captionOverlay',
146	'headingId',
147	'headingText',
148	'headingEval',
149	'headingOverlay',
150	'creditsPosition',
151	'dragByHeading',
152	'autoplay',
153	'numberPosition',
154	'transitions',
155	'dimmingOpacity',
156	
157	'width',
158	'height',
159	
160	'wrapperClassName',
161	'minWidth',
162	'minHeight',
163	'maxWidth',
164	'maxHeight',
165	'slideshowGroup',
166	'easing',
167	'easingClose',
168	'fadeInOut',
169	'src'
170],
171overlays : [],
172idCounter : 0,
173oPos : {
174	x: ['leftpanel', 'left', 'center', 'right', 'rightpanel'],
175	y: ['above', 'top', 'middle', 'bottom', 'below']
176},
177mouse: {},
178headingOverlay: {},
179captionOverlay: {},
180timers : [],
181
182slideshows : [],
183
184pendingOutlines : {},
185clones : {},
186onReady: [],
187uaVersion: /Trident\/4\.0/.test(navigator.userAgent) ? 8 :
188	parseFloat((navigator.userAgent.toLowerCase().match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1]),
189ie : (document.all && !window.opera),
190safari : /Safari/.test(navigator.userAgent),
191geckoMac : /Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent),
192
193$ : function (id) {
194	if (id) return document.getElementById(id);
195},
196
197push : function (arr, val) {
198	arr[arr.length] = val;
199},
200
201createElement : function (tag, attribs, styles, parent, nopad) {
202	var el = document.createElement(tag);
203	if (attribs) hs.extend(el, attribs);
204	if (nopad) hs.setStyles(el, {padding: 0, border: 'none', margin: 0});
205	if (styles) hs.setStyles(el, styles);
206	if (parent) parent.appendChild(el);	
207	return el;
208},
209
210extend : function (el, attribs) {
211	for (var x in attribs) el[x] = attribs[x];
212	return el;
213},
214
215setStyles : function (el, styles) {
216	for (var x in styles) {
217		if (hs.ie && x == 'opacity') {
218			if (styles[x] > 0.99) el.style.removeAttribute('filter');
219			else el.style.filter = 'alpha(opacity='+ (styles[x] * 100) +')';
220		}
221		else el.style[x] = styles[x];
222	}
223},
224animate: function(el, prop, opt) {
225	var start,
226		end,
227		unit;
228	if (typeof opt != 'object' || opt === null) {
229		var args = arguments;
230		opt = {
231			duration: args[2],
232			easing: args[3],
233			complete: args[4]
234		};
235	}
236	if (typeof opt.duration != 'number') opt.duration = 250;
237	opt.easing = Math[opt.easing] || Math.easeInQuad;
238	opt.curAnim = hs.extend({}, prop);
239	for (var name in prop) {
240		var e = new hs.fx(el, opt , name );
241		
242		start = parseFloat(hs.css(el, name)) || 0;
243		end = parseFloat(prop[name]);
244		unit = name != 'opacity' ? 'px' : '';
245		
246		e.custom( start, end, unit );
247	}	
248},
249css: function(el, prop) {
250	if (document.defaultView) {
251		return document.defaultView.getComputedStyle(el, null).getPropertyValue(prop);
252
253	} else {
254		if (prop == 'opacity') prop = 'filter';
255		var val = el.currentStyle[prop.replace(/\-(\w)/g, function (a, b){ return b.toUpperCase(); })];
256		if (prop == 'filter') 
257			val = val.replace(/alpha\(opacity=([0-9]+)\)/, 
258				function (a, b) { return b / 100 });
259		return val === '' ? 1 : val;
260	} 
261},
262
263getPageSize : function () {
264	var d = document, w = window, iebody = d.compatMode && d.compatMode != 'BackCompat' 
265		? d.documentElement : d.body;
266	
267	var width = hs.ie ? iebody.clientWidth : 
268			(d.documentElement.clientWidth || self.innerWidth),
269		height = hs.ie ? iebody.clientHeight : self.innerHeight;
270	
271	hs.page = {
272		width: width,
273		height: height,		
274		scrollLeft: hs.ie ? iebody.scrollLeft : pageXOffset,
275		scrollTop: hs.ie ? iebody.scrollTop : pageYOffset
276	}
277},
278
279getPosition : function(el)	{
280	var p = { x: el.offsetLeft, y: el.offsetTop };
281	while (el.offsetParent)	{
282		el = el.offsetParent;
283		p.x += el.offsetLeft;
284		p.y += el.offsetTop;
285		if (el != document.body && el != document.documentElement) {
286			p.x -= el.scrollLeft;
287			p.y -= el.scrollTop;
288		}
289	}
290	return p;
291},
292
293expand : function(a, params, custom, type) {
294	if (!a) a = hs.createElement('a', null, { display: 'none' }, hs.container);
295	if (typeof a.getParams == 'function') return params;	
296	try {	
297		new hs.Expander(a, params, custom);
298		return false;
299	} catch (e) { return true; }
300},
301getElementByClass : function (el, tagName, className) {
302	var els = el.getElementsByTagName(tagName);
303	for (var i = 0; i < els.length; i++) {
304    	if ((new RegExp(className)).test(els[i].className)) {
305			return els[i];
306		}
307	}
308	return null;
309},
310replaceLang : function(s) {
311	s = s.replace(/\s/g, ' ');
312	var re = /{hs\.lang\.([^}]+)\}/g,
313		matches = s.match(re),
314		lang;
315	if (matches) for (var i = 0; i < matches.length; i++) {
316		lang = matches[i].replace(re, "$1");
317		if (typeof hs.lang[lang] != 'undefined') s = s.replace(matches[i], hs.lang[lang]);
318	}
319	return s;
320},
321
322
323focusTopmost : function() {
324	var topZ = 0, 
325		topmostKey = -1,
326		expanders = hs.expanders,
327		exp,
328		zIndex;
329	for (var i = 0; i < expanders.length; i++) {
330		exp = expanders[i];
331		if (exp) {
332			zIndex = exp.wrapper.style.zIndex;
333			if (zIndex && zIndex > topZ) {
334				topZ = zIndex;				
335				topmostKey = i;
336			}
337		}
338	}
339	if (topmostKey == -1) hs.focusKey = -1;
340	else expanders[topmostKey].focus();
341},
342
343getParam : function (a, param) {
344	a.getParams = a.onclick;
345	var p = a.getParams ? a.getParams() : null;
346	a.getParams = null;
347	
348	return (p && typeof p[param] != 'undefined') ? p[param] : 
349		(typeof hs[param] != 'undefined' ? hs[param] : null);
350},
351
352getSrc : function (a) {
353	var src = hs.getParam(a, 'src');
354	if (src) return src;
355	return a.href;
356},
357
358getNode : function (id) {
359	var node = hs.$(id), clone = hs.clones[id], a = {};
360	if (!node && !clone) return null;
361	if (!clone) {
362		clone = node.cloneNode(true);
363		clone.id = '';
364		hs.clones[id] = clone;
365		return node;
366	} else {
367		return clone.cloneNode(true);
368	}
369},
370
371discardElement : function(d) {
372	if (d) hs.garbageBin.appendChild(d);
373	hs.garbageBin.innerHTML = '';
374},
375dim : function(exp) {
376	if (!hs.dimmer) {
377		hs.dimmer = hs.createElement ('div', {
378				className: 'highslide-dimming highslide-viewport-size',
379				owner: '',
380				onclick: function() {
381					
382						hs.close();
383				}
384			}, {
385                visibility: 'visible',
386				opacity: 0
387			}, hs.container, true);
388	}
389
390	hs.dimmer.style.display = '';
391
392	hs.dimmer.owner += '|'+ exp.key;
393	if (hs.geckoMac && hs.dimmingGeckoFix)
394		hs.setStyles(hs.dimmer, {
395			background: 'url('+ hs.graphicsDir + 'geckodimmer.png)',
396			opacity: 1
397		});
398	else
399		hs.animate(hs.dimmer, { opacity: exp.dimmingOpacity }, hs.dimmingDuration);
400},
401undim : function(key) {
402	if (!hs.dimmer) return;
403	if (typeof key != 'undefined') hs.dimmer.owner = hs.dimmer.owner.replace('|'+ key, '');
404
405	if (
406		(typeof key != 'undefined' && hs.dimmer.owner != '')
407		|| (hs.upcoming && hs.getParam(hs.upcoming, 'dimmingOpacity'))
408	) return;
409
410	if (hs.geckoMac && hs.dimmingGeckoFix) hs.dimmer.style.display = 'none';
411	else hs.animate(hs.dimmer, { opacity: 0 }, hs.dimmingDuration, null, function() {
412		hs.dimmer.style.display = 'none';
413	});
414},
415transit : function (adj, exp) {
416	var last = exp = exp || hs.getExpander();
417	if (hs.upcoming) return false;
418	else hs.last = last;
419	try {
420		hs.upcoming = adj;
421		adj.onclick(); 		
422	} catch (e){
423		hs.last = hs.upcoming = null;
424	}
425	try {
426		if (!adj || exp.transitions[1] != 'crossfade')
427		exp.close();
428	} catch (e) {}
429	return false;
430},
431
432previousOrNext : function (el, op) {
433	var exp = hs.getExpander(el);
434	if (exp) return hs.transit(exp.getAdjacentAnchor(op), exp);
435	else return false;
436},
437
438previous : function (el) {
439	return hs.previousOrNext(el, -1);
440},
441
442next : function (el) {
443	return hs.previousOrNext(el, 1);	
444},
445
446keyHandler : function(e) {
447	if (!e) e = window.event;
448	if (!e.target) e.target = e.srcElement; // ie
449	if (typeof e.target.form != 'undefined') return true; // form element has focus
450	var exp = hs.getExpander();
451	
452	var op = null;
453	switch (e.keyCode) {
454		case 70: // f
455			if (exp) exp.doFullExpand();
456			return true;
457		case 32: // Space
458			op = 2;
459			break;
460		case 34: // Page Down
461		case 39: // Arrow right
462		case 40: // Arrow down
463			op = 1;
464			break;
465		case 8:  // Backspace
466		case 33: // Page Up
467		case 37: // Arrow left
468		case 38: // Arrow up
469			op = -1;
470			break;
471		case 27: // Escape
472		case 13: // Enter
473			op = 0;
474	}
475	if (op !== null) {if (op != 2)hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler);
476		if (!hs.enableKeyListener) return true;
477		
478		if (e.preventDefault) e.preventDefault();
479    	else e.returnValue = false;
480    	if (exp) {
481			if (op == 0) {
482				exp.close();
483			} else if (op == 2) {
484				if (exp.slideshow) exp.slideshow.hitSpace();
485			} else {
486				if (exp.slideshow) exp.slideshow.pause();
487				hs.previousOrNext(exp.key, op);
488			}
489			return false;
490		}
491	}
492	return true;
493},
494
495
496registerOverlay : function (overlay) {
497	hs.push(hs.overlays, hs.extend(overlay, { hsId: 'hsId'+ hs.idCounter++ } ));
498},
499
500
501addSlideshow : function (options) {
502	var sg = options.slideshowGroup;
503	if (typeof sg == 'object') {
504		for (var i = 0; i < sg.length; i++) {
505			var o = {};
506			for (var x in options) o[x] = options[x];
507			o.slideshowGroup = sg[i];
508			hs.push(hs.slideshows, o);
509		}
510	} else {
511		hs.push(hs.slideshows, options);
512	}
513},
514
515getWrapperKey : function (element, expOnly) {
516	var el, re = /^highslide-wrapper-([0-9]+)$/;
517	// 1. look in open expanders
518	el = element;
519	while (el.parentNode)	{
520		if (el.hsKey !== undefined) return el.hsKey;
521		if (el.id && re.test(el.id)) return el.id.replace(re, "$1");
522		el = el.parentNode;
523	}
524	// 2. look in thumbnail
525	if (!expOnly) {
526		el = element;
527		while (el.parentNode)	{
528			if (el.tagName && hs.isHsAnchor(el)) {
529				for (var key = 0; key < hs.expanders.length; key++) {
530					var exp = hs.expanders[key];
531					if (exp && exp.a == el) return key;
532				}
533			}
534			el = el.parentNode;
535		}
536	}
537	return null; 
538},
539
540getExpander : function (el, expOnly) {
541	if (typeof el == 'undefined') return hs.expanders[hs.focusKey] || null;
542	if (typeof el == 'number') return hs.expanders[el] || null;
543	if (typeof el == 'string') el = hs.$(el);
544	return hs.expanders[hs.getWrapperKey(el, expOnly)] || null;
545},
546
547isHsAnchor : function (a) {
548	return (a.onclick && a.onclick.toString().replace(/\s/g, ' ').match(/hs.(htmlE|e)xpand/));
549},
550
551reOrder : function () {
552	for (var i = 0; i < hs.expanders.length; i++)
553		if (hs.expanders[i] && hs.expanders[i].isExpanded) hs.focusTopmost();
554},
555
556mouseClickHandler : function(e) 
557{	
558	if (!e) e = window.event;
559	if (e.button > 1) return true;
560	if (!e.target) e.target = e.srcElement;
561	
562	var el = e.target;
563	while (el.parentNode
564		&& !(/highslide-(image|move|html|resize)/.test(el.className)))
565	{
566		el = el.parentNode;
567	}
568	var exp = hs.getExpander(el);
569	if (exp && (exp.isClosing || !exp.isExpanded)) return true;
570		
571	if (exp && e.type == 'mousedown') {
572		if (e.target.form) return true;
573		var match = el.className.match(/highslide-(image|move|resize)/);
574		if (match) {
575			hs.dragArgs = { 
576				exp: exp , 
577				type: match[1], 
578				left: exp.x.pos, 
579				width: exp.x.size, 
580				top: exp.y.pos, 
581				height: exp.y.size, 
582				clickX: e.clientX, 
583				clickY: e.clientY
584			};
585			
586			
587			hs.addEventListener(document, 'mousemove', hs.dragHandler);
588			if (e.preventDefault) e.preventDefault(); // FF
589			
590			if (/highslide-(image|html)-blur/.test(exp.content.className)) {
591				exp.focus();
592				hs.hasFocused = true;
593			}
594			return false;
595		}
596	} else if (e.type == 'mouseup') {
597		
598		hs.removeEventListener(document, 'mousemove', hs.dragHandler);
599		
600		if (hs.dragArgs) {
601			if (hs.styleRestoreCursor && hs.dragArgs.type == 'image') 
602				hs.dragArgs.exp.content.style.cursor = hs.styleRestoreCursor;
603			var hasDragged = hs.dragArgs.hasDragged;
604			
605			if (!hasDragged &&!hs.hasFocused && !/(move|resize)/.test(hs.dragArgs.type)) {
606				exp.close();
607			} 
608			else if (hasDragged || (!hasDragged && hs.hasHtmlExpanders)) {
609				hs.dragArgs.exp.doShowHide('hidden');
610			}
611			hs.hasFocused = false;
612			hs.dragArgs = null;
613		
614		} else if (/highslide-image-blur/.test(el.className)) {
615			el.style.cursor = hs.styleRestoreCursor;		
616		}
617	}
618	return false;
619},
620
621dragHandler : function(e)
622{
623	if (!hs.dragArgs) return true;
624	if (!e) e = window.event;
625	var a = hs.dragArgs, exp = a.exp;
626	
627	a.dX = e.clientX - a.clickX;
628	a.dY = e.clientY - a.clickY;	
629	
630	var distance = Math.sqrt(Math.pow(a.dX, 2) + Math.pow(a.dY, 2));
631	if (!a.hasDragged) a.hasDragged = (a.type != 'image' && distance > 0)
632		|| (distance > (hs.dragSensitivity || 5));
633	
634	if (a.hasDragged && e.clientX > 5 && e.clientY > 5) {
635		
636		if (a.type == 'resize') exp.resize(a);
637		else {
638			exp.moveTo(a.left + a.dX, a.top + a.dY);
639			if (a.type == 'image') exp.content.style.cursor = 'move';
640		}
641	}
642	return false;
643},
644
645wrapperMouseHandler : function (e) {
646	try {
647		if (!e) e = window.event;
648		var over = /mouseover/i.test(e.type); 
649		if (!e.target) e.target = e.srcElement; // ie
650		if (hs.ie) e.relatedTarget = 
651			over ? e.fromElement : e.toElement; // ie
652		var exp = hs.getExpander(e.target);
653		if (!exp.isExpanded) return;
654		if (!exp || !e.relatedTarget || hs.getExpander(e.relatedTarget, true) == exp 
655			|| hs.dragArgs) return;
656		for (var i = 0; i < exp.overlays.length; i++) (function() {
657			var o = hs.$('hsId'+ exp.overlays[i]);
658			if (o && o.hideOnMouseOut) {
659				if (over) hs.setStyles(o, { visibility: 'visible', display: '' });
660				hs.animate(o, { opacity: over ? o.opacity : 0 }, o.dur);
661			}
662		})();	
663	} catch (e) {}
664},
665addEventListener : function (el, event, func) {
666	if (el == document && event == 'ready') hs.push(hs.onReady, func);
667	try {
668		el.addEventListener(event, func, false);
669	} catch (e) {
670		try {
671			el.detachEvent('on'+ event, func);
672			el.attachEvent('on'+ event, func);
673		} catch (e) {
674			el['on'+ event] = func;
675		}
676	} 
677},
678
679removeEventListener : function (el, event, func) {
680	try {
681		el.removeEventListener(event, func, false);
682	} catch (e) {
683		try {
684			el.detachEvent('on'+ event, func);
685		} catch (e) {
686			el['on'+ event] = null;
687		}
688	}
689},
690
691preloadFullImage : function (i) {
692	if (hs.continuePreloading && hs.preloadTheseImages[i] && hs.preloadTheseImages[i] != 'undefined') {
693		var img = document.createElement('img');
694		img.onload = function() { 
695			img = null;
696			hs.preloadFullImage(i + 1);
697		};
698		img.src = hs.preloadTheseImages[i];
699	}
700},
701preloadImages : function (number) {
702	if (number && typeof number != 'object') hs.numberOfImagesToPreload = number;
703	
704	var arr = hs.getAnchors();
705	for (var i = 0; i < arr.images.length && i < hs.numberOfImagesToPreload; i++) {
706		hs.push(hs.preloadTheseImages, hs.getSrc(arr.images[i]));
707	}
708	
709	// preload outlines
710	if (hs.outlineType)	new hs.Outline(hs.outlineType, function () { hs.preloadFullImage(0)} );
711	else
712	
713	hs.preloadFullImage(0);
714	
715	// preload cursor
716	if (hs.restoreCursor) var cur = hs.createElement('img', { src: hs.graphicsDir + hs.restoreCursor });
717},
718
719
720init : function () {
721	if (!hs.container) {
722	
723		hs.getPageSize();
724		hs.ieLt7 = hs.ie && hs.uaVersion < 7;
725		for (var x in hs.langDefaults) {
726			if (typeof hs[x] != 'undefined') hs.lang[x] = hs[x];
727			else if (typeof hs.lang[x] == 'undefined' && typeof hs.langDefaults[x] != 'undefined') 
728				hs.lang[x] = hs.langDefaults[x];
729		}
730		
731		hs.container = hs.createElement('div', {
732				className: 'highslide-container'
733			}, {
734				position: 'absolute', 
735				left: 0, 
736				top: 0, 
737				width: '100%', 
738				zIndex: hs.zIndexCounter,
739				direction: 'ltr'
740			}, 
741			document.body,
742			true
743		);
744		hs.loading = hs.createElement('a', {
745				className: 'highslide-loading',
746				title: hs.lang.loadingTitle,
747				innerHTML: hs.lang.loadingText,
748				href: 'javascript:;'
749			}, {
750				position: 'absolute',
751				top: '-9999px',
752				opacity: hs.loadingOpacity,
753				zIndex: 1
754			}, hs.container
755		);
756		hs.garbageBin = hs.createElement('div', null, { display: 'none' }, hs.container);
757		hs.viewport = hs.createElement('div', {
758				className: 'highslide-viewport highslide-viewport-size'
759			}, {
760				visibility: (hs.safari && hs.uaVersion < 525) ? 'visible' : 'hidden'
761			}, hs.container, 1
762		);
763		
764		// http://www.robertpenner.com/easing/ 
765		Math.linearTween = function (t, b, c, d) {
766			return c*t/d + b;
767		};
768		Math.easeInQuad = function (t, b, c, d) {
769			return c*(t/=d)*t + b;
770		};
771		Math.easeOutQuad = function (t, b, c, d) {
772			return -c *(t/=d)*(t-2) + b;
773		};
774		
775		hs.hideSelects = hs.ieLt7;
776		hs.hideIframes = ((window.opera && hs.uaVersion < 9) || navigator.vendor == 'KDE' 
777			|| (hs.ie && hs.uaVersion < 5.5));
778	}
779},
780ready : function() {
781	if (hs.isReady) return;
782	hs.isReady = true;
783	
784	for (var i = 0; i < hs.onReady.length; i++) hs.onReady[i]();
785},
786
787updateAnchors : function() {
788	var el, els, all = [], images = [],groups = {}, re;
789		
790	for (var i = 0; i < hs.openerTagNames.length; i++) {
791		els = document.getElementsByTagName(hs.openerTagNames[i]);
792		for (var j = 0; j < els.length; j++) {
793			el = els[j];
794			re = hs.isHsAnchor(el);
795			if (re) {
796				hs.push(all, el);
797				if (re[0] == 'hs.expand') hs.push(images, el);
798				var g = hs.getParam(el, 'slideshowGroup') || 'none';
799				if (!groups[g]) groups[g] = [];
800				hs.push(groups[g], el);
801			}
802		}
803	}
804	hs.anchors = { all: all, groups: groups, images: images };
805	return hs.anchors;
806	
807},
808
809getAnchors : function() {
810	return hs.anchors || hs.updateAnchors();
811},
812
813
814close : function(el) {
815	var exp = hs.getExpander(el);
816	if (exp) exp.close();
817	return false;
818}
819}; // end hs object
820hs.fx = function( elem, options, prop ){
821	this.options = options;
822	this.elem = elem;
823	this.prop = prop;
824
825	if (!options.orig) options.orig = {};
826};
827hs.fx.prototype = {
828	update: function(){
829		(hs.fx.step[this.prop] || hs.fx.step._default)(this);
830		
831		if (this.options.step)
832			this.options.step.call(this.elem, this.now, this);
833
834	},
835	custom: function(from, to, unit){
836		this.startTime = (new Date()).getTime();
837		this.start = from;
838		this.end = to;
839		this.unit = unit;// || this.unit || "px";
840		this.now = this.start;
841		this.pos = this.state = 0;
842
843		var self = this;
844		function t(gotoEnd){
845			return self.step(gotoEnd);
846		}
847
848		t.elem = this.elem;
849
850		if ( t() && hs.timers.push(t) == 1 ) {
851			hs.timerId = setInterval(function(){
852				var timers = hs.timers;
853
854				for ( var i = 0; i < timers.length; i++ )
855					if ( !timers[i]() )
856						timers.splice(i--, 1);
857
858				if ( !timers.length ) {
859					clearInterval(hs.timerId);
860				}
861			}, 13);
862		}
863	},
864	step: function(gotoEnd){
865		var t = (new Date()).getTime();
866		if ( gotoEnd || t >= this.options.duration + this.startTime ) {
867			this.now = this.end;
868			this.pos = this.state = 1;
869			this.update();
870
871			this.options.curAnim[ this.prop ] = true;
872
873			var done = true;
874			for ( var i in this.options.curAnim )
875				if ( this.options.curAnim[i] !== true )
876					done = false;
877
878			if ( done ) {
879				if (this.options.complete) this.options.complete.call(this.elem);
880			}
881			return false;
882		} else {
883			var n = t - this.startTime;
884			this.state = n / this.options.duration;
885			this.pos = this.options.easing(n, 0, 1, this.options.duration);
886			this.now = this.start + ((this.end - this.start) * this.pos);
887			this.update();
888		}
889		return true;
890	}
891
892};
893
894hs.extend( hs.fx, {
895	step: {
896
897		opacity: function(fx){
898			hs.setStyles(fx.elem, { opacity: fx.now });
899		},
900
901		_default: function(fx){
902			try {
903				if ( fx.elem.style && fx.elem.style[ fx.prop ] != null )
904					fx.elem.style[ fx.prop ] = fx.now + fx.unit;
905				else
906					fx.elem[ fx.prop ] = fx.now;
907			} catch (e) {}
908		}
909	}
910});
911
912hs.Outline =  function (outlineType, onLoad) {
913	this.onLoad = onLoad;
914	this.outlineType = outlineType;
915	var v = hs.uaVersion, tr;
916	
917	this.hasAlphaImageLoader = hs.ie && v >= 5.5 && v < 7;
918	if (!outlineType) {
919		if (onLoad) onLoad();
920		return;
921	}
922	
923	hs.init();
924	this.table = hs.createElement(
925		'table', { 
926			cellSpacing: 0 
927		}, {
928			visibility: 'hidden',
929			position: 'absolute',
930			borderCollapse: 'collapse',
931			width: 0
932		},
933		hs.container,
934		true
935	);
936	var tbody = hs.createElement('tbody', null, null, this.table, 1);
937	
938	this.td = [];
939	for (var i = 0; i <= 8; i++) {
940		if (i % 3 == 0) tr = hs.createElement('tr', null, { height: 'auto' }, tbody, true);
941		this.td[i] = hs.createElement('td', null, null, tr, true);
942		var style = i != 4 ? { lineHeight: 0, fontSize: 0} : { position : 'relative' };
943		hs.setStyles(this.td[i], style);
944	}
945	this.td[4].className = outlineType +' highslide-outline';
946	
947	this.preloadGraphic(); 
948};
949
950hs.Outline.prototype = {
951preloadGraphic : function () {
952	var src = hs.graphicsDir + (hs.outlinesDir || "outlines/")+ this.outlineType +".png";
953				
954	var appendTo = hs.safari ? hs.container : null;
955	this.graphic = hs.createElement('img', null, { position: 'absolute', 
956		top: '-9999px' }, appendTo, true); // for onload trigger
957	
958	var pThis = this;
959	this.graphic.onload = function() { pThis.onGraphicLoad(); };
960	
961	this.graphic.src = src;
962},
963
964onGraphicLoad : function () {
965	var o = this.offset = this.graphic.width / 4,
966		pos = [[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],
967		dim = { height: (2*o) +'px', width: (2*o) +'px' };
968	for (var i = 0; i <= 8; i++) {
969		if (pos[i]) {
970			if (this.hasAlphaImageLoader) {
971				var w = (i == 1 || i == 7) ? '100%' : this.graphic.width +'px';
972				var div = hs.createElement('div', null, { width: '100%', height: '100%', position: 'relative', overflow: 'hidden'}, this.td[i], true);
973				hs.createElement ('div', null, { 
974						filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+ this.graphic.src + "')", 
975						position: 'absolute',
976						width: w, 
977						height: this.graphic.height +'px',
978						left: (pos[i][0]*o)+'px',
979						top: (pos[i][1]*o)+'px'
980					}, 
981				div,
982				true);
983			} else {
984				hs.setStyles(this.td[i], { background: 'url('+ this.graphic.src +') '+ (pos[i][0]*o)+'px '+(pos[i][1]*o)+'px'});
985			}
986			
987			if (window.opera && (i == 3 || i ==5)) 
988				hs.createElement('div', null, dim, this.td[i], true);
989			
990			hs.setStyles (this.td[i], dim);
991		}
992	}
993	this.graphic = null;
994	if (hs.pendingOutlines[this.outlineType]) hs.pendingOutlines[this.outlineType].destroy();
995	hs.pendingOutlines[this.outlineType] = this;
996	if (this.onLoad) this.onLoad();
997},
998	
999setPosition : function (pos, offset, vis, dur, easing) {
1000	var exp = this.exp,
1001		stl = exp.wrapper.style,
1002		offset = offset || 0,
1003		pos = pos || {
1004			x: exp.x.pos + offset,
1005			y: exp.y.pos + offset,
1006			w: exp.x.get('wsize') - 2 * offset,
1007			h: exp.y.get('wsize') - 2 * offset
1008		};
1009	if (vis) this.table.style.visibility = (pos.h >= 4 * this.offset) 
1010		? 'visible' : 'hidden';
1011	hs.setStyles(this.table, {
1012		left: (pos.x - this.offset) +'px',
1013		top: (pos.y - this.offset) +'px',
1014		width: (pos.w + 2 * this.offset) +'px'
1015	});
1016	
1017	pos.w -= 2 * this.offset;
1018	pos.h -= 2 * this.offset;
1019	hs.setStyles (this.td[4], {
1020		width: pos.w >= 0 ? pos.w +'px' : 0,
1021		height: pos.h >= 0 ? pos.h +'px' : 0
1022	});
1023	if (this.hasAlphaImageLoader) this.td[3].style.height 
1024		= this.td[5].style.height = this.td[4].style.height;	
1025	
1026},
1027	
1028destroy : function(hide) {
1029	if (hide) this.table.style.visibility = 'hidden';
1030	else hs.discardElement(this.table);
1031}
1032};
1033
1034hs.Dimension = function(exp, dim) {
1035	this.exp = exp;
1036	this.dim = dim;
1037	this.ucwh = dim == 'x' ? 'Width' : 'Height';
1038	this.wh = this.ucwh.toLowerCase();
1039	this.uclt = dim == 'x' ? 'Left' : 'Top';
1040	this.lt = this.uclt.toLowerCase();
1041	this.ucrb = dim == 'x' ? 'Right' : 'Bottom';
1042	this.rb = this.ucrb.toLowerCase();
1043	this.p1 = this.p2 = 0;
1044};
1045hs.Dimension.prototype = {
1046get : function(key) {
1047	switch (key) {
1048		case 'loadingPos':
1049			return this.tpos + this.tb + (this.t - hs.loading['offset'+ this.ucwh]) / 2;
1050		case 'loadingPosXfade':
1051			return this.pos + this.cb+ this.p1 + (this.size - hs.loading['offset'+ this.ucwh]) / 2;
1052		case 'wsize':
1053			return this.size + 2 * this.cb + this.p1 + this.p2;
1054		case 'fitsize':
1055			return this.clientSize - this.marginMin - this.marginMax;
1056		case 'maxsize':
1057			return this.get('fitsize') - 2 * this.cb - this.p1 - this.p2 ;
1058		case 'opos':
1059			return this.pos - (this.exp.outline ? this.exp.outline.offset : 0);
1060		case 'osize':
1061			return this.get('wsize') + (this.exp.outline ? 2*this.exp.outline.offset : 0);
1062		case 'imgPad':
1063			return this.imgSize ? Math.round((this.size - this.imgSize) / 2) : 0;
1064		
1065	}
1066},
1067calcBorders: function() {
1068	// correct for borders
1069	this.cb = (this.exp.content['offset'+ this.ucwh] - this.t) / 2;
1070	
1071	this.marginMax = hs['margin'+ this.ucrb];
1072},
1073calcThumb: function() {
1074	this.t = this.exp.el[this.wh] ? parseInt(this.exp.el[this.wh]) : 
1075		this.exp.el['offset'+ this.ucwh];
1076	this.tpos = this.exp.tpos[this.dim];
1077	this.tb = (this.exp.el['offset'+ this.ucwh] - this.t) / 2;
1078	if (this.tpos == 0 || this.tpos == -1) {
1079		this.tpos = (hs.page[this.wh] / 2) + hs.page['scroll'+ this.uclt];		
1080	};
1081},
1082calcExpanded: function() {
1083	var exp = this.exp;
1084	this.justify = 'auto';
1085	
1086	// get alignment
1087	if (exp.align == 'center') this.justify = 'center';
1088	else if (new RegExp(this.lt).test(exp.anchor)) this.justify = null;
1089	else if (new RegExp(this.rb).test(exp.anchor)) this.justify = 'max';
1090	
1091	
1092	// size and position
1093	this.pos = this.tpos - this.cb + this.tb;
1094	
1095	if (this.maxHeight && this.dim == 'x')
1096		exp.maxWidth = Math.min(exp.maxWidth || this.full, exp.maxHeight * this.full / exp.y.full); 
1097		
1098	this.size = Math.min(this.full, exp['max'+ this.ucwh] || this.full);
1099	this.minSize = exp.allowSizeReduction ? 
1100		Math.min(exp['min'+ this.ucwh], this.full) :this.full;
1101	if (exp.isImage && exp.useBox)	{
1102		this.size = exp[this.wh];
1103		this.imgSize = this.full;
1104	}
1105	if (this.dim == 'x' && hs.padToMinWidth) this.minSize = exp.minWidth;
1106	this.target = exp['target'+ this.dim.toUpperCase()];
1107	this.marginMin = hs['margin'+ this.uclt];
1108	this.scroll = hs.page['scroll'+ this.uclt];
1109	this.clientSize = hs.page[this.wh];
1110},
1111setSize: function(i) {
1112	var exp = this.exp;
1113	if (exp.isImage && (exp.useBox || hs.padToMinWidth)) {
1114		this.imgSize = i;
1115		this.size = Math.max(this.size, this.imgSize);
1116		exp.content.style[this.lt] = this.get('imgPad')+'px';
1117	} else
1118	this.size = i;
1119	
1120	exp.content.style[this.wh] = i +'px';
1121	exp.wrapper.style[this.wh] = this.get('wsize') +'px';
1122	if (exp.outline) exp.outline.setPosition();
1123	if (this.dim == 'x' && exp.overlayBox) exp.sizeOverlayBox(true);
1124	if (this.dim == 'x' && exp.slideshow && exp.isImage) {
1125		if (i == this.full) exp.slideshow.disable('full-expand');
1126		else exp.slideshow.enable('full-expand');
1127	}
1128},
1129setPos: function(i) {
1130	this.pos = i;
1131	this.exp.wrapper.style[this.lt] = i +'px';	
1132	
1133	if (this.exp.outline) this.exp.outline.setPosition();
1134	
1135}
1136};
1137
1138hs.Expander = function(a, params, custom, contentType) {
1139	if (document.readyState && hs.ie && !hs.isReady) {
1140		hs.addEventListener(document, 'ready', function() {
1141			new hs.Expander(a, params, custom, contentType);
1142		});
1143		return;
1144	} 
1145	this.a = a;
1146	this.custom = custom;
1147	this.contentType = contentType || 'image';
1148	this.isImage = !this.isHtml;
1149	
1150	hs.continuePreloading = false;
1151	this.overlays = [];
1152	this.last = hs.last;
1153	hs.last = null;
1154	hs.init();
1155	var key = this.key = hs.expanders.length;
1156	// override inline parameters
1157	for (var i = 0; i < hs.overrides.length; i++) {
1158		var name = hs.overrides[i];
1159		this[name] = params && typeof params[name] != 'undefined' ?
1160			params[name] : hs[name];
1161	}
1162	if (!this.src) this.src = a.href;
1163	
1164	// get thumb
1165	var el = (params && params.thumbnailId) ? hs.$(params.thumbnailId) : a;
1166	el = this.thumb = el.getElementsByTagName('img')[0] || el;
1167	this.thumbsUserSetId = el.id || a.id;
1168	
1169	// check if already open
1170	for (var i = 0; i < hs.expanders.length; i++) {
1171		if (hs.expanders[i] && hs.expanders[i].a == a 
1172			&& !(this.last && this.transitions[1] == 'crossfade')) {
1173			hs.expanders[i].focus();
1174			return false;
1175		}
1176	}	
1177
1178	// cancel other
1179	if (!hs.allowSimultaneousLoading) for (var i = 0; i < hs.expanders.length; i++) {
1180		if (hs.expanders[i] && hs.expanders[i].thumb != el && !hs.expanders[i].onLoadStarted) {
1181			hs.expanders[i].cancelLoading();
1182		}
1183	}
1184	hs.expanders[key] = this;
1185	if (!hs.allowMultipleInstances && !hs.upcoming) {
1186		if (hs.expanders[key-1]) hs.expanders[key-1].close();
1187		if (typeof hs.focusKey != 'undefined' && hs.expanders[hs.focusKey])
1188			hs.expanders[hs.focusKey].close();
1189	}
1190	
1191	// initiate metrics
1192	this.el = el;
1193	this.tpos = hs.getPosition(el);
1194	hs.getPageSize();
1195	var x = this.x = new hs.Dimension(this, 'x');
1196	x.calcThumb();
1197	var y = this.y = new hs.Dimension(this, 'y');
1198	y.calcThumb();
1199	this.wrapper = hs.createElement(
1200		'div', {
1201			id: 'highslide-wrapper-'+ this.key,
1202			className: 'highslide-wrapper '+ this.wrapperClassName
1203		}, {
1204			visibility: 'hidden',
1205			position: 'absolute',
1206			zIndex: hs.zIndexCounter += 2
1207		}, null, true );
1208	
1209	this.wrapper.onmouseover = this.wrapper.onmouseout = hs.wrapperMouseHandler;
1210	if (this.contentType == 'image' && this.outlineWhileAnimating == 2)
1211		this.outlineWhileAnimating = 0;
1212	
1213	// get the outline
1214	if (!this.outlineType 
1215		|| (this.last && this.isImage && this.transitions[1] == 'crossfade')) {
1216		this[this.contentType +'Create']();
1217	
1218	} else if (hs.pendingOutlines[this.outlineType]) {
1219		this.connectOutline();
1220		this[this.contentType +'Create']();
1221	
1222	} else {
1223		this.showLoading();
1224		var exp = this;
1225		new hs.Outline(this.outlineType, 
1226			function () {
1227				exp.connectOutline();
1228				exp[exp.contentType +'Create']();
1229			} 
1230		);
1231	}
1232	return true;
1233};
1234
1235hs.Expander.prototype = {
1236error : function(e) {
1237	// alert ('Line '+ e.lineNumber +': '+ e.message);
1238	window.location.href = this.src;
1239},
1240
1241connectOutline : function() {
1242	var outline = this.outline = hs.pendingOutlines[this.outlineType];
1243	outline.exp = this;
1244	outline.table.style.zIndex = this.wrapper.style.zIndex - 1;
1245	hs.pendingOutlines[this.outlineType] = null;
1246},
1247
1248showLoading : function() {
1249	if (this.onLoadStarted || this.loading) return;
1250	
1251	this.loading = hs.loading;
1252	var exp = this;
1253	this.loading.onclick = function() {
1254		exp.cancelLoading();
1255	};
1256	var exp = this, 
1257		l = this.x.get('loadingPos') +'px',
1258		t = this.y.get('loadingPos') +'px';
1259	if (!tgt && this.last && this.transitions[1] == 'crossfade') 
1260		var tgt = this.last; 
1261	if (tgt) {
1262		l = tgt.x.get('loadingPosXfade') +'px';
1263		t = tgt.y.get('loadingPosXfade') +'px';
1264		this.loading.style.zIndex = hs.zIndexCounter++;
1265	}
1266	setTimeout(function () { 
1267		if (exp.loading) hs.setStyles(exp.loading, { left: l, top: t, zIndex: hs.zIndexCounter++ })}
1268	, 100);
1269},
1270
1271imageCreate : function() {
1272	var exp = this;
1273	
1274	var img = document.createElement('img');
1275    this.content = img;
1276    img.onload = function () {
1277    	if (hs.expanders[exp.key]) exp.contentLoaded(); 
1278	};
1279    if (hs.blockRightClick) img.oncontextmenu = function() { return false; };
1280    img.className = 'highslide-image';
1281    hs.setStyles(img, {
1282    	visibility: 'hidden',
1283    	display: 'block',
1284    	position: 'absolute',
1285		maxWidth: '9999px',
1286		zIndex: 3
1287	});
1288    img.title = hs.lang.restoreTitle;
1289    if (hs.safari) hs.container.appendChild(img);
1290    if (hs.ie && hs.flushImgSize) img.src = null;
1291	img.src = this.src;
1292	
1293	this.showLoading();
1294},
1295
1296contentLoaded : function() {
1297	try {	
1298		if (!this.content) return;
1299		this.content.onload = null;
1300		if (this.onLoadStarted) return;
1301		else this.onLoadStarted = true;
1302		
1303		var x = this.x, y = this.y;
1304		
1305		if (this.loading) {
1306			hs.setStyles(this.loading, { top: '-9999px' });
1307			this.loading = null;
1308		}	
1309			x.full = this.content.width;
1310			y.full = this.content.height;
1311			
1312			hs.setStyles(this.content, {
1313				width: x.t +'px',
1314				height: y.t +'px'
1315			});
1316			this.wrapper.appendChild(this.content);
1317			hs.container.appendChild(this.wrapper);
1318		
1319		x.calcBorders();
1320		y.calcBorders();
1321		
1322		hs.setStyles (this.wrapper, {
1323			left: (x.tpos + x.tb - x.cb) +'px',
1324			top: (y.tpos + x.tb - y.cb) +'px'
1325		});
1326		
1327		
1328		this.initSlideshow();
1329		this.getOverlays();
1330		
1331		var ratio = x.full / y.full;
1332		x.calcExpanded();
1333		this.justify(x);
1334		
1335		y.calcExpanded();
1336		this.justify(y);
1337		if (this.overlayBox) this.sizeOverlayBox(0, 1);
1338
1339		
1340		if (this.allowSizeReduction) {
1341				this.correctRatio(ratio);
1342			var ss = this.slideshow;			
1343			if (ss && this.last && ss.controls && ss.fixedControls) {
1344				var pos = ss.overlayOptions.position || '', p;
1345				for (var dim in hs.oPos) for (var i = 0; i < 5; i++) {
1346					p = this[dim];
1347					if (pos.match(hs.oPos[dim][i])) {
1348						p.pos = this.last[dim].pos 
1349							+ (this.last[dim].p1 - p.p1)
1350							+ (this.last[dim].size - p.size) * [0, 0, .5, 1, 1][i];
1351						if (ss.fixedControls == 'fit') {
1352							if (p.pos + p.size + p.p1 + p.p2 > p.scroll + p.clientSize - p.marginMax)
1353								p.pos = p.scroll + p.clientSize - p.size - p.marginMin - p.marginMax - p.p1 - p.p2;
1354							if (p.pos < p.scroll + p.marginMin) p.pos = p.scroll + p.marginMin; 
1355						} 
1356					}
1357				}
1358			}
1359			if (this.isImage && this.x.full > (this.x.imgSize || this.x.size)) {
1360				this.createFullExpand();
1361				if (this.overlays.length == 1) this.sizeOverlayBox();
1362			}
1363		}
1364		this.show();
1365		
1366	} catch (e) {
1367		this.error(e);
1368	}
1369},
1370
1371justify : function (p, moveOnly) {
1372	var tgtArr, tgt = p.target, dim = p == this.x ? 'x' : 'y';
1373	
1374	if (tgt && tgt.match(/ /)) {
1375		tgtArr = tgt.split(' ');
1376		tgt = tgtArr[0];
1377	}
1378	if (tgt && hs.$(tgt)) {
1379		p.pos = hs.getPosition(hs.$(tgt))[dim];
1380		if (tgtArr && tgtArr[1] && tgtArr[1].match(/^[-]?[0-9]+px$/)) 
1381			p.pos += parseInt(tgtArr[1]);
1382		if (p.size < p.minSize) p.size = p.minSize;
1383		
1384	} else if (p.justify == 'auto' || p.justify == 'center') {
1385	
1386		var hasMovedMin = false;
1387		
1388		var allowReduce = p.exp.allowSizeReduction;
1389		if (p.justify == 'center')
1390			p.pos = Math.round(p.scroll + (p.clientSize + p.marginMin - p.marginMax - p.get('wsize')) / 2);
1391		else
1392			p.pos = Math.round(p.pos - ((p.get('wsize') - p.t) / 2));
1393		if (p.pos < p.scroll + p.marginMin) {
1394			p.pos = p.scroll + p.marginMin;
1395			hasMovedMin = true;		
1396		}
1397		if (!moveOnly && p.size < p.minSize) {
1398			p.size = p.minSize;
1399			allowReduce = false;
1400		}
1401		if (p.pos + p.get('wsize') > p.scroll + p.clientSize - p.marginMax) {
1402			if (!moveOnly && hasMovedMin && allowReduce) {
1403				p.size = Math.min(p.size, p.get(dim == 'y' ? 'fitsize' : 'maxsize'));
1404			} else if (p.get('wsize') < p.get('fitsize')) {
1405				p.pos = p.scroll + p.clientSize - p.marginMax - p.get('wsize');
1406			} else { // image larger than viewport
1407				p.pos = p.scroll + p.marginMin;
1408				if (!moveOnly && allowReduce) p.size = p.get(dim == 'y' ? 'fitsize' : 'maxsize');
1409			}			
1410		}
1411		
1412		if (!moveOnly && p.size < p.minSize) {
1413			p.size = p.minSize;
1414			allowReduce = false;
1415		}
1416		
1417	
1418	} else if (p.justify == 'max') {
1419		p.pos = Math.floor(p.pos - p.size + p.t);
1420	}
1421	
1422		
1423	if (p.pos < p.marginMin) {
1424		var tmpMin = p.pos;
1425		p.pos = p.marginMin; 
1426		
1427		if (allowReduce && !moveOnly) p.size = p.size - (p.pos - tmpMin);
1428		
1429	}
1430},
1431
1432correctRatio : function(ratio) {
1433	var x = this.x, 
1434		y = this.y,
1435		changed = false,
1436		xSize = Math.min(x.full, x.size),
1437		ySize = Math.min(y.full, y.size),
1438		useBox = (this.useBox || hs.padToMinWidth);
1439	
1440	if (xSize / ySize > ratio) { // width greater
1441		xSize = ySize * ratio;
1442		if (xSize < x.minSize) { // below minWidth
1443			xSize = x.minSize;
1444			ySize = xSize / ratio;
1445		}
1446		changed = true;
1447	
1448	} else if (xSize / ySize < ratio) { // height greater
1449		ySize = xSize / ratio;
1450		changed = true;
1451	}
1452	
1453	if (hs.padToMinWidth && x.full < x.minSize) {
1454		x.imgSize = x.full;
1455		y.size = y.imgSize = y.full;
1456	} else if (this.useBox) {
1457		x.imgSize = xSize;
1458		y.imgSize = ySize;
1459	} else {
1460		x.size = xSize;
1461		y.size = ySize;
1462	}
1463	changed = this.fitOverlayBox(useBox ? null : ratio, changed);
1464	if (useBox && y.size < y.imgSize) {
1465		y.imgSize = y.size;
1466		x.imgSize = y.size * ratio;
1467	}
1468	if (changed || useBox) {
1469		x.pos = x.tpos - x.cb + x.tb;
1470		x.minSize = x.size;
1471		this.justify(x, true);
1472	
1473		y.pos = y.tpos - y.cb + y.tb;
1474		y.minSize = y.size;
1475		this.justify(y, true);
1476		if (this.overlayBox) this.sizeOverlayBox();
1477	}
1478},
1479fitOverlayBox : function(ratio, changed) {
1480	var x = this.x, y = this.y;
1481	if (this.overlayBox) {
1482		while (y.size > this.minHeight && x.size > this.minWidth 
1483				&&  y.get('wsize') > y.get('fitsize')) {
1484			y.size -= 10;
1485			if (ratio) x.size = y.size * ratio;
1486			this.sizeOverlayBox(0, 1);
1487			changed = true;
1488		}
1489	}
1490	return changed;
1491},
1492
1493show : function () {
1494	var x = this.x, y = this.y;
1495	this.doShowHide('hidden');
1496	if (this.slideshow && this.slideshow.thumbstrip) this.slideshow.thumbstrip.selectThumb();
1497	
1498	// Apply size change
1499	this.changeSize(
1500		1, {
1501			wrapper: {
1502				width : x.get('wsize'),
1503				height : y.get('wsize'),
1504				left: x.pos,
1505				top: y.pos
1506			},
1507			content: {
1508				left: x.p1 + x.get('imgPad'),
1509				top: y.p1 + y.get('imgPad'),
1510				width:x.imgSize ||x.size,
1511				height:y.imgSize ||y.size
1512			}
1513		},
1514		hs.expandDuration
1515	);
1516},
1517
1518changeSize : function(up, to, dur) {
1519	// transition
1520	var trans = this.transitions,
1521	other = up ? (this.last ? this.last.a : null) : hs.upcoming,
1522	t = (trans[1] && other 
1523			&& hs.getParam(other, 'transitions')[1] == trans[1]) ?
1524		trans[1] : trans[0];
1525		
1526	if (this[t] && t != 'expand') {
1527		this[t](up, to);
1528		return;
1529	}
1530	
1531	if (this.outline && !this.outlineWhileAnimating) {
1532		if (up) this.outline.setPosition();
1533		else this.outline.destroy();
1534	}
1535	
1536	
1537	if (!up) this.destroyOverlays();
1538	
1539	var exp = this,
1540		x = exp.x,
1541		y = exp.y,
1542		easing = this.easing;
1543	if (!up) easing = this.easingClose || easing;
1544	var after = up ?
1545		function() {
1546				
1547			if (exp.outline) exp.outline.table.style.visibility = "visible";
1548			setTimeout(function() {
1549				exp.afterExpand();
1550			}, 50);
1551		} :
1552		function() {
1553			exp.afterClose();
1554		};
1555	if (up) hs.setStyles( this.wrapper, {
1556		width: x.t +'px',
1557		height: y.t +'px'
1558	});
1559	if (this.fadeInOut) {
1560		hs.setStyles(this.wrapper, { opacity: up ? 0 : 1 });
1561		hs.extend(to.wrapper, { opacity: up });
1562	}
1563	hs.animate( this.wrapper, to.wrapper, {
1564		duration: dur,
1565		easing: easing,
1566		step: function(val, args) {
1567			if (exp.outline && exp.outlineWhileAnimating && args.prop == 'top') {
1568				var fac = up ? args.pos : 1 - args.pos;
1569				var pos = {
1570					w: x.t + (x.get('wsize') - x.t) * fac,
1571					h: y.t + (y.get('wsize') - y.t) * fac,
1572					x: x.tpos + (x.pos - x.tpos) * fac,
1573					y: y.tpos + (y.pos - y.tpos) * fac
1574				};
1575				exp.outline.setPosition(pos, 0, 1);				
1576			}
1577		}
1578	});
1579	hs.animate( this.content, to.content, dur, easing, after);
1580	if (up) {
1581		this.wrapper.style.visibility = 'visible';
1582		this.content.style.visibility = 'visible';
1583		this.a.className += ' highslide-active-anchor';
1584	}
1585},
1586
1587
1588
1589fade : function(up, to) {
1590	this.outlineWhileAnimating = false;
1591	var exp = this,	t = up ? hs.expandDuration : 0;
1592	
1593	if (up) {
1594		hs.animate(this.wrapper, to.wrapper, 0);
1595		hs.setStyles(this.wrapper, { opacity: 0, visibility: 'visible' });
1596		hs.animate(this.content, to.content, 0);
1597		this.content.style.visibility = 'visible';
1598
1599		hs.animate(this.wrapper, { opacity: 1 }, t, null, 
1600			function() { exp.afterExpand(); });
1601	}
1602	
1603	if (this.outline) {
1604		this.outline.table.style.zIndex = this.wrapper.style.zIndex;
1605		var dir = up || -1, 
1606			offset = this.outline.offset,
1607			startOff = up ? 3 : offset,
1608			endOff = up? offset : 3;
1609		for (var i = startOff; dir * i <= dir * endOff; i += dir, t += 25) {
1610			(function() {
1611				var o = up ? endOff - i : startOff - i;
1612				setTimeout(function() {
1613					exp.outline.setPosition(0, o, 1);
1614				}, t);
1615			})();
1616		}
1617	}
1618	
1619	
1620	if (up) {}//setTimeout(function() { exp.afterExpand(); }, t+50);
1621	else {
1622		setTimeout( function() {
1623			if (exp.outline) exp.outline.destroy(exp.preserveContent);
1624			
1625			exp.destroyOverlays();
1626	
1627			hs.animate( exp.wrapper, { opacity: 0 }, hs.restoreDuration, null, function(){
1628				exp.afterClose();
1629			});
1630		}, t);		
1631	}
1632},
1633crossfade : function (up, to, from) {
1634	if (!up) return;
1635	var exp = this, 
1636		last = this.last,
1637		x = this.x,
1638		y = this.y,
1639		lastX = last.x,
1640		lastY = last.y,
1641		wrapper = this.wrapper,
1642		content = this.content,
1643		overlayBox = this.overlayBox;
1644	hs.removeEventListener(document, 'mousemove', hs.dragHandler);
1645	
1646	hs.setStyles(content, { 
1647		width: (x.imgSize || x.size) +'px', 
1648		height: (y.imgSize || y.size) +'px'		
1649	});
1650	if (overlayBox) overlayBox.style.overflow = 'visible';
1651	this.outline = last.outline;
1652	if (this.outline) this.outline.exp = exp;
1653	last.outline = null;
1654	var fadeBox = hs.createElement('div', {
1655			className: 'highslide-image'
1656		}, { 
1657			position: 'absolute', 
1658			zIndex: 4,
1659			overflow: 'hidden',
1660			display: 'none'
1661		}
1662	);
1663	var names = { oldImg: last, newImg: this };
1664	for (var n in names) { 	
1665		this[n] = names[n].content.cloneNode(1);
1666		hs.setStyles(this[n], {
1667			position: 'absolute',
1668			border: 0,
1669			visibility: 'visible'
1670		});
1671		fadeBox.appendChild(this[n]);
1672	}
1673	wrapper.appendChild(fadeBox);
1674	if (overlayBox) {
1675		overlayBox.className = '';
1676		wrapper.appendChild(overlayBox);
1677	}
1678	fadeBox.style.display = '';
1679	last.content.style.display = 'none';
1680	
1681	
1682	if (hs.safari) {
1683		var match = navigator.userAgent.match(/Safari\/([0-9]{3})/);
1684		if (match && parseInt(match[1]) < 525) this.wrapper.style.visibility = 'visible';
1685	}
1686	hs.animate(wrapper, {
1687		width: x.size
1688	}, {
1689		duration: hs.transitionDuration, 
1690		step: function(val, args) {
1691			var pos = args.pos,
1692				invPos = 1 - pos;
1693			var prop,
1694				size = {}, 
1695				props = ['pos', 'size', 'p1', 'p2'];
1696			for (var n in props) {
1697				prop = props[n];
1698				size['x'+ prop] = Math.round(invPos * lastX[prop] + pos * x[prop]);
1699				size['y'+ prop] = Math.round(invPos * lastY[prop] + pos * y[prop]);
1700				size.ximgSize = Math.round(
1701					invPos * (lastX.imgSize || lastX.size) + pos * (x.imgSize || x.size));
1702				size.ximgPad = Math.round(invPos * lastX.get('imgPad') + pos * x.get('imgPad'));
1703				size.yimgSize = Math.round(
1704					invPos * (lastY.imgSize || lastY.size) + pos * (y.imgSize || y.size));
1705				size.yimgPad = Math.round(invPos * lastY.get('imgPad') + pos * y.get('imgPad'));
1706			}
1707			if (exp.outline) exp.outline.setPosition({ 
1708				x: size.xpos, 
1709				y: size.ypos, 
1710				w: size.xsize + size.xp1 + size.xp2 + 2 * x.cb, 
1711				h: size.ysize + size.yp1 + size.yp2 + 2 * y.cb
1712			});
1713			last.wrapper.style.clip = 'rect('
1714				+ (size.ypos - lastY.pos)+'px, '
1715				+ (size.xsize + size.xp1 + size.xp2 + size.xpos + 2 * lastX.cb - lastX.pos) +'px, '
1716				+ (size.ysize + size.yp1 + size.yp2 + size.ypos + 2 * lastY.cb - lastY.pos) +'px, '
1717				+ (size.xpos - lastX.pos)+'px)';
1718				
1719			hs.setStyles(content, {
1720				top: (size.yp1 + y.get('imgPad')) +'px',
1721				left: (size.xp1 + x.get('imgPad')) +'px',
1722				marginTop: (y.pos - size.ypos) +'px',
1723				marginLeft: (x.pos - size.xpos) +'px'
1724			});
1725			hs.setStyles(wrapper, {
1726				top: size.ypos +'px',
1727				left: size.xpos +'px',
1728				width: (size.xp1 + size.xp2 + size.xsize + 2 * x.cb)+ 'px',
1729				height: (size.yp1 + size.yp2 + size.ysize + 2 * y.cb) + 'px'
1730			});
1731			hs.setStyles(fadeBox, {
1732				width: (size.ximgSize || size.xsize) + 'px',
1733				height: (size.yimgSize || size.ysize) +'px',
1734				left: (size.xp1 + size.ximgPad)  +'px',
1735				top: (size.yp1 + size.yimgPad) +'px',
1736				visibility: 'visible'
1737			});
1738			
1739			hs.setStyles(exp.oldImg, {
1740				top: (lastY.pos - size.ypos + lastY.p1 - size.yp1 + lastY.get('imgPad') - size.yimgPad)+'px',
1741				left: (lastX.pos - size.xpos + lastX.p1 - size.xp1 + lastX.get('imgPad') - size.ximgPad)+'px'
1742			});		
1743			
1744			hs.setStyles(exp.newImg, {
1745				opacity: pos,
1746				top: (y.pos - size.ypos + y.p1 - size.yp1 + y.get('imgPad') - size.yimgPad) +'px',
1747				left: (x.pos - size.xpos + x.p1 - size.xp1 + x.get('imgPad') - size.ximgPad) +'px'
1748			});
1749			if (overlayBox) hs.setStyles(overlayBox, {
1750				width: size.xsize + 'px',
1751				height: size.ysize +'px',
1752				left: (size.xp1 + x.cb)  +'px',
1753				top: (size.yp1 + y.cb) +'px'
1754			});
1755		},
1756		complete: function () {
1757			wrapper.style.visibility = content.style.visibility = 'visible';
1758			content.style.display = 'block';
1759			fadeBox.style.display = 'none';
1760			exp.a.className += ' highslide-active-anchor';
1761			exp.afterExpand();
1762			last.afterClose();
1763			exp.last = null;
1764		}
1765		
1766	});
1767},
1768reuseOverlay : function(o, el) {
1769	if (!this.last) return false;
1770	for (var i = 0; i < this.last.overlays.length; i++) {
1771		var oDiv = hs.$('hsId'+ this.last.overlays[i]);
1772		if (oDiv && oDiv.hsId == o.hsId) {
1773			this.genOverlayBox();
1774			oDiv.reuse = this.key;
1775			hs.push(this.overlays, this.last.overlays[i]);
1776			return true;
1777		}
1778	}
1779	return false;
1780},
1781
1782
1783afterExpand : function() {
1784	this.isExpanded = true;	
1785	this.focus();
1786	if (this.dimmingOpacity) hs.dim(this);
1787	if (hs.upcoming && hs.upcoming == this.a) hs.upcoming = null;
1788	this.prepareNextOutline();
1789	var p = hs.page, mX = hs.mouse.x + p.scrollLeft, mY = hs.mouse.y + p.scrollTop;
1790	this.mouseIsOver = this.x.pos < mX && mX < this.x.pos + this.x.get('wsize')
1791		&& this.y.pos < mY && mY < this.y.pos + this.y.get('wsize');	
1792	if (this.overlayBox) this.showOverlays();
1793	
1794},
1795
1796
1797prepareNextOutline : function() {
1798	var key = this.key;
1799	var outlineType = this.outlineType;
1800	new hs.Outline(outlineType, 
1801		function () { try { hs.expanders[key].preloadNext(); } catch (e) {} });
1802},
1803
1804
1805preloadNext : function() {
1806	var next = this.getAdjacentAnchor(1);
1807	if (next && next.onclick.toString().match(/hs\.expand/)) 
1808		var img = hs.createElement('img', { src: hs.getSrc(next) });
1809},
1810
1811
1812getAdjacentAnchor : function(op) {
1813	var current = this.getAnchorIndex(), as = hs.anchors.groups[this.slideshowGroup || 'none'];
1814	
1815	/*< ? if ($cfg->slideshow) : ?>s*/
1816	if (!as[current + op] && this.slideshow && this.slideshow.repeat) {
1817		if (op == 1) return as[0];
1818		else if (op == -1) return as[as.length-1];
1819	}
1820	/*< ? endif ?>s*/
1821	return as[current + op] || null;
1822},
1823
1824getAnchorIndex : function() {
1825	var arr = hs.getAnchors().groups[this.slideshowGroup || 'none'];
1826	if (arr) for (var i = 0; i < arr.length; i++) {
1827		if (arr[i] == this.a) return i; 
1828	}
1829	return null;
1830},
1831
1832
1833getNumber : function() {
1834	if (this[this.numberPosition]) {
1835		var arr = hs.anchors.groups[this.slideshowGroup || 'none'];
1836		if (arr) {
1837			var s = hs.lang.number.replace('%1', this.getAnchorIndex() + 1).replace('%2', arr.length);
1838			this[this.numberPosition].innerHTML = 
1839				'<div class="highslide-number">'+ s +'</div>'+ this[this.numberPosition].innerHTML;
1840		}
1841	}
1842},
1843initSlideshow : function() {
1844	if (!this.last) {
1845		for (var i = 0; i < hs.slideshows.length; i++) {
1846			var ss = hs.slideshows[i], sg = ss.slideshowGroup;
1847			if (typeof sg == 'undefined' || sg === null || sg === this.slideshowGroup) 
1848				this.slideshow = new hs.Slideshow(this.key, ss);
1849		} 
1850	} else {
1851		this.slideshow = this.last.slideshow;
1852	}
1853	var ss = this.slideshow;
1854	if (!ss) return;
1855	var key = ss.expKey = this.key;
1856	
1857	ss.checkFirstAndLast();
1858	ss.disable('full-expand');
1859	if (ss.controls) {
1860		var o = ss.overlayOptions || {};
1861		o.overlayId = ss.controls;
1862		o.hsId = 'controls';		
1863		this.createOverlay(o);
1864	}
1865	if (ss.thumbstrip) ss.thumbstrip.add(this);
1866	if (!this.last && this.autoplay) ss.play(true);
1867	if (ss.autoplay) {
1868		ss.autoplay = setTimeout(function() {
1869			hs.next(key);
1870		}, (ss.interval || 500));
1871	}
1872},
1873
1874cancelLoading : function() {
1875	hs.discardElement (this.wrapper);
1876	hs.expanders[this.key] = null;
1877	if (hs.upcoming == this.a) hs.upcoming = null;
1878	hs.undim(this.key);
1879	if (this.loading) hs.loading.style.left = '-9999px';
1880},
1881
1882writeCredits : function () {
1883	if (this.credits) return;
1884	this.credits = hs.createElement('a', {
1885		href: hs.creditsHref,
1886		target: hs.creditsTarget,
1887		className: 'highslide-credits',
1888		innerHTML: hs.lang.creditsText,
1889		title: hs.lang.creditsTitle
1890	});
1891	this.createOverlay({ 
1892		overlayId: this.credits, 
1893		position: this.creditsPosition || 'top left', 
1894		hsId: 'credits' 
1895	});
1896},
1897
1898getInline : function(types, addOverlay) {
1899	for (var i = 0; i < types.length; i++) {
1900		var type = types[i], s = null;
1901		if (!this[type +'Id'] && this.thumbsUserSetId)  
1902			this[type +'Id'] = type +'-for-'+ this.thumbsUserSetId;
1903		if (this[type +'Id']) this[type] = hs.getNode(this[type +'Id']);
1904		if (!this[type] && !this[type +'Text'] && this[type +'Eval']) try {
1905			s = eval(this[type +'Eval']);
1906		} catch (e) {}
1907		if (!this[type] && this[type +'Text']) {
1908			s = this[type +'Text'];
1909		}
1910		if (!this[type] && !s) {
1911			this[type] = hs.getNode(this.a['_'+ type + 'Id']);
1912			if (!this[type]) {
1913				var next = this.a.nextSibling;
1914				while (next && !hs.isHsAnchor(next)) {
1915					if ((new RegExp('highslide-'+ type)).test(next.className || null)) {
1916						if (!next.id) this.a['_'+ type + 'Id'] = next.id = 'hsId'+ hs.idCounter++;
1917						this[type] = hs.getNode(next.id);
1918						break;
1919					}
1920					next = next.nextSibling;
1921				}
1922			}
1923		}
1924		if (!this[type] && !s && this.numberPosition == type) s = '\n';
1925		
1926		if (!this[type] && s) this[type] = hs.createElement('div', 
1927				{ className: 'highslide-'+ type, innerHTML: s } );
1928		
1929		if (addOverlay && this[type]) {
1930			var o = { position: (type == 'heading') ? 'above' : 'below' };
1931			for (var x in this[type+'Overlay']) o[x] = this[type+'Overlay'][x];
1932			o.overlayId = this[type];
1933			this.createOverlay(o);
1934		}
1935	}
1936},
1937
1938
1939// on end move and resize
1940doShowHide : function(visibility) {
1941	if (hs.hideSelects) this.showHideElements('SELECT', visibility);
1942	if (hs.hideIframes) this.showHideElements('IFRAME', visibility);
1943	if (hs.geckoMac) this.showHideElements('*', visibility);
1944},
1945showHideElements : function (tagName, visibility) {
1946	var els = document.getElementsByTagName(tagName);
1947	var prop = tagName == '*' ? 'overflow' : 'visibility';
1948	for (var i = 0; i < els.length; i++) {
1949		if (prop == 'visibility' || (document.defaultView.getComputedStyle(
1950				els[i], "").getPropertyValue('overflow') == 'auto'
1951				|| els[i].getAttribute('hidden-by') != null)) {
1952			var hiddenBy = els[i].getAttribute('hidden-by');
1953			if (visibility == 'visible' && hiddenBy) {
1954				hiddenBy = hiddenBy.replace('['+ this.key +']', '');
1955				els[i].setAttribute('hidden-by', hiddenBy);
1956				if (!hiddenBy) els[i].style[prop] = els[i].origProp;
1957			} else if (visibility == 'hidden') { // hide if behind
1958				var elPos = hs.getPosition(els[i]);
1959				elPos.w = els[i].offsetWidth;
1960				elPos.h = els[i].offsetHeight;
1961				if (!this.dimmingOpacity) { // hide all if dimming
1962				
1963					var clearsX = (elPos.x + elPos.w < this.x.get('opos') 
1964						|| elPos.x > this.x.get('opos') + this.x.get('osize'));
1965					var clearsY = (elPos.y + elPos.h < this.y.get('opos') 
1966						|| elPos.y > this.y.get('opos') + this.y.get('osize'));
1967				}
1968				var wrapperKey = hs.getWrapperKey(els[i]);
1969				if (!clearsX && !clearsY && wrapperKey != this.key) { // element falls behind image
1970					if (!hiddenBy) {
1971						els[i].setAttribute('hidden-by', '['+ this.key +']');
1972						els[i].origProp = els[i].style[prop];
1973						els[i].style[prop] = 'hidden';
1974						
1975					} else if (hiddenBy.indexOf('['+ this.key +']') == -1) {
1976						els[i].setAttribute('hidden-by', hiddenBy + '['+ this.key +']');
1977					}
1978				} else if ((hiddenBy == '['+ this.key +']' || hs.focusKey == wrapperKey)
1979						&& wrapperKey != this.key) { // on move
1980					els[i].setAttribute('hidden-by', '');
1981					els[i].style[prop] = els[i].origProp || '';
1982				} else if (hiddenBy && hiddenBy.indexOf('['+ this.key +']') > -1) {
1983					els[i].setAttribute('hidden-by', hiddenBy.replace('['+ this.key +']', ''));
1984				}
1985						
1986			}
1987		}
1988	}
1989},
1990
1991focus : function() {
1992	this.wrapper.style.zIndex = hs.zIndexCounter += 2;
1993	// blur others
1994	for (var i = 0; i < hs.expanders.length; i++) {
1995		if (hs.expanders[i] && i == hs.focusKey) {
1996			var blurExp = hs.expanders[i];
1997			blurExp.content.className += ' highslide-'+ blurExp.contentType +'-blur';
1998				blurExp.content.style.cursor = hs.ie ? 'hand' : 'pointer';
1999				blurExp.content.title = hs.lang.focusTitle;
2000		}
2001	}
2002	
2003	// focus this
2004	if (this.outline) this.outline.table.style.zIndex 
2005		= this.wrapper.style.zIndex - 1;
2006	this.content.className = 'highslide-'+ this.contentType;
2007		this.content.title = hs.lang.restoreTitle;
2008		
2009		if (hs.restoreCursor) {
2010			hs.styleRestoreCursor = window.opera ? 'pointer' : 'url('+ hs.graphicsDir + hs.restoreCursor +'), pointer';
2011			if (hs.ie && hs.uaVersion < 6) hs.styleRestoreCursor = 'hand';
2012			this.content.style.cursor = hs.styleRestoreCursor;
2013		}
2014		
2015	hs.focusKey = this.key;	
2016	hs.addEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler);	
2017},
2018moveTo: function(x, y) {
2019	this.x.setPos(x);
2020	this.y.setPos(y);
2021},
2022resize : function (e) {
2023	var w, h, r = e.width / e.height;
2024	w = Math.max(e.width + e.dX, Math.min(this.minWidth, this.x.full));
2025	if (this.isImage && Math.abs(w - this.x.full) < 12) w = this.x.full;
2026	h = w / r;
2027	if (h < Math.min(this.minHeight, this.y.full)) {
2028		h = Math.min(this.minHeight, this.y.full);
2029		if (this.isImage) w = h * r;
2030	}
2031	this.resizeTo(w, h);
2032},
2033resizeTo: function(w, h) {
2034	this.y.setSize(h);
2035	this.x.setSize(w);
2036	this.wrapper.style.height = this.y.get('wsize') +'px';
2037},
2038
2039close : function() {
2040	if (this.isClosing || !this.isExpanded) return;
2041	if (this.transitions[1] == 'crossfade' && hs.upcoming) {
2042		hs.getExpander(hs.upcoming).cancelLoading();
2043		hs.upcoming = null;
2044	}
2045	this.isClosing = true;
2046	if (this.slideshow && !hs.upcoming) this.slideshow.pause();
2047	
2048	hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler);
2049	
2050	try {
2051		this.content.style.cursor = 'default';
2052		this.changeSize(
2053			0, {
2054				wrapper: {
2055					width : this.x.t,
2056					height : this.y.t,
2057					left: this.x.tpos - this.x.cb + this.x.tb,
2058					top: this.y.tpos - this.y.cb + this.y.tb
2059				},
2060				content: {
2061					left: 0,
2062					top: 0,
2063					width: this.x.t,
2064					height: this.y.t
2065				}
2066			}, hs.restoreDuration
2067		);
2068	} catch (e) { this.afterClose(); }
2069},
2070
2071createOverlay : function (o) {
2072	var el = o.overlayId, 
2073		relToVP = (o.relativeTo == 'viewport' && !/panel$/.test(o.position));
2074	if (typeof el == 'string') el = hs.getNode(el);
2075	if (o.html) el = hs.createElement('div', { innerHTML: o.html });
2076	if (!el || typeof el == 'string') return;
2077	el.style.display = 'block';
2078	o.hsId = o.hsId || o.overlayId; 
2079	if (this.transitions[1] == 'crossfade' && this.reuseOverlay(o, el)) return;
2080	this.genOverlayBox();
2081	var width = o.width && /^[0-9]+(px|%)$/.test(o.width) ? o.width : 'auto';
2082	if (/^(left|right)panel$/.test(o.position) && !/^[0-9]+px$/.test(o.width)) width = '200px';
2083	var overlay = hs.createElement(
2084		'div', {
2085			id: 'hsId'+ hs.idCounter++,
2086			hsId: o.hsId
2087		}, {
2088			position: 'absolute',
2089			visibility: 'hidden',
2090			width: width,
2091			direction: hs.lang.cssDirection || '',
2092			opacity: 0
2093		},
2094		relToVP ? hs.viewport :this.overlayBox,
2095		true
2096	);
2097	if (relToVP) overlay.hsKey = this.key;
2098	
2099	overlay.appendChild(el);
2100	hs.extend(overlay, {
2101		opacity: 1,
2102		offsetX: 0,
2103		offsetY: 0,
2104		dur: (o.fade === 0 || o.fade === false || (o.fade == 2 && hs.ie)) ? 0 : 250
2105	});
2106	hs.extend(overlay, o);
2107		
2108	if (this.gotOverlays) {
2109		this.positionOverlay(overlay);
2110		if (!overlay.hideOnMouseOut || this.mouseIsOver) 
2111			hs.animate(overlay, { opacity: overlay.opacity }, overlay.dur);
2112	}
2113	hs.push(this.overlays, hs.idCounter - 1);
2114},
2115positionOverlay : function(overlay) {
2116	var p = overlay.position || 'middle center',
2117		relToVP = (overlay.relativeTo == 'viewport'),
2118		offX = overlay.offsetX,
2119		offY = overlay.offsetY;
2120	if (relToVP) {
2121		hs.viewport.style.display = 'block';
2122		overlay.hsKey = this.key;
2123		if (overlay.offsetWidth > overlay.parentNode.offsetWidth)
2124			overlay.style.width = '100%';
2125	} else
2126	if (overlay.parentNode != this.overlayBox) this.overlayBox.appendChild(overlay);
2127	if (/left$/.test(p)) overlay.style.left = offX +'px'; 
2128	
2129	if (/center$/.test(p))	hs.setStyles (overlay, { 
2130		left: '50%',
2131		marginLeft: (offX - Math.round(overlay.offsetWidth / 2)) +'px'
2132	});	
2133	
2134	if (/right$/.test(p)) overlay.style.right = - offX +'px';
2135		
2136	if (/^leftpanel$/.test(p)) { 
2137		hs.setStyles(overlay, {
2138			right: '100%',
2139			marginRight: this.x.cb +'px',
2140			top: - this.y.cb +'px',
2141			bottom: - this.y.cb +'px',
2142			overflow: 'auto'
2143		});		 
2144		this.x.p1 = overlay.offsetWidth;
2145	
2146	} else if (/^rightpanel$/.test(p)) {
2147		hs.setStyles(overlay, {
2148			left: '100%',
2149			marginLeft: this.x.cb +'px',
2150			top: - this.y.cb +'px',
2151			bottom: - this.y.cb +'px',
2152			overflow: 'auto'
2153		});
2154		this.x.p2 = overlay.offsetWidth;
2155	}
2156	var parOff = overlay.parentNode.offsetHeight;
2157	overlay.style.height = 'auto';
2158	if (relToVP && overlay.offsetHeight > parOff)
2159		overlay.style.height = hs.ieLt7 ? parOff +'px' : '100%';
2160
2161	if (/^top/.test(p)) overlay.style.top = offY +'px'; 
2162	if (/^middle/.test(p))	hs.setStyles (overlay, { 
2163		top: '50%', 
2164		marginTop: (offY - Math.round(overlay.offsetHeight / 2)) +'px'
2165	});	
2166	if (/^bottom/.test(p)) overlay.style.bottom = - offY +'px';
2167	if (/^above$/.test(p)) {
2168		hs.setStyles(overlay, {
2169			left: (- this.x.p1 - this.x.cb) +'px',
2170			right: (- this.x.p2 - this.x.cb) +'px',
2171			bottom: '100%',
2172			marginBottom: this.y.cb +'px',
2173			width: 'auto'
2174		});
2175		this.y.p1 = overlay.offsetHeight;
2176	
2177	} else if (/^below$/.test(p)) {
2178		hs.setStyles(overlay, {
2179			position: 'relative',
2180			left: (- this.x.p1 - this.x.cb) +'px',
2181			right: (- this.x.p2 - this.x.cb) +'px',
2182			top: '100%',
2183			marginTop: this.y.cb +'px',
2184			width: 'auto'
2185		});
2186		this.y.p2 = overlay.offsetHeight;
2187		overlay.style.position = 'absolute';
2188	}
2189},
2190
2191getOverlays : function() {	
2192	this.getInline(['heading', 'caption'], true);
2193	this.getNumber();
2194	if (this.heading && this.dragByHeading) this.heading.className += ' highsli
2194de-move';
2195	if (hs.showCredits) this.writeCredits();
2196	for (var i = 0; i < hs.overlays.length; i++) {
2197		var o = hs.overlays[i], tId = o.thumbnailId, sg = o.slideshowGroup;
2198		if ((!tId && !sg) || (tId && tId == this.thumbsUserSetId)
2199				|| (sg && sg === this.slideshowGroup)) {
2200			this.createOverlay(o);
2201		}
2202	}
2203	var os = [];
2204	for (var i = 0; i < this.overlays.length; i++) {
2205		var o = hs.$('hsId'+ this.overlays[i]);
2206		if (/panel$/.test(o.position)) this.positionOverlay(o);
2207		else hs.push(os, o);
2208	}
2209	for (var i = 0; i < os.length; i++) this.positionOverlay(os[i]);
2210	this.gotOverlays = true;
2211},
2212genOverlayBox : function() {
2213	if (!this.overlayBox) this.overlayBox = hs.createElement (
2214		'div', {
2215			className: this.wrapperClassName
2216		}, {
2217			position : 'absolute',
2218			width: (this.x.size || (this.useBox ? this.width : null) 
2219				|| this.x.full) +'px',
2220			height: (this.y.size || this.y.full) +'px',
2221			visibility : 'hidden',
2222			overflow : 'hidden',
2223			zIndex : hs.ie ? 4 : 'auto'
2224		},
2225		hs.container,
2226		true
2227	);
2228},
2229sizeOverlayBox : function(doWrapper, doPanels) {
2230	var overlayBox = this.overlayBox, 
2231		x = this.x,
2232		y = this.y;
2233	hs.setStyles( overlayBox, {
2234		width: x.size +'px', 
2235		height: y.size +'px'
2236	});
2237	if (doWrapper || doPanels) {
2238		for (var i = 0; i < this.overlays.length; i++) {
2239			var o = hs.$('hsId'+ this.overlays[i]);
2240			var ie6 = (hs.ieLt7 || document.compatMode == 'BackCompat');
2241			if (o && /^(above|below)$/.test(o.position)) {
2242				if (ie6) {
2243					o.style.width = (overlayBox.offsetWidth + 2 * x.cb
2244						+ x.p1 + x.p2) +'px';
2245				}
2246				y[o.position == 'above' ? 'p1' : 'p2'] = o.offsetHeight;
2247			}
2248			if (o && ie6 && /^(left|right)panel$/.test(o.position)) {
2249				o.style.height = (overlayBox.offsetHeight + 2* y.cb) +'px';
2250			}
2251		}
2252	}
2253	if (doWrapper) {
2254		hs.setStyles(this.content, {
2255			top: y.p1 +'px'
2256		});
2257		hs.setStyles(overlayBox, {
2258			top: (y.p1 + y.cb) +'px'
2259		});
2260	}
2261},
2262
2263showOverlays : function() {
2264	var b = this.overlayBox;
2265	b.className = '';
2266	hs.setStyles(b, {
2267		top: (this.y.p1 + this.y.cb) +'px',
2268		left: (this.x.p1 + this.x.cb) +'px',
2269		overflow : 'visible'
2270	});
2271	if (hs.safari) b.style.visibility = 'visible';
2272	this.wrapper.appendChild (b);
2273	for (var i = 0; i < this.overlays.length; i++) {
2274		var o = hs.$('hsId'+ this.overlays[i]);
2275		o.style.zIndex = o.hsId == 'controls' ? 5 : 4;
2276		if (!o.hideOnMouseOut || this.mouseIsOver) {
2277			o.style.visibility = 'visible';
2278			hs.setStyles(o, { visibility: 'visible', display: '' });
2279			hs.animate(o, { opacity: o.opacity }, o.dur);
2280		}
2281	}
2282},
2283
2284destroyOverlays : function() {
2285	if (!this.overlays.length) return;
2286	if (this.slideshow) {
2287		var c = this.slideshow.controls;
2288		if (c && hs.getExpander(c) == this) c.parentNode.removeChild(c);
2289	}
2290	for (var i = 0; i < this.overlays.length; i++) {
2291		var o = hs.$('hsId'+ this.overlays[i]);
2292		if (o && o.parentNode == hs.viewport && hs.getExpander(o) == this) hs.discardElement(o);
2293	}
2294	hs.discardElement(this.overlayBox);
2295},
2296
2297
2298
2299createFullExpand : function () {
2300	if (this.slideshow && this.slideshow.controls) {
2301		this.slideshow.enable('full-expand');
2302		return;
2303	}
2304	this.fullExpandLabel = hs.createElement(
2305		'a', {
2306			href: 'javascript:hs.expanders['+ this.key +'].doFullExpand();',
2307			title: hs.lang.fullExpandTitle,
2308			className: 'highslide-full-expand'
2309		}
2310	);
2311	
2312	this.createOverlay({ 
2313		overlayId: this.fullExpandLabel, 
2314		position: hs.fullExpandPosition, 
2315		hideOnMouseOut: true, 
2316		opacity: hs.fullExpandOpacity
2317	});
2318},
2319
2320doFullExpand : function () {
2321	try {
2322		if (this.fullExpandLabel) hs.discardElement(this.fullExpandLabel);
2323		
2324		this.focus();
2325		var xSize = this.x.size;
2326		this.resizeTo(this.x.full, this.y.full);
2327		
2328		var xpos = this.x.pos - (this.x.size - xSize) / 2;
2329		if (xpos < hs.marginLeft) xpos = hs.marginLeft;
2330		
2331		this.moveTo(xpos, this.y.pos);
2332		this.doShowHide('hidden');
2333	
2334	} catch (e) {
2335		this.error(e);
2336	}
2337},
2338
2339
2340afterClose : function () {
2341	this.a.className = this.a.className.replace('highslide-active-anchor', '');
2342	
2343	this.doShowHide('visible');
2344		if (this.outline && this.outlineWhileAnimating) this.outline.destroy();
2345	
2346		hs.discardElement(this.wrapper);
2347	this.destroyOverlays();
2348	if (!hs.viewport.childNodes.length) hs.viewport.style.display = 'none';
2349	
2350	if (this.dimmingOpacity) hs.undim(this.key);
2351	hs.expanders[this.key] = null;		
2352	hs.reOrder();
2353}
2354
2355};
2356
2357
2358hs.Slideshow = function (expKey, options) {
2359	if (hs.dynamicallyUpdateAnchors !== false) hs.updateAnchors();
2360	this.expKey = expKey;
2361	for (var x in options) this[x] = options[x];
2362	if (this.useControls) this.getControls();
2363	if (this.thumbstrip) this.thumbstrip = hs.Thumbstrip(this);
2364};
2365hs.Slideshow.prototype = {
2366getControls: function() {
2367	this.controls = hs.createElement('div', { innerHTML: hs.replaceLang(hs.skin.controls) }, 
2368		null, hs.container);
2369	
2370	var buttons = ['play', 'pause', 'previous', 'next', 'move', 'full-expand', 'close'];
2371	this.btn = {};
2372	var pThis = this;
2373	for (var i = 0; i < buttons.length; i++) {
2374		this.btn[buttons[i]] = hs.getElementByClass(this.controls, 'li', 'highslide-'+ buttons[i]);
2375		this.enable(buttons[i]);
2376	}
2377	this.btn.pause.style.display = 'none';
2378	//this.disable('full-expand');
2379},
2380checkFirstAndLast: function() {
2381	if (this.repeat || !this.controls) return;
2382	var exp = hs.expanders[this.expKey],
2383		cur = exp.getAnchorIndex(), 
2384		re = /disabled$/;
2385	if (cur == 0) 
2386		this.disable('previous');
2387	else if (re.test(this.btn.previous.getElementsByTagName('a')[0].className))
2388		this.enable('previous');
2389	if (cur + 1 == hs.anchors.groups[exp.slideshowGroup || 'none'].length) {
2390		this.disable('next');
2391		this.disable('play');
2392	} else if (re.test(this.btn.next.getElementsByTagName('a')[0].className)) {
2393		this.enable('next');
2394		this.enable('play');
2395	}
2396},
2397enable: function(btn) {
2398	if (!this.btn) return;
2399	var sls = this, a = this.btn[btn].getElementsByTagName('a')[0], re = /disabled$/;
2400	a.onclick = function() {
2401		sls[btn]();
2402		return false;
2403	};
2404	if (re.test(a.className)) a.className = a.className.replace(re, '');
2405},
2406disable: function(btn) {
2407	if (!this.btn) return;
2408	var a = this.btn[btn].getElementsByTagName('a')[0];
2409	a.onclick = function() { return false; };
2410	if (!/disabled$/.test(a.className)) a.className += ' disabled';
2411},
2412hitSpace: function() {
2413	if (this.autoplay) this.pause();
2414	else this.play();
2415},
2416play: function(wait) {
2417	if (this.btn) {
2418		this.btn.play.style.display = 'none';
2419		this.btn.pause.style.display = '';
2420	}
2421	
2422	this.autoplay = true;	
2423	if (!wait) hs.next(this.expKey);
2424},
2425pause: function() {
2426	if (this.btn) {
2427		this.btn.pause.style.display = 'none';
2428		this.btn.play.style.display = '';
2429	}
2430	
2431	clearTimeout(this.autoplay);
2432	this.autoplay = null;
2433},
2434previous: function() {
2435	this.pause();
2436	hs.previous(this.btn.previous);
2437},
2438next: function() {
2439	this.pause();
2440	hs.next(this.btn.next);
2441},
2442move: function() {},
2443'full-expand': function() {
2444	hs.getExpander().doFullExpand();
2445},
2446close: function() {
2447	hs.close(this.btn.close);
2448}
2449};
2450hs.Thumbstrip = function(slideshow) {
2451	function add (exp) {
2452		hs.extend(options || {}, {
2453			overlayId: dom,
2454			hsId: 'thumbstrip',
2455			className: 'highslide-thumbstrip-'+ mode +'-overlay ' + (options.className || '')
2456		});
2457		if (hs.ieLt7) options.fade = 0;
2458		exp.createOverlay(options);
2459		hs.setStyles(dom.parentNode, { overflow: 'hidden' });
2460	};
2461	
2462	function scroll (delta) {	
2463		selectThumb(undefined, Math.round(delta * dom[isX ? 'offsetWidth' : 'offsetHeight'] * 0.7));
2464	};
2465	
2466	function selectThumb (i, scrollBy) {
2467		if (i === undefined) for (var j = 0; j < group.length; j++) {
2468			if (group[j] == hs.expanders[slideshow.expKey].a) {
2469				i = j;
2470				break;
2471			}
2472		}
2473		if (i === undefined) return;
2474		var as = dom.getElementsByTagName('a'),
2475			active = as[i],
2476			cell = active.parentNode,
2477			left = isX ? 'Left' : 'Top',
2478			right = isX ? 'Right' : 'Bottom',
2479			width = isX ? 'Width' : 'Height',
2480			offsetLeft = 'offset' + left,
2481			offsetWidth = 'offset' + width,
2482			overlayWidth = div.parentNode.parentNode[offsetWidth],
2483			minTblPos = overlayWidth - table[offsetWidth],
2484			curTblPos = parseInt(table.style[isX ? 'left' : 'top']) || 0,
2485			tblPos = curTblPos,
2486			mgnRight = 20;
2487		if (scrollBy !== undefined) {
2488			tblPos = curTblPos - scrollBy;
2489			
2490			if (minTblPos > 0) minTblPos = 0;
2491			if (tblPos > 0) tblPos = 0;
2492			if (tblPos < minTblPos) tblPos = minTblPos;
2493			
2494	
2495		} else {
2496			for (var j = 0; j < as.length; j++) as[j].className = '';
2497			active.className = 'highslide-active-anchor';
2498			var activeLeft = i > 0 ? as[i - 1].parentNode[offsetLeft] : cell[offsetLeft],
2499				activeRight = cell[offsetLeft] + cell[offsetWidth] + 
2500					(as[i + 1] ? as[i + 1].parentNode[offsetWidth] : 0);
2501			if (activeRight > overlayWidth - curTblPos) tblPos = overlayWidth - activeRight;
2502			else if (activeLeft < -curTblPos) tblPos = -activeLeft;
2503		}
2504		var markerPos = cell[offsetLeft] + (cell[offsetWidth] - marker[offsetWidth]) / 2 + tblPos;
2505		hs.animate(table, isX ? { left: tblPos } : { top: tblPos }, null, 'easeOutQuad');
2506		hs.animate(marker, isX ? { left: markerPos } : { top: markerPos }, null, 'easeOutQuad');
2507		scrollUp.style.display = tblPos < 0 ? 'block' : 'none';
2508		scrollDown.style.display = (tblPos > minTblPos)  ? 'block' : 'none';
2509		
2510	};
2511	
2512
2513	// initialize
2514	var group = hs.anchors.groups[hs.expanders[slideshow.expKey].slideshowGroup || 'none'],
2515		options = slideshow.thumbstrip,
2516		mode = options.mode || 'horizontal',
2517		floatMode = (mode == 'float'),
2518		tree = floatMode ? ['div', 'ul', 'li', 'span'] : ['table', 'tbody', 'tr', 'td'],
2519		isX = (mode == 'horizontal'),
2520		dom = hs.createElement('div', {
2521				className: 'highslide-thumbstrip highslide-thumbstrip-'+ mode,
2522				innerHTML:
2523					'<div class="highslide-thumbstrip-inner">'+
2524					'<'+ tree[0] +'><'+ tree[1] +'></'+ tree[1] +'></'+ tree[0] +'></div>'+
2525					'<div class="highslide-scroll-up"><div></div></div>'+
2526					'<div class="highslide-scroll-down"><div></div></div>'+
2527					'<div class="highslide-marker"><div></div></div>'
2528			}, {
2529				display: 'none'
2530			}, hs.container),
2531		domCh = dom.childNodes,
2532		div = domCh[0],
2533		scrollUp = domCh[1],
2534		scrollDown = domCh[2],
2535		marker = domCh[3],
2536		table = div.firstChild,
2537		tbody = dom.getElementsByTagName(tree[1])[0],
2538		tr;
2539	for (var i = 0; i < group.length; i++) {
2540		if (i == 0 || !isX) tr = hs.createElement(tree[2], null, null, tbody);
2541		(function(){
2542			var a = group[i],
2543				cell = hs.createElement(tree[3], null, null, tr),
2544				pI = i;
2545			hs.createElement('a', {
2546				href: a.href,
2547				onclick: function() {
2548					hs.getExpander(this).focus();
2549					return hs.transit(a);
2550				},
2551				innerHTML: hs.stripItemFormatter ? hs.stripItemFormatter(a) : a.innerHTML
2552			}, null, cell);
2553		})();
2554	}
2555	if (!floatMode) {
2556		scrollUp.onclick = function () { scroll(-1); };
2557		scrollDown.onclick = function() { scroll(1); };
2558		hs.addEventListener(tbody, document.onmousewheel !== undefined ? 
2559				'mousewheel' : 'DOMMouseScroll', function(e) {        
2560			var delta = 0;
2561	        e = e || window.event;
2562	        if (e.wheelDelta) {
2563				delta = e.wheelDelta/120;
2564				if (hs.opera) delta = -delta;
2565	        } else if (e.detail) {
2566				delta = -e.detail/3;
2567	        }
2568	        if (delta) scroll(-delta * 0.2);
2569			if (e.preventDefault) e.preventDefault();
2570			e.returnValue = false;
2571		});
2572	}
2573	
2574	return {
2575		add: add,
2576		selectThumb: selectThumb
2577	}
2578};
2579hs.langDefaults = hs.lang;
2580// history
2581var HsExpander = hs.Expander;
2582if (hs.ie) {
2583	(function () {
2584		try {
2585			document.documentElement.doScroll('left');
2586		} catch (e) {
2587			setTimeout(arguments.callee, 50);
2588			return;
2589		}
2590		hs.ready();
2591	})();
2592}
2593hs.addEventListener(document, 'DOMContentLoaded', hs.ready);
2594hs.addEventListener(window, 'load', hs.ready);
2595
2596// set handlers
2597hs.addEventListener(document, 'ready', function() {
2598	if (hs.expandCursor || hs.dimmingOpacity) {
2599		var style = hs.createElement('style', { type: 'text/css' }, null, 
2600			document.getElementsByTagName('HEAD')[0]);
2601			
2602		function addRule(sel, dec) {		
2603			if (!hs.ie) {
2604				style.appendChild(document.createTextNode(sel + " {" + dec + "}"));
2605			} else {
2606				var last = document.styleSheets[document.styleSheets.length - 1];
2607				if (typeof(last.addRule) == "object") last.addRule(sel, dec);
2608			}
2609		}
2610		function fix(prop) {
2611			return 'expression( ( ( ignoreMe = document.documentElement.'+ prop +
2612				' ? document.documentElement.'+ prop +' : document.body.'+ prop +' ) ) + \'px\' );';
2613		}
2614		if (hs.expandCursor) addRule ('.highslide img', 
2615			'cursor: url('+ hs.graphicsDir + hs.expandCursor +'), pointer !important;');
2616		addRule ('.highslide-viewport-size',
2617			hs.ie && (hs.uaVersion < 7 || document.compatMode == 'BackCompat') ?
2618				'position: absolute; '+
2619				'left:'+ fix('scrollLeft') +
2620				'top:'+ fix('scrollTop') +
2621				'width:'+ fix('clientWidth') +
2622				'height:'+ fix('clientHeight') :
2623				'position: fixed; width: 100%; height: 100%; left: 0; top: 0');
2624	}
2625});
2626hs.addEventListener(window, 'resize', function() {
2627	hs.getPageSize();
2628	if (hs.viewport) for (var i = 0; i < hs.viewport.childNodes.length; i++) {
2629		var node = hs.viewport.childNodes[i],
2630			exp = hs.getExpander(node);
2631		exp.positionOverlay(node);
2632		if (node.hsId == 'thumbstrip') exp.slideshow.thumbstrip.selectThumb();
2633	}
2634});
2635hs.addEventListener(document, 'mousemove', function(e) {
2636	hs.mouse = { x: e.clientX, y: e.clientY	};
2637});
2638hs.addEventListener(document, 'mousedown', hs.mouseClickHandler);
2639hs.addEventListener(document, 'mouseup', hs.mouseClickHandler);
2640
2641hs.addEventListener(document, 'ready', hs.getAnchors);
2642hs.addEventListener(window, 'load', hs.preloadImages);
2643}

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.