/**
 * nbase plugins.js
 *
 * version 1.1 (2011/11/11)
 */

(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
            var oSrc = $(this).attr('src');
            if (! oSrc) {
                return false;
            }
            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   : 0,
            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 + ')');
                var bodyElm = (setting.bodyResize === true) ? showElm.parent() : $(setting.bodyResize);
                
                nowPage = idx;
                
                
                // 切替えアニメーション
                if (! setting.animate) {
                    if (setting.fadeOverlap) {
                        // フェードイン／フェードアウト を同時に
                        hideElm
                            .stop(true, true)
                            .fadeOut(speed);
                        showElm.fadeIn(speed);

                        // 外側の高さのリサイズ
                        if (setting.bodyResize) {
                            bodyElm.animate({
                                height: showElm.height()
                            }, speed);
                        }
                    }
                    else {
                        // フェードアウト後、フェードイン
                        bodies
                            .stop(true, false)
                            .fadeOut(speed, function() {
                                if (bodies.filter(':visible').length == 0) {
                                    $(bodies[nowPage]).fadeTo(1, speed);

                                    // 外側の高さのリサイズ
                                    if (setting.bodyResize) {
                                        bodyElm.animate({
                                            height: $(bodies[nowPage]).height()
                                        }, speed);
                                    }
                                }
                            });
                    }
                }
                else {
                    // アニメーション用外部関数呼び出し
                    setting.animate(showElm, hideElm);
                }
                
                
                // タブ画像の切替え
				if (buttons) {
					buttons.each(function(i) {
						var e = $(this).find('img');
						if (buttons && setting.imgPostfixIn) {
							if (idx == i) {
								e.attr('src', e[0].inSrc);
							}
							else {
								e.attr('src', e[0].originalSrc);
							}
						}
						
						if (idx == i) {
							e.addClass('current');
						}
						else {
							e.removeClass('current');
						}
					});
				}
                    
                    
                // アクティブクラスの設定
                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);
    }
};

