
var $=function(e){
	return document.getElementById(e);
};

var $$ = function(e){return document.getElementsByTagName(e);};

var returnfalse = function(){return false;};
var returntrue = function(){return true;};

var uriEncode =encodeURIComponent;
var uriDecode =decodeURIComponent;

var write = document.write;

var reload = function(){location.reload();}


$A = function(e){
	var rtn = [];
	for(var x = 0, length = e.length; x < length; x++){
		rtn[x] = e[x];
	}
	return rtn;
};

$dump = function(obj){
	var str = "";
	for(var x in obj){
		str += x+" : " + obj[x] + "\r";
	}
	alert(str);
};

function serialize(obj, refs){

	if(!obj){
		return '""';
	}

	if(obj == window || obj == top || obj == document || obj.ownerDocument)
		return '"HTMLObject"';

	if(obj.serialize)
		return obj.serialize();

	if(refs === undefined)
		refs = [];

	switch(obj.constructor){
		case Function:
			return "";
		case Number:
			return obj.toString();
		case Boolean:
			return obj.toString();
		case Array:
			if(refs.search(obj))
				return '"__RECURSION_ARRAY"';

			refs.push(obj);
			var rtn = [];
			for(var x = 0, length = obj.length; x < length; x++){
				rtn.push(serialize(obj[x], refs));
			}
			refs.pop();
			return "[" + rtn.join()+"]";
		case String:
			var rtn = '"' + obj.replace(/\"/g,"\\\"") + '"';
			return rtn.replace(/\r\n/g,'\\n').replace(/\n/g,'\\n');
		case Date:
			return "new Date(" + obj.valueOf() + ")";
		}


		if(refs.search(obj))
			return '"__RECURSION_OBJECT"';

		refs.push(obj);
		var rtn = [];
		for(var x in obj){
			if(!obj[x] || obj[x].constructor !== Function)
				rtn.push('"'+x.replace(/\"/g,"\\\"") + '":' + serialize(obj[x], refs));
		}
		refs.pop();
		return "{" + rtn.join()+"}";
	try{
	}catch(e){
		return "" + obj;
	}
}

function unserialize(str){
	try{
		return eval("("+str+")");
	}catch(e){
		return false;
	}
}

function natsort(l,r){
	var lIdx = 0, rIdx = 0;
	var lLen = l.length, rLen = r.length;
	var lValue, rValue;

	while(1){

		lValue = l.charCodeAt(lIdx++);
		rValue = r.charCodeAt(rIdx++);

		if(isNaN(lValue) || isNaN(rValue))
			break;

		if(lValue > 48 && lValue < 58 && rValue > 48 && rValue < 58){
			lValue = parseInt(l.substr(lIdx -1));
			rValue = parseInt(r.substr(rIdx -1));
		}

		if(lValue > rValue) return 1;
		if(lValue < rValue) return -1;
	}

	return 0;
}

var Initializer = {
	_initFncs : [],
	_bInit : false,
	
	init : function(){
		if(this._bInit)
			return;

		for (var i = 0, length = this._initFncs.length; i < length; i++)
			this._initFncs[i]();


		var is = document.getElementsByTagName("*");
		var i = null;

		for(var x = 0, length = is.length; x < length; x++){
			i = is[x];
			if(i.onclick || i.onmousedown || i.onmouseup){
				i.className += " hand";
			}

		}

	},

	add : function(fnc){
		this._initFncs.push(fnc);
	}
}

var Deinitializer = {
	_initFncs : [],
	
	init : function(){
		for (var i = 0, length = Deinitializer._initFncs.length; i < length; i++)
			Deinitializer._initFncs[i]();
	},

	add : function(fnc){
		if(fnc){
			Deinitializer._initFncs.push(fnc);
			return true;
		}
		return false;
	}
}

Deinitializer.add(function(){window.onunload = null});
window.attachEvent("onunload", function(){Deinitializer.init()});


var _ext_list = {};

function $ext(dest, src){
	try{
		if(!dest.constructor)
			throw "";

		for(var x in src)
			dest[x] = src[x];

	}catch(e){
		var d;
		for(var x in src){
			d = src[x];
			if(d.isFunction == Function){
				_ext_list[dest] = true;
				if(!dest.__methods) dest.__methods = [];
				dest.__methods.push(x);

				dest[x] = src[x];
			}else{
				dest[x] = src[x];
			}
		}

	}

	return dest;
}

function $ext_unload(){
	for(var x in _ext_list)
		alert(_ext_list);
}

Deinitializer.add($ext_unload);


