



sML = /* JavaScript Library */ {

//	description : "I'm a Simple and Middling Library: for Small or Medium, or a Little bit Larger projects.",
//	copyright   : "Copyright 2010, Satoru MATSUSHIMA",
//	licence     : "Licensed under the MIT License. (http://www.opensource.org/licenses/mit-license.php)",
//	date        : "Tue June 1 00:00:00 2010 +0900",

	version     : "0.2",
	build       : "20100601"

}




//=========================================================================================================================
//-------------------------------------------------------------------------------------------------------------------------

//-- sML.polarstar

//-------------------------------------------------------------------------------------------------------------------------

sML.dir = (function() {
	var Dir = "";
	var SCRIPTs = document.getElementsByTagName("script");
	for(var i = 0, l = SCRIPTs.length; i < l; i++) {
		if(SCRIPTs[i].src.match(/^(.+\/)sML\.js$/)) {
			Dir = SCRIPTs[i].src.replace(/^(.+\/)sML\.js$/, "$1");
			break;
		}
	}
	return Dir;
})();

sML.write = function() {
	document.open();
	for(var l = arguments.length, i = 0; i < l; i++) document.write(arguments[i]);
	document.close();
}

sML.importer = {
	write : function(p) {
		     if(p.type == "css")        sML.write('<link rel="stylesheet" type="text/css" media="' + p.media + '" href="' + p.path + '" />');
		else if(p.type == "javascript") sML.write('<script type="text/javascript" src="' + p.path + '"></script>');
		else return;
	},
	append : function(p) {
		if(p.type == "css") {
			var E = document.createElement("link");
			E.rel = "stylesheet", E.type = "text/css", E.media = p.media, E.href = p.path;
		} else if(p.type == "javascript") {
			var E = document.createElement("script");
			E.type = "text/javascript", E.src = p.path;
		} else return;
		document.getElementsByTagName("head")[0].appendChild(E);
	}
}

//-------------------------------------------------------------------------------------------------------------------------

