// #require mootools.js
if (window.addEvent) {

// Adjust Transitions.Expo
Fx.Transitions.extend({
	Expo: function(p){
//		return Math.pow(2, 8 * (p - 1));	// original
		return Math.pow(2, 8 * (p - 1)) - 1/256;	// result is exactly 0 when p := 0
//		return (Math.pow(2, 8 * p) - 1) / 255;	// result is exactly 0 when p := 0, and exactly 1 when p := 1
	},
	SineInExpoOut: function (p) {
		if (p < 0.3) {
			return Fx.Transitions.Sine.easeIn(p / 0.3) / 2;
		} else {
			return 1 - Fx.Transitions.Expo.easeIn((1 - p) / 0.7) / 2;
		}
	}
});

// RollOver & BrightOver
var selectors = [
	"a.rollover",	// 一般A
	"img.rollover",	// 一般B
	"input.rollover"	// 一般C
];
// RollOver
window.addEvent('domready', function(){
	// 画像の切り替え表示
	var fn_mover_factory = function(theObj) {
		return function () {
			theObj.target.src = theObj.sw_img.src;
		};
	};
	var fn_mout_factory = function(theObj) {
		return function () {
			theObj.target.src = theObj.or_img.src;
		};
	};
	(function (selectors) {
		selectors = selectors.filter(function(flg){return !!flg;});
		return $$(selectors.join(','));
	})(selectors).each(function (elm) {
		var imgs = [elm];
		if (!elm.src) {
			imgs = elm.getElements('img');
		}
		imgs.each(function (img) {
			if (img.src.test(/^.+-(act|on)\.(gif|jpe?g|png)(\?.*)?$/))	return;
			var or_img = new Image;
			var sw_img = new Image;
			if (window.IEPNGFIX && (img.filters[IEPNGFIX.filter] || (/\.png(\?.*)?$/i).test(img.src))) {
				IEPNGFIX.fix(img);
				or_img.src = img.filters[IEPNGFIX.filter].src;
				sw_img.src = or_img.src.replace(
					/^(.+)(?:-on)?(\.(gif|jpe?g|png)(\?.*)?)$/,
					"$1-on$2");
				var obj = {
					"target": img.filters[IEPNGFIX.filter],
					"or_img": or_img,
					"sw_img": sw_img
				};
			} else {
				or_img.src = img.src;
				sw_img.src = img.src.replace(
					/^(.+)(?:-on)?(\.(gif|jpe?g|png)(\?.*)?)$/,
					"$1-on$2");
				var obj = {
					"target": img,
					"or_img": or_img,
					"sw_img": sw_img
				};
			}
			this.addEvent('mouseenter', fn_mover_factory(obj));
			this.addEvent('mouseleave', fn_mout_factory(obj));
		}, elm);
	});
});
// BrightOver for IE8
if (Browser.Engine.trident && document.documentMode && document.documentMode >= 8) {
	window.addEvent('domready', function(){
		$$('.brightover').each(function (item) {
			var imgs = item.getElements('img');
			if (imgs.length) {
				item.addEvent('mouseenter', function () {
					imgs.setOpacity(0.7);
				}).addEvent('mouseleave', function () {
					imgs.setOpacity(1.0);
				});
			} else {
				item.addEvent('mouseenter', function () {
					item.setOpacity(0.7);
				}).addEvent('mouseleave', function () {
					item.setOpacity(1.0);
				});
			}
		});
		$$('.brightover_rev').each(function (item) {
			var imgs = item.getElements('img');
			if (imgs.length) {
				item.addEvent('mouseenter', function () {
					imgs.setOpacity(1.0);
				}).addEvent('mouseleave', function () {
					imgs.setOpacity(0.7);
				});
				imgs.setOpacity(0.7);
			} else {
				item.addEvent('mouseenter', function () {
					item.setOpacity(1.0);
				}).addEvent('mouseleave', function () {
					item.setOpacity(0.7);
				});
				item.setOpacity(0.7);
			}
		});
	});
}
// BrightOver for IE6,7
if (Browser.Engine.trident && !(document.documentMode && document.documentMode >= 8)) {
	window.addEvent('domready', function(){
		$$('.brightover').each(function (item) {
			item.addEvent('mouseenter', function () {
				item.setOpacity(0.7);
			}).addEvent('mouseleave', function () {
				item.setOpacity(1.0);
			});
		});
		$$('.brightover_rev').each(function (item) {
			item.addEvent('mouseenter', function () {
				item.setOpacity(1.0);
			}).addEvent('mouseleave', function () {
				item.setOpacity(0.7);
			});
			item.setOpacity(0.7);
		});
	});
}

// Smooth Scroll & ElevatorMenu(PageTop-Link)
var evDuration;
var evTransition;
window.addEvent('domready', function () {
	var scrollCtrl = (window.SmoothScroll
		? new SmoothScroll({links: 'a.innerlink, area.innerlink', transition: Fx.Transitions.SineInExpoOut.easeIn})
		: {timer: false, addEvent: $empty}
	);
	var subnavi = $('contents-footer');
	if (subnavi && !subnavi.hasClass('rigid')) {	// Exists and Not Fixed
		var parent = subnavi.getOffsetParent();
		if (Browser.Engine.trident)	parent = $(parent);
		var currTop = subnavi.getPosition(parent).y;
		var limitTop = 54;
		if ($('sidebar')) {
			limitTop += $('sidebar').offsetHeight;
		}
		var limitBottom = 0;
		var limitClientTop = 0;
		var limitMargin = 20;
		//
		if (parent.offsetHeight < subnavi.offsetHeight + limitTop + limitBottom) {
			var adjHeight = subnavi.offsetHeight + limitTop + limitBottom - parent.offsetHeight;
			parent.setStyle('height', (parent.getStyle('height').toInt() + adjHeight));
		}
		//
		var tween = subnavi.get('tween', {
			property: 'top',
			duration: evDuration || 1000,
			link: 'cancel',
			fps: 75,
			transition: $pick(evTransition, Fx.Transitions.Expo.easeInOut)
		});
		var navCtrl = {
			timer: false,
			top: currTop,
			orgTop: currTop,
			status: 0,	// 0: STOP, 1: READY, 2: SCROLL
			scroll: function () {
				navCtrl.timer = $clear(navCtrl.timer);
				navCtrl.orgTop = navCtrl.top;
				navCtrl.status = 2;
				tween.start(navCtrl.top).chain(function () {
					navCtrl.status = 0;
				});
			}
		};
//		var o_scrollTop = window.getScroll().y - 1;
		var o_scrollTop = window.getScroll().y + 1;
		var setNaviTop = function () {
			if (scrollCtrl.timer)	return;
			var winHeight = window.getSize().y;
			var scrollTop = window.getScroll().y;
			var scrollDir = scrollTop - o_scrollTop;
			o_scrollTop = scrollTop;
//			var clientTop = Math.min(Math.floor(winHeight * .1), limitClientTop);
//			var clientTop = limitMargin;
//			if (winHeight > subnavi.offsetHeight + limitMargin) {
//				clientTop = (winHeight - subnavi.offsetHeight) / 2;
//			} else if (scrollDir > 0) {
//				var clientTop = winHeight - subnavi.offsetHeight - limitMargin;
//			}
			var clientTop = winHeight - subnavi.offsetHeight - limitMargin;
			var top = scrollTop + clientTop - parent.getPosition().y;
			top = Math.min(top, parent.offsetHeight - subnavi.offsetHeight - limitBottom);
			top = Math.max(top, limitTop);
			if (currTop != top && ((top - currTop) * scrollDir) > 0) {
			//	navCtrl.timer = $clear(navCtrl.timer);
//				tween.set(currTop + scrollDir / 10);
				currTop = navCtrl.top = top;
				navCtrl.scroll();
			}
		};
//			setNaviTop.periodical(20);
		window.addEvent('scroll', setNaviTop);
		scrollCtrl.addEvent('complete', setNaviTop);
		setNaviTop();
	}
});

}
