// ====================================================================================================
//
// Author  : metaphhase
// Create  : 2009/02/26
// Update  : 2009/02/26
// Description : アコーディオンを実装する
//
// ====================================================================================================


// Loadが終わるまで非表示にする
// ----------------------------------------
document.write('<style type="text/css">');
document.write('.accordionNavi dd {display:none;}');
document.write('</style>');
// ----------------------------------------

var accordion = {

	//-----------------------------------------
	// 設定値
	//-----------------------------------------
	conf : {
		targetClass : 'accordionNavi',                      // 対象とするクラス名
		targetTag : 'dl',                               // 対象とする要素名
		buttonTag : 'dt',                               // ボタン部分の要素名
		menuTag : 'dd',                                 // メニュー部分の要素名
		initOpen : 'accordionOpen',                    // 初期オープン状態に指定するクラス名
		count : '01'                                       // ※変更不可
	},

	//-----------------------------------------
	// Main処理
	//-----------------------------------------
	main : function() {
		
		var elements = accordion.getTargetElements(accordion.conf.targetClass, accordion.conf.targetTag);
		for (var i = 0; i < elements.length; i++) {
			accordion.createMenu(elements[i]);
		}
		
	},

	//-----------------------------------------
	// アコーディオンメニュー作成
	//-----------------------------------------
	createMenu : function(element) {

		var buttons = element.getElementsByTagName(accordion.conf.buttonTag);
		var menus = element.getElementsByTagName(accordion.conf.menuTag);
		
		for (var i = 0; i < buttons.length; i++) {
			
			// クラス名生成
			var clsName = 'accordionMenu'+accordion.conf.count;
			
			// --------------------------------------
			// ボタン操作
			// --------------------------------------
			if ( buttons[i].className && buttons[i].className.match('lnavBnr') ) {
				break;
			}
			buttons[i].style.cursor = 'pointer';
			buttons[i].className += ' '+clsName;
			var imgs = buttons[i].getElementsByTagName('img');
			for (var x = 0; x < imgs.length; x++) {
				if ((imgs[x].src.match(/_n\./))||(imgs[x].style.filter)){
					try{
						imgs[x].addEventListener('mouseover',accordion.over,false);
						imgs[x].addEventListener('mouseout',accordion.out,false);
					}catch(e){
						imgs[x].attachEvent('onmouseover', (function(el){return function(){accordion.over.call(el);};})(imgs[x])); 
						imgs[x].attachEvent('onmouseout', (function(el){return function(){accordion.out.call(el);};})(imgs[x])); 
					}
				}
			}
			
			// --------------------------------------
			// メニュー操作
			// --------------------------------------
			if ( menus[i] )  {
				menus[i].className += ' '+clsName;
				if ( menus[i].className && !menus[i].className.match(accordion.conf.initOpen) ) {
					menus[i].style.display = 'none';
				} else {
					var button = accordion.getTargetElements(clsName, accordion.conf.buttonTag);
					var img = button[0].getElementsByTagName('img');
					accordion.active(img[0]); // ボタンアクティブ
					menus[i].style.display = 'block';
				}
			}
			
			// メソッド登録 JQuery ----------------------------
			// Mac safari2 対応
			var cb = new checkbrowser();
			if ( !cb.ie && cb.safari ) {
				var button = accordion.getTargetElements(clsName, accordion.conf.buttonTag);
				accordion.addEvent('click',button[0],
					function(){
						var button = accordion.getTargetElements(this.className, accordion.conf.buttonTag);
						var img = button[0].getElementsByTagName('img');
						var menu = accordion.getTargetElements(this.className, accordion.conf.menuTag);
						for (var x = 0; x < menu.length; x++) {
							if ( menu[x].style.display == 'none' ) {
								menu[x].style.display = 'block';
								// ボタンアクティブ
								accordion.active(img[0]);
							} else {
								menu[x].style.display = 'none';
								// 非ボタンアクティブ
								accordion.nonactive(img[0]);
							}
						}
						return false;
					}
				);
			} else {
				$(accordion.conf.buttonTag+'.'+clsName).click(function(){
					var button = accordion.getTargetElements(this.className, accordion.conf.buttonTag);
					var img = button[0].getElementsByTagName('img');
					var menu = accordion.getTargetElements(this.className, accordion.conf.menuTag);
					for (var x = 0; x < menu.length; x++) {
						if ( menu[x].style.display == 'none' ) {
							$(accordion.conf.menuTag+'.'+this.className.replace(/^\s/,'')).slideDown("slow");
							// ボタンアクティブ
							accordion.active(img[0]);
						} else {
							$(accordion.conf.menuTag+'.'+this.className.replace(/^\s/,'')).slideUp("slow");
							// 非ボタンアクティブ
							accordion.nonactive(img[0]);
						}
					}
					return false;
				});
			}
			
			var intCnt = parseInt(accordion.conf.count,10);
			if ( intCnt < 9 ) {
				intCnt = intCnt + 1;
				accordion.conf.count = '0' + intCnt;
			} else {
				intCnt = intCnt + 1;
				accordion.conf.count = '' + intCnt;
			}
			
		}

	},
	over : function() {
		if ( (!this.className) || (this.className && !this.className.match('accordionActive')) ) {
			if ( (this.style) && (this.style.filter) && (this.style.filter.match(/_n\.png/)) ) { //(IE5.5-6 && png)
				this.style.filter = this.style.filter.replace('_n.png', '_r.png');
			} else {
				this.src = this.src.replace('_n.', '_r.');
			}
		}
	},
	out : function(){
		if ( (!this.className) || (this.className && !this.className.match('accordionActive')) ) {
			if ( (this.style) && (this.style.filter) && (this.style.filter.match(/_r\.png/)) ) { //(IE5.5-6 && png)
				this.style.filter = this.style.filter.replace('_r.png', '_n.png');
			} else {
				this.src = this.src.replace('_r.', '_n.');
			}
		}
	},
	active : function(element){
		if ( (this.style) && (element.style.filter) && (element.style.filter.match(/_r\.png/)) ) { //(IE5.5-6 && png)
			element.style.filter = element.style.filter.replace('_r.png', '_a.png');
			element.style.filter = element.style.filter.replace('_n.png', '_a.png');
		} else {
			element.src = element.src.replace('_r.', '_a.');
			element.src = element.src.replace('_n.', '_a.');
		}
		element.className += ' accordionActive'
	},
	nonactive : function(element){
		if ( (this.style) && (element.style.filter) && (element.style.filter.match(/_r\.png/)) ) { //(IE5.5-6 && png)
			element.style.filter = element.style.filter.replace('_a.png', '_n.png');
		} else {
			element.src = element.src.replace('_a.', '_n.');
		}
		element.className = element.className.replace('accordionActive','');
	},

	//-----------------------------------------
	// ターゲットタグを取得する
	//-----------------------------------------
	getTargetElements : function(cls, tag) {

		var elements = new Array();
		var targetElements = document.getElementsByTagName(tag);

		for (var i = 0; i < targetElements.length; i++) {
			if (targetElements[i].className.match(cls)) {
				elements[elements.length] = targetElements[i];
			}
		}

		return elements;

	},

	//-----------------------------------------
	// イベントに追加
	//-----------------------------------------
	addEvent : function(event, target, func) {
		try {
			target.addEventListener(event, func, false);
		} catch (e) {
			target.attachEvent('on' + event, func);
		}
	},

	//-----------------------------------------
	// Loadイベントに追加
	//-----------------------------------------
	addLoadEvent : function() {
		try {
			window.addEventListener('load', this.main, false);
		} catch (e) {
			window.attachEvent('onload', this.main);
		}
	}

}