$ext(Array.prototype, {
	isArray : true,
	search : function(e){
		for(var x = 0, length = this.length; x < length; x++){
			if(this[x] === e)
				return this[x];
		}

		return null;
	},
	searchWord : function(e){
		for(var x = 0, length = this.length; x < length; x++){
			if(this[x].toLowerCase() === e.toLowerCase())
				return this[x];
		}

		return false;
	},
	find : function(e){
		for(var x = 0, length = this.length; x < length; x++){
			if(this[x] === e)
				return x;
		}

		return false;
	},
	remove : function(n){
		this.splice(n,1);
	},
	map : function(fnc){
		var rtn = [];
		if(!fnc)
			fnc = function(n){return n;};
		for(var x = 0, length = this.length; x < length; x++)
			rtn.push(fnc(this[x], x))
		return rtn;
	},
	clone : function(){
		var rtn = [];
		for(var x = 0; x < this.length; x++){
			rtn.push(this[x]);
		}
		return rtn;
	},

	shuffle : function(){
		var rtn = this.clone();

		var length = rtn.length;
		for(var x = 0; x < length; x++){
			var rnd = Math.ceil(Math.random() * length) - 1;
			var tmp = rtn[rnd];
			rtn[rnd] = rtn[x];
			rtn[x] = tmp;
		}

		return rtn;
	}

});

$ext(Function.prototype, {
	isFunction : true,

	bind : function(){
		var fnc = this, args = $A(arguments), obj = args.shift();
		return function() {
			return fnc.apply(obj, args.concat($A(arguments)));
		}
	}
});

$ext(String.prototype, {
	isString : true,
	trim : function (){
		return this.replace(/^\s+|\s+$/g,"");
	},
	lenB : function (){
		obxMatchStringwithLENB=0;
		this.replace(/[^\x00-\x7e]/g,function ($1) {obxMatchStringwithLENB++;});
		return this.length+obxMatchStringwithLENB;
	},
	toArray : function(){
		return this.split('');
	},
	repeat : function(n){
		var rtn = "";
		for(var x = 0; x < n; x++){
			rtn+=this;
		}
		return rtn;
	},
	setAt : function(i,c){
		i = parseInt(i);
		if(c == undefined)
			c = '';

		var rtn="";
		rtn += this.substr(0,i);

		while(rtn.length < i)
			rtn+=" ";

		rtn += c;
		rtn += this.substr(i+1);

		return rtn;
	},
	repeat : function(n){
		var rtn = [];
		for(var x = 0; x < n; x++)
			rtn.push(this);

		return rtn.join("");
	}
});

$ext(Number.prototype, {
	isNumber : true,

	toPaddedString : function(len){
		var rtn = this.toString();
		var str = "";
		for(var x = 0,length = len - rtn.length; x < length; x++){
			str+="0";
		}
		return str + rtn;
	}
});

Class = {};
Class.realize = function(){
	var rtn = function(){
		if(this.initialize)
			this.initialize.apply(this, arguments);
	}

	for(var x = 0, length = arguments.length - 1; x < length; x++)
		$ext(rtn,arguments[x]);

	if(arguments.length)
		$ext(rtn.prototype,arguments[x]);
	
	return rtn;
}



var Ajax = Class.realize();

Ajax.Request = Class.realize({
	running : false,
	url : "",
	initialize : function(url, opt){
		if(!url)
			return;

		this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");

		this.opt = $ext({
			async : true,
			method : 'post',
			params : null,
			onSuccess : returnfalse,
			onFailure : returnfalse,
			onResponseOk : returnfalse,
			onResponseError : returnfalse,
			onComplete : returnfalse,
			onAbort : returnfalse
		}, opt);
		var opt = this.opt;
		this.xmlhttp.open(opt.method, url, opt.async);
		this.url = url;

		var QueryData = "";

		if(opt.params){
			QueryData = [];
			var params = opt.params;
			for(var x in params){
				QueryData.push(x + '=' + uriEncode(params[x]));
			}

			QueryData = QueryData.join("&");
			this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
			this.xmlhttp.setRequestHeader("Content-length", QueryData.length);
		}

		this.running = true;
		this.xmlhttp.onreadystatechange = this.onreadystatechange.bind(this);

		this.xmlhttp.send(QueryData);
	},
	abort : function(){
		if(this.running){
			this.xmlhttp.onreadystatechange = returnfalse;
			this.xmlhttp.abort();
			this.opt.onAbort();
			this.running = false;
		}
	},
	onreadystatechange : function(){
		switch(this.xmlhttp.readyState){
			case 4:
				var fnc = returnfalse;

				if(!this.xmlhttp)
					return;

				var response = this.xmlhttp.responseXML;

				var ev = document.createEventObject();
				if(ev.ctrlKey && ev.shiftKey){
					alert(this.url+"\n"+this.xmlhttp.responseText);
				}


				if(response.lastChild){
					fnc = this.opt.onSuccess;
					
					if(response.lastChild.firstChild && response.lastChild.firstChild.tagName == 'error'){
						this.opt.onResponseError(this.xmlhttp);
					}else{
						this.opt.onResponseOk(this.xmlhttp);
					}

				}else{
					fnc = this.opt.onFailure;
					this.opt.onResponseError(this.xmlhttp);
				}

				fnc(this.xmlhttp);

				this.opt.onComplete(this.xmlhttp);

				this.xmlhttp.onreadystatechange = returnfalse;
				this.running = false;
				break;
		}

	}

});



