PageSourceSearch

https://southerntower.co.jp/Portals/0/js/lightcase/lightcase.js

js southerntower.co.jp collected 2026-10-02 17:03:34 UTC 44,953 bytes, 1,408 lines download raw bytes

1/*
2 * Lightcase - jQuery Plugin
3 * The smart and flexible Lightbox Plugin.
4 *
5 * @author		Cornel Boppart <[email protected]>
6 * @copyright	Author
7 *
8 * @version		2.3.4 (29/12/2015)
9 */
10
11;
12(function($) {
13	'use strict';
14	// スクロール位置記憶用
15	var currentScrollPos;
16
17	var _self = {
18		cache: {},
19		support: {},
20		objects: {},
21		scrollPosition: $(window).scrollTop(),
22		init: function(options) {
23			return this.each(function() {
24				$(this).unbind('click.lightcase').bind('click.lightcase', function(event) {
25
26					event.preventDefault();
27					$(this).lightcase('start', options);
28				});
29			});
30		},
31		start: function(options) {
32			_self.origin = lightcase.origin = this;
33
34			_self.settings = lightcase.settings = $.extend(true, {
35				idPrefix: 'lightcase-',
36				classPrefix: 'lightcase-',
37				attrPrefix: 'lc-',
38				transition: 'elastic',
39				transitionIn: null,
40				transitionOut: null,
41				cssTransitions: true,
42				speedIn: 250,
43				speedOut: 250,
44				maxWidth: 835,
45				maxHeight: 750,
46				forceWidth: false,
47				forceHeight: false,
48				liveResize: true,
49				fullScreenModeForMobile: true,
50				mobileMatchExpression: /(iphone|ipod|ipad|android|blackberry|symbian)/,
51				disableShrink: false,
52				shrinkFactor: .75,
53				overlayOpacity: .9,
54				slideshow: false,
55				timeout: 5000,
56				swipe: true,
57				useKeys: true,
58				useCategories: true,
59				navigateEndless: true,
60				closeOnOverlayClick: true,
61				title: null,
62				caption: null,
63				showTitle: true,
64				showCaption: true,
65				showSequenceInfo: true,
66				inline: {
67					width: 'auto',
68					height: 'auto'
69				},
70				ajax: {
71					width: 'auto',
72					height: 'auto',
73					type: 'get',
74					dataType: 'html',
75					data: {}
76				},
77				iframe: {
78					width: 835,
79					height: 750,
80					frameborder: 0
81				},
82				flash: {
83					width: 400,
84					height: 205,
85					wmode: 'transparent'
86				},
87				video: {
88					width: 400,
89					height: 225,
90					poster: '',
91					preload: 'auto',
92					controls: true,
93					autobuffer: true,
94					autoplay: true,
95					loop: false
96				},
97				attr: 'data-rel',
98				href: null,
99				type: null,
100				typeMapping: {
101					'image': 'jpg,jpeg,gif,png,bmp',
102					'flash': 'swf',
103					'video': 'mp4,mov,ogv,ogg,webm',
104					'iframe': 'html,php',
105					'ajax': 'json,txt',
106					'inline': '#'
107				},
108				errorMessage: function() {
109					return '<p class="' + _self.settings.classPrefix + 'error">' + _self.settings.labels['errorMessage'] + '</p>';
110				},
111				labels: {
112					'errorMessage': 'Source could not be found...',
113					'sequenceInfo.of': ' of ',
114					'close': 'Close',
115					'navigator.prev': 'Prev',
116					'navigator.next': 'Next',
117					'navigator.play': 'Play',
118					'navigator.pause': 'Pause'
119				},
120				markup: function() {
121					$('body').append(
122						_self.objects.overlay = $('<div id="' + _self.settings.idPrefix + 'overlay"></div>'),
123						_self.objects.loading = $('<div id="' + _self.settings.idPrefix + 'loading" class="' + _self.settings.classPrefix + 'icon-spin"></div>'),
124						_self.objects.case = $('<div id="' + _self.settings.idPrefix + 'case" aria-hidden="true" role="dialog"></div>')
125					);
126					_self.objects.case.after(
127						_self.objects.nav = $('<div id="' + _self.settings.idPrefix + 'nav"></div>')
128					);
129					_self.objects.nav.append(
130						_self.objects.close = $('<a href="javascript:void(0)" class="' + _self.settings.classPrefix + 'icon-close"><span>' + _self.settings.labels['close'] + '</span></a>'),
131						_self.objects.prev = $('<a href="javascript:void(0)" class="' + _self.settings.classPrefix + 'icon-prev"><span>' + _self.settings.labels['navigator.prev'] + '</span></a>').hide(),
132						_self.objects.next = $('<a href="javascript:void(0)" class="' + _self.settings.classPrefix + 'icon-next"><span>' + _self.settings.labels['navigator.next'] + '</span></a>').hide(),
133						_self.objects.play = $('<a href="javascript:void(0)" class="' + _self.settings.classPrefix + 'icon-play"><span>' + _self.settings.labels['navigator.play'] + '</span></a>').hide(),
134						_self.objects.pause = $('<a href="javascript:void(0)" class="' + _self.settings.classPrefix + 'icon-pause"><span>' + _self.settings.labels['navigator.pause'] + '</span></a>').hide()
135					);
136					_self.objects.case.append(
137						_self.objects.content = $('<div id="' + _self.settings.idPrefix + 'content"></div>'),
138						_self.objects.info = $('<div id="' + _self.settings.idPrefix + 'info"></div>')
139					);
140					_self.objects.content.append(
141						_self.objects.contentInner = $('<div class="' + _self.settings.classPrefix + 'contentInner"></div>')
142					);
143					_self.objects.info.append(
144						_self.objects.sequenceInfo = $('<div id="' + _self.settings.idPrefix + 'sequenceInfo"></div>'),
145						_self.objects.title = $('<h4 id="' + _self.settings.idPrefix + 'title"></h4>'),
146						_self.objects.caption = $('<p id="' + _self.settings.idPrefix + 'caption"></p>')
147					);
148				},
149				onInit: {},
150				onStart: {},
151				onFinish: {},
152				onClose: {},
153				onCleanup: {}
154			}, options);
155
156			// Call onInit hook functions
157			_self._callHooks(_self.settings.onInit);
158
159			_self.objectData = _self._setObjectData(this);
160
161			_self._cacheScrollPosition();
162			_self._watchScrollInteraction();
163
164			_self._addElements();
165			_self._open();
166
167			_self.dimensions = _self.getViewportDimensions();
168		},
169		get: function(name) {
170			return _self.objects[name];
171		},
172		getObjectData: function() {
173			return _self.objectData;
174		},
175		_setObjectData: function(object) {
176			var $object = $(object),
177				objectData = {
178					title: _self.settings.title || $object.attr(_self._prefixAttributeName('title')) || $object.attr('title'),
179					caption: _self.settings.caption || $object.attr(_self._prefixAttributeName('caption')) || $object.children('img').attr('alt'),
180					url: _self._determineUrl(),
181					requestType: _self.settings.ajax.type,
182					requestData: _self.settings.ajax.data,
183					requestDataType: _self.settings.ajax.dataType,
184					rel: $object.attr(_self._determineAttributeSelector()),
185					type: _self.settings.type || _self._verifyDataType(_self._determineUrl()),
186					isPartOfSequence: _self._isPartOfSequence($object.attr(_self.settings.attr), ':'),
187					isPartOfSequenceWithSlideshow: _self._isPartOfSequence($object.attr(_self.settings.attr), ':slideshow'),
188					currentIndex: $(_self._determineAttributeSelector()).index($object),
189					sequenceLength: $(_self._determineAttributeSelector()).length
190				};
191
192			// Add sequence info to objectData
193			objectData.sequenceInfo = (objectData.currentIndex + 1) + _self.settings.labels['sequenceInfo.of'] + objectData.sequenceLength;
194
195			// Add next/prev index
196			objectData.prevIndex = objectData.currentIndex - 1;
197			objectData.nextIndex = objectData.currentIndex + 1;
198
199			return objectData;
200		},
201		_prefixAttributeName: function(name) {
202			return 'data-' + _self.settings.attrPrefix + name;
203		},
204		_determineLinkTarget: function() {
205			return _self.settings.href || $(_self.origin).attr(_self._prefixAttributeName('href')) || $(_self.origin).attr('href');
206		},
207		_determineAttributeSelector: function() {
208			var $origin = $(_self.origin),
209				selector = '';
210
211			if (typeof _self.cache.selector !== 'undefined') {
212				selector = _self.cache.selector;
213			} else if (_self.settings.useCategories === true && $origin.attr(_self._prefixAttributeName('categories'))) {
214				var categories = $origin.attr(_self._prefixAttributeName('categories')).split(' ');
215
216				$.each(categories, function(index, category) {
217					if (index > 0) {
218						selector += ',';
219					}
220					selector += '[' + _self._prefixAttributeName('categories') + '~="' + category + '"]';
221				});
222			} else {
223				selector = '[' + _self.settings.attr + '="' + $origin.attr(_self.settings.attr) + '"]';
224			}
225
226			_self.cache.selector = selector;
227
228			return selector;
229		},
230		_determineUrl: function() {
231			var dataUrl = _self._verifyDataUrl(_self._determineLinkTarget()),
232				width = 0,
233				density = 0,
234				url;
235
236			$.each(dataUrl, function(index, src) {
237				if (
238					// Check density
239					_self._devicePixelRatio() >= src.density &&
240					src.density >= density &&
241					// Check viewport width
242					_self._matchMedia()('screen and (min-width:' + src.width + 'px)') &&
243					src.width >= width
244				) {
245					width = src.width;
246					density = src.density;
247					url = src.url;
248				}
249			});
250
251			return url;
252		},
253		_normalizeUrl: function(url) {
254			var srcExp = /^\d+$/;
255
256			return url.split(',').map(function(str) {
257				var src = {
258					width: 0,
259					density: 0
260				};
261
262				str.trim().split(/\s+/).forEach(function(url, i) {
263					if (i === 0) {
264						return src.url = url;
265					}
266
267					var value = url.substring(0, url.length - 1),
268						lastChar = url[url.length - 1],
269						intVal = parseInt(value, 10),
270						floatVal = parseFloat(value);
271					if (lastChar === 'w' && srcExp.test(value)) {
272						src.width = intVal;
273					} else if (lastChar === 'h' && srcExp.test(value)) {
274						src.height = intVal;
275					} else if (lastChar === 'x' && !isNaN(floatVal)) {
276						src.density = floatVal;
277					}
278				});
279
280				return src;
281			});
282		},
283		_isPartOfSequence: function(rel, expression) {
284			var getSimilarLinks = $('[' + _self.settings.attr + '="' + rel + '"]'),
285				regexp = new RegExp(expression);
286
287			return (regexp.test(rel) && getSimilarLinks.length > 1);
288		},
289		isSlideshowEnabled: function() {
290			return (_self.objectData.isPartOfSequence && (_self.settings.slideshow === true || _self.objectData.isPartOfSequenceWithSlideshow === true));
291		},
292		_loadContent: function() {
293			if (_self.cache.originalObject) {
294				_self._restoreObject();
295			}
296
297			_self._createObject();
298		},
299		_createObject: function() {
300			var $object;
301
302			// Create object
303			switch (_self.objectData.type) {
304				case 'image':
305					$object = $(new Image());
306					$object.attr({
307						// The time expression is required to prevent the binding of an image load
308						'src': _self.objectData.url,
309						'alt': _self.objectData.title
310					});
311					break;
312				case 'inline':
313					$object = $('<div class="' + _self.settings.classPrefix + 'inlineWrap"></div>');
314					$('html').addClass('inlineMode');
315					$object.html(_self._cloneObject($(_self.objectData.url)));
316
317					// Add custom attributes from _self.settings
318					$.each(_self.settings.inline, function(name, value) {
319						$object.attr(_self._prefixAttributeName(name), value);
320					});
321					break;
322				case 'ajax':
323					$object = $('<div class="' + _self.settings.classPrefix + 'inlineWrap"></div>');
324
325					// Add custom attributes from _self.settings
326					$.each(_self.settings.ajax, function(name, value) {
327						if (name !== 'data') {
328							$object.attr(_self._prefixAttributeName(name), value);
329						}
330					});
331					break;
332				case 'flash':
333					$object = $('<embed src="' + _self.objectData.url + '" type="application/x-shockwave-flash"></embed>');
334
335					// Add custom attributes from _self.settings
336					$.each(_self.settings.flash, function(name, value) {
337						$object.attr(name, value);
338					});
339					break;
340				case 'video':
341					$object = $('<video></video>');
342					$object.attr('src', _self.objectData.url);
343
344					// Add custom attributes from _self.settings
345					$.each(_self.settings.video, function(name, value) {
346						$object.attr(name, value);
347					});
348					break;
349				default:
350					$object = $('<iframe></iframe>');
351					$object.attr({
352						'src': _self.objectData.url
353					});
354
355					// Add custom attributes from _self.settings
356					$.each(_self.settings.iframe, function(name, value) {
357						$object.attr(name, value);
358					});
359					break;
360			}
361
362			_self._addObject($object);
363			_self._loadObject($object);
364		},
365		_addObject: function($object) {
366			// Add object to content holder
367			_self.objects.contentInner.html($object);
368
369			// Start loading
370			_self._loading('start');
371
372			// Call onStart hook functions
373			_self._callHooks(_self.settings.onStart);
374
375			// Add sequenceInfo to the content holder or hide if its empty
376			if (_self.settings.showSequenceInfo === true && _self.objectData.isPartOfSequence) {
377				_self.objects.sequenceInfo.html(_self.objectData.sequenceInfo);
378				_self.objects.sequenceInfo.show();
379			} else {
380				_self.objects.sequenceInfo.empty();
381				_self.objects.sequenceInfo.hide();
382			}
383			// Add title to the content holder or hide if its empty
384			if (_self.settings.showTitle === true && _self.objectData.title !== undefined && _self.objectData.title !== '') {
385				_self.objects.title.html(_self.objectData.title);
386				_self.objects.title.show();
387			} else {
388				_self.objects.title.empty();
389				_self.objects.title.hide();
390			}
391			// Add caption to the content holder or hide if its empty
392			if (_self.settings.showCaption === true && _self.objectData.caption !== undefined && _self.objectData.caption !== '') {
393				_self.objects.caption.html(_self.objectData.caption);
394				_self.objects.caption.show();
395			} else {
396				_self.objects.caption.empty();
397				_self.objects.caption.hide();
398			}
399		},
400		_loadObject: function($object) {
401			// Load the object
402			switch (_self.objectData.type) {
403				case 'inline':
404					if ($(_self.objectData.url)) {
405						_self._showContent($object);
406					} else {
407						_self.error();
408					}
409					break;
410				case 'ajax':
411					$.ajax(
412						$.extend({}, _self.settings.ajax, {
413							url: _self.objectData.url,
414							type: _self.objectData.requestType,
415							dataType: _self.objectData.requestDataType,
416							data: _self.objectData.requestData,
417							success: function(data, textStatus, jqXHR) {
418								// Unserialize if data is transferred as json
419								if (_self.objectData.requestDataType === 'json') {
420									_self.objectData.data = data;
421								} else {
422									$object.html(data);
423								}
424								_self._showContent($object);
425							},
426							error: function(jqXHR, textStatus, errorThrown) {
427								_self.error();
428							}
429						})
430					);
431					break;
432				case 'flash':
433					_self._showContent($object);
434					break;
435				case 'video':
436					if (typeof($object.get(0).canPlayType) === 'function' || _self.objects.case.find('video').length === 0) {
437						_self._showContent($object);
438					} else {
439						_self.error();
440					}
441					break;
442				default:
443					if (_self.objectData.url) {
444						$object.load(function() {
445							_self._showContent($object);
446						});
447						$object.error(function() {
448							_self.error();
449						});
450					} else {
451						_self.error();
452					}
453					break;
454			}
455		},
456		error: function() {
457			_self.objectData.type = 'error';
458			var $object = $('<div class="' + _self.settings.classPrefix + 'inlineWrap"></div>');
459
460			$object.html(_self.settings.errorMessage);
461			_self.objects.contentInner.html($object);
462
463			_self._showContent(_self.objects.contentInner);
464		},
465		_calculateDimensions: function($object) {
466			_self._cleanupDimensions();
467
468			// Set default dimensions
469			var dimensions = {
470				objectWidth: $object.attr('width') ? $object.attr('width') : $object.attr(_self._prefixAttributeName('width')),
471				objectHeight: $object.attr('height') ? $object.attr('height') : $object.attr(_self._prefixAttributeName('height'))
472			};
473
474			if (!_self.settings.disableShrink) {
475				// Add calculated maximum width/height to dimensions
476				dimensions.maxWidth = parseInt(_self.dimensions.windowWidth * _self.settings.shrinkFactor);
477				dimensions.maxHeight = parseInt(_self.dimensions.windowHeight * _self.settings.shrinkFactor);
478
479				// If the auto calculated maxWidth/maxHeight greather than the userdefined one, use that.
480				if (dimensions.maxWidth > _self.settings.maxWidth) {
481					dimensions.maxWidth = _self.settings.maxWidth;
482				}
483				if (dimensions.maxHeight > _self.settings.maxHeight) {
484					dimensions.maxHeight = _self.settings.maxHeight;
485				}
486
487				// Calculate the difference between screen width/height and image width/height
488				dimensions.differenceWidthAsPercent = parseInt(100 / dimensions.maxWidth * dimensions.objectWidth);
489				dimensions.differenceHeightAsPercent = parseInt(100 / dimensions.maxHeight * dimensions.objectHeight);
490
491				switch (_self.objectData.type) {
492					case 'image':
493					case 'flash':
494					case 'video':
495						if (dimensions.differenceWidthAsPercent > 100 && dimensions.differenceWidthAsPercent > dimensions.differenceHeightAsPercent) {
496							dimensions.objectWidth = dimensions.maxWidth;
497							dimensions.objectHeight = parseInt(dimensions.objectHeight / dimensions.differenceWidthAsPercent * 100);
498						}
499						if (dimensions.differenceHeightAsPercent > 100 && dimensions.differenceHeightAsPercent > dimensions.differenceWidthAsPercent) {
500							dimensions.objectWidth = parseInt(dimensions.objectWidth / dimensions.differenceHeightAsPercent * 100);
501							dimensions.objectHeight = dimensions.maxHeight;
502						}
503						if (dimensions.differenceHeightAsPercent > 100 && dimensions.differenceWidthAsPercent < dimensions.differenceHeightAsPercent) {
504							dimensions.objectWidth = parseInt(dimensions.maxWidth / dimensions.differenceHeightAsPercent * dimensions.differenceWidthAsPercent);
505							dimensions.objectHeight = dimensions.maxHeight;
506						}
507						break;
508					case 'error':
509						if (!isNaN(dimensions.objectWidth) && dimensions.objectWidth > dimensions.maxWidth) {
510							dimensions.objectWidth = dimensions.maxWidth;
511						}
512						break;
513					default:
514						if ((isNaN(dimensions.objectWidth) || dimensions.objectWidth > dimensions.maxWidth) && !_self.settings.forceWidth) {
515							dimensions.objectWidth = dimensions.maxWidth;
516						}
517						if (((isNaN(dimensions.objectHeight) && dimensions.objectHeight !== 'auto') || dimensions.objectHeight > dimensions.maxHeight) && !_self.settings.forceHeight) {
518							dimensions.objectHeight = dimensions.maxHeight;
519						}
520						break;
521				}
522			}
523
524			if (_self.settings.forceWidth) {
525				dimensions.maxWidth = dimensions.objectWidth;
526			} else if ($object.attr(_self._prefixAttributeName('max-width'))) {
527				dimensions.maxWidth = $object.attr(_self._prefixAttributeName('max-width'));
528			}
529
530			if (_self.settings.forceHeight) {
531				dimensions.maxHeight = dimensions.objectHeight;
532			} else if ($object.attr(_self._prefixAttributeName('max-height'))) {
533				dimensions.maxHeight = $object.attr(_self._prefixAttributeName('max-height'));
534			}
535
536			_self._adjustDimensions($object, dimensions);
537		},
538		_adjustDimensions: function($object, dimensions) {
539			// Adjust width and height
540			$object.css({
541				'width': dimensions.objectWidth,
542				'height': dimensions.objectHeight,
543				'max-width': dimensions.maxWidth,
544				'max-height': dimensions.maxHeight
545			});
546
547			_self.objects.contentInner.css({
548				'width': $object.outerWidth(),
549				'height': $object.outerHeight(),
550				'max-width': '100%'
551			});
552
553			_self.objects.case.css({
554				'width': _self.objects.contentInner.outerWidth()
555			});
556
557			// Adjust margin
558			_self.objects.case.css({
559				'margin-top': parseInt(-(_self.objects.case.outerHeight() / 2)),
560				'margin-left': parseInt(-(_self.objects.case.outerWidth() / 2))
561			});
562		},
563		_loading: function(process) {
564			if (process === 'start') {
565				_self.objects.case.addClass(_self.settings.classPrefix + 'loading');
566				_self.objects.loading.show();
567			} else if (process === 'end') {
568				_self.objects.case.removeClass(_self.settings.classPrefix + 'loading');
569				_self.objects.loading.hide();
570			}
571		},
572		getViewportDimensions: function() {
573			return {
574				windowWidth: $(window).innerWidth(),
575				windowHeight: $(window).innerHeight()
576			};
577		},
578		_verifyDataUrl: function(dataUrl) {
579			if (!dataUrl || dataUrl === undefined || dataUrl === '') {
580				return false;
581			}
582
583			if (dataUrl.indexOf('#') > -1) {
584				dataUrl = dataUrl.split('#');
585				dataUrl = '#' + dataUrl[dataUrl.length - 1];
586			}
587
588			return _self._normalizeUrl(dataUrl.toString());
589		},
590		_verifyDataType: function(url) {
591			var typeMapping = _self.settings.typeMapping;
592
593			// Early abort if dataUrl couldn't be verified
594			if (!url) {
595				return false;
596			}
597
598			// Verify the dataType of url according to typeMapping which
599			// has been defined in settings.
600			for (var key in typeMapping) {
601				if (typeMapping.hasOwnProperty(key)) {
602					var suffixArr = typeMapping[key].split(',');
603
604					for (var i = 0; i < suffixArr.length; i++) {
605						var suffix = suffixArr[i].toLowerCase(),
606							regexp = new RegExp('\.(' + suffix + ')$', 'i'),
607							// Verify only the last 5 characters of the string
608							str = url.toLowerCase().split('?')[0].substr(-5);
609
610						if (regexp.test(str) === true || (key === 'inline' && (url.indexOf(suffix) > -1))) {
611							return key;
612						}
613					}
614				}
615			}
616
617			// If no expression matched, return 'iframe'.
618			return 'iframe';
619		},
620		_addElements: function() {
621			if (typeof _self.objects.case !== 'undefined' && $('#' + _self.objects.case.attr('id')).length) {
622				return;
623			}
624
625			_self.settings.markup();
626		},
627		_showContent: function($object) {
628			// Add data attribute with the object type
629			_self.objects.case.attr(_self._prefixAttributeName('type'), _self.objectData.type);
630
631			_self.cache.object = $object;
632			_self._calculateDimensions($object);
633
634			// Call onFinish hook functions
635			_self._callHooks(_self.settings.onFinish);
636
637			switch (_self.settings.transitionIn) {
638				case 'scrollTop':
639				case 'scrollRight':
640				case 'scrollBottom':
641				case 'scrollLeft':
642				case 'scrollHorizontal':
643				case 'scrollVertical':
644					_self.transition.scroll(_self.objects.case, 'in', _self.settings.speedIn);
645					_self.transition.fade(_self.objects.contentInner, 'in', _self.settings.speedIn);
646					break;
647				case 'elastic':
648					if (_self.objects.case.css('opacity') < 1) {
649						_self.transition.zoom(_self.objects.case, 'in', _self.settings.speedIn);
650						_self.transition.fade(_self.objects.contentInner, 'in', _self.settings.speedIn);
651					}
652				case 'fade':
653				case 'fadeInline':
654					_self.transition.fade(_self.objects.case, 'in', _self.settings.speedIn);
655					_self.transition.fade(_self.objects.contentInner, 'in', _self.settings.speedIn);
656					break;
657				default:
658					_self.transition.fade(_self.objects.case, 'in', 0);
659					break;
660			}
661
662			// End loading.
663			_self._loading('end');
664			_self.isBusy = false;
665		},
666		_processContent: function() {
667			_self.isBusy = true;
668
669			switch (_self.settings.transitionOut) {
670				case 'scrollTop':
671				case 'scrollRight':
672				case 'scrollBottom':
673				case 'scrollLeft':
674				case 'scrollVertical':
675				case 'scrollHorizontal':
676					if (_self.objects.case.is(':hidden')) {
677						_self.transition.fade(_self.objects.case, 'out', 0, 0, function() {
678							_self._loadContent();
679						});
680						_self.transition.fade(_self.objects.contentInner, 'out', 0);
681					} else {
682						_self.transition.scroll(_self.objects.case, 'out', _self.settings.speedOut, function() {
683							_self._loadContent();
684						});
685					}
686					break;
687				case 'fade':
688					if (_self.objects.case.is(':hidden')) {
689						_self.transition.fade(_self.objects.case, 'out', 0, 0, function() {
690							_self._loadContent();
691						});
692					} else {
693						_self.transition.fade(_self.objects.case, 'out', _self.settings.speedOut, 0, function() {
694							_self._loadContent();
695						});
696					}
697					break;
698				case 'fadeInline':
699				case 'elastic':
700					if (_self.objects.case.is(':hidden')) {
701						_self.transition.fade(_self.objects.case, 'out', 0, 0, function() {
702							_self._loadContent();
703						});
704					} else {
705						_self.transition.fade(_self.objects.contentInner, 'out', _self.settings.speedOut, 0, function() {
706							_self._loadContent();
707						});
708					}
709					break;
710				default:
711					_self.transition.fade(_self.objects.case, 'out', 0, 0, function() {
712						_self._loadContent();
713					});
714					break;
715			}
716		},
717		_handleEvents: function() {
718			_self._unbindEvents();
719
720			_self.objects.nav.children().not(_self.objects.close).hide();
721
722			// If slideshow is enabled, show play/pause and start timeout.
723			if (_self.isSlideshowEnabled()) {
724				// Only start the timeout if slideshow is not pausing
725				if (!_self.objects.nav.hasClass(_self.settings.classPrefix + 'paused')) {
726					_self._startTimeout();
727				} else {
728					_self._stopTimeout();
729				}
730			}
731
732			if (_self.settings.liveResize) {
733				_self._watchResizeInteraction();
734			}
735
736			_self.objects.close.click(function(event) {
737				event.preventDefault();
738				_self.close();
739				// 当初のスクロール位置に戻す
740				$( 'html, body' ).prop( { scrollTop: currentScrollPos } );
741			});
742
743			if (_self.settings.closeOnOverlayClick === true) {
744				_self.objects.overlay.css('cursor', 'pointer').click(function(event) {
745					event.preventDefault();
746
747					_self.close();
748				});
749			}
750
751			if (_self.settings.useKeys === true) {
752				_self._addKeyEvents();
753			}
754
755			if (_self.objectData.isPartOfSequence) {
756				_self.objects.nav.attr(_self._prefixAttributeName('ispartofsequence'), true);
757				_self.objects.nav.data('items', _self._setNavigation());
758
759				_self.objects.prev.click(function(event) {
760					event.preventDefault();
761
762					if (_self.settings.navigateEndless === true || !_self.item.isFirst()) {
763						_self.objects.prev.unbind('click');
764						_self.cache.action = 'prev';
765						_self.objects.nav.data('items').prev.click();
766
767						if (_self.isSlideshowEnabled()) {
768							_self._stopTimeout();
769						}
770					}
771					return false;
772				});
773
774				_self.objects.next.click(function(event) {
775					event.preventDefault();
776
777					if (_self.settings.navigateEndless === true || !_self.item.isLast()) {
778						_self.objects.next.unbind('click');
779						_self.cache.action = 'next';
780						_self.objects.nav.data('items').next.click();
781
782						if (_self.isSlideshowEnabled()) {
783							_self._stopTimeout();
784						}
785					}
786					return false;
787				});
788
789				if (_self.isSlideshowEnabled()) {
790					_self.objects.play.click(function(event) {
791						event.preventDefault();
792						_self._startTimeout();
793					});
794					_self.objects.pause.click(function(event) {
795						event.preventDefault();
796						_self._stopTimeout();
797					});
798				}
799
800				// Enable swiping if activated
801				if (_self.settings.swipe === true) {
802					if ($.isPlainObject($.event.special.swipeleft)) {
803						_self.objects.case.on('swipeleft', function(event) {
804							event.preventDefault();
805							_self.objects.next.click();
806							if (_self.isSlideshowEnabled()) {
807								_self._stopTimeout();
808							}
809						});
810					}
811					if ($.isPlainObject($.event.special.swiperight)) {
812						_self.objects.case.on('swiperight', function(event) {
813							event.preventDefault();
814							_self.objects.prev.click();
815							if (_self.isSlideshowEnabled()) {
816								_self._stopTimeout();
817							}
818						});
819					}
820				}
821			}
822		},
823		_addKeyEvents: function() {
824			$(document).bind('keyup.lightcase', function(event) {
825				// Do nothing if lightcase is in process
826				if (_self.isBusy) {
827					return;
828				}
829
830				switch (event.keyCode) {
831					// Escape key
832					case 27:
833						_self.objects.close.click();
834						break;
835						// Backward key
836					case 37:
837						if (_self.objectData.isPartOfSequence) {
838							_self.objects.prev.click();
839						}
840						break;
841						// Forward key
842					case 39:
843						if (_self.objectData.isPartOfSequence) {
844							_self.objects.next.click();
845						}
846						break;
847				}
848			});
849		},
850		_startTimeout: function() {
851			_self.objects.play.hide();
852			_self.objects.pause.show();
853
854			_self.cache.action = 'next';
855			_self.objects.nav.removeClass(_self.settings.classPrefix + 'paused');
856
857			_self.timeout = setTimeout(function() {
858				_self.objects.nav.data('items').next.click();
859			}, _self.settings.timeout);
860		},
861		_stopTimeout: function() {
862			_self.objects.play.show();
863			_self.objects.pause.hide();
864
865			_self.objects.nav.addClass(_self.settings.classPrefix + 'paused');
866
867			clearTimeout(_self.timeout);
868		},
869		_setNavigation: function() {
870			var $links = $((_self.cache.selector || _self.settings.attr)),
871				sequenceLength = _self.objectData.sequenceLength - 1,
872				items = {
873					prev: $links.eq(_self.objectData.prevIndex),
874					next: $links.eq(_self.objectData.nextIndex)
875				};
876
877			if (_self.objectData.currentIndex > 0) {
878				_self.objects.prev.show();
879			} else {
880				items.prevItem = $links.eq(sequenceLength);
881			}
882			if (_self.objectData.nextIndex <= sequenceLength) {
883				_self.objects.next.show();
884			} else {
885				items.next = $links.eq(0);
886			}
887
888			if (_self.settings.navigateEndless === true) {
889				_self.objects.prev.show();
890				_self.objects.next.show();
891			}
892
893			return items;
894		},
895		item: {
896			isFirst: function() {
897				return (_self.objectData.currentIndex === 0);
898			},
899			isLast: function() {
900				return (_self.objectData.currentIndex === (_self.objectData.sequenceLength - 1));
901			}
902		},
903		_cloneObject: function($object) {
904			var $clone = $object.clone(),
905				objectId = $object.attr('id');
906
907			// If element is hidden, cache the object and remove
908			if ($object.is(':hidden')) {
909				_self._cacheObjectData($object);
910				$object.attr('id', _self.settings.idPrefix + 'temp-' + objectId).empty();
911			} else {
912				// Prevent duplicated id's
913				$clone.removeAttr('id');
914			}
915
916			return $clone.show();
917		},
918		isMobileDevice: function() {
919			var deviceAgent = navigator.userAgent.toLowerCase(),
920				agentId = deviceAgent.match(_self.settings.mobileMatchExpression);
921
922			return agentId ? true : false;
923		},
924		isTransitionSupported: function() {
925			var body = $('body').get(0),
926				isTransitionSupported = false,
927				transitionMapping = {
928					'transition': '',
929					'WebkitTransition': '-webkit-',
930					'MozTransition': '-moz-',
931					'OTransition': '-o-',
932					'MsTransition': '-ms-'
933				};
934
935			for (var key in transitionMapping) {
936				if (transitionMapping.hasOwnProperty(key) && key in body.style) {
937					_self.support.transition = transitionMapping[key];
938					isTransitionSupported = true;
939				}
940			}
941
942			return isTransitionSupported;
943		},
944		transition: {
945			fade: function($object, type, speed, opacity, callback) {
946				var isInTransition = type === 'in',
947					startTransition = {},
948					startOpacity = $object.css('opacity'),
949					endTransition = {},
950					endOpacity = opacity ? opacity : isInTransition ? 1 : 0;
951
952				if (!_self.isOpen && isInTransition) return;
953
954				startTransition['opacity'] = startOpacity;
955				endTransition['opacity'] = endOpacity;
956
957				$object.css(startTransition).show();
958
959				// Css transition
960				if (_self.support.transitions) {
961					endTransition[_self.support.transition + 'transition'] = speed + 'ms ease';
962
963					setTimeout(function() {
964						$object.css(endTransition);
965
966						setTimeout(function() {
967							$object.css(_self.support.transition + 'transition', '');
968
969							if (callback && (_self.isOpen || !isInTransition)) {
970								callback();
971							}
972						}, speed);
973					}, 15);
974				} else {
975					// Fallback to js transition
976					$object.stop();
977					$object.animate(endTransition, speed, callback);
978				}
979			},
980			scroll: function($object, type, speed, callback) {
981				var isInTransition = type === 'in',
982					transition = isInTransition ? _self.settings.transitionIn : _self.settings.transitionOut,
983					direction = 'left',
984					startTransition = {},
985					startOpacity = isInTransition ? 0 : 1,
986					startOffset = isInTransition ? '-50%' : '50%',
987					endTransition = {},
988					endOpacity = isInTransition ? 1 : 0,
989					endOffset = isInTransition ? '50%' : '-50%';
990
991				if (!_self.isOpen && isInTransition) return;
992
993				switch (transition) {
994					case 'scrollTop':
995						direction = 'top';
996						break;
997					case 'scrollRight':
998						startOffset = isInTransition ? '150%' : '50%';
999						endOffset = isInTransition ? '50%' : '150%';
1000						break;
1001					case 'scrollBottom':
1002						direction = 'top';
1003						startOffset = isInTransition ? '150%' : '50%';
1004						endOffset = isInTransition ? '50%' : '150%';
1005						break;
1006					case 'scrollHorizontal':
1007						startOffset = isInTransition ? '150%' : '50%';
1008						endOffset = isInTransition ? '50%' : '-50%';
1009						break;
1010					case 'scrollVertical':
1011						direction = 'top';
1012						startOffset = isInTransition ? '-50%' : '50%';
1013						endOffset = isInTransition ? '50%' : '150%';
1014						break;
1015				}
1016
1017				if (_self.cache.action === 'prev') {
1018					switch (transition) {
1019						case 'scrollHorizontal':
1020							startOffset = isInTransition ? '-50%' : '50%';
1021							endOffset = isInTransition ? '50%' : '150%';
1022							break;
1023						case 'scrollVertical':
1024							startOffset = isInTransition ? '150%' : '50%';
1025							endOffset = isInTransition ? '50%' : '-50%';
1026							break;
1027					}
1028				}
1029
1030				startTransition['opacity'] = startOpacity;
1031				startTransition[direction] = startOffset;
1032
1033				endTransition['opacity'] = endOpacity;
1034				endTransition[direction] = endOffset;
1035
1036				$object.css(startTransition).show();
1037
1038				// Css transition
1039				if (_self.support.transitions) {
1040					endTransition[_self.support.transition + 'transition'] = speed + 'ms ease';
1041
1042					setTimeout(function() {
1043						$object.css(endTransition);
1044
1045						setTimeout(function() {
1046							$object.css(_self.support.transition + 'transition', '');
1047
1048							if (callback && (_self.isOpen || !isInTransition)) {
1049								callback();
1050							}
1051						}, speed);
1052					}, 15);
1053				} else {
1054					// Fallback to js transition
1055					$object.stop();
1056					$object.animate(endTransition, speed, callback);
1057				}
1058			},
1059			zoom: function($object, type, speed, callback) {
1060				var isInTransition = type === 'in',
1061					startTransition = {},
1062					startOpacity = $object.css('opacity'),
1063					startScale = isInTransition ? 'scale(0.75)' : 'scale(1)',
1064					endTransition = {},
1065					endOpacity = isInTransition ? 1 : 0,
1066					endScale = isInTransition ? 'scale(1)' : 'scale(0.75)';
1067
1068				if (!_self.isOpen && isInTransition) return;
1069
1070				startTransition['opacity'] = startOpacity;
1071				startTransition[_self.support.transition + 'transform'] = startScale;
1072
1073				endTransition['opacity'] = endOpacity;
1074
1075				$object.css(startTransition).show();
1076
1077				// Css transition
1078				if (_self.support.transitions) {
1079					endTransition[_self.support.transition + 'transform'] = endScale;
1080					endTransition[_self.support.transition + 'transition'] = speed + 'ms ease';
1081
1082					setTimeout(function() {
1083						$object.css(endTransition);
1084
1085						setTimeout(function() {
1086							$object.css(_self.support.transition + 'transform', '');
1087							$object.css(_self.support.transition + 'transition', '');
1088
1089							if (callback && (_self.isOpen || !isInTransition)) {
1090								callback();
1091							}
1092						}, speed);
1093					}, 15);
1094				} else {
1095					// Fallback to js transition
1096					$object.stop();
1097					$object.animate(endTransition, speed, callback);
1098				}
1099			}
1100		},
1101		_callHooks: function(hooks) {
1102			if (typeof(hooks) === 'object') {
1103				$.each(hooks, function(index, hook) {
1104					if (typeof(hook) === 'function') {
1105						hook.call(_self.origin);
1106					}
1107				});
1108			}
1109		},
1110		_cacheObjectData: function($object) {
1111			$.data($object, 'cache', {
1112				id: $object.attr('id'),
1113				content: $object.html()
1114			});
1115
1116			_self.cache.originalObject = $object;
1117		},
1118		_restoreObject: function() {
1119			var $object = $('[id^="' + _self.settings.idPrefix + 'temp-"]');
1120
1121			$object.attr('id', $.data(_self.cache.originalObject, 'cache').id);
1122			$object.html($.data(_self.cache.originalObject, 'cache').content);
1123		},
1124		resize: function() {
1125			if (!_self.isOpen) return;
1126
1127			if (_self.isSlideshowEnabled()) {
1128				_self._stopTimeout();
1129			}
1130
1131			_self.dimensions = _self.getViewportDimensions();
1132			_self._calculateDimensions(_self.cache.object);
1133		},
1134		_cacheScrollPosition: function() {
1135			var $window = $('body'),
1136				$document = $(document),
1137				offset = {
1138					'top': $window.scrollTop(),
1139					'left': $window.scrollLeft()
1140				};
1141
1142			_self.cache.scrollPosition = _self.cache.scrollPosition || {};
1143
1144			if ($document.width() > $window.width()) {
1145				_self.cache.scrollPosition.left = offset.left;
1146			}
1147			if ($document.height() > $window.height()) {
1148				_self.cache.scrollPosition.top = offset.top;
1149				var userAgent = window.navigator.userAgent.toLowerCase();
1150				if (userAgent.indexOf('msie') > -1 || userAgent.indexOf('trident') > -1 || userAgent.indexOf("firefox") > -1) {
1151					_self.cache.scrollPosition.top = _self.scrollPosition;
1152				}
1153			}
1154		},
1155		_watchResizeInteraction: function() {
1156			$(window).resize(_self.resize);
1157		},
1158		_unwatchResizeInteraction: function() {
1159			$(window).off('resize', _self.resize);
1160		},
1161		_watchScrollInteraction: function() {
1162			$(window).scroll(_self._cacheScrollPosition);
1163		},
1164		_unwatchScrollInteraction: function() {
1165			$(window).off('scroll', _self._cacheScrollPosition);
1166		},
1167		_restoreScrollPosition: function() {
1168			// $(window)
1169			// 	.scrollTop(parseInt(_self.cache.scrollPosition.top))
1170			// 	.scrollLeft(parseInt(_self.cache.scrollPosition.left))
1171			// 	.resize();
1172		},
1173		_switchToFullScreenMode: function() {
1174			_self.settings.shrinkFactor = 1;
1175			_self.settings.overlayOpacity = 1;
1176
1177			$('html').addClass(_self.settings.classPrefix + 'fullScreenMode');
1178		},
1179		_open: function() {
1180
1181			// スクロール位置セット
1182			currentScrollPos = $(window).scrollTop();
1183			if ($(window).scrollTop() > 1) {
1184				_self.scrollPosition = $(window).scrollTop();
1185			} else {}
1186
1187			_self.isOpen = true;
1188			_self.support.transitions = _self.settings.cssTransitions ? _self.isTransitionSupported() : false;
1189			_self.support.mobileDevice = _self.isMobileDevice();
1190			if (_self.support.mobileDevice) {
1191				$('html').addClass(_self.settings.classPrefix + 'isMobileDevice');
1192				if (_self.settings.fullScreenModeForMobile) {
1193					_self._switchToFullScreenMode();
1194				}
1195			}
1196			if (!_self.settings.transitionIn) {
1197				_self.settings.transitionIn = _self.settings.transition;
1198			}
1199			if (!_self.settings.transitionOut) {
1200				_self.settings.transitionOut = _self.settings.transition;
1201			}
1202
1203			switch (_self.settings.transitionIn) {
1204				case 'fade':
1205				case 'fadeInline':
1206				case 'elastic':
1207				case 'scrollTop':
1208				case 'scrollRight':
1209				case 'scrollBottom':
1210				case 'scrollLeft':
1211				case 'scrollVertical':
1212				case 'scrollHorizontal':
1213					if (_self.objects.case.is(':hidden')) {
1214						_self.objects.close.css('opacity', 0);
1215						_self.objects.overlay.css('opacity', 0);
1216						_self.objects.case.css('opacity', 0);
1217						_self.objects.contentInner.css('opacity', 0);
1218					}
1219					_self.transition.fade(_self.objects.overlay, 'in', _self.settings.speedIn, _self.settings.overlayOpacity, function() {
1220						_self.transition.fade(_self.objects.close, 'in', _self.settings.speedIn);
1221						_self._handleEvents();
1222						_self._processContent();
1223					});
1224					break;
1225				default:
1226					_self.transition.fade(_self.objects.overlay, 'in', 0, _self.settings.overlayOpacity, function() {
1227						_self.transition.fade(_self.objects.close, 'in', 0);
1228						_self._handleEvents();
1229						_self._processContent();
1230					});
1231					break;
1232			}
1233			// console.log(_self.settings.classPrefix);
1234			$('html').addClass(_self.settings.classPrefix + 'open');
1235			_self.objects.case.attr('aria-hidden', 'false');
1236
1237			if(_self.cache.scrollPosition.top > 0){
1238				if ($('body').hasClass('pcView')) {
1239					$('body').css('top', -_self.cache.scrollPosition.top + 'px');
1240				}
1241			} else {
1242				if ($('body').hasClass('pcView')) {
1243					if(_self.scrollPosition > 0){
1244						$('body').css('top', -_self.scrollPosition + 'px');
1245					} else {
1246						$('body').css('top', '0px');
1247					}
1248				}
1249			}
1250		},
1251		close: function() {
1252			_self.isOpen = false;
1253
1254			if (_self.isSlideshowEnabled()) {
1255				_self._stopTimeout();
1256				_self.objects.nav.removeClass(_self.settings.classPrefix + 'paused');
1257			}
1258			_self.objects.loading.hide();
1259			_self._unbindEvents();
1260			_self._unwatchResizeInteraction();
1261			_self._unwatchScrollInteraction();
1262			$('html').removeClass(_self.settings.classPrefix + 'open');
1263			if ($('html').hasClass('inlineMode')) {
1264				$('html').removeClass('inlineMode');
1265			}
1266			_self.objects.case.attr('aria-hidden', 'true');
1267			_self.objects.nav.children().hide();
1268			_self._restoreScrollPosition();
1269			// Call onClose hook functions
1270			_self._callHooks(_self.settings.onClose);
1271
1272			switch (_self.settings.transitionOut) {
1273				case 'fade':
1274				case 'fadeInline':
1275				case 'scrollTop':
1276				case 'scrollRight':
1277				case 'scrollBottom':
1278				case 'scrollLeft':
1279				case 'scrollHorizontal':
1280				case 'scrollVertical':
1281					_self.transition.fade(_self.objects.case, 'out', _self.settings.speedOut, 0, function() {
1282						_self.transition.fade(_self.objects.overlay, 'out', _self.settings.speedOut, 0, function() {
1283							_self.cleanup();
1284						});
1285					});
1286					break;
1287				case 'elastic':
1288					_self.transition.zoom(_self.objects.case, 'out', _self.settings.speedOut, function() {
1289						_self.transition.fade(_self.objects.overlay, 'out', _self.settings.speedOut, 0, function() {
1290							_self.cleanup();
1291						});
1292					});
1293					break;
1294				default:
1295					_self.cleanup();
1296					break;
1297			}
1298
1299			// ブラウザのUAを小文字で取得
1300			var userAgent = window.navigator.userAgent.toLowerCase();
1301			// IEの判定
1302			var isIE = (userAgent.indexOf('msie') >= 0 || userAgent.indexOf('trident') >= 0);
1303
1304			if ($('body').hasClass('spView')) {
1305				// console.log(_self.scrollPosition);
1306				// console.log(_self.cache.scrollPosition.top);
1307				$('body').animate({ scrollTop: _self.scrollPosition }, 0);
1308			} else {
1309				$('html, body').animate({ scrollTop: _self.cache.scrollPosition.top }, 0);
1310				if (isIE) {
1311					document.documentElement.scrollTop = _self.cache.scrollPosition.top;
1312				}
1313			}
1314		},
1315		_unbindEvents: function() {
1316			// Unbind overlay event
1317			_self.objects.overlay.unbind('click');
1318
1319			// Unbind key events
1320			$(document).unbind('keyup.lightcase');
1321
1322			// Unbind swipe events
1323			_self.objects.case.unbind('swipeleft').unbind('swiperight');
1324
1325			// Unbind navigator events
1326			_self.objects.prev.unbind('click');
1327			_self.objects.next.unbind('click');
1328			_self.objects.play.unbind('click');
1329			_self.objects.pause.unbind('click');
1330
1331			// Unbind close event
1332			_self.objects.close.unbind('click');
1333		},
1334		_cleanupDimensions: function() {
1335			var opacity = _self.objects.contentInner.css('opacity');
1336
1337			_self.objects.case.css({
1338				'width': '',
1339				'height': '',
1340				'top': '',
1341				'left': '',
1342				'margin-top': '',
1343				'margin-left': ''
1344			});
1345
1346			_self.objects.contentInner.removeAttr('style').css('opacity', opacity);
1347			_self.objects.contentInner.children().removeAttr('style');
1348		},
1349		cleanup: function() {
1350			_self._cleanupDimensions();
1351
1352			_self.objects.loading.hide();
1353			_self.objects.overlay.hide();
1354			_self.objects.case.hide();
1355			_self.objects.prev.hide();
1356			_self.objects.next.hide();
1357			_self.objects.play.hide();
1358			_self.objects.pause.hide();
1359
1360			_self.objects.case.removeAttr(_self._prefixAttributeName('type'));
1361			_self.objects.nav.removeAttr(_self._prefixAttributeName('ispartofsequence'));
1362
1363			_self.objects.contentInner.empty().hide();
1364			_self.objects.info.children().empty();
1365
1366			if (_self.cache.originalObject) {
1367				_self._restoreObject();
1368			}
1369
1370			// Call onCleanup hook functions
1371			_self._callHooks(_self.settings.onCleanup);
1372
1373			// Restore cache
1374			_self.cache = {};
1375		},
1376		_matchMedia: function() {
1377			return window.matchMedia || window.msMatchMedia;
1378		},
1379		_devicePixelRatio: function() {
1380			return window.devicePixelRatio || 1;
1381		},
1382		_isPublicMethod: function(method) {
1383			return (typeof _self[method] === 'function' && method.charAt(0) !== '_');
1384		},
1385		_export: function() {
1386			window.lightcase = {};
1387
1388			$.each(_self, function(property) {
1389				if (_self._isPublicMethod(property)) {
1390					lightcase[property] = _self[property];
1391				}
1392			});
1393		}
1394	};
1395
1396	_self._export();
1397
1398	$.fn.lightcase = function(method) {
1399		// Method calling logic (only public methods are applied)
1400		if (_self._isPublicMethod(method)) {
1401			return _self[method].apply(this, Array.prototype.slice.call(arguments, 1));
1402		} else if (typeof method === 'object' || !method) {
1403			return _self.init.apply(this, arguments);
1404		} else {
1405			$.error('Method ' + method + ' does not exist on jQuery.lightcase');
1406		}
1407	};
1408})(jQuery);

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.