/**
 * neuqp (neu jQuery Plugins)
 *
 * version 1.00 (2011/05/06)
 */

(function($) {
	
	var neuqp = {
		imgext : 'gif|jpg|png',		// 画像の拡張子
		
		/**
		 * イン画像切替え：初期設定
		 */
		inImgInit : function(elms, setting)
		{
			var reg = new RegExp('(' + setting.imgPostfixOff + '|' + setting.imgPostfixIn + ')\.(' + neuqp.imgext + ')$');
			
			elms.find('img').each(function() {
				if (! this.originalSrc) {
					this.originalSrc = $(this).attr('src').replace(reg, setting.imgPostfixOff + '.' + '$2');
				}
				this.inSrc = $(this).attr('src').replace(reg, setting.imgPostfixIn + '.' + '$2');
			});
		},
		
		/**
		 * アコーディオン設定 (初期値)
		 */
		accordionOptions : function()
		{
			return {
				speed			: 400,		// 切替え速度
				buttons			: 'dt',		// ボタン
				bodies			: 'dd',		// 表示・非表示させる部分
				hideOthers		: false,	// 表示時、ほかの対象を非表示とするか
				imgPostfixIn	: null,		// in画像のポストフィクス (null のときin画像使用せず)
				imgPostfixOff	: ''		// off画像のポストフィクス
			};
		},
		
		/**
		 * アコーディオンを開く
		 */
		accordionOpen : function(btn, bdy, setting)
		{
			$(bdy).slideDown(setting.speed);
			if (setting.imgPostfixIn) {
				var e = $(btn).find('img');
				e.attr('src', e[0].inSrc);
			}
		},
		
		/**
		 * アコーディオンを閉じる
		 */
		accordionClose : function(btn, bdy, setting)
		{
			$(bdy).slideUp(setting.speed, function() {
				if (setting.imgPostfixIn) {
					var e = $(btn).find('img');
					e.attr('src', e[0].originalSrc);
				}
			});
		}
	}
	
	
	
	// easing
	$.extend($.easing,{
		easeOutExpo: function (x, t, b, c, d) {
			return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
		}
	});



	/**
	 * rollOver
	 * 
	 * ロールオーバー
	 */
	$.fn.rollOver = function(options)
	{
		// 初期値
		var setting = $.extend({
			imgPostfixOff	: '',
			imgPostfixOn	: '_on',
			imgPostfixIn	: '_in'
		}, options);
		
		
		// 正規表現の定義
		var regOn = new RegExp('(' + setting.imgPostfixOn + '|' + setting.imgPostfixIn + ')\.(' + neuqp.imgext + ')$');
		var regOff = new RegExp(setting.imgPostfixOff + '\.(' + neuqp.imgext + ')$');
		var regIn = new RegExp(setting.imgPostfixIn + '\.(' + neuqp.imgext + ')$');
		
		
		// 実処理
		this.each(function() {
			// initialize
			this.originalSrc = $(this).attr('src').replace(regOn, setting.imgPostfixOff + '.' + '$2');
			this.rolloverSrc = this.originalSrc.replace(regOff, setting.imgPostfixOn + '.' + '$1');
			this.inSrc = this.originalSrc.replace(regOff, setting.imgPostfixIn + '.' + '$1');
			
			// 先読み
			this.rolloverImg = new Image;
			this.rolloverImg.src = this.rolloverSrc;
			
			// ホバー時の処理
			$(this).hover(function() {
				if (! $(this).attr('src').match(regIn)) {
					$(this).attr('src', this.rolloverSrc);
				}
			}, function() {
				if (! $(this).attr('src').match(regIn)) {
					$(this).attr('src', this.originalSrc);
				}
			});
		});
	
		return this;
	};



	/**
	 * fadeOver
	 * 
	 * 透明度を使ったロールオーバー
	 */
	$.fn.fadeOver = function(options)
	{
		// 初期値
		var setting = $.extend({
			speed	: 150,
			opacity	: 0.75,
			imgPostfixIn	: null
		}, options);
		
		
		var regIn = null;
		if (setting.imgPostfixIn) {
			regIn = new RegExp(setting.imgPostfixIn + '\.(' + neuqp.imgext + ')$');
		}
		
		
		// 実処理
		this.each(function() {
			$(this).hover(function() {
				if (! regIn || ! $(this).attr('src').match(regIn)) {
					$(this)
						.stop(true, false)
						.fadeTo(setting.speed, setting.opacity);
				}
			}, function() {
				if (! regIn || ! $(this).attr('src').match(regIn)) {
					$(this).fadeTo(setting.speed, 1);
				}
			});
		});
		
		return this;
	};



	/**
	 * smoothLink
	 * 
	 * ページ内リンクのスムーズ・スクロール
	 */
	$.fn.smoothLink = function(options)
	{
		// 初期値
		var setting = $.extend({
			speed		: 1200,
			easing		: 'easeOutExpo',
			marginTop	: 0
		}, options);
		
		
		// 実処理
		this.each(function() {
			$(this).click(function() {
				var id = this.href.substring(this.href.indexOf('#'), this.href.length);
				if (id != '#') {
					var t = navigator.appName.match(/Opera/) ? 'html' : 'html, body';
					$(t).animate({
							scrollTop: $(id).offset().top - setting.marginTop
						},
						setting.speed, setting.easing);
				}
				return false;
			});
		});
		
		return this;
	};



	/**
	 * alignHeights
	 *
	 * 高さを揃える (heightline的な)
	 */
	$.fn.alignHeights = function()
	{
		// 実処理
		if (this.length > 1) {
			var maxheight = 0;
			this.each(function() {
				maxheight = Math.max($(this).height(), maxheight);
			});
			this.css('height', maxheight);
		}
		
		return this;
	}


	
	/**
	 * boxTarget
	 *
	 * bigtarget的な
	 */
	$.fn.boxTarget = function(options)
	{
		var setting = $.extend({
			hoverClass	: 'boxTargetHover'
		}, options);
		
		
		// 実処理
		this.each(function() {
			$(this)
				.css('cursor', 'pointer')
				.hover(function() {
					$(this).addClass(setting.hoverClass);
				}, function () {
					$(this).removeClass(setting.hoverClass);
				})
				.click(function() {
					var a = $(this).find('a:first');
					if (a.length > 0) {
						anchor(a);
					}
					return false;
				});
			
			
			$(this)
				.find('a')
				.click(function() {
					anchor($(this));
					return false;
				});
			
			function anchor(a)
			{
				var href = a.attr('href');
				if (a.is('[target=_blank]')) {
					window.open(href);
				}
				else {
					window.location = href;
				}
			}
		});
		
		return this;
	}



	/**
	 * popup
	 *
	 * ポップアップウィンドウ
	 */
	$.fn.popup = function(options)
	{
		// 初期値
		var setting = $.extend({
			target		: null,
			width		: 640,
			height		: 400,
			//left
			//top
			menubar		: 'no',
			toolbar		: 'no',
			location	: 'yes',
			status		: 'no',
			resizable	: 'yes',
			scrollbars	: 'yes'
		}, options);


		var target = setting.target;
		delete setting.target;
		
		var opts = [];
		for (var i in setting) {
			var v = (setting[i] === true) ? 'yes' : (
					(setting[i] === false) ? 'no' : setting[i]
			);
			opts.push(i + '=' + v);
		}
		
		// 実処理
		this.each(function() {
			$(this).click(function() {
				window.open($(this).attr('href'), setting.target, opts.join(','));
				return false;
			});
		});

		return this;
	}
	
	
	
	/**
	 * flipSlide
	 *
	 * スライドショー 兼 タブ切替え
	 */
	$.fn.flipSlide = function(options)
	{
		// 初期値
		var setting = $.extend({
			speed			: 400,		// 切替え速度
			interval		: null,		// スライドショー間隔 (null のとき切替えなし)
			buttons			: null,		// タブ(aタグ)要素
			bodies			: 'li',		// 本体部分の要素
			bodyResize		: false,	// 本体の高さを変更するか
			nextButton		: null,		// 次へボタン
			prevButton		: null,		// 前へボタン
			imgPostfixOff	: '',		// off画像のポストフィクス
			imgPostfixIn	: null,		// in画像のポストフィクス (null のときin画像使用せず)
			buttonInClass	: null,		// アクティブ時のボタン部分につけるクラス
			fadeOverlap		: true,		// 画像が重なるようにフェードイン/アウトするか
			animate			: null		// 画像切替えのコールバック関数
		}, options);
		var timerId = null;
		var nowPage = -1;
		
		
		// 実処理
		this.each(function() {
			var buttons = (setting.buttons) ? $(this).find(setting.buttons) : null;
			var bodies = $(this).find(setting.bodies);
			
			
			// イン画像切替え：初期設定
			if (buttons && setting.imgPostfixIn) {
				neuqp.inImgInit(buttons, setting);
			}
			
			
			// 初期ページを表示
			// ★ハッシュ操作
			pageShow(0, 1);
			
			
			// タブクリック
			if (buttons) {
				buttons.click(function() {
					var id = this.href.substring(this.href.indexOf('#'), this.href.length);
					var i = bodies.index(bodies.filter(id));
					pageShow(i);
					return false;
				});
			}
			
			// next ボタン
			if (setting.nextButton) {
				$(setting.nextButton).click(function() {
					pageShowNext();
					return false;
				});
			}

			// prev ボタン
			if (setting.prevButton) {
				$(setting.prevButton).click(function() {
					pageShowPrev();
					return false;
				});
			}
			
			// スライドショー
			if (setting.interval) {
				timerId = setTimeout(pageShowNext, setting.interval);
			}


			// 次のページ
			function pageShowNext()
			{
				var i = bodies.index(bodies.filter(':visible')) + 1;
				if (i >= bodies.length) {
					i = 0;
				}
				pageShow(i);
			}
			
			// 前のページ
			function pageShowPrev()
			{
				var i = bodies.index(bodies.filter(':visible')) - 1;
				if (i < 0) {
					i = bodies.length - 1;
				}
				pageShow(i);
			}
			
			
			// 指定されたタブを表示 (表示状態のタブは事前に消す)
			function pageShow(idx, argSpeed)
			{
				var speed = argSpeed || setting.speed;
				var showElm = $(bodies[idx]);
				var hideElm = bodies.not(':eq(' + idx + ')');
				
				
				nowPage = idx;
				
				
				// 切替えアニメーション
				if (! setting.animate) {
					if (setting.fadeOverlap) {
						// フェードイン／フェードアウト を同時に
						hideElm
							.stop(true, true)
							.fadeOut(speed);
						showElm.fadeIn(speed);
					}
					else {
						// フェードアウト後、フェードイン
						bodies
							.stop(true, false)
							.fadeOut(speed, function() {
								if (bodies.filter(':visible').length == 0) {
									$(bodies[nowPage]).fadeIn(speed);
								}
							});
					}
				}
				else {
					// アニメーション用外部関数呼び出し
					setting.animate(showElm, hideElm);
				}
				
				
				// 外側の高さのリサイズ
				if (setting.bodyResize) {
					var e = (setting.bodyResize === true) ? showElm.parent() : $(setting.bodyResize);
					e.animate({
						height: showElm.height()
					}, speed);
				}
				
				
				// タブ画像の切替え
				if (buttons && setting.imgPostfixIn) {
					buttons.each(function(i) {
						var e = $(this).find('img');
						if (idx == i) {
							e.attr('src', e[0].inSrc);
						}
						else {
							e.attr('src', e[0].originalSrc);
						}
					});
				}
					
					
				// アクティブクラスの設定
				if (buttons && setting.buttonInClass) {
					buttons.each(function(i) {
						if (idx == i) {
							$(this).addClass(setting.buttonInClass);
						}
						else {
							$(this).removeClass(setting.buttonInClass);
						}
					});
				}
				
				
				// タイマー再設定
				if (setting.interval) {
					if (timerId) {
						clearInterval(timerId);
					}
					timerId = setTimeout(pageShowNext, setting.interval);
				}
			};
		});
	
		return this;
	};



	/**
	 * accordion
	 * 
	 * アコーディオンメニュー
	 */
	$.fn.accordion = function(options)
	{
		// 初期値
		var setting = $.extend(neuqp.accordionOptions(), options);
		
		
		// 実処理
		this.each(function() {
			var buttons = $(this).find(setting.buttons);
			var bodies = $(this).find(setting.bodies);
			
			// イン画像切替え：初期設定
			if (buttons && setting.imgPostfixIn) {
				neuqp.inImgInit(buttons, setting);
			}
			
			$(buttons).each(function(idx) {
				$(this).click(function() {
					if (! $(bodies[idx]).is(':visible')) {
						// 表示する
						neuqp.accordionOpen(this, bodies[idx], setting);

						if (setting.hideOthers) {
							// ほかの対象を非表示に
							$(buttons).each(function(i) {
								if (idx != i) {
									neuqp.accordionClose(this, bodies[i], setting);
								}
							});
						}
					}
					else {
						// 非表示にする
						neuqp.accordionClose(this, bodies[idx], setting);
					}
					return false;
				});
			});
		});
		
		return this;
	};



	/**
	 * accordionShow
	 * 
	 * アコーディオンを開く
	 */
	$.fn.accordionShow = function(options)
	{
		// 初期値
		var setting = $.extend(neuqp.accordionOptions(), options);
		
		
		// 実処理
		this.each(function() {
			var buttons = $(this).find(setting.buttons);
			var bodies = $(this).find(setting.bodies);
			
			// イン画像切替え：初期設定
			if (buttons && setting.imgPostfixIn) {
				neuqp.inImgInit(buttons, setting);
			}

			$(buttons).each(function(idx) {
				// 表示する
				neuqp.accordionOpen(this, bodies[idx], setting);
			});
		});
	
		return this;
	};
	
	
	
	/**
	 * accordionHide
	 * 
	 * アコーディオンを閉じる
	 */
	$.fn.accordionHide = function(options)
	{
		// 初期値
		var setting = $.extend(neuqp.accordionOptions(), options);
		
		
		// 実処理
		this.each(function() {
			var buttons = $(this).find(setting.buttons);
			var bodies = $(this).find(setting.bodies);
			
			// イン画像切替え：初期設定
			if (buttons && setting.imgPostfixIn) {
				neuqp.inImgInit(buttons, setting);
			}
			
			$(buttons).each(function(idx) {
				// 非表示にする
				neuqp.accordionClose(this, bodies[idx], setting);
			});
		});
		
		return this;
	};
})(jQuery);



/**
 * ユーティリティ
 *
 * IEのバージョンを判別する
 */
function isIE(ver)
{
	switch (ver) {
		case 6:
			return (! jQuery.support.style && typeof document.documentElement.style.maxHeight == "undefined");
		case 7:
			return (! jQuery.support.style && typeof document.documentElement.style.maxHeight != "undefined");
		case 8:
			return (! jQuery.support.opacity && jQuery.support.style);
		case 9:
			return (window.ActiveXObject != undefined && jQuery.support.opacity);
		case 67:
			return (! jQuery.support.style);
		case 678:
			return (! jQuery.support.opacity);
		default:
			return (window.ActiveXObject != undefined);
	}
};

