
SINAP = {} // Based on sML JavaScript Library, customized for SINAP.jp

//=========================================================================================================================

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)
}

UA.VersionToNumber = function(S) {
	return parseFloat(S.replace(/\./g, ",").replace(/\,/, ".").replace(/\,/g, ""));
}

if(UA.WK) UA.WK = UA.VersionToNumber(navigator.userAgent.replace(/^.+AppleWebKit\/([\d\.]+).+$/, "$1"));
if(UA.Ge) UA.Ge = UA.VersionToNumber(navigator.userAgent.replace(/^.+rv\:([\d\.]+).+$/, "$1"));

if(UA.IE) {
	     if(document.documentMode)                      UA.IE = parseInt(document.documentMode);
	else if(navigator.userAgent.indexOf("MSIE 7") > -1) UA.IE = 7;
	if(UA.IE < 7) try { document.execCommand("BackgroundImageCache", false, true); } catch(e) {}
}

//=========================================================================================================================

if(!document.addEventListener && document.attachEvent) {
//	SINAP.eOb = function(e) { this.target = e.srcElement; }
	SINAP.ELM = function(a) {
		if(a) return function(Ev, F) { this.attachEvent("on" + Ev, F/*function() { return F(new SINAP.eOb(event)); }*/); }
		else  return function(Ev, F) { this.detachEvent("on" + Ev, F); }
	}
	window.addEventListener    = document.addEventListener    = SINAP.ELM(1);
	window.removeEventListener = document.removeEventListener = SINAP.ELM(0);
}

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

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

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

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

SINAP.onRead = {
	compatible : ((UA.Ge || (UA.WK > 525) || UA.Op) ? 1 : 0),
	eventListeners : [],
	executeAll : function() { this.eventListeners.forEach(function(eL) { eL(); }); }
}

SINAP.onRead.addEventListener = (function() {
	if(SINAP.onRead.compatible) return function(F) { document.addEventListener('DOMContentLoaded', F, false); };
	else                        return function(F) { this.eventListeners.push(F); };
})()

if(!SINAP.onRead.compatible) SINAP.onLoad.addEventListener(function() { SINAP.onRead.executeAll(); });

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

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

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

foreach = function(O, F, pThis) { for(var i = 0; i < O.length; i ++) F(O[i], i, pThis); }

toArray = function() {
	var A = new Array;
	foreach(arguments, function(i) { foreach(i, function(j) { A.push(j); }); });
	return A;
}

//=========================================================================================================================

allElements = new Array;

getElementsByClassName = function(Cs) {
	var Es = new Array();
	var aEs = this.getElementsByTagName("*") || allElements;
	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;
}

SINAP.extendElements = function(O) {
	if(!allElements.length) allElements = toArray(document.getElementsByTagName("*"));
	var Es = O ? [O].concat(toArray(O.getElementsByTagName("*"))) : [window, document].concat(allElements);
	Es.forEach(function(E) { E.getElementsByClassName = getElementsByClassName; });
	if(UA.IE) {
		Es.forEach(function(E) {
			if(!E.addEventListener) {
				E.addEventListener    = SINAP.ELM(1);
				E.removeEventListener = SINAP.ELM(0);
			}
		});
	}
}

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

SINAP.onRead.addEventListener(function() { SINAP.extendElements(); });

//=========================================================================================================================

SINAP.setButtonInteractions = function(C, Ts) {
	var As = new Array;
	var Is = new Array;
	var Cs = document.getElementsByClassName(C);
	Cs.forEach(function(i) {
		var Os = i.getElementsByTagName("a");
		foreach(Os, function(j) { As.push(j); });
	});
	As.forEach(function(i) {
		var Os = i.getElementsByTagName("img");
		foreach(Os, function(j) { Is.push(j); });
	});
	var fR = function(I, iS) { return function() { I.src = iS; }; }
	Is.forEach(function(i) {
		var h_src = new Image().src = i.src.replace(/(_selected)?(\.(png|gif|jpg|jpeg))$/, Ts[0] + "$2");
		i.addEventListener("mouseover", fR(i, h_src), false);
		i.addEventListener("mouseout",  fR(i, i.src), false);
	});
	if(Ts.length) Is.forEach(function(i) {
		var a_src = new Image().src = i.src.replace(/(_selected)?(\.(png|gif|jpg|jpeg))$/, Ts[1] + "$2");
		var h_src = new Image().src = i.src.replace(/(_selected)?(\.(png|gif|jpg|jpeg))$/, Ts[0] + "$2");
		i.addEventListener("mousedown", fR(i, a_src), false);
		i.addEventListener("mouseup",   fR(i, h_src), false);
		i.addEventListener("keydown",   fR(i, a_src), false);
		i.addEventListener("keyup",     fR(i, h_src), false);
	});
}

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

//SINAP.onRead.addEventListener(function() { SINAP.setButtonInteractions("リンクを内包する親のclass", [":hoverのときの接尾辞", ":activeのときの接尾辞"]); });
SINAP.onRead.addEventListener(function() { SINAP.setButtonInteractions("rollover", ["_over", "_click"]); });
SINAP.onRead.addEventListener(function() { SINAP.setButtonInteractions("G_rollover", ["_over", ""]); });
SINAP.onRead.addEventListener(function() { SINAP.setButtonInteractions("S_rollover", ["_o", ""]); });

//=========================================================================================================================

