// 01_globalFilter.txt から読み込まれるグローバルオブジェクト定義
// 
// 同梱フィルタで使用する Prototype.js/jQuery に依存しない基本処理を提供する
// （なるべく jQuery っぽくしていますが必要最低限しか実装していません）
// 
// また、ページ毎に必要なグローバル定義を本オブジェクトに追加する事もある
// Extension 等でグローバル空間を汚染したくない場合、適当なプレフィックスを
// 付加して本オブジェクトに追加しても良い [ex) NicoCache_nl.ext1FuncA()]
//
var NicoCache_nl = {
	// NicoCache_nl オブジェクトを拡張する
	extend: function(options) {
		for (var name in options) {
			this[name] = options[name];
		}
	},
	// console.log があればメッセージをログに出力
	log: function(message) {
		if (window.console && typeof console.log === 'function') {
			console.log(message);
		}
	},
	// XMLHttpRequest オブジェクトを生成して返す
	xhr: function() {
		var xhr = null;
		if (window.XMLHttpRequest) {
			xhr = new XMLHttpRequest();
		} else if (window.ActiveXObject) { // IE6
			try {
				xhr = new ActiveXObject("MSXML2.XMLHTTP");
			} catch (e) {
				try {
					xhr = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {}
			}
		}
		if (xhr == null) {
			this.log("XMLHttpRequest object not found");
		}
		return xhr;
	},
	// オブジェクトをパラメータ文字列(key=value&...)にして返す
	param: function(obj) {
		var s = [];
		for (var key in obj) {
			s.push(encodeURIComponent(key) + "=" + encodeURIComponent(obj[key]));
		}
		return s.join("&").replace(/%20/g, "+");
	},
	// HTTP GET
	get: function(url, data, callback) {
		var xhr = this.xhr();
		if (xhr != null) {
			if (typeof data === 'object' && data != null) {
				data = this.param(data);
			}
			if (typeof data !== 'string') {
				callback = data;
				data = "";
			}
			if (data.length > 0) {
				url += (url.indexOf("?") < 0 ? "?" : "&") + data;
			}
			var sync = false;
			if (typeof callback === 'boolean') {
				sync = callback;
			}
			if (typeof callback !== 'function') {
				callback = this.empty;
			}
			xhr.open('GET', url, !sync);
			xhr.onreadystatechange = function() {
				if (xhr.readyState == 4) callback(xhr);
			}
			xhr.send(null);
		}
		return xhr;
	},
	empty: function() {}
}
