/*
	フォームの入力可能場所などを動的に変更して、入力可能な場所を明確にする。
*/

/*
	スイッチとなるコントロールのvalue値をキーに、
	それによって切り替えられるコントロールを含む親要素のID名を対で指定。
*/
var encoder_field = {
	direct         : "encoder-input-direct",
	file           : "encoder-input-file",
	use_data_scheme: "encoder-use_data_scheme",
	use_compress   : "encoder-use_compress"
};
	
var decoder_field = {
	direct                 : "decoder-input-direct",
	file                   : "decoder-input-file",
	datauri                : "decoder-input-datauri",
	use_decompress         : "decoder-use_decompress",
	set_mime_type          : "decoder-set_mime_type",
	set_content_disposition: "decoder-set_content-disposition"
};

function changeState( form_node, ctrl_name, field_tbl, forced_disabled_mode )
{
	return function(){
		var parent_node;
		var targ_field_nodes;
		var targ_ctrl_nodes;
		if( typeof form_node.elements[ctrl_name].length == "undefined" ){
			targ_field_nodes = new Array( form_node.elements[ctrl_name] );
		} else{
			targ_field_nodes = form_node.elements[ctrl_name];
		}
		
		for( var i = 0; i < targ_field_nodes.length; i++ ){
			parent_node = document.getElementById( field_tbl[targ_field_nodes[i].value] );
			if( ! parent_node ) continue;
			
			if( typeof parent_node.getElementsByTagName( "*" ).length == "undefined" ){
				targ_ctrl_nodes = new Array( parent_node.getElementsByTagName( "*" ) );
			} else{
				targ_ctrl_nodes = parent_node.getElementsByTagName( "*" );
			}
			if( targ_field_nodes[i].checked == true ){
				for( var j = 0; j < targ_ctrl_nodes.length; j++ ){
					if( targ_ctrl_nodes[j].type && targ_ctrl_nodes[j].name != ctrl_name ){
						targ_ctrl_nodes[j].disabled = ( typeof forced_disabled_mode != "undefined" ? ( ! forced_disabled_mode ) : false );
					}
				}
			} else{
				for( var j = 0; j < targ_ctrl_nodes.length; j++ ){
					if( targ_ctrl_nodes[j].type && targ_ctrl_nodes[j].name != ctrl_name ){
						targ_ctrl_nodes[j].disabled = ( typeof forced_disabled_mode != "undefined" ? ( ! forced_disabled_mode ) : true );
					}
				}
			}
		}
	}
}

function init( form_node, ctrl_name, field_tbl, handler )
{
	var event_listeners;
	if( typeof form_node.elements[ctrl_name].length == "undefined" ){
		event_listeners = new Array( form_node.elements[ctrl_name] );
	} else{
		event_listeners = form_node.elements[ctrl_name];
	}
	
	
	for( var i = 0; i < event_listeners.length ; i++ ){
		if( typeof handler == "function" ){
			event_listeners[i].onclick = function(){
				changeState( form_node, ctrl_name, field_tbl )();
				handler();
			};
		} else{
			event_listeners[i].onclick = changeState( form_node, ctrl_name, field_tbl );
		}
	}
	
		if( typeof handler == "function" ) handler();
		changeState( form_node, ctrl_name, field_tbl )();
}

function linked_switch( src_form_node, src_ctrl_name, src_mode, trg_form_node, trg_ctrl_name, trg_field_tbl, trg_mode )
{
	if( src_form_node.elements[src_ctrl_name].checked == src_mode ){
		changeState( trg_form_node, trg_ctrl_name, trg_field_tbl, trg_mode )();
	} else{
		changeState( trg_form_node, trg_ctrl_name, trg_field_tbl )();
	}
}

window.onload = function()
{
	var encoder_node = document.getElementById( "base64encoder" );
	var decoder_node = document.getElementById( "base64decoder" );
	
	init( encoder_node, "source", encoder_field );
	init( encoder_node, "use_data_scheme",  encoder_field, function(){
		linked_switch(
			encoder_node, "use_compress", true,
			encoder_node, "use_data_scheme", encoder_field, false
		);
	} );
	init( encoder_node, "use_compress",  encoder_field, function(){
		linked_switch(
			encoder_node, "use_compress", true,
			encoder_node, "use_data_scheme", encoder_field, false
		);
	} );
	
	init( decoder_node, "source", decoder_field );
	init( decoder_node, "use_decompress", decoder_field );
	init( decoder_node, "set_mime_type", decoder_field );
	init( decoder_node, "set_content_disposition", decoder_field );
}
