/*
 *1 jQuery
 */
jQuery.fn.extend({
	/*
	 *2 insertAtCaret
	 *  http://www.psl.ne.jp/blog/?p=135
	 */
	insertAtCaret: function(v){
		var o = this.get(0);
		o.focus();
		if (jQuery.browser.msie) {
			var r = document.selection.createRange();
			r.text = v;
			r.select();
		} else {
			var s = o.value;
			var p = o.selectionStart;
			var np = p + v.length;
			o.value = s.substr(0, p) + v + s.substr(p);
			o.setSelectionRange(np, np);
		}
	}
	,
	windowHeight : function(){
		if (this.get(0) == window){
			return (jQuery.browser.webkit ? this.get(0).innerHeight : this.height());
		} else {
			return this.height();
		}
	}
	,
	/*
	 *2 aタグを指定
	 */
	imageHover : function(){
		return this
			.each(function(){
				jQuery(this)
				.hover(
					function(){
						var img = jQuery(this).find('img');
						img.attr('src', img.attr('src').replace('_off.', '_on.'));
					},
					function(){
						var img = jQuery(this).find('img');
						img.attr('src', img.attr('src').replace('_on.', '_off.'));
					}
				);
			})
		;
	}
	,
	/*
	 *2 form内に装飾的なイベントを割り当てる
	 */
	aultaFormAddEvent : function(){
		return this
		.each(function(){
			jQuery(this).find('.textbox')
			.focus(function(){
				jQuery(this).css('border-color', '#00BFFF');
				//jQuery(this).css('background-color', '#FFFACD').css('border-color', '#00BFFF');
			})
			.blur(function(){
				jQuery(this).css('border-color', 'gray');
				//jQuery(this).css('background-color', 'white').css('border-color', 'gray');
			})
			;
			jQuery(this).find('.checkbox input')
			.change(function(){
				jQuery(this.parentNode).css('color', (this.checked ? 'red' : 'black'));
			})
			.change()
			;
			jQuery(this).find('.radiobox input')
			.change(function(){
				if ( ! this.checked) return;
				jQuery('form label input[name="' + this.name + '"]').parent().css('color', 'black').css('font-size', '12px').css('font-weight', 'normal');
				jQuery(this.parentNode).css('color', 'red').css('font-size', '12px').css('font-weight', 'normal');
			})
			.change()
			;
		});
	}
	,
	/*
	 *2 aultaWrapDialog
	 */
	aultaWrapDialog : function(title){
		var id = jQuery(this).attr('id')
			, height = jQuery(this).height() + 50 //+ 130
			, winHeight = jQuery(window).aultaHeight();
		height = (height < (winHeight * 0.9)
			? height
			: (winHeight * 0.9)
		);
		jQuery(this)
		.after(
			jQuery('<p>')
			.attr('id', jQuery(this).attr('id') + '-commands')
			.append(
				jQuery('<button>')
				.html(title)
				.click(function(){
					if (jQuery('#' + id).dialog('isOpen')){
						jQuery('#' + id).dialog('close');
					} else {
						jQuery('#' + id).dialog('open');
					}
				})
			)
			/*
			.append(
				jQuery('<button>')
				.html('新規追加')
				.click(function(){
					document.location.href = './edit0.html';
				})
			)
			*/
		);
		jQuery(this)
		.dialog({
			title : title,
			autoOpen : false,
			width : 'auto',
			height : height,
			open : function(){
			},
			buttons : {
				//'閉じる' : function(){jQuery(this).dialog('close');}
				//'検索' : function(){jQuery('#' + id).submit();}
			}
		});
	}
	,
	/*
	 *2 webkit対応の高さ取得（window）
	 */
	aultaHeight : function(){
		if (this.get(0) == window){	//	こっちは解決していないっぽい。
			return (jQuery.browser.webkit ? this.get(0).innerHeight : this.height());
		} else {
			return this.height();
		}
	}
})
;

/*
 *1 funcs
 */
