// JavaScript Document
window.addEvent( 'domready', function() {
	webJADE.initJADE();

// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/fromCharCode
	var fixedFromCharCode = function( code ) {
		var codeArray = [];
		if ( code > 0xffff )
		{
			code -= 0x10000;
			codeArray = [0xd800 + (code>>10), 0xdc00 + (code&0x3ff)];
			return {realCode:codeArray, str:String.fromCharCode.apply(null,codeArray)};
		} else
			return {str:String.fromCharCode(code)};
	};

	var forceProc = function( value ) {
		if ( !value ) return value;
		var valArea = $('dvValue');
		if ( !valArea ) return function(){};
		var str = '', codeAry = [], orgValue = value;
		value += '\u0020\u0020';
		var fullcode, code=value.charCodeAt(0), next;
		for ( var idx = 0; idx < value.length-2; idx++ )
		{
			next = value.charCodeAt( idx+1 );
			if (code >= 0xd800 && code <= 0xdbff && next >= 0xdc00 && next <= 0xdfff) 
			{
				fullcode = ((code - 0xd800) << 10) + (next - 0xdc00) + 0x10000;
				str += String.fromCharCode(code, next) + ': 0x' + fullcode.toString(16) + '<small>(0x' + code.toString(16) + ',0x' + next.toString(16) + ')</small><br />';
				codeAry.push('0x' + fullcode.toString(16));
				idx++;
				code = value.charCodeAt(idx + 1);
			} else {
				code = '0x' + value.charCodeAt(idx).toString(16);
				str += value.charAt(idx) + ': ' + code + '<br/>';
				codeAry.push(code);
				code = next;
			}
		}
		str += '<span>'+codeAry.join(',')+'</span>';
		valArea.innerHTML = str;
		return orgValue;
	}

	var codeProc = function( value ) {
		if ( !value ) return value;
		var codeArea = $('dvCode');
		if ( !codeArea ) return function(){};

		value = value.replace( /^([a-f\d]{0,6})(.*)$/i, "$1" );
		if ( !value ) return value;
		var strObj, str = '', val = parseInt( value, 16 );
		if ( val != NaN )
		{
			if ( val > 0x10ffff )
				val = 0x10ffff;
			strObj = fixedFromCharCode( val );
			str = '0x'+val.toString(16);
			if ( strObj['realCode'] != null )
				str += '<small>(0x' + strObj['realCode'][0].toString(16) + ',0x' + strObj['realCode'][1].toString(16) + ')</small>';

			codeArea.innerHTML = str + ' : ' + strObj['str'];
			value = val.toString(16);
		}
		return value;
	};

	var convSelProc = function(ev,selElem) {
		if ( !selElem.value ) return;
		var convArea = $('taConv');
		if ( !convArea ) return;
		var value = convProc( convArea.value );	
		convArea.value = value;
	}

	var convProc = (function(){
		var selObj = {};
		(function(){
			var sels = $('dvTest').getElements('div.itemSel select');
			sels.each( function(sel) {
				if ( !sel.name ) return;
				sel.addEvent( 'change', convSelProc.bindWithEvent(this,[sel]) );
				selObj[sel.name] = sel;
			} );
		})();
		var infoElem = $('dvConvInfo');
		if ( !infoElem ) return;
		var convArea = $('taConv');
		if ( !convArea || convArea.value ) 
			infoElem.setStyle( 'display', 'none' );

		var proc = {
			'ftoh': FHConvert.createCl( 'ftoh' ),
			'htof': FHConvert.createCl( 'htof' ),
			'jftojh': FHConvert.createCl( 'ftoh', {jaCode:true} ),
			'jhtojf': FHConvert.createCl( 'htof', {jaCode:true} ),
			'hgtokk': FHConvert.createCl( 'hgtokk' ),
			'kktohg': FHConvert.createCl( 'kktohg' ),
			'hkktofkk': FHConvert.createCl( 'hkktofkk' ),
			'fkktohkk': FHConvert.createCl( 'fkktohkk' )
		};
		return function( value ) {
			if ( !value ) return value;
			
			var elElem, elapse, cur = new Date().getTime();
			['convSelFH','convSelHK','convSelKK'].each( function(targ) {
				if ( selObj[targ] && proc[selObj[targ].value] )
					value = proc[selObj[targ].value]( value );
			} );

			if ( selObj['convSelSP'] )
			{
				switch ( selObj['convSelSP'].value )
				{
					case 'hstofs':
						value = value.replace( /[\u0020]/g, '\u3000' );
						break;
					case 'fstohs':
						value = value.replace( /[\u3000]/g, '\u0020' );
						break;
				}
			}
			var elapse = new Date().getTime() - cur;
			elElem = $('dvElapse');
			if ( elElem )
				elElem.innerHTML = elapse+' msec';
			return value;
		}
	})();

	var convInfoFx = Du.Style.Setup.setFx({'opacity':0},{'opacity':1},{'duration':200},{'postAct':{'display':'none'}});

	var selInfoFx = Du.Style.Setup.setFx( {'styles':{'opacity':0.75}}, {'styles':{'opacity':0}}
		,{'duration':200,'delay':0},{'preAct':{'display':'block'},'postInact':{'display':'none'}} );

	var codeTest = new FormCtrl( $('dvFormBase'), {
		config: {checkBlur:true, validateKeyup:false, mouseHideInfo:true, mouseHideTip:true},
		item: {root:'div.itemArea', selector:'input,textarea,select'},
		info: {baseSel:'div.info', duStyle:selInfoFx, resize:true},
		format:{
			'convSelFH':{require:false},
			'convSelHK':{require:false},
			'convSelKK':{require:false},
			'convSelSP':{require:false},
			'convert':{require:false, itemStyle:{info:convInfoFx}, force:Du.Force.setForces({id:'df_convert',opt:{conv:convProc}})},
			'test':{require:false, validateKeyup:true, force:Du.Force.setForces({id:'df_convert',opt:{conv:forceProc}})},
			'code':{require:false, validateKeyup:true, force:Du.Force.Ja.setForces(['df_ftoh',{id:'df_convert',opt:{conv:codeProc}}])}
		}
	});

	initSampleForm();
} );