if(!Array.prototype.reverse) {
	Array.prototype.reverse = function() {
		for(var newArray = [], l = this.length, i = l - 1; i >= 0; i--) newArray[newArray.length] = this[i];
		for(var i = 0; i < l; i++) this[i] = newArray[i];
		return this;
	}
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

if(!Array.prototype.push) {
	Array.prototype.push = function() {
		for(var l = arguments.length, i = 0; i < l; i ++) this[this.length] = arguments[i];
		return this.length;
	}
}

if(!Array.prototype.pop) {
	Array.prototype.pop = function() {
		if(!this.length) return null;
		var last = this[this.length - 1];
		--this.length;
		return last;
	}
}

if(!Array.prototype.shift) {
	Array.prototype.shift = function() {
		if(!this.length) return null;
		this.reverse();
		var first = this.pop();
		this.reverse();
		return first;
	}
}

if(!Array.prototype.unshift) {
	Array.prototype.unshift = function() {
		this.reverse();
		for(var i = arguments.length - 1; i >= 0; i--) this.push(arguments[i]);
		this.reverse();
		return this.length;
	}
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

if(!Array.prototype.map) {
	Array.prototype.map = function(F, pThis) {
		if(typeof F != "function") throw new TypeError();
		for(var newArray = [], l = this.length, i = 0; i < l; i++) newArray.push(F.call(pThis, this[i], i, this));
		return newArray;
	}
}

if(!Array.prototype.filter) {
	Array.prototype.filter = function(F, pThis) {
		if(typeof F != "function") throw new TypeError();
		for(var newArray = [], l = this.length, i = 0; i < l; i++) if(F.call(pThis, this[i], i, this)) newArray.push(this[i]);
		return newArray;
	}
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

if(!Array.prototype.forEach) {
	Array.prototype.forEach = function(F, pThis) {
		if(typeof F != "function") throw new TypeError();
		for(var l = this.length, i = 0; i < l; i++) if(i in this) F.call(pThis, this[i], i, this);
	}
}

foreach = function(O, F, pThis) {
	if(typeof O == "array") O.forEach(F, pThis);
	else for(var l = O.length, i = 0; i < l; i ++) F(O[i], i, pThis);
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

toArray = function() {
	var A = [];
	foreach(arguments, function(I) { foreach(I, function(E) { A.push(E); }); });
	return A;
}

//-------------------------------------------------------------------------------------------------------------------------

sML.UA = {
	WK : ((navigator.userAgent.indexOf("AppleWebKit") > -1) ? 1 : 0),
	Ge : ((navigator.userAgent.indexOf("Gecko/") > -1)      ? 1 : 0),
	Op : ( window.opera                                     ? 1 : 0),
	IE : ((document.all && !this.Op)                        ? 1 : 0),
	FP : 0
}

sML.UA.V2N = function(S) { // Version To Number
	return parseFloat(S.replace(/\./g, ",").replace(/\,/, ".").replace(/\,/g, ""));
}

if(sML.UA.WK) sML.UA.WK = sML.UA.V2N(navigator.userAgent.replace(/^.+AppleWebKit\/([\d\.]+).+$/, "$1"));
if(sML.UA.Ge) sML.UA.Ge = sML.UA.V2N(navigator.userAgent.replace(/^.+rv\:([\d\.]+).+$/, "$1"));
if(sML.UA.IE) {
	     if(document.documentMode)                      sML.UA.IE = parseInt(document.documentMode);
	else if(navigator.userAgent.indexOf("MSIE 7") > -1) sML.UA.IE = 7;
	if(sML.UA.IE < 7) try { document.execCommand("BackgroundImageCache", false, true); } catch(e) {}
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sML.UA.R4 = { // Readied For
	addEventListener       : (document.addEventListener       ? 1 : 0),
	getElementsByClassName : (document.getElementsByClassName ? 1 : 0),
	DOMContentLoaded       : (document.addEventListener       ? 1 : 0)
}

if(sML.UA.WK && sML.UA.WK <= 525) sML.UA.R4.DOMContentLoaded = 0;




//=========================================================================================================================
//-------------------------------------------------------------------------------------------------------------------------

//-- sML.nucleus

//-------------------------------------------------------------------------------------------------------------------------

if(!sML.UA.R4.addEventListener && document.attachEvent) {
	sML.ELM = function(a) {
		/* // 01 & 02 may be sometimes useful, but difficult to removeEventListener
		if(a) return function(Ev, F) {	// 01. 'this' in event-listener == event.target == event.srcElement
			this.attachEvent("on" + Ev, (function(o) {
				return function(e) {
					e.target = e.srcElement;
					F.call(o, e);
				};
			})(this));
		}
		if(a) return function(Ev, F) {	// 02. event.target == event.srcElement
			this.attachEvent("on" + Ev, function(e) {
				e.target = e.srcElement;
				F(e);
			});
		}
		*/
		if(a) return function(Ev, F) { this.attachEvent("on" + Ev, F); }
		else  return function(Ev, F) { this.detachEvent("on" + Ev, F); }
	}
	window.addEventListener    = sML.ELM(1);
	window.removeEventListener = sML.ELM(0);
}

//-------------------------------------------------------------------------------------------------------------------------

sML.onLoad = {
	eventListeners : [],
	executeAll : function() { this.eventListeners.forEach(function(eL) { eL(); }); },
	addEventListener : function(F) { this.eventListeners.push(F); }
}

window.addEventListener("load", function() { sML.onLoad.executeAll(); }, false);

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sML.onRead = {
	eventListeners : [],
	executeAll : function() { sML.onRead.eventListeners.forEach(function(eL) { eL(); }); },
	addEventListener : (function() {
		if(sML.UA.R4.DOMContentLoaded) return function(F) { document.addEventListener("DOMContentLoaded", F, false); };
		else                           return function(F) { sML.onRead.eventListeners.push(F); };
	})()
}

if(sML.UA.IE) {
	sML.onRead.IE = {
		behavior : document.documentElement.addBehavior(sML.dir + "sML.onRead.IE.htc"),
		executeAll : function() {
			sML.onRead.executeAll();
			document.documentElement.removeBehavior(this.behavior);
			sML.onRead.IE = null;
		}
	}
} else if(!sML.UA.R4.DOMContentLoaded) sML.onLoad.addEventListener(sML.onRead.executeAll);

//-------------------------------------------------------------------------------------------------------------------------

document.getElementsByIds = function() {
	var Es = new Array();
	foreach(arguments, function(ID) { if(document.getElementById(ID)) Es.push(document.getElementById(ID)); });
	return Es;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sML.getElementsByClassName = sML.gEbCN = function(Cs) {
	var Es = [], aEs = this.getElementsByTagName("*");
	Cs.split(",").forEach(function(C) {
		foreach(aEs, function(E) {
			var cNs = E.className.split(" ");
			if(C.indexOf(" ") > -1) {
				var cNsStr = " " + cNs.sort().join(" ") + " ";
				var argStr = " " + C.split(" ").sort().join(" ") + " ";
				if(cNsStr.indexOf(argStr) > -1) Es.push(E);
			} else for(var i = 0; i < cNs.length; i ++) if(cNs[i] == C) { Es.push(E); break; }
		});
	});
	return Es;
}

if(!sML.UA.R4.getElementsByClassName && window.HTMLElement && window.Document) {
	if(HTMLElement.prototype.getElementsByClassName == undefined) HTMLElement.prototype.getElementsByClassName = sML.gEbCN;
	if(   Document.prototype.getElementsByClassName == undefined)    Document.prototype.getElementsByClassName = sML.gEbCN;
}

//-------------------------------------------------------------------------------------------------------------------------

sML.extendElements = function(tE) {
	if(sML.UA.R4.addEventListener && sML.UA.R4.getElementsByClassName) return;
	if(!tE) var tE = document;
	var Es = [tE].concat(toArray(tE.getElementsByTagName("*")));
	if(!sML.UA.addEventListener && document.attachEvent) {
		Es.forEach(function(E) {
			if(!E.addEventListener) {
				E.addEventListener    = sML.ELM(1);
				E.removeEventListener = sML.ELM(0);
			}
		});
	}
	if(!sML.UA.getElementsByClassName) Es.forEach(function(E) { E.getElementsByClassName = sML.gEbCN; });
}

if(!sML.UA.R4.addEventListener || !sML.UA.R4.getElementsByClassName) sML.onRead.addEventListener(sML.extendElements);




//=========================================================================================================================
//-------------------------------------------------------------------------------------------------------------------------

//-- sML.flowers

//-------------------------------------------------------------------------------------------------------------------------

try {
	if(sML.UA.IE) {
		var fAX = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"); // Farewell to Flash Player Under-7
		sML.UA.FP = fAX.GetVariable("$version").replace(/^[^\d]+(\d+)\,([\d\,]+)$/, "$1.$2").replace(/\,/g, "");
	} else if(navigator.plugins && navigator.mimeTypes['application/x-shockwave-flash']) {
		var fPI = navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin;
		if(fPI && fPI.description) sML.UA.FP = fPI.description.replace(/^[^\d]+(\d+\.\d+)\s*r(\d+)*\.*$/, "$1$2");
	}
} catch(e) {}

sML.fp = {
	getHTML : function(ID, Src, W, H, Ps, Alt) {
		if(typeof Ps == "undefined") var Ps = {};
		/* common */ var HTML  = '<object type="application/x-shockwave-flash"';
		if(sML.UA.IE)    HTML += ' classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"';
		if(ID)           HTML += ' id="' + ID + '"';
		if(!sML.UA.IE)   HTML += ' data="' + Src + '"';
		/* common */     HTML += ' width="' + W + '" height="' + H + '"';
		/* common */     HTML += '>';
		if(sML.UA.IE)    HTML += '<param name="movie" value ="' + Src + '">';
		for(var P in Ps) HTML += '<param name="' + P + '" value="' + Ps[P] + '" />';
		if(Alt == "UseEMBED") {
			/* common */     HTML += '<embed type="application/x-shockwave-flash" src="' + M + '" width="' + W + '" height="' + H + '"';
			for(var P in Ps) HTML += ' ' + P + '="' + Ps[P] + '"';
			/* common */     HTML += ' />';
		}
		/* common */     HTML += '</object>';
		return HTML;
	},
	set : function(pID, oID, Src, W, H, V, Ps, Alt) {
		if(V && sML.UA.FP < V) alert(V);//return;
		if(!document.getElementById(pID)) return;
		var fA = document.getElementById(pID);
		fA.innerHTML = "";
		setTimeout(function() { fA.innerHTML = sML.fp.getHTML(oID, Src, W, H, Ps, Alt); }, (sML.UA.WK ? 100 : 10));
	},
	write : function(oID, Src, W, H, V, Ps, Alt) {
		if(V && sML.UA.FP < V) return;
		sML.write(sML.fp.getHTML(oID, Src, W, H, Ps, Alt));
	}
}

//-------------------------------------------------------------------------------------------------------------------------

sML.setButtonInteractions = function(Es, Ts, Fs, IN) {
	if(!Fs) Fs = [];
	var fR = function(I, S, F) {
		if(!F) return function() { I.src = S; };
		else   return function() { I.src = S; F.call(this); };
	}
	var As = new Array;
	foreach(Es, function(E) {
		foreach(E.getElementsByTagName("a"), function(A) {
			if(A.getElementsByTagName("img").length > 0) As.push([A, A.getElementsByTagName("img")[0]]);
		});
		foreach(E.getElementsByTagName("input"), function(A) {
			if(A.type == "image") As.push([A, A]);
		});
	});
	As.forEach(function(A) {
		var ImgSrc = {}, Action = {};
		if(IN) IN.call(A[0]);
		if(Ts.length > 0) {
			if(Ts[0] == "*") Ts[0] = "$1";
			ImgSrc.H = new Image().src = A[1].src.replace(/(_link|_hover|_active|_active-down|_active-up|_on|_in)?(\.png|\.gif|\.jpg)/, Ts[0] + "$2");
			Action.H = ((Fs.length < 1) || (typeof Fs[0] != "function")) ? fR(A[1], ImgSrc.H) : fR(A[1], ImgSrc.H, Fs[0]);
			Action.L = ((Fs.length < 2) || (typeof Fs[1] != "function")) ? fR(A[1], A[1].src) : fR(A[1], A[1].src, Fs[1]);
		} else {
			if(Fs.length < 2) return;
			Action.H = function() { Fs[0].call(this); };
			Action.L = function() { Fs[1].call(this); };
		}
		A[0].addEventListener("mouseover", Action.H, false);
		A[0].addEventListener("mouseout",  Action.L, false);
		if(Ts.length > 1) {
			if(Ts[1] == "*") Ts[1] = "$1";
			if(Ts[2] == "*") Ts[2] = "$1";
			ImgSrc.D = new Image().src = A[1].src.replace(/(_link|_hover|_active|_active-down|_active-up|_on|_in)?(\.png|\.gif|\.jpg)/, Ts[1] + "$2");
			ImgSrc.U = new Image().src = (Ts.length > 2) ? A[1].src.replace(/(_link|_hover|_active|_active-down|_active-up|_on|_in)?(\.png|\.gif|\.jpg)/, Ts[2] + "$2") : A[1].src;
			Action.D = ((Fs.length < 3) || (typeof Fs[2] != "function")) ? fR(A[1], ImgSrc.D) : fR(A[1], ImgSrc.D, Fs[2]);
			Action.U = ((Fs.length < 4) || (typeof Fs[3] != "function")) ? fR(A[1], ImgSrc.U) : fR(A[1], ImgSrc.U, Fs[3]);
		} else {
			if(Fs.length < 3) return;
			Action.D = function() { Fs[2].call(this); };
			Action.U = function() { Fs[3].call(this); };
		}
		A[0].addEventListener("mousedown", Action.D, false);
		A[0].addEventListener("keydown",   Action.D, false);
		A[0].addEventListener("mouseup",   Action.U, false);
		A[0].addEventListener("keyup",     Action.U, false);
	});
}

//-------------------------------------------------------------------------------------------------------------------------

sML.setLinksToOpenNewWindow = function(As, F) {
	var Action = F ? F : function() { open(this.href); return false; };
	foreach(As, function(A) { A.onclick = A.onkeypress = Action; });
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sML.setPageTopLinks = function(As, F) {
	var Action = F ? F : function() { window.scrollTo(0, 0); return false; };
	foreach(As, function(A) { A.onclick = A.onkeypress = Action; });
}

//-------------------------------------------------------------------------------------------------------------------------

sML.insertZeroWidthSpace = function(T) {
	return T.replace(/(?=\w)/g, "&#x200B;");
}

//-------------------------------------------------------------------------------------------------------------------------

sML.smoothScroller = {
	getScrollPosition : function() {
		var scrollPosition = { x: 0, y: 0 };
		scrollPosition.x = document.documentElement.scrollLeft || document.body.scrollLeft;
		scrollPosition.y = document.documentElement.scrollTop  || document.body.scrollTop;
		return scrollPosition;
	},
	scrollTo : function(Goal, Frames, Interval, X, Y) {
		var S = sML.smoothScroller.getScrollPosition();
		var G = Goal;
		var F = Frames   ? Frames   : 10;
		var I = Interval ? Interval : 50;
		var D = { x: 0, y: 0 };
		if(X) D.x = (G.x - S.x) / F;
		if(Y) D.y = (G.y - S.y) / F;
		var C = 1;
		var T = setInterval(function() {
			if(C > F) {
				clearInterval(T);
				return;
			}
			window.scrollBy(D.x, D.y);
			C++;
		}, I);
	},
	scrollXTo : function(GoalX, Frames, Interval) {
		sML.smoothScroller.scrollTo({ x:GoalX, y:0 }, Frames, Interval, 1, 0);
	},
	scrollYTo : function(GoalY, Frames, Interval) {
		sML.smoothScroller.scrollTo({ x:0, y:GoalY }, Frames, Interval, 0, 1);
	}
};

//-------------------------------------------------------------------------------------------------------------------------

sML.getOpacity = (function() {
	if(sML.UA.IE) return function(Ob) { return (parseFloat(Ob.style.filter.replace(/alpha\(opacity=([\d\.]+)/, "$1")) / 100); };
	else          return function(Ob) { return  parseFloat(Ob.style.opacity); };
})();

sML.setOpacity = (function() {
	if(sML.UA.IE) return function(Ob, Op) { Ob.style.filter  = "alpha(opacity=" + (Op * 100) + ")"; };
	else          return function(Ob, Op) { Ob.style.opacity = Op; };
})();

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sML.smoothFader = sML.sF = {
	fadeOpacityTo : function(Ob, tO, Cx, fT, Ac) {
		(Ob.sF == undefined) ? (Ob.sF = {}) : clearInterval(Ob.sF.timer);
		Ob.sF.sO = sML.getOpacity(Ob);
		Ob.sF.tO = tO;
		Ob.sF.Cx = Cx ? Cx : 10;
		Ob.sF.fT = fT ? fT : 100;
		Ob.sF.Ac = Ac ? Ac : function() {};
		Ob.sF.Ct = 0;
		Ob.sF.timer = setInterval(function() {
			Ob.sF.Ct ++;
			if(Ob.sF.Ct == Ob.sF.Cx) {
				sML.setOpacity(Ob, Ob.sF.tO);
				clearInterval(Ob.sF.timer);
				Ob.sF.Ac();
			} else {
				sML.setOpacity(Ob, (sML.getOpacity(Ob) + ((Ob.sF.tO - Ob.sF.sO) / Ob.sF.Cx)));
			}
		}, Ob.sF.fT);
	}
}

//-------------------------------------------------------------------------------------------------------------------------

sML.Cookie = {
	Cookies : {},
	set : function(N, K, V) {
		if(!this.Cookies[N]) this.Cookies[N] = {};
		this.Cookies[N][K] = V;
	},
	add : function(N, K, V) {
		if(!this.Cookies[N]) this.Cookies[N] = {};
		this.Cookies[N][K] += V;
	},
	put : function(N, eD) {
		if(!eD) var eD = 1;
		var C = "", Ex = new Date();
		for(var K in this.Cookies[N]) C += "%00" + escape(K) + "=" + escape(this.Cookies[N][K]);
		document.cookie = N + "=" + C.replace(/^%00/, "") + "; expires=" + Ex.toGMTString(Ex.setTime(Ex.getTime() + 86400000 * eD));
	},
	del : function(N) {
		var Ex = new Date();
		document.cookie = N + "=%00; expires=" + Ex.toGMTString(Ex.setTime(Ex.getTime() - 86400000));
	},
	get : function(N, K) {
		var Cs = document.cookie.split("; "), KnVs = [], NCs = {};
		for(var l = Cs.length, i = 0; i < l; i++) {
			if(Cs[i].substr(0, N.length + 1) == (N + "=")){
				var KnVs = Cs[i].substr(N.length + 1, Cs[i].length).split("%00");
				break;
			}
		}
		KnVs.forEach(function(KnV) {
			KnV = KnV.split("=");
			KnV[0] = unescape(KnV[0]);
			KnV[1] = unescape(KnV[1]);
			NCs[KnV[0]] = KnV[1];
		});
		if(!this.Cookies[N]) this.Cookies[N] = NCs;
		return (K ? NCs[K] : NCs);
	}
}
