/********************************
 *	Minimal Javascript			*
 *					v2010.2.26	*
 ********************************/
if ( !MJ ) {

var MJ = {
	extend: function( tar, src ) {
		tar = MJ.isFunction( tar ) ? tar.prototype : tar;
		src = MJ.isFunction( src ) ? src.prototype : src;
		for ( var i in src ) {
			if ( src.hasOwnProperty(i) ) { tar[i] = src[i]; }
		}
	},
	
	isUndef:		function(o) { return o === undefined; },
	isNull:			function(o) { return o === null; },
	isNullString:	function(s) { return s === ''; },
	isEmpty:		function(o)	{ return ( o === '' ) ? true : o == 0 ? false : !o; },
	isArray:		function(a)	{ return ( a && a.constructor === Array ); },
	isFunction:		function(o)	{ return typeof o == 'function'; },
	isNumber:		function(o) { return typeof o == 'number'; },
	isString:		function(o)	{ return typeof o == 'string'; },
	
	isIe:		function() { return ( window.attachEvent && !window.opera ); },
	isOpera:	function() { return !!window.opera; },
	isWebkit:	function() { return ( navigator.userAgent.indexOf('AppleWebKit/') > -1 ); },
	isGecko:	function() {
		return ( navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1 );
	}
};

/********************************
 *	Util						*
 ********************************/
MJ.Util = {
	getKeys:function(a) {
		var keys = [];
		for ( var i in a ) { keys.push(i); }
		return keys;
	},
	
	getRandam:function(a) {
		var keys = MJ.Util.getKeys(a);
		var r = Math.floor( Math.random() * keys.length );
		return a[ keys[r] ];
	},
	
	isExistKey:function( a, key ) {
		for ( var i in a ) {
			if ( key == i ) { return true; }
		}
		return false;
	},
	
	isExistValue:function( a, v) {
		for ( var i in a ) {
			if ( a[i] == v ) { return true; }
		}
		return false;
	},
	
	sortByKey:function(h) {
		var keys = MJ.Util.getKeys(h);
		keys.sort( function ( a, b ) {
			return ( a > b ) ? 1 : ( a < b ) ? -1 : 0;
		});
		for ( var i = 0; i < keys.length; i++ ) {
			var v = h[ keys[i] ];
			delete h[ keys[i] ];
			h[ keys[i] ] = v;
		}
		return h;
	},
	
	deleteByValue:function( a, v ) {
		for ( var i in a ) {
			if ( ( a[i] === v ) && a.hasOwnProperty(i) ) { return delete a[i]; }
		}
		return false;
	},
	
	clearArray:function(a) {
		for ( var i in a ) { delete a[i]; }
	},
	
	marge:function( a, b ) {
		var r = {};
		for ( var i in a ) { r[i] = a[i]; }
		for ( var j in b ) { r[j] = b[j]; }
		return r;
	},
	
	ceil:function( n, k ) {
		var r = 0;
		if ( k > 0 ) {
			var p = Math.pow( 10, k );
			r = Math.ceil( n * p ) / p;
		} else {
			r = Math.ceil(n);
		}
		return MJ.Util.addZero( r, null, k );
	},
	
	floor:function( n, k ) {
		var r = 0;
		if ( k > 0 ) {
			var p = Math.pow( 10, k );
			r = Math.floor( n * p ) / p;
		} else {
			r = Math.floor(n);
		}
		return MJ.Util.addZero( r, null, k );
	},
	
	round:function( n, k ) {
		var r = 0;
		if ( k > 0 ) {
			var p = Math.pow( 10, k );
			r = Math.round( n * p ) / p;
		} else {
			r = Math.round(n);
		}
		return MJ.Util.addZero( r, null, k );
	},
	
	addZero:function( n, fn, bn ) {
		var a = String(n).split('.');
		if ( fn > 0 ) {
			while ( a[0].length < fn ) { a[0] = '0' + a[0]; }
		}
		if ( bn > 0) {
			if ( !a[1] ) { a[1] = ''; }
			while ( a[1].length < bn ) { a[1] += '0'; }
		} else {
			return a[0];
		}
		return a.join('.');
	},
	
	sleep:function( msec ) {
		var cur = new Date().getTime();
		var last = cur + msec;
		while ( cur < last ) { cur = new Date().getTime(); }
	},
	
	dateToString:function( d, sep ) {
		if ( !sep ) { sep = '.'; }
		var y = d.getYear();
		y = ( y < 2000 ) ? y + 1900 : y;
		var m = MJ.Util.addZero( d.getMonth() + 1, 2 );
		var d = MJ.Util.addZero( d.getDate(), 2 );
		return y + sep + m + sep + d;
	},
	
	parseCSV:function( csv ) {
		var tokenizer = new RegExp( ',|\r?\n|[^,"\r\n][^,\r\n]*|"(?:[^"]|"")*"', 'g' );
		var record = 0, field = 0, data = [['']], qq = /""/g;
		csv.replace( /\r?\n$/, '' ).replace( tokenizer, function( token ) {
			switch ( token ) {
				case ',': 
					data[ record ][ ++field ] = '';
					break;
				case '\n': case '\r\n':
					data[ ++record ] = [''];
					field = 0;
					break;
				default:
					data[ record ][ field ] = ( token.charAt(0) != '"' ) ? token : token.slice( 1, -1 ).replace( qq, '"' );
			}
		});
		return data;
	},
	
	preLoadImage:function( url ) {
		if ( !url || url == '' ) { return false; }
		var img = new Image();
		img.src = url;
		return img;
	},
	
	setCookie:function( key, v, path, expires ) {
		var str = key + '=' + encodeURIComponent( v );
		if ( path && path != '' ) { str += '; path=' + path; }
		str += ( expires && expires != '' ) ? '; expires=' + expires : '; expires=Mon, 31-Dec-2029 23:59:59 GMT';
		str += ';';
		document.cookie = str;
	},
	delCookie:function( key ) {
		var d = new Date();
		d.setYear( d.getYear() - 1 );
		document.cookie = key + '=;expires=' + d.toGMTString();
	},
	getCookie:function( key ) {
		var match  = ( '; ' + document.cookie + ';' ).match( new RegExp( '; ' + key + '=(.*?);' ) );
		return match ? decodeURIComponent( match[1] ) : null;
	}
};

/*--------------------------- Url ---------------------------*/
MJ.Util.Url = function( url ) {
	if ( url ) { this.parse( url ); }
};
MJ.Util.Url.prototype = {
	parse:function( url ) {
		var n = url.indexOf( '://' );
		
		//	プロトコルとホストの検出および絶対アドレスか否かの判定
		if ( n > -1 ) {
			this.protocol = url.substring( 0, n );
			n += 3;
			this.host = url.substring( n, url.indexOf( '/', n ) );
			url = url.substring( n + this.host.length );
			this.absolute = true;
		} else {
			this.absolute = ( url.match( new RegExp( '^\/' ) ) );
			//this.absolute = ( url.match( /^\// ) );
		}
		if ( this.absolute ) { url = url.slice(1); }
		
		//	ページ内リンクの検出
		n = url.indexOf('#');
		if ( n > -1 ) {
			this.link = url.slice( n + 1 );
			url = url.slice( 0, n );
		}
		
		//	オプションの検出
		n = url.indexOf('?');
		this.options = {};
		if ( n > -1 ) {
			var qs = url.slice( n + 1 ).split( '&' );
			for ( var i in qs ) {
				var es = qs[i].split('=');
				this.options[ es[0] ] = es[1];
			}
			url = url.slice( 0, n );
		}
		
		//	ディレクトリとファイルの検出
		this.directories = url.split('/');
		this.fName = this.directories.pop();
		
		//	拡張子と拡張子無しのファイル名の検出
		n = this.fName.lastIndexOf('.');
		if ( n > -1 ) {
			this.fNameWoExt = this.fName.slice( 0, n );
			this.ext		= this.fName.substring( n + 1 );
		}
	},
	
	isFullUrl:function() { return ( this.protocol && this.host && this.absolute ); },
	isAbsolute:function () { return this.absolute; },
	
	getFileName:function() { return this.fName; },
	setFileName:function( name ) { this.fName = name; },
	
	getFileNameWoExt:function() { return this.fNameWoExt; },
	setFileNameWoExt:function( name ) { this.fNameWoExt = name; },
	
	getExt:function() { return this.ext; },
	
	getOption:function( name ) { return this.options[ name ]; },
	addOption:function( name, value ) { this.options[ name ] = value; },
	addOptionByHash:function( hash ) {
		for ( var i in hash ) { this.addOption( i, hash[i] ); }
	},
	removeOption:function( name ) { delete this.options[name]; },
	
	getLink:function() { return this.link; },
	
	toString:function() {
		var rtn = ( this.protocol && this.host ) ? this.protocol + '://' + this.host + '/' : ( this.absolute ) ? '/' : '';
		if ( this.directories ) {
			for (var i in this.directories) {
				rtn += this.directories[i] + '/';
			}
		}
		rtn += ( this.fNameWoExt && this.ext ) ? this.fNameWoExt + '.' + this.ext : this.fName ? this.fName : '';
		var op_str = '';
		for (var j in this.options) {
			op_str += (op_str) ? '&' : '?';
			op_str += j + '=' + this.options[j];
		}
		rtn += op_str;
		return (this.link) ? rtn += '#' + this.link : rtn;
	}
};

/********************************
 *	Event						*
 ********************************/
MJ.Evnt = {
	addListener:function( ele, type, func, cap ) {
		type = ( type == 'mousewheel' && MJ.isGecko() ) ? 'DOMMouseScroll' : type;
		try { ele.addEventListener( type, func, cap );	return true; } catch(e) {}
		try { ele.attachEvent( 'on' + type, func );		return true; } catch(e) {}
		return false;
	},
	getSrcElement:function(e) { return ( e.srcElement ) ? e.srcElement : e.target; }
};

/*----------------------- CustomEvent -----------------------*/
MJ.Evnt.CustomEvent = function() {};
MJ.extend( MJ.Evnt.CustomEvent.prototype, {
	addListener:function( o, fn ) {//fn = function name
		if ( !o || !fn) { return false; }
		if ( ( this.listeners === null ) || ( this.listeners === undefined ) ) { this.listeners = []; }
		if ( ( this.listeners[ fn ] === null ) || ( this.listeners[ fn ] === undefined ) ) {
			this.listeners[ fn ] = [];
		}
		if ( !MJ.Util.isExistValue( this.listeners[ fn ], o ) ) { this.listeners[ fn ].push(o); }
		return true;
	},
	
	removeListener:function( o, fn ) {
		if ( o && fn && this.listeners && this.listeners[ fn ] ) {
			return MJ.Util.deleteByValue( this.listeners[ fn ], o );
		}
		return false;
	},
	
	dispatch:function( fn ) {
		if ( this.listeners && this.listeners[ fn ] ) {
			for ( var i in this.listeners[ fn ] ) {
				if ( MJ.isFunction( this.listeners[ fn ][i][ fn ] ) ) {
					this.listeners[ fn ][i][ fn ]( this );
				}
			}
		}			
	}
});

/********************************
 *	Ajax						*
 ********************************/
MJ.Ajax = {
	create:function() {
		try { return new XMLHttpRequest();						} catch(e) {}
		try { return new ActiveXObject('MXSML2.XMLHTTP');		} catch(e) {}
		try { return new ActiveXObject('Microsoft.XMLHTTP');	} catch(e) {}
		return null;
	}
};

/*------------------------- ExAjax --------------------------*/
MJ.Ajax.ExAjax = function() {
	if ( !this.init() ) { return null; }
};
MJ.extend( MJ.Ajax.ExAjax, MJ.Evnt.CustomEvent );
MJ.extend( MJ.Ajax.ExAjax.prototype, {
	init:function() {
		var x = this;	//	onreadystatechangeメソッド↓でexAjaxを参照するための変数宣言
		x.ajax = MJ.Ajax.create();
		if ( !x.ajax ) { return false; }
		this.ajax.onreadystatechange = function() {
			if ( x.ajax.readyState == 4 ) {
				if ( x.ajax.status == 200 ) {
					x.dispatch('successRequest');
				} else {
					x.dispatch('failureRequest');
				}
				x.dispatch('completeRequest');
			}
		};
		return true;
	},
	
	request:function( url, data_h, method, sync ) {
		var qs = '';
		if ( data_h ) {
			var a = [];
			for ( var i in data_h ) {
				if ( data_h[i] ) { a.push( encodeURIComponent(i) + '=' + encodeURIComponent( data_h[i] ) ); }
			}
			qs = a.join('&');
		}
		if ( method.match( new RegExp( '^post$', 'i' ) ) ) {
			this.ajax.open( 'POST', url, sync );
			this.ajax.send( qs );
		} else {
			url = ( qs == '' ) ? url : url + '?' + qs;
			this.ajax.open( 'GET', url, sync );
			this.ajax.send( null );
		}
		this.dispatch('startRequest');
	},
	
	addAjaxListener:function(o) {
		this.addListener( o, 'startRequest'		);
		this.addListener( o, 'successRequest'	);
		this.addListener( o, 'failureRequest'	);
		this.addListener( o, 'completeRequest'	);
	},
	
	getResponseText:	function() { return this.ajax.responseText;	},
	getResponseXML:		function() { return this.ajax.responseXML;	},
	getReadyState:		function() { return this.ajax.readyState;	},
	getStatus:			function() { return this.ajax.status;		},
	getStatusText:		function() { return this.ajax.StatusText;	}
});

/********************************
 *	Element						*
 ********************************/
MJ.Elem = {
	/*従前*/create:function( tag, attr_h, text ) {
		if ( !tag ) { return document.createTextNode( text ); }
		var ele = document.createElement( tag );
		if ( attr_h ) {
			for ( var i in attr_h ) { MJ.Elem.setAttr( ele, i, attr_h[i] ); }
		}
		if ( ( text !== null ) && ( text !== undefined ) ) {
			ele.appendChild( document.createTextNode( text ) );
		}
		return ele;
	},
	
	/*従前*/clearChild:function( ele ) {
		if ( MJ.isIe() && ele.tagName.match( /table|tbody|thead|tfoot|tr|th|td/i ) ) {
			while ( ele.firstChild ) { ele.removeChild( ele.firstChild ); }
		} else {
			ele.innerHTML = '';
		}
	},
	
	/*従前*/setAttr:function( ele, name, v ) {
		switch ( name ) {
			case 'class':	ele.className = v;break;
			case 'id':		ele.id = v;break;
			default:		ele.setAttribute( name, v );
		}
	},
	
	/*従前*/getAttr:function( ele, name ) {
		switch ( name ) {
			case 'class':	return ele.className;
			case 'id':		return ele.id;
			default:		ele.getAttribute( name );
		}
	},
	
	/*従前*/setTextContent:function( ele, text ) { MJ.Elem.setText( ele, text ); },
	setText:function( ele, text ) {
		if ( MJ.isIe() ) {
			ele.innerText = text;
		} else {
			ele.textContent = text;
		}
	},
	
	/*従前*/getTextContent:function( ele ) { return MJ.Elem.getText( ele ); },
	getText:function( ele ) {
		return ( ele.textContent ) ? ele.textContent : ele.innerText/*ele.innerHTML*/;
	},
	
	/*従前*/getElementsByClass:function( ele, cn ) {
		if ( !ele.childNodes ) { return []; }
		var rtn = [];
		for ( var i = 0; i < ele.childNodes.length; i++ ) {
			if ( ele.childNodes.item(i) && ele.childNodes.item(i).tagName ) {
				if ( ele.childNodes.item(i).className == cn || ele.childNodes.item(i).getAttribute('class') == cn ) {
					rtn.push( ele.childNodes.item(i) );
				}
				rtn = rtn.concat( MJ.Elem.getElementsByClass( ele.childNodes.item(i), cn ) );
			}
		}
		return rtn;
	},
	
	/*従前*/appendXmlWithXsl:function( ele, xml, xsl ) {
		if ( typeof XSLTProcessor != "undefined" ) {
			MJ.Elem.clearChild( ele );
			var xsl_proc = new XSLTProcessor ();
			xsl_proc.importStylesheet( xsl );
			ele.appendChild( xsl_proc.transformToFragment( xml, document ) );
		} else if ( typeof xml.transformNode != "undefined" ) {
			ele.innerHTML = xml.transformNode( xsl );
		} else {
		
		}
	},
	
	/*従前*/setBackgroundImage:function( ele, url, png_f ) { MJ.Elem.setBg( ele, url, png_f ); },
	setBg:function( ele, url, png_f ) {
		if ( !ele ) { return; }
		if ( url && url != '' ) {
			if ( png_f && MJ.isIe() ) {
				ele.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" +
						url + "', sizingMethod='scale')";
			} else {
				ele.style.backgroundImage = 'url(' + url + ')';
			}
		} else {
			ele.style.backgroundImage = 'none';
		}
	},
	
	isEmpty:function(o) {
		var ele = MJ.isString(o) ? document.getElementById(o) : o;
		if ( ele.hasChildNodes() ) {
			var r = new RegExp('/\s*/');
			for ( var i = 0; i < ele.childNodes.length; i++ ) {
				if ( ele.childNodes[i].tagName || !$( ele.childNodes[i] ).text().match(r) ) { return false; }
			}
		}
		return true;
	},
	
	asTabPanel:function(o) {
		var ele = MJ.isString(o) ? document.getElementById(o) : o;
		var dts = $( ele ).children('dt');
		var dds = $( ele ).children('dd').hide();
		ele.selectTab = function(o) {
			var dt = MJ.isNumber(o) ? dts.filter(':eq(' + o + ')') : $(o);
			var tar = dt.next();
			dts.not( dt.addClass('selected') ).removeClass('selected');
			if ( dds.size() > 1 ) {
				dds.not( tar ).fadeOut( 'fast', function() { tar.fadeIn('fast'); } );
			} else {
				tar.fadeIn('fast');
			}
		};
		ele.enableTab = function(o) {
			var dt = MJ.isNumber(o) ? dts.filter(':eq(' + o + ')') : $(o);
			dt.removeClass('disabled');
		};
		ele.disableTab = function(o) {
			var dt = MJ.isNumber(o) ? dts.filter(':eq(' + o + ')') : $(o);
			if ( dt.hasClass('selected') ) {
				dts.each( function() {
					if ( !$( this ).hasClass('disabled') ) { ele.selectTab( this );return false; }
				});
			}
			dt.addClass('disabled').removeClass('overed');
		};
		dts.mouseover( function(e) {
			var tar = $( this );
			if ( !tar.hasClass('selected') && !tar.hasClass('disabled') ) { tar.addClass('overed'); }
		}).mouseout( function(e) {
			$( this ).removeClass('overed');
		}).click( function(e) {
			var tar = $( this );
			if ( !tar.hasClass('selected') && !tar.hasClass('disabled') ) { ele.selectTab( this ); }
		}).each( function() {
			var dt = $( this );
			var dd = dt.next()[0];
			if ( !dd || dd.tagName != 'DD' || MJ.Elem.isEmpty( dd ) ) { dt.addClass('disabled'); }
		});
		return ele;
	},
	
	asUnselectable:function(ele) {
		var style = ele.getAttribute('style');
		ele.setAttribute('unselectable', 'on');
		ele.setAttribute('style', ((style) ? style : '') +
				'cursor:default; -moz-user-select:none; -khtml-user-select:none; -webkit-user-select:none; user-select:none;');
		MJ.Evnt.addListener(ele, 'selectstart', function (e) { return false; });
		
		/*
		if ( typeof ele.onselectstart != 'undefined' ) {
			ele.onselectstart = function() { return false; };
		} else if ( typeof ele.style.MozUserSelect != 'undefined' ) {
			ele.style.MozUserSelect = 'none';
		}
		*/
	},
	
	asPmButton:function( p_ele, m_ele, tar_ele, right_inc, min, max, set_func ) {
		if ( MJ.isString( p_ele ) ) { p_ele = document.getElementById( p_ele ); }
		if ( MJ.isString( m_ele ) ) { m_ele = document.getElementById( m_ele ); }
		if ( MJ.isString( tar_ele ) ) { tar_ele = document.getElementById( tar_ele ); }
		p_ele.oncontextmenu = function() { return false; }
		m_ele.oncontextmenu = function() { return false; }
		MJ.Elem.asUnselectable( p_ele );
		MJ.Elem.asUnselectable( m_ele );
		
		var input_flag = ( tar_ele.tagName == 'INPUT' );
		
		var timer, now_n, now_max, now_min, inc;
		var _get_max = function() { return MJ.isFunction( max ) ? max() : max; };
		var _get_min = function() { return MJ.isFunction( min ) ? min() : min; };
		var _get_num = function() {
			var num = input_flag ? $(tar_ele).val() : MJ.Elem.getTextContent( tar_ele );
			return parseInt( ( isNaN( num ) ? _get_min() : num ), 10 );
		};
		var _set_num = function() {
			if ( input_flag ) {
				$(tar_ele).val( now_n );
			} else {
				MJ.Elem.setTextContent( tar_ele, now_n || _get_min() );
			}
		};
		var _pm_func = function(t) {
			now_n += inc;
			if ( now_n > now_max ) { now_n = now_max; }
			if ( now_n < now_min ) { now_n = now_min; }
			//MJ.Elem.setTextContent( tar_ele, now_n );
			_set_num();
			if ( now_n < now_max || now_n > now_min ) {
				timer = setTimeout( _pm_func, t || 30 );
			} else {
				set_func( now_n );
			}
		};
		var _md_func = function( e, m_flag ) {
			//now_n = parseInt( MJ.Elem.getTextContent( tar_ele ), 10 );
			now_n = _get_num();
			if ( isNaN( now_n ) ) { now_n = _get_min(); }
			now_max = _get_max();
			now_min = _get_min();
			inc = ( e.button == 2 ) ? right_inc || 10 : 1;
			if ( m_flag ) { inc = inc * -1; }
			_pm_func( 500 );
			return false;
		};
		MJ.Evnt.addListener( p_ele, 'mousedown', function( e ) { return _md_func(e); } );
		MJ.Evnt.addListener( m_ele, 'mousedown', function( e ) { return _md_func( e, true ); } );
		var _mu_func = function( e ) {
			if ( timer ) {
				clearTimeout( timer );
				timer = undefined;
			//MJ.Elem.setTextContent( tar_ele, now_n || _get_min() );
				_set_num();
				set_func( now_n );
			}
		};
		MJ.Evnt.addListener( p_ele, 'mouseup', _mu_func );
		MJ.Evnt.addListener( m_ele, 'mouseup', _mu_func );
		MJ.Evnt.addListener( p_ele, 'mouseout', _mu_func );
		MJ.Evnt.addListener( m_ele, 'mouseout', _mu_func );
	}
};


//	従前
MJ.isUndefined = function(o) { return o === undefined; };

}