/**
 * @name bridge.js
 * @version 0.1.2
 * @date 2009-05-21
 * @revision 11
 */



var $_ = Bridge;

function Bridge(selector) {
//	return Bridge.prototype.collect.apply(Bridge.prototype, arguments);
	// Win IE 5.x
	return (function() {
		return Bridge.prototype.collect(selector);
	})();
}

Bridge.prototype = {
	// 要素を取得
	collect: function(selector) {
		return (typeof selector == 'object') ? selector
			: (selector.match('^#(.+)')) ? document.getElementById(RegExp.$1)
			: (selector.match('^[\.](.+)')) ? this.getElementsByClassName(RegExp.$1)
			: document.getElementsByTagName(selector);
	},

	// クラス名をもとに要素を取得
	getElementsByClassName: function(className, parent, tagName) {
		parent = (typeof parent == 'object') ? parent
			: (typeof parent == 'string') ? document.getElementById(parent)
			: document;
		if (!tagName) tagName = '*';
		var elms = [];
		var collection = parent.getElementsByTagName(tagName);
		if (tagName == '*' && !collection.length && parent.all) collection = parent.all;// Win IE 5.x
		for (var i = 0, l = collection.length; i < l; i++) {
			if (collection[i].className.match('(^|\\s)' + className + '(\\s|$)')) {
//				elms.push(collection[i]);
				elms[elms.length] = collection[i];// Win IE 5.x
			}
		}
		return (elms.length == 0) ? null : elms;
	},

	// イベントを追加
	addEvent: function(elm, ev, fn, capt) {
		if (elm.addEventListener) {// Fx, Sf, Op, Ns
			if (!capt) capt = false;
			elm.addEventListener(ev, fn, capt);
			return true;
		} else if (elm.attachEvent) {// Win IE
			return elm.attachEvent('on' + ev, fn);
		} else {// Mac IE
			var handler = elm['on' + ev];
			if (typeof handler != 'function') {
				handler = function(e) { fn(e); }
			} else {
				var temp = handler;
				handler = function(e) {
					temp(e);
					fn(e);
				}
			}
			return true;
		}
	},

	// 要素を作成
	create: function(name, attr) {
		var elm = document.createElement(name);
		for (var key in attr) elm.setAttribute(key, attr[key]);
		return elm;
	},

	// スタイルを取得
	getStyle: function(elm) {
		return elm.currentStyle || document.defaultView.getComputedStyle(elm, '');
	},

	// 位置を取得
	getPosition: function(elm, mode) {
		var l = elm.offsetLeft;
		var t = elm.offsetTop;
		while(elm = elm.offsetParent) {
			l += elm.offsetLeft;
			t += elm.offsetTop;
		}
		return (mode == 'l') ? l : (mode == 't') ? t : { left: l, top: t };
	},

	// サイズを取得
	getSize: function(elm, mode) {
		var w = elm.offsetWidth || elm.clientWidth || 0;
		var h = elm.offsetHeight || elm.clientHeight || 0;
		return (mode == 'w') ? w : (mode == 'h') ? h : { width: w, height: h };
	},

	// ウインドウサイズを取得
	getWindowSize: function(mode) {
		var win = window;
		var d = document;
		var w = win.innerWidth || d.documentElement.clientWidth || d.body.clientWidth || 0;
		var h = win.innerHeight || d.documentElement.clientHeight || d.body.clientHeight || 0;
		return (mode == 'w') ? w : (mode == 'h') ? h : { width: w, height: h };
	},

	// スクロール量を取得
	getScrollLength: function(mode) {
		var win = window;
		var d = document;
		var x = win.scrollX || win.pageXOffset || d.documentElement.scrollLeft || d.body.scrollLeft || 0;
		var y = win.scrollY || win.pageYOffset || d.documentElement.scrollTop || d.body.scrollTop || 0;	
		return (mode == 'x') ? x : (mode == 'y') ? y : { x: x, y: y };
	},

	// カーソルの座標を取得
	getCursor: function(e, mode) {
		var win = window;
		var d = document;
		var x = e.pageX || win.event.clientX + (d.documentElement.scrollLeft || d.body.scrollLeft || 0) || 0;
		var y = e.pageY || win.event.clientY + (d.documentElement.scrollTop || d.body.scrollTop || 0) || 0;
		return (mode == 'x') ? x : (mode == 'y') ? y : { x: x, y: y };
	},

	// キーコードを取得
	getKeyCode: function(e) {
		return (e || window.event).keyCode;
	},

	// クエリを取得
	getQuery: function(str) {
		var prop = {}
		var temp = str.split('&');
		for (var i = 0, l = temp.length; i < l; i++) {
			temp[i] = temp[i].split('=');
			prop[temp[i][0]] = temp[i][1];
		}
		return prop;
	},

	// クッキーを取得
	getCookie: function(key) {
		return document.cookie.match('(^|;)\\s*' + key + '=([^;]*)(;|$)') ? unescape(RegExp.$2) : null;
	},

	// クッキーをセット
	setCookie: function(key, val, expires, path, domain, secure) {
		var prop = key + '=' + escape(val);
		if (expires) prop += '; expires=' + new Date(new Date().getTime() + expires).toGMTString();
		if (path) prop += '; path=' + path;
		if (domain) prop += '; domain=' + domain;
		if (secure) prop += '; secure';
		document.cookie = prop;
	},

	// クッキーを削除
	deleteCookie: function(key, path, domain) {
		if (this.getCookie(key) === null) return false;
		var prop = key + '=; expires=' + new Date(0).toGMTString();
		if (path) prop += '; path=' + path;
		if (domain) prop += '; domain=' + domain;
		document.cookie = prop;
		return true;
	}
}

for (var key in Bridge.prototype) Bridge[key] = Bridge.prototype[key];