var Cookie = {
	set : function (name,value,day){
		var today= new Date();
		today.setDate(today.getDate() + day);
		document.cookie = name + "=" + escape(value) + "; path=/; expires=" + today.toGMTString() + ";"
	},
	get : function (name){
		name += "=";
		var start = document.cookie.indexOf(name);
		if(start > -1){
			start = start+name.length;
			var end = document.cookie.indexOf(";", start);
			if(end > 0)
				return document.cookie.substr(start, end - start);
			else
				return document.cookie.substr(start);
		}
		return ;
	}
}


var HttpBase = {
	open : function(url, opt){
//		if(this === Http){
//			// Http.open
//		}else{
//			// new Http.open
//		}

		var http = new Http();
		http.open(url, opt);

		return http;
	}
};

var Http = Class.realize(HttpBase, {
	opt : null,
	xmlhttp : null,
	running : false,
	stack : false,

	initialize : function(){
		this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		this.stack = [];
	},
	
	push : function(opt){
		this.stack.push(opt);
	},
	pop : function(){
		this.stack.pop();
	},
	open : function(opt){
		
		if(!opt){
			return this.checkStack();
		}

		var opt = this.opt = $ext({
			url : "",
			async : true,
			method : 'post',
			params : null,

			oncomplete : null,
			onabort : null,
			onreadystatechange : this.onreadystatechange.bind(this)
		}, opt);

		if(this.opt.oncomplete)
			this.opt.oncomplete = opt.oncomplete.bind(this);
		if(this.opt.onabort)
			this.opt.onabort = opt.onabort.bind(this);

		this.xmlhttp.open(opt.method, opt.url, opt.async);

		var QueryData = "";
		if(opt.params){
			QueryData = [];
			var params = opt.params;
			for(var x in params){
				QueryData.push(x + '=' + uriEncode(params[x]));
			}

			QueryData = QueryData.join("&");
			this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
			this.xmlhttp.setRequestHeader("Content-length", QueryData.length);
		}

		this.running = true;
		this.xmlhttp.onreadystatechange = this.opt.onreadystatechange;

		this.xmlhttp.send(QueryData);

		
	},
	abort : function(){
		if(this.running){
			this.xmlhttp.onreadystatechange = returnfalse;
			this.xmlhttp.abort();
			if(this.opt.onabort)
				this.opt.onabort();
			this.running = false;
		}
	},
	onreadystatechange : function(){
		switch(this.xmlhttp.readyState){
			case 4:

				if(!this.xmlhttp)
					return;

				var ev = document.createEventObject();
				if(ev.ctrlKey && ev.shiftKey){
					alert(this.opt.url+"\n"+this.xmlhttp.responseText);
				}

				if(this.opt.oncomplete){
					var mime = this.xmlhttp.getResponseHeader("Content-type");

					switch(mime){
						case 'text/x-json':
							try{
								var rtn = eval('('+this.xmlhttp.responseText+')');
							}catch(e){
								alert(this.opt.url+' json parse error => \r'+this.xmlhttp.responseText);
								this.opt.oncomplete(null);
							}
							this.opt.oncomplete(rtn, this.xmlhttp.responseText);
							break;

						case 'text/xml':
							this.opt.oncomplete(this.xmlhttp.responseXML);
							break;

						default:
							this.opt.oncomplete(this.xmlhttp.responseText);
							break;
					}
				}

				this.xmlhttp.onreadystatechange = returnfalse;
				this.running = false;

				this.checkStack();
				break;
		}

	},

	checkStack : function(){
		if(this.stack.length)
			this.open(this.stack.shift());
	}

});