var funcs = {
	get : function(arr, key, def){
		if (arr && arr[key]) return arr[key];
		return (def ? def : '');
	},
	/*
	 *2 api
	 */
	api : {
		/*
		 *3 get
		 		dataには雛形を渡します。（キーと初期値）
		 		dataがnullの場合は、パラメータがそのまま使われます。
		 		値がnullは、送信対象外となります。
		 		送信対象の値は、dataに空文字または初期値をセットします。
		 */
		get : function(type, url, data, params, callbackSuccess, callbackError){
			if (typeof(data) == 'object' && data == null){
				data = params;
			} else {
				if (typeof(params) == 'object' && params != null){
					/*
					for(var i in data){
						if (typeof(params[i]) != 'undefined')
							data[i] = params[i];
					}
					*/
					for(var i in params){
						//if (params[i].length > 0){
							data[i] = params[i];
						//}
					}
				}
			}
			for(var i in data){
				if (data[i] === null) delete data[i];
			}
			/**デバッグ用***
			var s = '';
			for(var i in data){
				s += i + ' : ' + data[i] + "\n";
			}
			alert(url + "\n\n" + s);
			/*****/
			
			//(type == 'post' ? jQuery.post : jQuery.get)(url, data, callback, 'json');
			
			/*****/
			jQuery.ajax({
				type : (type == 'post' ? 'POST' : 'GET'),
				url : url,
				data : data,
				dataType : 'jsonp',
				cache : false,
				success : callbackSuccess,
				error : (typeof(callbackError) == 'function' ? callbackError : function(){})
				//error : function(XMLHttpRequest, textStatus, errorThrown){alert(textStatus);}
			});
			/******/
		}
		,
		/*
		 *3 multipart
		 */
		multipart : function(selector, action, callback){
			/****/
			var flgDelete = false,
			target = 'ajax_upload' + (new Date).getTime(),
			div = jQuery('<div>')
				.attr('id', target + '_uploader'),
			form = jQuery('<form>')
				.attr('target', target)
				.attr('action', action)
				.attr('enctype', 'multipart/form-data')
				.attr('encoding', 'multipart/form-data')
				.attr('method', 'post')
				.css({
					position : 'absolute',
					left : '-1000px',
					top : '0px',
					width : '10px',
					height : '10px'
				}),
			iframe = jQuery('<iframe>', {
				id : target,
				name : target,
				src : '#',
				width : 1,
				height : 1,
				css : {
					position : 'absolute',
					left : '-9000px',
					top : '0px',
					width : '10px',
					height : '10px'
				}
			})
			;
			jQuery(
				selector + ' input'
				+ ',' + selector + ' textarea'
				+ ',' + selector + ' select'
			)
			.each(function(){
				var input = jQuery(this)
					, nm = input.attr('name');
				if (nm.length == 0) return;
				if (input.attr('type') == 'checkbox'){
					if ( ! input.get(0).checked) return;
				}
				if (input.attr('type') == 'file'){
					form.append(input.clone());
					//form.append(input);
				} else {
					form.append(
						jQuery('<input type="hidden" name="' + input.attr('name') + '" />')
						.val(input.val())
					);
				}
			});
			
			jQuery('body').append(div.append(form).append(iframe));
			iframe.load(function(){
				if (
					this.src == "javascript:'%3Chtml%3E%3C/html%3E';"	// For Safari
					|| this.src == "javascript:'<html></html>';"	//	// For FF, IE
				){
					if (flgDelete) {setTimeout(function(){jQuery(this).empty().remove();}, 0);}
					return;
				}
				var doc, response = '';
				try{
					doc = this.contentDocument ? this.contentDocument : window.frames[this.id].document;
					if (doc.readyState && doc.readyState != 'complete') return;
					if (doc.body && doc.body.innerHTML == "false") return;
					if (doc.XMLDocument) {
						response = doc.XMLDocument;
					} else if (doc.body){
						response = doc.body.innerHTML;
					} else {
						response = doc;
					}
				} catch (e){
					response = e;
				}
				//alert(response);
				var i = response.indexOf('<div id="ChromeGesture-BackgroundSupportElement"');
				if (i > 0) response = response.substr(0, i);
				//alert(response);
				eval('var oj = ' + response);
				if (callback) callback(oj);
				flgDelete = true;
				this.src = "javascript:'<html></html>';";
				//setTimeout(function(){jQuery(this).empty().remove();}, 10);
				setTimeout(function(){
					jQuery('#' + target + '_uploader *').unbind();
					jQuery('#' + target + '_uploader').remove();
				}, 10);
			});
			
			//alert('submit before');
			form.submit();
			//alert('submit after');
			//form.attr('target', originalTarget);
			/*****/
		}
		,
		/*
		 *3 multipart2
		 */
		multipart2 : function(selector, action, callback){
			/****/
			var flgDelete = false
				, target = 'ajax_upload' + (new Date).getTime()
				, div = jQuery('<div>')
					.attr('id', target + '_uploader')
				, form = jQuery(selector)
					.attr('target', target)
					.attr('action', action)
					.attr('enctype', 'multipart/form-data')
					.attr('encoding', 'multipart/form-data')
					.attr('method', 'post')
				, iframe = null
			;
			if(!jQuery.support.opacity){
				if(!jQuery.support.style){	//	IE6,7
					iframe = jQuery(document.createElement('<iframe name="' + target + '">'));
				}else{	//	IE8
					iframe = jQuery(document.createElement('<iframe name="' + target + '">'));
				}
			} else {
				iframe = jQuery('<iframe>').attr('name', target);
			}
			
			iframe
			.attr('id', target)
			.attr('src', '#')
			.attr('width', 1)
			.attr('height', 1)
			.css({
				position : 'absolute',
				left : '-9000px',
				top : '0px',
				width : '10px',
				height : '10px',
				left : '0px',
				width : '800px',
				height : '800px'
			})
			.hide()
			.load(function(){
				if (
					this.src == "javascript:'%3Chtml%3E%3C/html%3E';"	// For Safari
					|| this.src == "javascript:'<html></html>';"	//	// For FF, IE
				){
					if (flgDelete) {setTimeout(function(){jQuery(this).empty().remove();}, 0);}
					return;
				}
				var doc, response = '';
				try{
					doc = this.contentDocument ? this.contentDocument : window.frames[this.id].document;
					if (doc.readyState && doc.readyState != 'complete') return;
					if (doc.body && doc.body.innerHTML == "false") return;
					if (doc.XMLDocument) {
						response = doc.XMLDocument;
					} else if (doc.body){
						response = doc.body.innerHTML;
					} else {
						response = doc;
					}
				} catch (e){
					response = e;
				}
				//alert(response);
				var i = response.indexOf('<div id="ChromeGesture-BackgroundSupportElement"');
				if (i > 0) response = response.substr(0, i);
				//alert(response);
				if (response.length > 0){
					eval('var oj = ' + response);
					if (callback) callback(oj);
				} else {
					if (callback) callback({});
				}
				flgDelete = true;
				this.src = "javascript:'<html></html>';";
				//setTimeout(function(){jQuery(this).empty().remove();}, 10);
				setTimeout(function(){
					jQuery('#' + target + '_uploader *').unbind();
					jQuery('#' + target + '_uploader').remove();
				}, 10);
			});
			
			jQuery('body').append(div.append(iframe));
			
			form.submit();
			/*
			var submit = form.find('input[type="submit"]');
			submit
			.after(
				jQuery('<input type="button" value="' + submit.val() + '" />')
				.click(function(){form.submit();})
			)
			.hide();
			*/
		},
		/*
		 *3 multipart3
		 */
		multipart3 : function(selector, action, callback){
		
			var form = jQuery(selector);
			form
			.attr('flg-submit', 0)
			.attr('action', action)
			.attr('enctype', 'multipart/form-data')
			.attr('encoding', 'multipart/form-data')
			.attr('method', 'post')
			;
			form.submit(function(){
				var form = jQuery(this);
				if (form.attr('flg-submit') == 0) return false;
				var flgDelete = false
					, target = 'ajax_upload' + (new Date).getTime()
					, div = jQuery('<div>')
						.attr('id', target + '_uploader')
					, iframe = null
				;
				form.attr('target', target);
				if(!jQuery.support.opacity){
					if(!jQuery.support.style){	//	IE6,7
						iframe = jQuery(document.createElement('<iframe name="' + target + '">'));
					}else{	//	IE8
						iframe = jQuery(document.createElement('<iframe name="' + target + '">'));
					}
				} else {
					iframe = jQuery('<iframe>').attr('name', target);
				}
				
				iframe
				.attr('id', target)
				.attr('src', '#')
				.attr('width', 1)
				.attr('height', 1)
				.css({
					position : 'absolute',
					left : '-9000px',
					top : '0px',
					width : '10px',
					height : '10px',
					left : '0px',
					width : '800px',
					height : '800px'
				})
				.hide()
				.load(function(){
					form.attr('flg-submit', 0);
					if (
						this.src == "javascript:'%3Chtml%3E%3C/html%3E';"	// For Safari
						|| this.src == "javascript:'<html></html>';"	//	// For FF, IE
					){
						if (flgDelete) {setTimeout(function(){jQuery(this).empty().remove();}, 0);}
						return;
					}
					var doc, response = '';
					try{
						doc = this.contentDocument ? this.contentDocument : window.frames[this.id].document;
						if (doc.readyState && doc.readyState != 'complete') return;
						if (doc.body && doc.body.innerHTML == "false") return;
						if (doc.XMLDocument) {
							response = doc.XMLDocument;
						} else if (doc.body){
							response = doc.body.innerHTML;
						} else {
							response = doc;
						}
					} catch (e){
						response = e;
					}
					var i = response.indexOf('<div id="ChromeGesture-BackgroundSupportElement"');
					if (i > 0) response = response.substr(0, i);
					if (response.length > 0){
						eval('var oj = ' + response);
						if (callback) callback(oj);
					} else {
						if (callback) callback({});
					}
					flgDelete = true;
					this.src = "javascript:'<html></html>';";
					setTimeout(function(){
						jQuery('#' + target + '_uploader *').unbind();
						jQuery('#' + target + '_uploader').remove();
					}, 10);
				});
				
				jQuery('body').append(div.append(iframe));
			});
			var submit = null
				, newSubmit = null;
			if (form.find('input[type="image"]').size() > 0){
				submit = form.find('input[type="image"]');
				newSubmit = jQuery('<a href="#"><img src="' + submit.attr('src') + '" /></a>');
			} else {
				submit = form.find('input[type="submit"]');
				newSubmit = jQuery('<input type="button" value="' + submit.val() + '" />');
			}
			submit
			.after(
				newSubmit
				.click(function(){
					var form = jQuery(this).parents('form');
					form.attr('flg-submit', 1);
					form.submit();
					form.attr('flg-submit', 0);
					return false;
				})
			)
			.hide();
		},
		/*
		 *3 multipart4
		 */
		multipart4 : function(selector, action, callback){
		
			var form = jQuery(selector);
			form
			.attr('flg-submit', 0)
			.attr('action', action)
			.attr('enctype', 'multipart/form-data')
			.attr('encoding', 'multipart/form-data')
			.attr('method', 'post')
			.append('<input type="hidden" name="format" value="iframe">')
			;
			form.submit(function(){
				var form = jQuery(this);
				if (form.attr('flg-submit') == 0) return false;
				var flgDelete = false
					, target = 'ajax_upload' + (new Date).getTime()
					, div = jQuery('<div>')
						.attr('id', target + '_uploader')
					, iframe = null
				;
				form.attr('target', target);
				if (form.find('input[name="iframe-target"]').size() == 0){
					form.append(jQuery('<input type="hidden" name="iframe-target" />'));
				}
				form.find('input[name="iframe-target"]').val(target);
				
				if(!jQuery.support.opacity){
					if(!jQuery.support.style){	//	IE6,7
						iframe = jQuery(document.createElement('<iframe name="' + target + '">'));
					}else{	//	IE8
						iframe = jQuery(document.createElement('<iframe name="' + target + '">'));
					}
				} else {
					iframe = jQuery('<iframe>').attr('name', target);
				}
				
				window[target] = function(r){
					if (r.length > 0){
						r = r.replace(/\n/g, '\\n');
						
						//jQuery('#form-result textarea').text(r);
						//return;
						//r = r.replace(/\[wquot\]/g, '"');
						eval('var oj = ' + decodeURIComponent(r));
						if (callback) callback(oj);
					} else {
						if (callback) callback({status:'error', message:'不明なエラー'});
					}
					try{
						delete window[target];
					} catch (e){
					}
					jQuery('#' + target + '_uploader *').unbind();
					jQuery('#' + target + '_uploader').remove();
				}
				
				iframe
				.attr('id', target)
				.attr('src', '#')
				.attr('width', 1)
				.attr('height', 1)
				.css({
					position : 'absolute',
					left : '-9000px',
					top : '0px',
					width : '10px',
					height : '10px',
					left : '0px',
					width : '800px',
					height : '800px'
				})
				.hide();
				
				jQuery('body').append(div.append(iframe));
			});
			var submit = null
				, newSubmit = null;
			if (form.find('input[type="image"]').size() > 0){
				submit = form.find('input[type="image"]');
				newSubmit = jQuery('<a href="#"><img src="' + submit.attr('src') + '" /></a>');
			} else {
				submit = form.find('input[type="submit"]');
				newSubmit = jQuery('<input type="button" value="' + submit.val() + '" />');
			}
			submit
			.after(
				newSubmit
				.click(function(){
					var form = jQuery(this).parents('form');
					form.attr('flg-submit', 1);
					form.submit();
					form.attr('flg-submit', 0);
					return false;
				})
			)
			.hide();
		},
		/*
		 *4 formReset
		 */
		formReset : function(target){
			jQuery(target + ' input[type="text"]').val('');
			jQuery(target + ' input[type="file"]').val('');
			jQuery(target + ' textarea').val('');
		},
		/*
		 *3 getQuerystring
		 */
		getQuerystring : function(key, default_){
			if (default_==null) default_ = '';
			if (key.substr(0, 1) == '#'){
				var s = window.location.href
					, p = s.indexOf('#');
				if (p == -1) return default_;
				s = s.substr(p);
				if (key == '#') return s;
				s = s.split('/');
				var n = key.substr(1) - 0;
				return (s[n] ? s[n] : default_);
			} else {
				key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
				var regex = new RegExp("[\\?&]"+key+"=([^&#]*)");
				var qs = regex.exec(window.location.href);
				if(qs == null)
					return default_;
				else
					return qs[1];
			}
		}
		,
		getData : function(selector){
			var data = {};
			jQuery(
				selector + ' input'
				+ ',' + selector + ' textarea'
				+ ',' + selector + ' select'
			)
			.each(function(){
				var input = jQuery(this)
					, nm = input.attr('name');
				if (nm.length == 0) return;
				if (input.attr('type') == 'checkbox'){
					if ( ! input.get(0).checked) return;
				}
				if (input.attr('type') == 'file'){
					//form.append(input.clone());
				} else {
					data[input.attr('name')] = input.val();
				}
			});
			return data;
		}
	}
	,
	/*
	 *2 date
	 */
	date : {
		/*
		 *3 isExpired (指定時間が経過していたらtrue)
		 */
		isExpired : function(dt, specified){
			var date = new Date((dt + '').replace(/-/g, '/').replace('+0000', 'UTC+0000'));
			return (((new Date()).getTime() - date.getTime()) > specified);
		},
		/*
		 *3 phpFormat
		 */
		phpFormat : function(format, dt){
			//	http://php.net/manual/ja/function.date.php
			//	http://clonedoppelganger.net/javascript/DateFormatter.html
			var date = (arguments.length == 1 ? new Date() : new Date((dt + '').replace(/-/g, '/').replace('+0000', 'UTC+0000')))
				, weekJa = ['日', '月', '火', '水', '木', '金', '土']
				, weekEn = ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat']
				, weekEnFull = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
				, monthEn = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
				, monthEnFull = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
				, funcLastDay = function(date){
				    var t = new Date(date.getFullYear(), date.getMonth() + 1, 1);
				    t.setTime(t.getTime() - 1);
				    return t.getDate();
					}
				;
			//	コメント部分は必要になったときに作る。
			return format
				//	[日]
				.replace(/d/g, ('0' + date.getDate() + '').slice(-2))
				.replace(/D/g, weekEn[date.getDay()])
				.replace(/j/g, date.getDate())
				.replace(/l/g, weekEnFull[date.getDay()])
				.replace(/N/g, (date.getDay() == 0 ? 7 : date.getDay()))
				.replace(/S/g, function(d){
					if (d > 3 && d < 21) return 'th';
					switch (d % 10){
						case 1:	return 'st';
						case 2:	return 'nd';
						case 3:	return 'rd';
					}
					return 'th';
				}(date.getDate()))
				.replace(/w/g, date.getDay())
				.replace(/z/g, function(date){
					var m = date.getMonth()
						, t = new Date(date.getFullYear(), 0, 1)
						, r = 0;
					for (var i = 0; i < m; i++) {
						t.setMonth(i);
						r += funcLastDay(t);
					}
			    return r + date.getDate() - 1;
				}(date))
				//	[週]
				//.replace(/W/g, )	//	ISO-8601 月曜日に始まる年単位の週番号 (PHP 4.1.0 で追加) 	例: 42 (年の第 42 週目)
				//	[月]
				.replace(/F/g, monthEnFull[date.getMonth()])
				.replace(/m/g, ('0' + (date.getMonth() + 1)).slice(-2))
				.replace(/M/g, monthEn[date.getMonth()])
				.replace(/n/g, date.getMonth() + 1)
				.replace(/t/g, funcLastDay(date))
				//	[年]
				.replace(/L/g, function(date){
					var t = new Date(date.getFullYear(), 0, 1)
						, d = 0;
					for (var i = 0; i < 12; i++) {
						t.setMonth(i);
						d += funcLastDay(t);
					}
					return (d == 365 ? 0 : 1);
				}(date))
				//.replace(/o/g, )	//	ISO-8601 形式の年。これは Y ほぼ同じだが、ISO 週番号 （W）が前年あるいは翌年に属する場合がある点で 異なる（PHP 5.1.0 で追加）。 	例: 1999 あるいは 2003
				.replace(/Y/g, date.getFullYear())
				.replace(/y/g, (date.getFullYear() + '').slice(-2))
				//	[時]
				.replace(/a/g, function(){return (date.getHours() < 12 ? 'am' : 'pm');})
				.replace(/A/g, function(){return (date.getHours() < 12 ? 'AM' : 'PM');})
				//.replace(/B/g, )	//	Swatch インターネット時間 	000 から 999
				.replace(/g/g, function(){
					return (date.getHours() < 12 ? date.getHours() : date.getHours() - 12) - 0;
				})
				.replace(/G/g, date.getHours())
				.replace(/h/g, function(){
					return ('0' + ((date.getHours() < 12 ? date.getHours() : date.getHours() - 12) - 0)).slice(-2);
				})
				.replace(/H/g, ('0' + date.getHours()).slice(-2))
				.replace(/i/g, ('0' + date.getMinutes()).slice(-2))
				.replace(/s/g, ('0' + date.getSeconds()).slice(-2))
				.replace(/u/g, date.getMilliseconds() * 1000)
				//	[タイムゾーン]
				//.replace(/e/g, )	//	タイムゾーン識別子（PHP 5.1.0 で追加） 	例: UTC, GMT, Atlantic/Azores
				//.replace(/I/g, )	//	サマータイム中か否か 	1ならサマータイム中。 0ならそうではない。
				//.replace(/O/g, )	//	グリニッジ標準時 (GMT) との時差 	例: +0200
				//.replace(/P/g, )	//	グリニッジ標準時 (GMT) との時差。時間と分をコロンで区切った形式 (PHP 5.1.3 で追加)。 	例: +02:00
				//.replace(/T/g, )	//	タイムゾーンの略称 	例: EST, MDT ...
				//.replace(/Z/g, )	//	タイムゾーンのオフセット秒数。 UTC の西側のタイムゾーン用のオフセットは常に負です。そして、 UTC の東側のオフセットは常に正です。 	-43200 から 50400
				//	[全ての日付/時刻]
				//.replace(/c/g, )	//	ISO 8601 日付 (PHP 5 で追加されました) 	2004-02-12T15:19:21+00:00
				//.replace(/R/g, )	//	RFC 2822 フォーマットされた日付 	例: Thu, 21 Dec 2000 16:01:07 +0200
				//.replace(/U/g, )	//	Unix Epoch (1970 年 1 月 1 日 0 時 0 分 0 秒) からの秒数 	time() も参照
				;
		}
	}
	,
	/*
	 *2 string
	 */
	string : {
		/*
		 *3	正規表現
		 *
		reg : function(pattern, text){
			var buf = text + '';
			return buf.match(new RegExp(pattern, 'i'));
		},
		/*
		 *3 半角カナを全角に
		 */
		toZenKana : function(a){
			var b = a + ''
				, c = new Array("ｶﾞ","ｷﾞ","ｸﾞ","ｹﾞ","ｺﾞ","ｻﾞ","ｼﾞ","ｽﾞ","ｾﾞ","ｿﾞ","ﾀﾞ","ﾁﾞ","ﾂﾞ","ﾃﾞ","ﾄﾞ","ﾊﾞ","ﾋﾞ","ﾌﾞ","ﾍﾞ","ﾎﾞ","ﾊﾟ","ﾋﾟ","ﾌﾟ","ﾍﾟ","ﾎﾟ","ｦ","ｧ","ｨ","ｩ","ｪ","ｫ","ｬ","ｭ","ｮ","ｯ","ｰ","ｱ","ｲ","ｳ","ｴ","ｵ","ｶ","ｷ","ｸ","ｹ","ｺ","ｻ","ｼ","ｽ","ｾ","ｿ","ﾀ","ﾁ","ﾂ","ﾃ","ﾄ","ﾅ","ﾆ","ﾇ","ﾈ","ﾉ","ﾊ","ﾋ","ﾌ","ﾍ","ﾎ","ﾏ","ﾐ","ﾑ","ﾒ","ﾓ","ﾔ","ﾕ","ﾖ","ﾗ","ﾘ","ﾙ","ﾚ","ﾛ","ﾜ","ﾝ")
				, d = new Array("ガ","ギ","グ","ゲ","ゴ","ザ","ジ","ズ","ゼ","ゾ","ダ","ヂ","ヅ","デ","ド","バ","ビ","ブ","ベ","ボ","パ","ピ","プ","ペ","ポ","ヲ","ァ","ィ","ゥ","ェ","ォ","ャ","ュ","ョ","ッ","ー","ア","イ","ウ","エ","オ","カ","キ","ク","ケ","コ","サ","シ","ス","セ","ソ","タ","チ","ツ","テ","ト","ナ","ニ","ヌ","ネ","ノ","ハ","ヒ","フ","ヘ","ホ","マ","ミ","ム","メ","モ","ヤ","ユ","ヨ","ラ","リ","ル","レ","ロ","ワ","ン")
				;
			while(b.match(/[ｦ-ﾝ]/)){
				for(var i = 0; i < c.length; i++){
					b = b.replace(c[i], d[i]);
				}
			}
			return b;
		},
		/*
		 *3 全角数字を半角数字に
		 */
		toHarfNumber : function(text){
			var char1 = new Array("１","２","３","４","５","６","７","８","９","０")
				, char2 = new Array(1,2,3,4,5,6,7,8,9,0)
				, count
				, data = text + '';
			while(data.match(/[０-９]/)){
				for(count = 0; count < char1.length; count++){
					data = data.replace(char1[count], char2[count]);
				}
			}
			data = data.replace(/[ー－]/g, '-');
			return data;
		}
		,
		/*
		 *3 機種依存文字を置き換える
		 */
		replaceDependenceChar : function(text){
			return text
				.replace('①', '(1)')
				.replace('②', '(2)')
				.replace('③', '(3)')
				.replace('④', '(4)')
				.replace('⑤', '(5)')
				.replace('⑥', '(6)')
				.replace('⑦', '(7)')
				.replace('⑧', '(8)')
				.replace('⑨', '(9)')
				.replace('⑩', '(10)')
				.replace('⑪', '(11)')
				.replace('⑫', '(12)')
				.replace('⑬', '(13)')
				.replace('⑭', '(14)')
				.replace('⑮', '(15)')
				.replace('⑯', '(16)')
				.replace('⑰', '(17)')
				.replace('⑱', '(18)')
				.replace('⑲', '(19)')
				.replace('⑳', '(20)')
				.replace('Ⅰ', 'I')
				.replace('Ⅱ', 'II')
				.replace('Ⅲ', 'III')
				.replace('Ⅳ', 'IV')
				.replace('Ⅴ', 'V')
				.replace('Ⅵ', 'VI')
				.replace('Ⅶ', 'VII')
				.replace('Ⅷ', 'VIII')
				.replace('Ⅸ', 'IX')
				.replace('Ⅹ', 'X')
				;
		}
		,
		/*
		 *3	trim
		 */
		trim : function(a){
			return (a+'').replace(/^　+|　+$/g, "").replace(/^¥s+|¥s+$/g, "");
		},
		/*
		 *3 addFigure
		 */
		addFigure : function(s){
			var n = new String(s).replace(/,/g, "");
			while(n != (n = n.replace(/^(-?\d+)(\d{3})/, "$1,$2")));
			return n;
		}
		,
		/*
		 *3 addLinks
		 */
		addLinks : function(s, target){
			if (s)
				return s.replace(/(http[s]?:\/\/[\w\/\.\$\,\;\:\&\-\=\?\!\*\~\@\#\_\(\)\%]+)/g, "<a href=\"$1\" target=\"" + target + "\">$1<\/a>");
			else
				return s;
		}
		,
		/*
		 *3 addLinkMail
		 */
		addLinkMail : function(s){
			if (s)
				return s.replace(/([A-Za-z0-9]+[\w-]+@[\w\.-]+\.\w{2,})/g, "<a href=\"mailto:$1\">$1<\/a>");
			else
				return s;
		}
		,
		/*
		 *3 escape
		 */
		escape : function(s){
			return (s+'')
				.replace(/>/g, '&gt;')
				.replace(/</g, '&lt;')
				.replace(/\"/g, '&quote;')
				.replace(/&/g, '&amp;')
				;
		}
		,
		/*
		 *3 unescape
		 */
		unescape : function(s){
			return s
				.replace(/\&amp;/g, '&')
				.replace(/\&quote;/g, '\"')
				.replace(/\&lt;/g, '<')
				.replace(/\&gt;/g, '>')
				;
		}
		,
		/*
		 *3 urlencode
		 */
		urlencode : function(a){
			var i, b, c, d;
			b = '';
			for (i = 0; i < a.length; i++){
				c = a.charCodeAt(i);
				if (c == 0x20){
					b += "%20";
				} else {
					if (((0x30 <= c) && (c <= 0x39)) || ((0x41 <= c) && (c <= 0x5a)) || ((0x61 <= c) && (c <= 0x7a))){
						b += a.charAt(i);
					} else if ((c == 0x2a) || (c == 0x2e) || (c == 0x2d) || (c == 0x5f)) {
						b += a.charAt(i);
					} else {
						// Ref. http://homepage3.nifty.com/aokura/jscript/utf8.html
						// Ref. http://homepage1.nifty.com/nomenclator/unicode/ucs_utf.htm
						if ( c > 0xffff ) {
							b += "%" + ((c >> 18) | 0xf0).toString(16).toUpperCase();
							b += "%" + (((c >> 12) & 0x3f) | 0x80).toString(16).toUpperCase();
							b += "%" + (((c >> 6) & 0x3f) | 0x80).toString(16).toUpperCase();
							b += "%" + ((c & 0x3f) | 0x80).toString(16).toUpperCase();
						} else if ( c > 0x7ff ) {
							b += "%" + ((c >> 12) | 0xe0).toString(16).toUpperCase();
							b += "%" + (((c >> 6) & 0x3f) | 0x80).toString(16).toUpperCase();
							b += "%" + ((c & 0x3f) | 0x80).toString(16).toUpperCase();
						} else if ( c > 0x7f ) {
							b += "%" + (((c >> 6) & 0x1f) | 0xc0).toString(16).toUpperCase();
							b += "%" + ((c & 0x3f) | 0x80).toString(16).toUpperCase();
						} else {
							d = "0" + c.toString(16).toUpperCase();
							b += "%" + d.substr(d.length - 2, 2);
						}
					}
				}
			}
			return b;
		}
		,
		/*
		 *3 datetime2text
		 */
		datetime2text : function(dt){
			var i = ((new Date()).getTime() - (new Date(dt.replace('+0000', 'UTC+0000'))).getTime()) / 1000;
			if (i < 60){
				return Math.floor(i) + '秒前';
			} else if (i < 3600){
				return Math.floor(i / 60) + '分前';
			} else if (i < 3600 * 24){
				return Math.floor(i / 3600) + '時間前';
			} else {
				return Math.floor(i / (3600 * 24)) + '日前';
			}
		}
		,
		/*
		 *3 datetimeAgo
		 */
		datetimeAgo : function(dt){
			dt += '';
			dt = dt.replace('+0000', 'UTC+0000');
			dt = dt.replace(/-/g, '/');
			var i = ((new Date()).getTime() - (new Date(dt)).getTime()) / 1000;
			return Math.floor(i);
		}
		,
		/*
		 *3 datetimeSplit
		 */
		datetimeSplit : function(dt){
			var lang = {
							ja : {
								w : ['日', '月', '火', '水', '木', '金', '土']
							},
							en : {
								m : ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
								w : ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat']
							}
						}
				, date = new Date((dt + '').replace(/-/g, '/'))
				;
			return {
				y : {
					num : date.getFullYear(),
					f2 : (date.getFullYear() + '').slice(-2)
				},
				m : {
					num : date.getMonth() + 1,
					f2 : ('0' + (date.getMonth() + 1)).slice(-2),
					en : lang.en.m[date.getMonth()]
				},
				d : {
					num : date.getDate(),
					f2 : ('0' + date.getDate() + '').slice(-2)
				},
				w : {
					ja : lang.ja.w[date.getDay()],
					en : lang.en.w[date.getDay()]
				}
			};
		}
		,
		/*
		 *3 loading
		 */
		loading : function(){
			return '<img class="loading" src="http://img.gamesjp.com/img/loading.gif" width="220" height="47" alt="loading..." />';
		}
		,
		/*
		 *3 trimWidth
		 */
		trimWidth : function(text, width, trimmarker){	//	width = px
			if (text.length == 0) return '';
			var ret = '', span = document.createElement('span');
			span.style.visibility = 'hidden';
			span.style.position = 'absolute';
			document.body.appendChild(span);
			span.innerHTML = text;
			if (span.offsetWidth <= width){
				ret = text;
			} else {
				for (var i = text.length - 1; i >= 1; --i){
				  var s = text.slice(0, i) + trimmarker;
				  span.innerHTML = s;
				  if (span.offsetWidth <= width){
				  	ret = s;
				  	break;
				  }
				}
			}
			document.body.removeChild(span);
			return ret;
		},
		/*
		 *3 getKeyCode
		 */
		getKeyCode : function(e){
			if(document.all)
				return  e.keyCode;
			else if(document.getElementById) 
				return (e.keyCode)? e.keyCode: e.charCode;
			else if(document.layers)
				return  e.which;
		},
		/*
		 *3 zeroFormat
		 */
		zeroFormat : function(num, k){
			var r = num+'';
			while(r.length < k) r = '0' + r;
			return r;
		}
	}
	,
	/*
	 *2 bind
	 */
	bind : {
		/*
		 *3 fileSelect
		 */
		fileSelect : function(target, changeEvent){
			var id = ''
				, form = jQuery('<form>')
				, filebox = jQuery('<input type="file" name="userfile" value="" />');
			for (var i = 0; i < 100; i++){
				id = 'form-fileupload-' + i;
				if ( ! document.getElementById(id)) break;
			}
			jQuery('body')
			.append(
				form
				.attr('id', id)
				.css({
					display: 'block',
					position: 'absolute',
					overflow: 'hidden',
					margin: '0pt',
					padding: '0pt',
					opacity: '0',
					direction: 'ltr',
					'z-index': '9999',
					left: '338px',
					top: '153.067px',
					width: '88px',
					height: '15px',
					visibility: 'hidden',
					'cursor': 'pointer'
				})
				.append('<input type="hidden" name="MAX_FILE_SIZE" value="10000000" />')
				.append(
					filebox
					.change(function(){
						var id = jQuery(this).parent().attr('id')
							, target = jQuery('*[fileid="' + id + '"]');
						changeEvent(id, target.get(0), jQuery(this).parent());
					})
					.css({
						position: 'absolute',
						right: '0pt',
						margin: '0pt',
						padding: '0pt',
						'font-size': '480px',
						'cursor': 'pointer'
					})
				)
			);
			jQuery(target)
			.attr('fileid', id)
			.mouseover(function(){
				var jq = jQuery(this)
					, id = jq.attr('fileid');
				jQuery('#' + id)
				.css({
					left: jq.offset().left,
					top: jq.offset().top,
					width: jq.width(),
					height: jq.height(),
					visibility : 'visible'
				});
			});
			return id;
		}
	}
	,
	/*
	 *2 util
	 */
	util : {
		/*
		 *3 bodyScrollTop
		 */
		bodyScrollTop : function(){
			if (document.all){
				return ((document.body.scrollTop + '').replace('px', '') - 0);
			} else {
				return (((document.body.scrollTop || document.documentElement.scrollTop || window.pageYOffset) + '').replace('px', '') - 0);
			}
		},
		/*
		 *3 loadedAnimate
		 */
		loadedAnimate : function(oj, callback){
			//	背景色を変える
			jQuery(oj).css('background-color', '#aaaaaa');
			var color = ['b', 'c', 'd', 'e', 'f'];
			(function(){
				var c = color.shift();
				jQuery(oj).css('background-color', '#' + c + c + c);
				if (color.length > 0){
					setTimeout(arguments.callee, 100);
				} else {
					if (typeof(callback) == 'function') callback(oj);
					jQuery(oj).css('background-color', 'transparent');
				}
			})();
		},
		isIPhone : function(){ return (navigator.userAgent.indexOf('iPhone') > -1); },
		isIPad : function(){ return (navigator.userAgent.indexOf('iPad') > -1); },
		isIPod : function(){ return (navigator.userAgent.indexOf('iPod') > -1); },
		/*
		 *3 replaceLoading
		 */
		replaceLoading : function(target){
			jQuery(target).find('*').unbind();
			jQuery(target)
			.empty()
			.html(funcs.string.loading());
		},
		/*
		 *3 tableScroller
		 */
		tableScroller : function(target, table_id){
			var table = jQuery(target)
			if ( ! document.getElementById(table_id)){
				table.attr('rel', table_id);
				table.after(jQuery('<div>').attr('id', table_id).addClass('table-scroller'))
			}
			table.hide();
			var div = jQuery('#' + table_id);
			div.hide();
			div.html(''
				+ '<table class="head">' + table.find('thead').html() + '</table>'
				+ '<div class="body">'
					+ '<table>' + table.find('tbody').html() + '</table>'
				+ '</div>'
			);
			div.show();
		}
	},
	/*
	 *2 paging
	 */
	paging : {
		set : function(setting){
			var paging = jQuery('<div>')
				, start = (setting.param.page - 1) * setting.param.count + 1
				, end = start + (setting.param.count-1);
			if (end > setting.pages.items) end = setting.pages.items;
			if (end == 0) start = 0;
			paging
			.addClass('paging')
			.html(''
				+ '<div>' + setting.pages.items + '件中、' + start + '～' + end + '件目</div>'
				+ '<ul></ul>'
			);
			for(var i = 1, j = setting.pages.last; i <= j; i++){
				var li = jQuery('<li>');
				li
				.attr('pg', i)
				.append(
					jQuery('<a href="#" no="' + i + '">' + i + '</a>')
				)
				;
				if (i == setting.param.page) li.addClass('current');
				paging.find('ul').append(li);
			}
			jQuery(setting.target + ' *').unbind();
			jQuery(setting.target).empty().append(paging);
			jQuery(setting.target + ' ul li a').click(setting.click);
		}
	}
}
;

