﻿/* ------------------------------------------------------------

             programed by kura07
                            2010/03/14

------------------------------------------------------------ */


/* ------------------------------------------------------------
   設定値の修正
------------------------------------------------------------ */
isDefined("cc", "0");
isDefined("pss", "[0,0,0,0,0]");

/* ------------------------------------------------------------
   プラグインの折りたたみ
------------------------------------------------------------ */
var pluginFolderObj = {

	setEvents : function(n){

		// 折りたたみにする設定にされてないなら、終わり
		if(!pss[n-1]) return;

		// 要素の取得
		var tL = $c("PluginTitle"+n), bL = $c("PluginBlock"+n);

		for(var i=0,t,b;t=tL[i],b=bL[i];i++){

			// プラグイン名
			var pluginName = t.childNodes[0].nodeValue.replace(/\s/g, "");

			// 初期状態の取得 0=close, 1=open
			var iniState = pfo.useCookie && !!getCookie("Plugin_"+pluginName);

			// スタイルの変更
			var ts = t.style, bs = b.style;
			ts.borderLeftColor = "#aaf";
			ts.backgroundColor = "#eef";
			ts.cursor = "pointer";
			setPseudoClass(t, "hover", ["color", "#555", "#f55"]);
			if(iniState == 0){
				bs.overflow = "hidden";
				bs.height = "37px";
				bs.visibility = "hidden";
			}

			// 開閉する関数
			var folderFunc = function(n){

				var c = pfo.list[n];

				// 透明度と高さを設定する関数
				var setHeightAndOpacity = function(h, o){
					c.bs.height = h + "px";

					if(c.b.filters){
						if(!c.b.filters.alpha) c.bs.filter = "alpha(opacity=0)";
						c.b.filters.alpha.opacity = o * 100;
					}
					else if(brw.ff && brw.v < 3.5){
						c.bs.MozOpacity = o;
					}
					else{
						c.bs.opacity = o;
					}
				};

				// ひらく
				if(c.state == "close"){

					// 状態を変更
					c.state = "opening";

					// 高さの取得
					c.bs.height = "auto"; var h = c.b.offsetHeight;

					// 可視化
					c.bs.visibility = "visible";

					// 透明度
					setHeightAndOpacity(37, 0);

					// タイマーで開く
					for(var i=1;i<=20;i++){
						timer(setHeightAndOpacity, i*30, (h-37)/20*i+37, i/20);
					}
					timer(function(){
						c.bs.height = "auto";
						c.bs.overflow = "visible";
						c.state = "open";
						if(pfo.useCookie) setCookie("Plugin_"+c.name, "open", 7);
					}, i*30);
				}

				// とじる
				if(c.state == "open"){

					// 状態を変更
					c.state = "closing";

					// 高さの取得
					var h = c.b.offsetHeight;

					// はみ出しを隠す
					c.bs.overflow = "hidden";

					// タイマーでとじる
					for(var i=1;i<=20;i++){
						timer(setHeightAndOpacity, i*30, (h-37)/20*(20-i)+37, (20-i)/20);
					}
					timer(function(){
						c.bs.visibility = "hidden";
						c.state = "close";
						if(pfo.useCookie) delCookie("Plugin_"+c.name);
					}, i*30);
				}
			};

			// イベントの登録
			addEvent(t, "click", $f(folderFunc, pfo.list.length));

			// 一覧に登録
			pfo.list.push({t:t, ts:ts, b:b, bs:bs, state:(iniState?"open":"close"), name:pluginName});
		}
	},

	list : [],
	useCookie : cc

}, pfo = pluginFolderObj;

/* ------------------------------------------------------------
   コメントの文字色
------------------------------------------------------------ */
function previewCommentColor(){

	var elm = $("color"),
	func = function(){
		if(!brw.ie && !brw.op) elm.style.color = elm.value;
		$("CommentTextArea").style.color = elm.value;
	};

	addEvent(elm, "keyup", func);
	addEvent(elm, "change", func);

}

/* ------------------------------------------------------------
   テキストエリアの拡張
------------------------------------------------------------ */
var extendCTAobj = {

	// イベントリスナーの登録
	register : function(){
		var textarea = $("CommentTextArea"), elm = $("CommentTextAreaExtend"), body = document.getElementsByTagName("body")[0],
		getY = function(e){
			return brw.ie ? e.y + body.scrollTop : e.pageY;
		};

		// 外見
		var s = elm.style;
		s.marginLeft = "auto";
		s.border = "1px solid #555";
		s.width = "100px"; s.height = "5px";
		s.fontSize = "0"; s.overFlow = "hidden";
		s.cursor = "s-resize";
		textarea.style.height = "50px";

		// 選択の回避
		addEvent(elm, "selectstart", function(){event.returnValue=false;});
		addEvent(elm, "mousedown", function(){event.returnValue=false;});
		elm.unselectable = "on";
		s.MozUserSelect = "none";

		// イベントの登録
		addEvent(elm, "mousedown", function(e){

			if(eo.on) return; eo.on = true;
			var originY = getY(e);

			// Chromeのテキストエリア拡大による変化に対応
			if(textarea.style.height.match(/[\d\.]+px/) && eo.nowSize+"px" != textarea.style.height){
				eo.nowSize = Number(textarea.style.height.replace(/[^\d]/g, ""));
			}

			var moveFunc = function(e){
				eo.nowSize += getY(e) - originY; originY = getY(e);
				textarea.style.height = (eo.nowSize > 0 ? eo.nowSize : 1) + "px";
			},
			upFunc = function(e){
				eo.on = false;
				if(eo.nowSize < 1) eo.nowSize = 1;
				delEvent(body, "mousemove", moveFunc);
				delEvent(body, "mouseup", upFunc);
			};

			addEvent(body, "mousemove", moveFunc);
			addEvent(body, "mouseup", upFunc);
		});
	},

	on : false,
	nowSize : 50
}, eo = extendCTAobj;

