// baselib.js
// Basic JavaScript Library
// Version 1.7 (Rollover ONLY)
(function() {
// ----------------------------------------------------------------------------
// convArray: 与集合を新規 Array オブジェクトに変換
// ----------------------------------------------------------------------------
// 複数個与えられた場合はすべてを concat する
function convArray(/* arguments */) {
	var ret = [];
	var args = arguments;
	var nargs = args.length;
	for (var a = 0; a < nargs; a++) {
		if (null === args[a] || undefined === args[a]) { continue; }
		var nsets = args[a].length;
		for (var s = 0; s < nsets; s++) { ret.push(args[a][s]); }
	}
	return ret;
};


// ----------------------------------------------------------------------------
// EventControl: 汎用イベント処理
// ----------------------------------------------------------------------------
// Note:
// IE のメモリリークは、DOM ノード上にある循環参照要素に対しては修正された
// （DOM ノードへ append されていない要素が循環参照している場合は未修正）
// 故に、本イベントリスナラッパーはメモリリーク対策を講じていない
// See also:
// http://support.microsoft.com/kb/929874/
// http://www.microsoft.com/japan/msdn/ie/general/ie_leak_patterns.aspx
// http://d.hatena.ne.jp/zorio/20070626/1182875782
// http://d.hatena.ne.jp/zorio/20070918/1190135017
// http://ajaxian.com/archives/ie-memory-leaks-be-gone
// http://ajaxian.com/archives/ies-memory-leak-fix-greatly-exaggerated
// ----------------------------------------------------------------------------
function EventControl() {/* EMPTY */};

EventControl.prototype.add =
EventControl.add = function(element, type, listener, useCapture) {
	if (element.addEventListener) {
		return element.addEventListener(type, listener, useCapture);
	} else if (element.attachEvent) {
		return element.attachEvent("on"+type, listener);
	} else {
		return null;
	}
};

EventControl.prototype.remove =
EventControl.remove = function(element, type, listener, useCapture) {
	if (element.removeEventListener) {
		return element.removeEventListener(type, listener, useCapture);
	} else if (element.detachEvent) {
		return element.detachEvent("on"+type, listener);
	} else {
		return null;
	}
};

EventControl.prototype.getCurrentElement =
EventControl.getCurrentElement = function(event) {
	return (event.currentTarget)     ? event.currentTarget     :
			(event.srcElement)        ? event.srcElement        :
			(window.event.srcElement) ? window.event.srcElement : null;
};

EventControl.prototype.preventDefault =
EventControl.preventDefault = function(event) {
	if (undefined !== event.preventDefault) {
		event.preventDefault();
	} else {
		event.returnValue = false;
	}
};


// ----------------------------------------------------------------------------
// getElementsByClassName: class 名による要素の収集
// ----------------------------------------------------------------------------
// 実装されている UA では無視
if (undefined === document.getElementsByClassName) {(function() {
	var func = null;
	if (document.evaluate) { // XPath が利用できる
		func = function(name) {
			var elems = [];
			var query = document.evaluate( // XPath で収集
				'.//*[contains(concat(" ",@class," "),'+'" '+name+' ")]',
				document,
				null,
				XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
				null
			);
			var nquery = query.snapshotLength;
			for (var i = 0; i < nquery; i++) { // 配列に変換
				elems.push(query.snapshotItem(i));
			}
			return elems;
		};
	} else { // XPath が利用できない
		var spc = "[\t ]";
		var rp = "(?:^|"+spc+")";
		var rs = "(?:"+spc+"|$)";
		func = function(name) {
			var elems = [];
			var regexp = new RegExp(rp+name+rs, "g");
			/*@cc_on @if (@_jscript_version < 5.6)
			var all = document.all;
			@else @*/
			var all = document.getElementsByTagName("*");
			/*@end @*/
			var nall = all.length;
			for (var i = 0; i < nall; i++) { // 全要素を線形探索 (DOM Level 1)
				if (regexp.test(all[i].className)) { elems.push(all[i]); }
			}
			return elems;
		};
	}
	document.getElementsByClassName = func;
})();}


// ----------------------------------------------------------------------------
// Rollover: ロールオーバーの付与
// ----------------------------------------------------------------------------
function Rollover() {
	this.targets = []; // 対象要素集合
}

// イベントタイプ別 元 src 属性値変換対応
Rollover.prototype.events = {
	mouseover : {cond : /(\.[^\.]+)$/g, replace : "-on$1"},
	mouseout  : {cond : "",             replace : ""},
	focus     : {cond : /(\.[^\.]+)$/g, replace : "-on$1"},
	blur      : {cond : "",             replace : ""}
};

// 各種クラス属性値
Rollover.prototype.classNames = {
	enable : { // 適用条件
		str    : "rollover",
		regexp : /(^|[\t ])rollover([\t ]|$)/
	},
	disable : { // 除外条件
		str    : "current",
		regexp : /(^|[\t ])current([\t ]|$)/
	}
};

// ロールオーバー許可
Rollover.prototype.enable = function() {
	this._setTargets();
	var ntargets = this.targets.length;
	for (var t = 0; t < ntargets; t++) {
		for (var type in this.targets[t].events) {
			EventControl.add(this.targets[t].element,
							type,
							this.targets[t].events[type],
							false);
		}
	}
};

// ターゲット要素取得
Rollover.prototype._getElements = function(className) {
	var ret = []; // 取得した要素集合
	var es = document.getElementsByClassName(className);
	var nes = es.length;
	for (var e = 0; e < nes; e++) {
		var nodeName = es[e].nodeName.toLowerCase();
		if ("img" == nodeName ||
			("input" == nodeName && "image" == es[e].getAttribute("type"))) {
			ret.push(es[e]);
		} else {
			ret = ret.concat(
				convArray(es[e].getElementsByTagName("img"))
			);
			var inputs = es[e].getElementsByTagName("input");
			var ninputs = inputs.length;
			var imgInputs = [];
			for (var i = 0; i < ninputs; i++) {
				if ("image" == inputs[i].getAttribute("type")) {
					imgInputs.push(inputs[i]);
				}
			}
			ret = ret.concat(imgInputs);
		}
	}
	return ret;
};

// 対象外要素を除外した要素集合を得る
Rollover.prototype._getElementsWithoutExcludes = function() {
	var ret = [];
	var targets = this._getElements(this.classNames.enable.str).concat(
		this._getElements(this.classNames.disable.str)
	);
	var ntargets = targets.length;
	for (var t = 0; t < ntargets; t++) {
		if (!this._isEnableNode(targets[t])) { continue; }
		ret.push(targets[t]);
	}
	return ret;
};

// 自身ないし最も近い祖先要素が効果を許可しているか否か
Rollover.prototype._isEnableNode = function(node) {
	var d = this.classNames.disable.regexp;
	var e = this.classNames.enable.regexp;
	do {
		if (d.test(node.className)) { return false; }
		if (e.test(node.className)) { return true; }
		node = node.parentNode;
	} while (node);
	// 判別不能だった場合は例外とせず disable として処理
	return false;
};

// 対象要素、イベント、イベントリスナのコレクションを生成
Rollover.prototype._setTargets = function() {
	var elems = this._getElementsWithoutExcludes();
	var nelems = elems.length;
	for (var e = 0; e < nelems; e++) {
		var src = elems[e].getAttribute("src");
		var item = { element : elems[e], events : {} };
		for (var v in this.events) {
			var rsrc = src.replace(this.events[v].cond,
									this.events[v].replace);
			item.events[v] = this._getChanger(rsrc);
			this._createCache(rsrc);
		}
		this.targets.push(item);
	}
};

// 画像置換を実現するクロージャの生成機
Rollover.prototype._getChanger = function(src) {
	return function(event) {
		EventControl.getCurrentElement(event).setAttribute("src", src);
	};
};

// キャッシュ
// 1ドキュメントに1つでよいため prototype へ保存
Rollover.prototype._caches = {};

// キャッシュ生成
Rollover.prototype._createCache = function(src) {
	// 同一ファイルが既にキャッシュ済 -> キャッシュ不要
	// 但し、同一パスのみ対応する
	// 故に、例えば次のパスが全て同一ファイル示していても全てキャッシュされる
	//  /img/test.png
	//  img/test.png
	//  ./img/test.png
	//  http://foo/img/test.png
	if (this._caches[src]) { return; }
	// img 要素を生成し、キャッシュに格納
	this._caches[src] = document.createElement("img");
	this._caches[src].setAttribute("src", src);
};


// ----------------------------------------------------------------------------
// 実行
// ----------------------------------------------------------------------------
EventControl.add(window, "load", function() {
	(new Rollover()).enable();
}, false);

// ----------------------------------------------------------------------------
})();

// ----------------------------------------------------------------------------
// クロスフェード
// ----------------------------------------------------------------------------
$(document).ready(
	function(){
	   $("#promobox").innerfade({
		   animationtype:"fade",
		   speed:"slow",
		   timeout:6000,
		   type:"sequence",
		   containerheight:"auto"
	   });
});

// ----------------------------------------------------------------------------
// ロール
// ----------------------------------------------------------------------------
$(document).ready(
	function(){
		$(".newslist").jCarouselLite({
			vertical:true,
			hoverPause:true,
			visible:1,
			btnNext:".btn-next",
			btnPrev:".btn-prev",
			auto:3400,
			speed:50
		});
});