accordion.addLoadEvent();

var checkbrowser = function() {

	// ブラウザ
	this.browserName = '';     // [String]  ブラウザ名
	this.browserSName = '';    // [String]  ブラウザ名(略)
	this.browserMVersion = 0;  // [Int]     ブラウザメジャーバージョン
	this.browserVersion = 0;   // [Float]   ブラウザバージョン
	// ------
	this.ie = false;           // [Boolean] InternetExplorerである場合はtrue
	this.macie = false;        // [Boolean] MacIEであれば true
	this.firefox = false;      // [Boolean] Firefoxであれば true
	this.safari = false;       // [Boolean] Safariであれば true
	this.opera = false;        // [Boolean] Operaであれば true
	this.netscape = false;     // [Boolean] Netscapeであれば true
	this.gchrome = false;      // [Boolean] Google Chromeであれば true

	// エンジン
	this.engineName = '';      // [String]  エンジン名
	this.engineVersion = 0;    // [Float]   エンジンバージョン
	// ------
	this.webkit = false;       // [Boolean] Webkitエンジンを使用していれば true
	this.gecko = false;        // [Boolean] Geckoエンジンを使用していれば true
	this.presto = false;       // [Boolean] Prestoエンジンを使用していれば true
	this.trident = false;      // [Boolean] Tridentエンジンを使用していれば true
	this.tasman = false;       // [Boolean] Tasmanエンジンを使用していれば true

	var constBrowser = new Array('MSIE','Firefox','Opera','Safari','Chrome','Netscape');
	var constSBrowser = new Array('IE','FF','OP','SF','GC','NS');
	var constEngine = new Array('Gecko','WebKit','Presto','Trident','Tasman');

	var uaString = navigator.userAgent;

	var i;

	// ブラウザ取得
	for (i=0; i<constBrowser.length; i++) {
		if ( uaString.match(constBrowser[i]) ) {
			if ( constBrowser[i] == 'MSIE' ) {
				if ( uaString.match('Windows NT') ) {
					this.ie = true;
					this.trident = true;
					this.engineName = 'Trident';
				} else {
					this.macie = true;
					this.tasman = true;
					this.engineName = 'Tasman';
				}
				this.browserName = 'Internet Explorer';
				this.browserSName = constSBrowser[i];
				break;
			} else if ( constBrowser[i] == 'Safari' ) {
				if ( uaString.match('Chrome') ) {
					this.browserName = 'Google Chrome';
					this.browserSName = 'GC';
					this.gchrome = true;
				} else {
					this.browserName = constBrowser[i];
					this.browserSName = constSBrowser[i];
					this.safari = true;
				}
				break;
			} else if ( constBrowser[i] == 'Chrome' ) {
				this.browserName = 'Google Chrome';
				this.browserSName = constSBrowser[i];
				this.gchrome = true;
				break;
			} else  {
				if ( constBrowser[i] == 'Firefox' ) {
					this.firefox = true;
				} else if ( constBrowser[i] == 'Opera' ) {
					this.opera = true;
				} else if ( constBrowser[i] == 'Netscape' ) {
					this.netscape = true;
				}
				this.browserName = constBrowser[i];
				this.browserSName = constSBrowser[i];
				break;
			}
		}
	}

	// ブラウザバージョン取得
	var str = '';
	uaString = uaString + ' ';
	if ( this.browserSName == 'IE' ) {
		str = uaString.substring(uaString.indexOf(this.browserSName), uaString.length);
		str = str.substring(0, str.indexOf(';'));
		str = str.substring(str.indexOf(' ') + 1, str.length);
	} else if ( this.browserSName == 'SF' ) {
		str = uaString.substring(uaString.indexOf('Version'), uaString.length);
		str = str.substring(0, str.indexOf(' '));
		str = str.substring(str.indexOf('/') + 1, str.length);
	} else if ( this.browserSName == 'GC' ) {
		str = uaString.substring(uaString.indexOf('Chrome'), uaString.length);
		str = str.substring(0, str.indexOf(' '));
		str = str.substring(str.indexOf('/') + 1, str.length);
	} else {
		str = uaString.substring(uaString.indexOf(this.browserName), uaString.length);
		str = str.substring(0, str.indexOf(' '));
		str = str.substring(str.indexOf('/') + 1, str.length);
	}
	var result = new Array();
	var ary = str.split('.');
	for (i=0; i<ary.length; i++) {
		if (i == 0) {
			result[0] = ary[i];
			result[1] = ary[i];
		} else if (i == 1) {
			result[1] = result[1] + '.' + ary[i];
			break;
		}
	}
	this.browserMVersion = parseInt(result[0]);
	this.browserVersion =  parseFloat(result[1]);


	// エンジン取得
	if ( this.browserSName != 'IE' ) {
		for (i=0; i<constEngine.length; i++) {
			if ( uaString.match(constEngine[i]) ) {
				if ( constEngine[i] == 'Gecko' ) {
					if ( uaString.match('WebKit') ) {
						this.engineName = 'WebKit';
						this.webkit = true;
					} else {
						this.engineName = constEngine[i];
						this.gecko = true;
					}
				} else {
					if ( constEngine[i] == 'WebKit' ) {
						this.webkit = true;
					} else if ( constEngine[i] == 'Presto' ) {
						this.presto = true;
					}
					this.engineName = constEngine[i];
				}
				break;
			}
		}
	}

	// エンジンバージョン取得
	str = '';
	if ( this.browserSName != 'IE' ) {

		uaString = uaString + ' ';
		if ( this.engineName == 'Gecko' ) {
			str = uaString.substring(uaString.indexOf('rv:'), uaString.length);
			str = str.substring(0, str.indexOf(')'));
			str = str.replace(/^rv:/,'');
		} else {
			str = uaString.substring(uaString.indexOf(this.engineName), uaString.length);
			str = str.substring(0, str.indexOf(' '));
			str = str.substring(str.indexOf('/') + 1, str.length);
		}

		result = new Array();
		ary = str.split('.');
		for (i=0; i<ary.length; i++) {
			if (i == 0) {
				result[0] = ary[i];
			} else if (i == 1) {
				result[0] = result[0] + '.' + ary[i];
				break;
			}
		}

		this.engineVersion =  parseFloat(result[0]);

	} else if ( uaString.match('Trident') ) {

		str = uaString.substring(uaString.indexOf(this.engineName), uaString.length);
		str = str.substring(0, str.indexOf(';'));
		str = str.substring(str.indexOf('/') + 1, str.length);

		result = new Array();
		ary = str.split('.');
		for (i=0; i<ary.length; i++) {
			if (i == 0) {
				result[0] = ary[i];
			} else if (i == 1) {
				result[0] = result[0] + '.' + ary[i];
				break;
			}
		}

		this.engineVersion =  parseFloat(result[0]);

	}

}