/** * nbase plugins.js * * version 1.2.3 (2012/04/20) */ (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 : 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 : 1800, easing : 'easeOutExpo', marginTop : 0 }, options); // 実処理 this.each(function() { var idx = this.href.indexOf('#'); if (idx >= 0) { $(this).click(function() { var id = this.href.slice(idx); 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, false); } return false; }); $(this) .find('a') .click(function() { anchor($(this), true); return false; }); function anchor(a, flg) { var href = a.attr('href'); if (href && href.substr(0,1) != '#') { if (a.is('[target=_blank]')) { window.open(href); } else { window.location = href; } } else if (flg == false) { a.click(); } } }); 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, false) .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); } };