// handlehtmlfromhash.js
function MkHtmlByTemplate (
	strList,						// コード→内容対応「NAME::VALUE,,...」文字列
	htmlTemplate					// テンプレート
	// htmlTemplate は必ず escape() しておくこと！
) {
//	htmlTemplate = unescape( htmlTemplate );
	var arrayPairs = strList.split( ',,' );
	for( var i=0; i<arrayPairs.length; i++ ) {
		var keyAndVal = arrayPairs[ i ].split( '::' );
		keyAndVal[ 0 ] = '%%' + keyAndVal[ 0 ] + '%%';
		htmlTemplate = ReplaceMe( htmlTemplate, keyAndVal[ 0 ], keyAndVal[ 1 ] );
	}
	return( htmlTemplate );
}
var removableChkBoxToAdd =
	'<!' + '-- %%FIELD%%.%%CODE%% --' + '><input ' +
		'type="checkbox" ' +
		'name="%%FIELD%%" ' +
		'value="%%CODE%%" ' +
		'checked ' +
		'onclick="RmRemovableChkBoxFromDiv(' +
			q()+'%%DIV%%'+q()+','+
			q()+'%%FIELD%%'+q()+','+
			q()+'%%CODE%%'+q()+
		')"' +
	'> %%NAME%%<!' + '-- /%%FIELD%%.%%CODE%% --' + '>';
function AddRemovableChkBoxToDiv(
	divName,
	fieldName,
	codeValue,
	nameString
) {
	var strContent = GetContent( divName );
	if ( strContent.indexOf( fieldName + '.' + codeValue ) != -1 ) {
		return( false );
	}
	AddContent(
		divName,
		MkHtmlByTemplate(
			'DIV::' + divName + ',,' +
				'FIELD::' + fieldName + ',,' +
				'CODE::' + codeValue + ',,' +
				'NAME::' + nameString,
			removableChkBoxToAdd
		)
	)
	return( false );
}
function RmRemovableChkBoxFromDiv(
	divName,
	fieldName,
	codeValue
) {
	var strContent = GetContent( divName );
	var uniqName = fieldName + '.' + codeValue;
	var fromB = strContent.indexOf( '<!' + '-- ' + uniqName );
	var tailStr = '/' + uniqName + ' --' + '>';
	var endB = strContent.indexOf( tailStr ) + tailStr.length;
	strContent = 
		strContent.substring( 0, fromB ) +
		strContent.substring( endB );
	SetContent( divName, strContent );
	return( false );
}
function ReplaceMe( targetStr, fromStr, toStr ) {
	var leftStr = '';
	var fromB = 0;
	while ( 1 ) {
		fromB = targetStr.indexOf( fromStr );
		if ( fromB == -1 ) {
			break;
		}
		if ( fromB != 0 ) {
			leftStr = leftStr + targetStr.substring( 0, fromB );
		}
		leftStr = leftStr + toStr;
		targetStr = targetStr.substring( fromB + fromStr.length );
	}
	return( leftStr + targetStr );
}
function MkHtmlFromHash (
	hashObj,						// コード→内容対応ハッシュオブジェクト
	hashNames,						// コード→名前対応ハッシュオブジェクト
	hashKey,						// 展開するハッシュキー
	htmlTemplate,					// 展開するためのメインのテンプレート
	htmlEachEntryTemplate,			// 各エントリーごとのテンプレート
	htmlExceptionalEntriesTemplate	// 特定#番目エントリーのみに適用されるテンプレート
	// htmlExceptionalEntriesTemplate は必ず escape() しておくこと！
) {
	var arrayEntries = hashObj[ hashKey ].split( ',,' );
	var hashExceptionalEntries = { };
	if ( htmlExceptionalEntriesTemplate != '' ) {
		htmlExceptionalEntriesTemplate =
			unescape( htmlExceptionalEntriesTemplate );
		var arrayExceptional = htmlExceptionalEntriesTemplate.split( ',,' );
		for( var i=0; i<arrayExceptional.length; i++ ) {
			var arrayElem = arrayExceptional[ i ].split( '::' );
			arrayElem[ 1 ] = arrayElem[ 1 ].replace( /\\:/g, ':' );
//			arrayElem[ 1 ] = arrayElem[ 1 ].replace( /\\,/g, ',' );
			hashExceptionalEntries[ arrayElem[ 0 ] ] = arrayElem[ 1 ];
		}
	}
	var allEntries = '';
	for( var i=0; i<arrayEntries.length; i++ ) {
		var anEntry = arrayEntries[ i ];
		var elementOfAnEntry = anEntry.split( '::' );
		var thisHtml = htmlEachEntryTemplate;
		if ( hashExceptionalEntries[ i ] ) {
			thisHtml = hashExceptionalEntries[ i ];
		}
		if ( i == ( arrayEntries.length - 1 ) ) {
			if ( hashExceptionalEntries[ 'last' ] ) {
				thisHtml = hashExceptionalEntries[ 'last' ];
			}
		}
		thisHtml = thisHtml.replace( /%%CODE%%/g, elementOfAnEntry[ 0 ] );
		thisHtml = thisHtml.replace( /%%NAME%%/g, hashNames[ elementOfAnEntry[ 0 ] ] );
		allEntries = allEntries + thisHtml;
	}
	var resultHtml = htmlTemplate;
	resultHtml = resultHtml.replace( /%%CODE%%/g, hashKey );
	resultHtml = resultHtml.replace( /%%ALLENTRIES%%/g, allEntries );
	return( resultHtml );
}
