if ( typeof window.FD == "undefined" ) {
/*///////////////////////////////////////////////////////////////////

	4D JS

///////////////////////////////////////////////////////////////////*/
	var FD = function (a) {
		if ( window == this )
			return new FD(a);
		if ( typeof a == "string" )
			return new FD().find(a);
	};

/*

		4DIGIT DOM FUNCTIONS

*/
	FD.fn = FD.prototype = {
		find : function (e) {
			var r = FD.getElementByCSS(e);
			if (!r) return;
	/*//////////////////////////////////////////////////
		each
	//////////////////////////////////////////////////*/
			r.each = function (func) {
				FD.each ( r, func );
			};

	/*//////////////////////////////////////////////////
		bundleObj　FUNCTION
	//////////////////////////////////////////////////*/
			/*event {add, remove}*/
			r.event = {
				/*add*/
				add: function(eventType, func, cap){
					r.each ( function (e) {
						FD.event.add( e, eventType, func, cap );
					});
				},
				/*remove*/
				remove: function(eventType, func) {
					r.each ( function (e) {
						FD.event.remove( e, eventType, func );
					});
				}
			};
			/*toggle*/
			r.toggle = function () {
				var arg = arguments;
				r.each( function (e) {
					var i;
					var toggle = function () {
						if (i == undefined) { i = 0 };
						arg[i]();
						i = ( i + 1 < arg.length ? i + 1 : 0);
					}
					e.event.add("click", toggle);
				});
			};
	/*//////////////////////////////////////////////////
		eachObject FUNCTION
	//////////////////////////////////////////////////*/
			r.each (function (e){
				/*event {add, remove}*/
				e.event = {
					add: function (eventType, func, cap) {
						FD.event.add( e, eventType, func, cap );
					},
					remove: function(eventType, func) {
						FD.event.remove( e, eventType, func );
					}
				};
				/*pos*/
				e.pos = FD.findPos(e);
				/*readText*/
				e.readText = function (url) {
					var ajax = new FD.ajax( url );
					ajax.onComplete = function(val){
						e.innerHTML = val;
					};
					ajax.load('text');
				};
				e.readXML = function (url) {
					var ajax = new FD.ajax( url );
					ajax.onComplete = function(val){
						e.innerHTML = val.firstChild.nodeValue;
					};
					ajax.load('xml');
				};
				e.readHTML = function (url) {
					var ajax = new FD.ajax( url );
					ajax.onComplete = function(val){
						e.innerHTML = val.getElementsByTagName('body')[0].innerHTML;
					};
					ajax.load('html');
				};

				/*motion*/
				e.fadeout = function () {
					if (e.fadeID) clearInterval(e.fadeID);
					e.opacity = 10;
					e.style.zoom = 1;
					e.fadeID = setInterval(
						function (){
							e.opacity--;
							if (e.opacity == 0) {
								clearInterval(e.fadeID);
								e.style.visibility = 'hidden';
							}
							if (FD.browser.msie) {
								e.style.filter = 'alpha(opacity='+ (e.opacity*10) +')';
							} else {
								e.style.opacity = e.opacity / 10;
							}
						},50
					);
				};
				e.fadein = function () {
					if (e.fadeID) clearInterval(e.fadeID);
					e.style.visibility = 'visible';
					e.style.zoom = 1;
					e.opacity = 0;
					e.fadeID = setInterval(
						function (){
							e.opacity++;
							if (e.opacity == 10 ) clearInterval(e.fadeID);
							if (FD.browser.msie) {
								e.style.filter = 'alpha(opacity='+ (e.opacity*10) +')';
							} else {
								e.style.opacity = e.opacity / 10;
							}
						},50
					);
				};
			});
		return r;} // eachObject FUNCTION
	};


/*

	4DIGIT CORE FUNCTIONS

*/
	/*//////////////////////////////////////////////////
		each
	//////////////////////////////////////////////////*/
	FD.each = function (arr, func) {
		for (var i = 0; i < arr.length; i++) {
			func (arr[i]);
		}
	};

	/*//////////////////////////////////////////////////
		getElementByCSS
	//////////////////////////////////////////////////*/
	FD.getElementByCSS = function (str) {
		var rev = [];
		str = str.replace(/, /g, ',').replace(/^ 　/gim, '').replace(/ 　$/gim, '');
		var selectors = str.split(',');
		for ( var i in selectors ) {
			var orders = selectors[i].split(" ");
			var elem = [];
			elem[0] = document;
			// function filt
			var filt = function ( order ) {
				var retVal = [];
				var sel =[];
				sel = resolveSelector( order );
				for ( var cnt = 0; cnt < elem.length; cnt++) {
					if ( !sel['tag']  ) sel['tag'] = "*";
					var nowElem = elem[cnt].getElementsByTagName( sel['tag'] );
					for ( var i = 0; i < nowElem.length; i++ ) {
						if ( sel['id'] && sel['id'] != nowElem[i].id ) continue;
						if ( sel['class'] ) {
							var classes = nowElem[i].className.split(" ");
							var err = 1
							for ( var j in classes ) {
								if( sel['class'] == classes[j] )  err = 0;
							}
							if ( err ) continue;
						}
						retVal.push( nowElem[i] );
					}
				}
				return retVal;
			}; // end
			// function resolveSelector
			var resolveSelector = function (str) {
				var rev = ['tag', 'id', 'class'];
				var pat = {
					tag : /\s*([^#\.\:]+)/.exec(str),
					id : /.*#([^\.\:]+)/.exec(str),
					cls : /.*\.([^\:]+)/.exec(str)
				};
				rev['tag'] = (pat['tag'] ? pat['tag'][1] : 'aa' );
				rev['id'] =  (pat['id'] ? pat['id'][1] : '' );
				rev['class'] =  (pat['cls'] ? pat['cls'][1] : '' );
				return rev;
			}; //end
			for ( var j = 0; j < orders.length; j++ ) {
				elem = filt( orders[j] );
			}
			for ( var j = 0; j < elem.length; j++ ) {
				rev.push( elem[j] );
			}
		}
		return rev;
	};

	/*//////////////////////////////////////////////////
		findPos
	//////////////////////////////////////////////////*/
	FD.findPos = function (obj){
		var posX = posY = 0;
		if (obj.offsetParent) {
			posX = obj.offsetLeft;
			posY = obj.offsetTop;
			while (obj = obj.offsetParent) {
				posX += obj.offsetLeft;
				posY += obj.offsetTop;
			}
		}
		return {X:posX, Y:posY};
	};

	/*//////////////////////////////////////////////////
		event
	//////////////////////////////////////////////////*/
	FD.event = {
		add : function ( tar, eventType, func, cap) {
			if( cap == ("" || undefined)) cap = false;
			if ( tar.addEventListener )
				tar.addEventListener ( eventType, func, cap );
			else if ( tar.attachEvent )
				tar.attachEvent ( 'on'+eventType, func );
		},
		remove : function ( tar, eventType, func ) {
			if ( tar.removeEventListener )
				tar.removeEventListener ( eventType, func );
			else if ( tar.detachEvent )
				tar.detachEvent ( 'on'+eventType, func );
		}
	};
	/*//////////////////////////////////////////////////
		fastOnLoad
	//////////////////////////////////////////////////*/
	FD.DOMcheck = {
		complete : function(){
			if(arguments.callee.done) return;
			arguments.callee.done = true;
			if(typeof _timer != 'undefined'){
				clearInterval(_timer);
				_timer = null;
			}
			FD.DOMcheck.onload ();
		},
		check : function(){
			if(document.addEventListener){
				document.addEventListener("DOMContentLoaded", FD.DOMcheck.complete, false);
			}
			if(navigator.userAgent.match(/webkit|safari|khtml/i)){
				var _timer = setInterval( function(){
					if( document.readyState.match(/loaded|complete/)){
						FD.DOMcheck.complete();
					}
				}, 50);
			}
			/*@cc_on @*/
			/*@if (@_win32)
			document.write('<script id="_decoy_" defer src="javascript:void 0"><\/script>');
			document.getElementById("_decoy_").onreadystatechange = function(){
				if(this.readyState=='complete'){
					FD.DOMcheck.complete();
				}
			};
			/*@end @*/
			FD.event.add(window, "load", FD.DOMcheck.complete);
		},
		onload : function() {
			if(FD.onload) FD.onload();
		}
	}
	FD.DOMcheck.check ();
	
	/*//////////////////////////////////////////////////
		ajax
	//////////////////////////////////////////////////*/
	FD.ajax = function  (url, query, method) {
		this.url = url;
		this.query = ( typeof query == 'String' ? query : '' );
		this.method = ( query == ("GET" || "POST") ? method : "GET");
	};
	FD.ajax.prototype.load = function (format) {
		try{this.req = new XMLHttpRequest();} catch(e) {
		try{this.req = new ActiveXObject("Msxml2.XMLHTTP");} catch(e) {
		try{this.req = new ActiveXObject("Microsoft.XMLHTTP");}
		catch(e){
			return null;
		}}}
		this.req.open(this.method, this.url, true);
		var copy = this;
		this.req.onreadystatechange = function(){
			if(copy.req.readyState == 4 && copy.req.status == 200){
				if (format == 'HTML'){
					copy.completeF(copy.req.responseHTML);
				} else if (format != 'text') {
					copy.completeF(copy.req.responseXML.lastChild);
				} else {
					var get_response_text = function ( req ) {
						var txt = req.responseText;
						if ( FD.browser.webkit ) {
							var esc = escape( txt );
							if ( esc.indexOf("%u") < 0 && esc.indexOf("%") > -1 ) {
								txt = decodeURIComponent( esc );
							}
						}
						return txt;
					};
					var ret = get_response_text(copy.req);
					copy.completeF(ret);
				}
			}
		};
		this.req.send(this.query);
	};
	FD.ajax.prototype.completeF = function (val){ if (this.onComplete) this.onComplete(val); };
	FD.ajax.prototype.connectF = function (val){ if (this.onConnect) this.onConnect(val); };
	FD.ajax.prototype.errorF = function (val){ alert(val); };
	/*//////////////////////////////////////////////////
		browser
	//////////////////////////////////////////////////*/
	FD.browser = {
		msie : /msie/.test(navigator.userAgent.toLowerCase()),
		msie5 : /msie 5.0/.test(navigator.userAgent.toLowerCase()),
		msie55 : /msie 5.5/.test(navigator.userAgent.toLowerCase()),
		gecko : /gecko/.test(navigator.userAgent.toLowerCase()),
		webkit : /webkit/.test(navigator.userAgent.toLowerCase()),
		firefox : /webkit/.test(navigator.userAgent.toLowerCase())
					 && /gecko/.test(navigator.userAgent.toLowerCase()),
		safari : /webkit/.test(navigator.userAgent.toLowerCase())
					 && /gecko/.test(navigator.userAgent.toLowerCase()),
		opera : window.opera,
		mac : /mac/.test(navigator.userAgent.toLowerCase()),
		win : /win/.test(navigator.userAgent.toLowerCase())
	};
	/*//////////////////////////////////////////////////
		isFunction
	//////////////////////////////////////////////////*/
	FD.isFunction = function( fn ) {
		return !!fn && typeof fn != "string" && !fn.nodeName && 
			typeof fn[0] == "undefined" && /function/i.test( fn + "" );
	};
///////////////////////////////////////////////////////////////////
}
