// --------------------------------------------------------------------
// Author  : mashimonator
// Create  : 2009/11/17
// Update  : 2009/11/17
//         : 2009/12/28 IE6で発生していたエラーを修正
// Description : リンクに指定されたファイルのサイズを自動で取得して表示する
// --------------------------------------------------------------------

/*@cc_on 
var doc = document;
eval('var document = doc');
@*/
var fileSizeGetter = {
	//-----------------------------------------
	// 設定値
	//-----------------------------------------
	conf : {
		// サイズを取得する対象の拡張子
		extension : [ '.pdf','.docx', '.doc' ]
	},
	//-----------------------------------------
	// 初期処理
	//-----------------------------------------
	init : function() {
		var elements = document.getElementsByTagName('A');
		for (var i = 0, len = elements.length; i < len; i++) {
			for (var x = 0, len2 = fileSizeGetter.conf.extension.length; x < len2; x++) {
				var href = elements[i].getAttribute('href');
				var reg = new RegExp( fileSizeGetter.conf.extension[x] + '$', 'i' );
				if ( href.match(reg) ) {
					// サイズ取得
					var size = fileSizeGetter.getFileSize(href);
					// サイズを挿入
					if ( size ) {
						elements[i].innerHTML += ' [' + fileSizeGetter.convUnit(size) + ']';
					}
					break;
				}
			}
		}
	},
	// -----------------------------------
	// ファイルサイズを取得する
	// -----------------------------------
	getFileSize : function( href ) {
		// HTTP通信用オブジェクト生成
		var httpObj = fileSizeGetter.createXMLHttpRequest();
		if ( !httpObj ) {
			return false;
		}
		// 同期通信
		httpObj.open('HEAD', href, false);
		try {
			httpObj.send(null);
		} catch(e) {
			// 404 Not Found
			return false;
		}
		// 結果を取得
		if ( !httpObj.getResponseHeader('Content-Length') ) {
			// No Content-Length
			return false;
		} else {
			// Return Content-Length
			if ( httpObj.readyState == 4 && httpObj.status == 200 ) {
				return httpObj.getResponseHeader('Content-Length');
			} else {
				return false;
			}
		}
	},
	// -----------------------------------
	// 単位を変換する
	// -----------------------------------
	convUnit : function( num ) {
		if ( num > 1073741824 ) {
			// GByte
			num = num / (1024*1024*1024);
			return Math.ceil(num) + 'GB';
		} else if ( num > 1048576 ) {
			// MByte
			num = num / (1024*1024);
			return Math.ceil(num) + 'MB';
		} else if ( num > 1024 ) {
			// KByte
			num = num / 1024;
			return Math.ceil(num) + 'KB';
		} else {
			// byte
			return Math.ceil(num) + 'B';
		}
	},
	// -----------------------------------
	// HTTP通信用オブジェクト生成
	// -----------------------------------
	createXMLHttpRequest : function() {
		var XMLhttpObject = null;
		try {
			XMLhttpObject = new XMLHttpRequest();
		} catch(e) {
			var progids = new Array('MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP');
			for (var i = 0, len = progids.length; i < len; i++) {
				try {
					XMLhttpObject = new ActiveXObject(progids[i]);
				} catch (e) {
					XMLhttpObject = null;
				}
			}
		}
		return XMLhttpObject;
	},
	//-----------------------------------------
	// イベントに関数を付加する
	//-----------------------------------------
	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));
		}
	}
}
// 実行
fileSizeGetter.addEvent( window, 'load', fileSizeGetter.init );