// --------------------------------------------------------------------
// Author  : mashimonator
// Create  : 2010/01/15
// Update  : 2010/01/15
// Description : リンク先サイトのfaviconを取得・付加する
// --------------------------------------------------------------------

var addFavicon2Links = {
	//-----------------------------------------
	// 設定値
	//-----------------------------------------
	config : {
		className : 'favicon', // faviconに付加されるクラス
		width : '16', // faviconの表示サイズ（幅）
		height : '16', // faviconの表示サイズ（高さ）
		style : 'border:none !important; margin:0 !important; padding:0 5px 0 0 !important; vertical-align:text-bottom', // faviconに設定されるスタイル
		notExist : 'img', // faviconが無い場合の動作（img：代替画像表示／none：表示しない）
		blankImg : 'http://pankichi.com/img/file.gif'// faviconが無い場合に表示する画像のパス
	},
	//-----------------------------------------
	// 定数
	//-----------------------------------------
	constant : {
		domain : location.hostname
	},
	//-----------------------------------------
	// 初期処理
	//-----------------------------------------
	initialize : function() {
		var elements = document.getElementsByTagName('A');
		for (var i = 0,len = elements.length; i < len; i++) {
			var href = elements[i].getAttribute('href');
			// 外部サイトへのリンクの場合
			if ( href.match(/^http:|^https:/) && !href.match(addFavicon2Links.constant.domain) ) {
				// ドメイン取得
				var domain = href.match(/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/);
				// faviconパス生成
				var file = 'http://' + RegExp.$2 + '/favicon.ico';
				// img要素生成
				var img = document.createElement('img');
				img.className = addFavicon2Links.config.className;
				img.src = file;
				img.setAttribute('width', addFavicon2Links.config.width);
				img.setAttribute('height', addFavicon2Links.config.height);
				img.onerror = function() {
					switch (addFavicon2Links.config.notExist) {
						case 'img':
							this.src = addFavicon2Links.config.blankImg
							break;
						case 'none':
							this.style.display = 'none';
							break;
						default:
							this.style.display = 'none';
							break;
					}
				};
				// リンクの前に挿入
				elements[i].parentNode.insertBefore(img, elements[i]);
			}
		}
		// faviconのスタイルをセット
		addFavicon2Links.addCssRule('.' + addFavicon2Links.config.className, addFavicon2Links.config.style);
	},
	//-----------------------------------------
	// スタイルシートに規則を追加する
	//-----------------------------------------
	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 );
				}
			}
		}
	},
	//-----------------------------------------
	// イベントに関数を付加する
	//-----------------------------------------
	addEvent : function( target, event, func ) {
		try {
			target.addEventListener(event, func, false);
		} catch (e) {
			target.attachEvent('on' + event, (function(el){return function(){func.call(el);};})(target));
		}
	}
}
// 実行
addFavicon2Links.addEvent( window, 'load', addFavicon2Links.initialize );