/* ------------------------------------------------------------
   ブラウザ判別
------------------------------------------------------------ */
var brw = {
	// http://d.hatena.ne.jp/uupaa/20090603/1244029278 から引用
	v : (function(){
		return window.opera ? (opera.version().replace(/\d$/, "") - 0)
				: parseFloat((/(?:IE |fox\/|ome\/|ion\/)(\d+\.\d)/.
				exec(navigator.userAgent) || [,0])[1]);
	})(),

	ie : "\v" == "v",
	ff : /a/[-1] == "a",
	sf : /a/.__proto__ == "//",
	op : !!window.opera,
	ch : !!navigator.userAgent.match("Chrome")
};
//b.browser = b.ie ? "IE" : b.ff ? "FF" : b.sf ? "SF" : b.op ? "OP" : b.ch ? "CH" : "??";

/* ------------------------------------------------------------
   よく使うやつ
------------------------------------------------------------ */
function timer(func, time){
	var a = arguments, a2 = [];
	for(var i=2;i<a.length;i++) a2.push(a[i]);
	return setTimeout(function(){func.apply(null,a2);}, time);
}
function timerx(obj, funcName, time){
	var a = arguments, a2 = [];
	for(var i=3;i<a.length;i++) a2.push(a[i]);
	return setTimeout(function(){obj[funcName].apply(obj,a2);}, time);
}
function $f(func){
	var a = arguments, a2 = [];
	for(var i=1;i<a.length;i++) a2.push(a[i]);
	return function(){func.apply(null,a2);};
}
function $(_){
	return document.getElementById(_);
}
function $c(_){
	if(document.getElementsByClassName){
		return document.getElementsByClassName(_);
	}
	else {
		var els = document.getElementsByTagName("*"), rtns = [],
		hasAsElm = function(str, name){
			return str.match(new RegExp("^(?:[A-z_\\-]+ )*"+name+"(?: [A-z_\\-]+)*$"));
		};
		for(var i=0;i<els.length;i++) if(hasAsElm(els[i].className, _)) rtns.push(els[i]);
		return rtns;
	}
}
function addEvent(elm, type, event){
	if(elm.attachEvent) elm.attachEvent("on"+type, event, false);
	else elm.addEventListener(type, event, false);
}
function delEvent(elm, type, event){
	if(elm.attachEvent) elm.detachEvent("on"+type, event, false);
	else elm.removeEventListener(type, event, false);
}
function isDefined(varName, value){
	try {
		eval(varName);
	}
	catch(e) {
		eval(varName + " = " + value + ";");
	}
}

/* ------------------------------------------------------------
   CSS擬似クラスのセット
   (IE6以下だとa以外の:hoverと:activeができないので…)
------------------------------------------------------------ */
function setPseudoClass(elm, type){
	// 変更するstyleリスト
	var a = arguments, properties = [];
	for(var i=2;i<a.length;i++) properties.push(a[i]);

	// styleを変更する関数
	var changeStyleFunc = function(elm, property, value){
		return function(){
			elm.style[property] = value;
		};
	};

	// hover
	if(type == "hover"){
		for(var i=0;i<properties.length;i++){
			addEvent(elm, "mouseover" , changeStyleFunc(elm, properties[i][0], properties[i][2]));
			addEvent(elm, "mouseout" , changeStyleFunc(elm, properties[i][0], properties[i][1]));
		}
	}
	// active
	else if(type == "active"){
		for(var i=0;i<properties.length;i++){
			addEvent(elm, "mousedown" , changeStyleFunc(elm, properties[i][0], properties[i][2]));
			addEvent(elm, "mouseout" , changeStyleFunc(elm, properties[i][0], properties[i][1]));
			addEvent(elm, "mouseup" , changeStyleFunc(elm, properties[i][0], properties[i][1]));
		}
	}
}

/* ------------------------------------------------------------
   Cookie関連
------------------------------------------------------------ */
function getCookie(_name){
	var cookies = document.cookie.split("; ");
	for (var i=0;i<cookies.length;i++){
		var str = cookies[i].split("=");
		if (str[0] == escape(_name)){
			return unescape(str[1]);
		}
	}
	return null;
}
function setCookie(_name, _value, _expire/*有効期限日数*/){
	var expiredate = new Date();
	expiredate.setDate(expiredate.getDate() + _expire);
	document.cookie = escape(_name) + "=" + escape(_value) + ";expires=" + expiredate.toGMTString() + ";path=/;";
	return true;
}
function delCookie(_name){
	var expiredate = new Date();
	expiredate.setFullYear(expiredate.getFullYear() - 1);
	document.cookie = escape(_name) + "=;expires=" + expiredate.toGMTString() + ";path=/;";
	return true;
}