function initSampleForm() {
	var inputFxS = Du.Style.Setup.setFx( {'styles':{'left':'2px','background-color':'#ffffff'}}, {'styles':{'left':'8px','background-color':'#f8f8e8'}}, {'duration':160} );
	var infoFxS = Du.Style.Setup.setFx( {'styles':{'opacity':0.9,'top':'30px'}}, {'styles':{'opacity':0,'top':'38px'},'options':{'delay':0}}
		,{'duration':360,'delay':200}, {'preAct':{'display':'block'}, 'postInact':{'display':'none'}} );
	var tipFxS = Du.Style.Setup.setFx( 
		{styles:{'opacity':1,'color':'#000020','top':'6px'},options:{'duration':300,'delay':0}},
		{styles:{'opacity':0,'color':'#8080c0','top':'-6px'},'options':{'duration':300,'delay':0}},{'duration':1000,'delay':400} );

	var dateProc = function( value ) {
		if ( !value ) return value;
		var dateObj = Du.Str.retrieveDate( value, true, true );
		if ( !dateObj ) return '';
		return dateObj['year']+'-'+dateObj['month']+'-'+dateObj['date'];
	}

	var formCtrlObj = new FormCtrl( $('dvSampleForm'), {
		config: {checkBlur:true, cnfDisable:false, clickHideTip:false, validateKeyup:false},
		formBase: {},
		item: {root:'div.formItem', selector:'input', replace:false, duStyle:inputFxS, cnfStyle:Du.Style.Setup.setClass('confirmed')},
		tip: {baseSel:'span.formTip', targSel:'span', duStyle:tipFxS, resize:true},
		info: {baseSel:'div.formInfo', duStyle:infoFxS},
		format:{
			'fname':{require:false, force:Du.Force.Ja.setForces(['df_hgtokk','df_hkktofkk',{id:'df_purge',opt:{code:['kkana','spaceH','spaceF']}},'df_space']), type:Du.Type.setTypes({id:'dt_limit',opt:{'max':60}})},
			'birth':{require:false, force:Du.Force.Ja.setForces(['df_ftoh',{id:'df_convert',opt:{conv:dateProc}}]), type:Du.Type.setTypes({id:'birth',typeReg:true,check:/^\d{4}\-?\d{2}-?\d{2}$/,errStr:'日付は2009-07-23のような形式で'})}
		}
	});
}

var _distDocVer = [
	{version:'1.0.0', date:'2008/11/04', desc:'英数字記号/ひらがなカタカナ/全角半角カナ/空白の変換機能'},
	{version:'1.1.0', date:'2008/11/21', desc:'closureでの変換を正規表現に戻し、半角全角カナ変換の大幅書き直し'},
	{version:'1.1.1', date:'2008/11/24', desc:'ベンチ結果などの追加と考察'},
	{version:'1.1.2', date:'2008/12/02', desc:'文字コードから文字を求める処理で、surrogate pair関連のコードがバグっていたのを修正'},
	{version:'1.1.3', date:'2008/12/03', desc:'文字列→文字コードツールで、surrogate pair文字に対応'},
	{version:'1.1.4', date:'2009/02/16', desc:'iGoogle用のGadgetを作成しリンクを追加'},
	{version:'1.2.0', date:'2009/10/07', desc:'Mootools1.2対応と文字変換用法の記述とサンプルフォームの設置'}
];