// --------------------------------------------------------------------
// Author  : mashimonator
// Create  : 2009/09/28
// Update  : 2009/09/28
// Description : リンクに対応したアイコンを付加する
// --------------------------------------------------------------------

var addIcon2Links = {
	//-----------------------------------------
	// 設定値
	//-----------------------------------------
	conf : {
		// アイコン配置ディレクトリ（ルート・絶対・相対パスで指定可能）
		imageDir : '../img/',
		
		// アイコンを付加する拡張子 [ 拡張子, 画像ファイル名, クラス名 ]
		extension : [
			[ '.pdf', 'icon_pdf.gif', 'addIconPdf' ],
			[ '.xls', 'icon_excel.gif', 'addIconXls' ],
			[ '.xlsx', 'icon_excel.gif', 'addIconXls' ],
			[ '.doc', 'icon_word.gif', 'addIconDoc' ],
			[ '.docx', 'icon_word.gif', 'addIconDoc' ],
			[ '.ppt', 'icon_ppt.gif', 'addIconPpt' ],
			[ '.pptx', 'icon_ppt.gif', 'addIconPpt' ],
			[ '.zip', 'icon_zip.gif', 'addIconZip' ],
			[ '.lzh', 'icon_zip.gif', 'addIconZip' ],
			[ '.cab', 'icon_zip.gif', 'addIconZip' ],
			[ '.txt', 'icon_txt.gif', 'addIconTxt' ]
		],
		
		// 上記以外でアイコンを付加するリンク（true：付加する／false：付加しない）
		externalFlag : [ false, 'ico_external.png', 'addIconExternal' ], // 外部サイトへのリンク
		mailFlag : [ false, 'ico_mail.png', 'addIconMail' ], // mailto
		httpFlag : [ false, 'ico_http.png', 'addIconHttp' ], // httpへのリンク（httpsページ内のみ有効）
		httpsFlag : [ false, 'ico_https.png', 'addIconHttps' ], // httpsへのリンク（httpページ内のみ有効）
		blankFlag : [ false, 'ico_blank.png', 'addIconBlank' ], // 別ウィンドウ
		
		// httpのドメイン(httpsとドメインが変わる場合は文字列で設定)
		httpDomain : location.hostname,
		// httpsのドメイン(httpとドメインが変わる場合は文字列で設定)
		httpsDomain : location.hostname,
		
		// 該当ページのURL（変更不可）
		url : location.href
	},
	//-----------------------------------------
	// 初期設定
	//-----------------------------------------
	init : function() {
		// CSSセット
		addIcon2Links.addEvent( window, 'load',  addIcon2Links.setStyle );
		// Loadイベントにアイコン付加処理をセット
		addIcon2Links.addEvent( window, 'load',  addIcon2Links.setIcon );
	},
	//-----------------------------------------
	// CSSをセットする
	//-----------------------------------------
	setStyle : function() {
		// アイコン配置ディレクトリの編集
		var imagePath = '';
		if ( addIcon2Links.conf.imageDir.match(/^http:/) || addIcon2Links.conf.imageDir.match(/^https:/) ) {
			// アイコン配置ディレクトリが絶対パスの場合
			imagePath = addIcon2Links.conf.imageDir;
		} else if ( addIcon2Links.conf.imageDir.match(/^[/]/) ) {
			// アイコン配置ディレクトリがルートパスの場合（絶対パスに置き換え）
			if ( addIcon2Links.conf.url.match(/^https:/) ) {
				imagePath = 'https://' + addIcon2Links.conf.httpsDomain + addIcon2Links.conf.imageDir;
			} else {
				imagePath = 'http://' + addIcon2Links.conf.httpDomain + addIcon2Links.conf.imageDir;
			}
		} else {
			// アイコン配置ディレクトリが相対パスの場合
			imagePath = addIcon2Links.conf.imageDir;
		}
		// extension
		var len = addIcon2Links.conf.extension.length;
		for (var i = 0; i < len; i++) {
			addIcon2Links.addCssRule('a.' + addIcon2Links.conf.extension[i][2], 'background:url(' + imagePath + addIcon2Links.conf.extension[i][1] + ') no-repeat right center; padding-right:20px;');
		}
		// external
		if ( addIcon2Links.conf.externalFlag[0] ) {
			addIcon2Links.addCssRule('a.' + addIcon2Links.conf.externalFlag[2], 'background:url(' + imagePath + addIcon2Links.conf.externalFlag[1] + ') no-repeat right center; padding-right:20px;');
		}
		// mailto
		if ( addIcon2Links.conf.mailFlag[0] ) {
			addIcon2Links.addCssRule('a.' + addIcon2Links.conf.mailFlag[2], 'background:url(' + imagePath + addIcon2Links.conf.mailFlag[1] + ') no-repeat right center; padding-right:20px;');
		}
		// http
		if ( addIcon2Links.conf.httpFlag[0] ) {
			addIcon2Links.addCssRule('a.' + addIcon2Links.conf.httpFlag[2], 'background:url(' + imagePath + addIcon2Links.conf.httpFlag[1] + ') no-repeat right center; padding-right:20px;');
		}
		// https
		if ( addIcon2Links.conf.httpsFlag[0] ) {
			addIcon2Links.addCssRule('a.' + addIcon2Links.conf.httpsFlag[2], 'background:url(' + imagePath + addIcon2Links.conf.httpsFlag[1] + ') no-repeat right center; padding-right:20px;');
		}
		// blank
		if ( addIcon2Links.conf.blankFlag[0] ) {
			addIcon2Links.addCssRule('a.' + addIcon2Links.conf.blankFlag[2], 'background:url(' + imagePath + addIcon2Links.conf.blankFlag[1] + ') no-repeat right center; padding-right:20px;');
		}
	},
	//-----------------------------------------
	// リンクにアイコンをセットする
	//-----------------------------------------
	setIcon : function() {
		var elements = document.getElementsByTagName('A');
		var len = elements.length;
		var len2 = addIcon2Links.conf.extension.length;
		for (var i = 0; i < len; i++) {
			// リンク形式のチェック
			if ( !addIcon2Links.checkTextLink(elements[i]) ) {
				continue;
			}
			var setFlag = false;
			var href = elements[i].getAttribute('href');
			if ( !href ) {
				continue;
			}
			// extension
			for (var x = 0; x < len2; x++) {
				var reg = new RegExp( addIcon2Links.conf.extension[x][0] + '$', 'i' );
				if ( href.match(reg) ) {
					elements[i].className += ' ' + addIcon2Links.conf.extension[x][2];
					setFlag = true;
					break;
				}
			}
			// mailto
			if ( !setFlag && addIcon2Links.conf.mailFlag[0] ) {
				if ( href.match(/^mailto:/i) ) {
					elements[i].className += ' ' + addIcon2Links.conf.mailFlag[2];
					setFlag = true;
				}
			}
			// external
			if ( !setFlag && addIcon2Links.conf.externalFlag[0] && addIcon2Links.conf.httpDomain && addIcon2Links.conf.httpsDomain ) {
				var reg = new RegExp( addIcon2Links.conf.httpDomain );
				var reg2 = new RegExp( addIcon2Links.conf.httpsDomain );
				if ( href.match(/^(http:|https:)/) && ( !href.match(reg) && !href.match(reg2) ) ) {
					elements[i].className += ' ' + addIcon2Links.conf.externalFlag[2];
					setFlag = true;
				}
			}
			// http
			if ( !setFlag && addIcon2Links.conf.httpFlag[0] && addIcon2Links.conf.url.match(/^https:/) && addIcon2Links.conf.httpDomain ) {
				var reg = new RegExp( addIcon2Links.conf.httpDomain );
				if ( href.match(/^http:/) && href.match(reg) ) {
					elements[i].className += ' ' + addIcon2Links.conf.httpFlag[2];
					setFlag = true;
				}
			}
			// https
			if ( !setFlag && addIcon2Links.conf.httpsFlag[0] && addIcon2Links.conf.url.match(/^http:/) && addIcon2Links.conf.httpsDomain ) {
				var reg = new RegExp( addIcon2Links.conf.httpsDomain );
				if ( href.match(/^https:/) && href.match(reg) ) {
					elements[i].className += ' ' + addIcon2Links.conf.httpsFlag[2];
					setFlag = true;
				}
			}
			// blank
			if ( !setFlag && addIcon2Links.conf.blankFlag[0] ) {
				var target = elements[i].getAttribute('target');
				if ( target && target.match('_blank') ) {
					elements[i].className += ' ' + addIcon2Links.conf.blankFlag[2];
				}
			}
		}
	},
	//-----------------------------------------
	// スタイルシートに規則を追加する
	//-----------------------------------------
	addCssRule : function ( selector, declarations ) {
		var sheets = document.styleSheets;
		if ( sheets ) {
			if ( sheets.length < 1 ) {
				// 外部読み込みのスタイルシートが無い場合
				var style = document.createElement('style');
				style.setAttribute('type', 'text/css');
				style.innerHTML += selector + '{' + declarations + '}';
				var head = document.getElementsByTagName('HEAD');
				head[0].appendChild(style);
			} else {
				// 一番最後のスタイルシートを取得
				var tSheet = sheets[sheets.length-1];
				if ( document.all ) {
					// iIndexは省略可。省略するとスタイルシートの最後に追加
					tSheet.addRule( selector, declarations );
				} else {
					// ruleはセレクタと宣言ブロック。被挿入規則のインデックスが返る
					tSheet.insertRule( selector + '{' + declarations + '}', tSheet.cssRules.length );
				}
			}
		}
	},
	//-----------------------------------------
	// 画像リンクチェック（テキストリンクチェック）
	//-----------------------------------------
	checkTextLink : function ( element ) {
		var result = true;
		var children = element.childNodes;
		var len = children.length;
		for (var i = 0; i < len; i++) {
			// 子要素にimg要素が含まれる場合
			if ( children[i].nodeType == '1' && children[i].nodeName.match(/IMG/i) ) {
				result = false;
				break;
			}
		}
		return result;
	},
	//-----------------------------------------
	// イベントに関数を付加する
	//-----------------------------------------
	addEvent : function( target, event, func ) {
		try {
			target.addEventListener(event, func, false);
		} catch (e) {
			target.attachEvent('on' + event, func);
		}
	}
}
// 実行
addIcon2Links.init();
