(function($){
    var name_space = 'setSlideShow';
    $.fn[name_space] = function(options){
        var settings = $.extend({
            animation : "fade",
            speed : 1000,
            delay : 5000,
            auto : 0
        }, options);
        var elements = $(this);
        
        // 実行関数
        function set(){
            return function(){
                // 変数

                var panel = $('.panel', this);// 大きい画像を含む要素
                var panelArea = $('#panelArea', this);// 全てのパネルを包むフレーム
                var a = $('#menu > li > a', this);// メニューのa要素

                var timer;// タイマー
                var pWidth = panel.width();// パネルの幅
                var pHeight = panel.height();// パネルの高さ
                var pLength = panel.length;// パネルの数
                var animFlg = true;// アニメーション実行中を判断するフラグ

                // CSS
                panel.parent().css({ position:"relative", width:pWidth, height:pHeight });
                panel.css({ position:"absolute", top:"0", left:"0", width:pWidth, height:pHeight });
                for(var i=0; i<=pLength; i++){ $(panel[i]).css({ zIndex:"100"-i }) }
                
                // 初期設定：最初の要素だけ表示しておく
                menuActivated(a.filter(':first')[0]);
                
                // 自動切替の実行
                autoChange();
               
                // メニューマウスオーバー：自動切替をストップさせる　対象要素を引数にして changePanel を実行する
                // メニューマウスアウト：自動切替を再設定する
                // メニュークリック：JSが有効のときはアンカーリンクが効かないように設定
                // メインマウスオーバー：自動切替をストップさせる　対象要素を引数にして changePanel を実行する
                // メインマウスアウト：自動切替を再設定する
                if(animFlg == true){

                    a.each(function(i){
                        $(this).hover(function(){
                            clearTimeout(timer);
                            changePanel(this, i);
                        },function(){
                            autoChange();
                        });

                        $(this).click(function(){
							//ページ内リンクにするときはrelを指定する必要はない。
							//relが指定されていなかったら下記（LinkChange）を実行させない。
							var relCheck = $(this).attr("rel");
							if(!relCheck ==""){
								LinkChange(this);
							}
								return false;
                        });
                    });

					panel.each(function(i){
						 $(this).hover(function(){
							clearTimeout(timer);
						 },function(){
							autoChange();
						});
					});
                };

                /*
                ===================================================
                 Private 関数
                ===================================================
                */
                // relとhrefをチェンジ
                function LinkChange(elm){
					var target = $(elm);
					var externalLink =target.hasClass("external");
					var targetRel = target.attr("rel");
					//クラスにexternalが降ってあれば外部リンクとして機能させる。
					if(externalLink){
						window.open(targetRel);
					}else{location.href = targetRel;}
					return false;
                }


                // パネル自動切替処理
                function autoChange(){
                    if(settings.auto == 0){return false}// 自動切替設定OFFの場合、実行しない
                    timer = setTimeout(function(){change()}, settings.delay);
                    function change(){
                        a.each(function(i){
                            if( $(this).parent('li').hasClass('current') ){
                                var nextParent = $(this).parent('li').next();
                                var item;
                                (nextParent.length == 0) ? (item = a.filter(':first')[0]) : (item = $('>a', nextParent)[0])
                                changePanel(item, i);
                                return false;
                            }
                        });
                        timer = setTimeout(function(){change()}, settings.delay);
                    }
                }
                
                // パネル変更処理
                function changePanel(elm, index){

                    clearTimeout(timer);
                    var _elm = $(elm);

                    // _elm.parent('li')のclass名にcurrentが無い場合にのみ実行
                    // 現在アクティブなものは処理を走らせない
                    if(!_elm.parent('li').hasClass('current')){
                        var target = panel.filter(elm.hash);
                        if(settings.animation == "fade"){
                            Animation.fade(target, settings.speed, index);
                        }
                        else if(settings.animation == "slide"){
                            Animation.slide(target, settings.speed, index);
                        }
                        else{
                            return
                        }
                        menuActivated(elm);
                    }
                }
                
                // メニューのアクティブ処理
                function menuActivated(elm){
                    var _elm = $(elm);
                    a.each(function(i){
                        var _this = $(this);
                        _this.parent('li').removeClass('current');
                        _elm.parent('li').addClass('current');
                        panel.removeClass('current');
                        panel.filter(elm.hash).addClass('current');
                        var img = $('>img', this);
                        var currentImg = $('>img', _elm);
                        if(img.length > 0){
                            (_this.parent('li').hasClass('current')) ? currentImg.attr('src', currentImg.attr('src').replace('_o.', '_h.')) : img.attr('src', img.attr('src').replace('_h.', '_o.'));
                        }
                    });
                }
                
                // 画像のロールオーバー処理
                function rollover(elm){
                    var roll = new Image;
                    roll.src = elm.src.replace( '_o.', '_h.');
                    $(elm).hover(function(){
                        elm.src = elm.src.replace(new RegExp("_o(\.[a-z]+)$"), "_h$1");
                    },function(){
                        elm.src = elm.src.replace("_h", "_o");
                    });
                }
                
                // アニメーション
                var Animation = {}
                Animation.fade = function(elm, speed){
                    animFlg = false;
                    panel.hide();
                    elm.fadeIn(speed, function(){
                        animFlg = true;
                    });
                }
                
                Animation.slide = function(elm, speed, index){
                    animFlg = false;
                    var curObj = $("p.current", panelArea);
                    for(var i=0; i<=pLength; i++){ $(panel[i]).css({ zIndex:"100"-i }) }
                    curObj.css({ zIndex:"102" });
                    curObj.stop(true, false).animate({"left": elm.width()}, speed, "easeInCubic", function(){
                        animFlg = true;
                    });
                    (index+1 == panel.length) ? $(panel[0]).css({ "left": 0 }) : curObj.next().css({ "left": 0 });
                    elm.css({ left:"0", zIndex:"101" });
                }
            }
        }
        elements.each(set());
        return this;
    };
})(jQuery);



//jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
jQuery.easing['jswing'] = jQuery.easing['swing'];

jQuery.extend( jQuery.easing,
{
	def: 'easeOutQuad',
	swing: function (x, t, b, c, d) {
		//alert(jQuery.easing.default);
		return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
	},
	easeInQuad: function (x, t, b, c, d) {
		return c*(t/=d)*t + b;
	},
	easeOutQuad: function (x, t, b, c, d) {
		return -c *(t/=d)*(t-2) + b;
	},
	easeInOutQuad: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t + b;
		return -c/2 * ((--t)*(t-2) - 1) + b;
	},
	easeInCubic: function (x, t, b, c, d) {
		return c*(t/=d)*t*t + b;
	},
	easeOutCubic: function (x, t, b, c, d) {
		return c*((t=t/d-1)*t*t + 1) + b;
	},
	easeInOutCubic: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t + b;
		return c/2*((t-=2)*t*t + 2) + b;
	},
	easeInQuart: function (x, t, b, c, d) {
		return c*(t/=d)*t*t*t + b;
	},
	easeOutQuart: function (x, t, b, c, d) {
		return -c * ((t=t/d-1)*t*t*t - 1) + b;
	},
	easeInOutQuart: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
		return -c/2 * ((t-=2)*t*t*t - 2) + b;
	},
	easeInQuint: function (x, t, b, c, d) {
		return c*(t/=d)*t*t*t*t + b;
	},
	easeOutQuint: function (x, t, b, c, d) {
		return c*((t=t/d-1)*t*t*t*t + 1) + b;
	},
	easeInOutQuint: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
		return c/2*((t-=2)*t*t*t*t + 2) + b;
	},
	easeInSine: function (x, t, b, c, d) {
		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
	},
	easeOutSine: function (x, t, b, c, d) {
		return c * Math.sin(t/d * (Math.PI/2)) + b;
	},
	easeInOutSine: function (x, t, b, c, d) {
		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
	},
	easeInExpo: function (x, t, b, c, d) {
		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
	},
	easeOutExpo: function (x, t, b, c, d) {
		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
	},
	easeInOutExpo: function (x, t, b, c, d) {
		if (t==0) return b;
		if (t==d) return b+c;
		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
	},
	easeInCirc: function (x, t, b, c, d) {
		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
	},
	easeOutCirc: function (x, t, b, c, d) {
		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
	},
	easeInOutCirc: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
	},
	easeInElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
	},
	easeOutElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
	},
	easeInOutElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
	},
	easeInBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		return c*(t/=d)*t*((s+1)*t - s) + b;
	},
	easeOutBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
	},
	easeInOutBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158; 
		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
	},
	easeInBounce: function (x, t, b, c, d) {
		return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
	},
	easeOutBounce: function (x, t, b, c, d) {
		if ((t/=d) < (1/2.75)) {
			return c*(7.5625*t*t) + b;
		} else if (t < (2/2.75)) {
			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
		} else if (t < (2.5/2.75)) {
			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
		} else {
			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
		}
	},
	easeInOutBounce: function (x, t, b, c, d) {
		if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
		return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
	}
});

$(function(){
//ONLY SlideShow
$('#mainVisual').setSlideShow({ animation:"fade", speed:1000, delay:5000, auto:1 });
});

