
function	makeMyshelfDncomRoot( 
	www_sessionid_, myshelf_sessionid_, companyuuid_, showcasePaneRevision_, showcasePanedata_, firstDisplay_, swf_id_, swfFuncName_onRequest_, urlMyshelfIndex_, listener_
)
{
	var	sessionid = myshelf_sessionid_;
	var	curDate = new Date();
	var	clientqueueid = sessionid + ":" + curDate.getTime() + ":" + Math.floor(Math.random()*1000);
	var	clientqueueseqno = 0;

	var	commandQueue = [];
	var	isServerConnect = false;

	var	swf_domObj = undefined;
	var	paneRevision = -1;
	var	paneData = undefined;
	var	processing = true;

	var	funcAry_onReadyMyshelf = [];

	//--------

	//初期化:シェルフデータの読み込み,設定
	function	init()
	{
		if( showcasePaneRevision_<=0 ) {
			//www2/docroot内でpaneRevisionが得られなかった
			//←myshelf/php内のActionSet*上のメソッドを実行する必要がある。
			//→execしてpanedataを初期化して、panedataを得る。
			exec( 'startShelf', {} );
		}else{
			if( showcasePanedata_ ) {
				paneData = showcasePanedata_;
				paneRevision = showcasePaneRevision_;
				if( swf_domObj ) {
					swf_domObj[swfFuncName_onRequest_]( 'loadedData', JSON.stringify({panecode:'shelf',d:paneData}) );
				}
			}else{
				//www2/docroot内でpaneRevisionが得られた
				//→paneRevisionを指定してpanedataを得る。
				startRequest_getShelfPaneData_knownRevision(showcasePaneRevision_);
			}
		}
	}

	//html読み込み時の状態に合わせて、初期化タイミングを制御
	if( firstDisplay_ ) {
		//	画面読み込み時にシェルフ表示の場合は、早めにすべきなのでDOM準備後に初期化
		$(document).ready( function(){
			init();
		});

	}else{
		//	画面読み込み時にシェルフ非表示の場合は、後回しにすべきなのでロード完了後に初期化
		$.event.add(window, "load", function(){
			init();
		});
	}


	//--------

	function	add_onReadyMyshelf( func )
	{
		funcAry_onReadyMyshelf.push(func);
		if( swf_domObj ) {
			func();
		}
	}

	/**	shelfWww.swfからの応答処理
	*/
	function	responseFromShelf( type, argJsonStr )
	{
		arg = JSON.parse(argJsonStr);
		var	ret = {};
		switch( type ) {
			case	'send':
				send( arg.commandcode, arg.arg );
				break;
			case	'exec':
				exec( arg.actioncode, arg.arg );
				break;
			case	'execWww':
				execWww( arg.actioncode, arg.arg );
				break;
			case	'ready':
logger.info( 'responseFromShelf ready' );
				swf_domObj = getThisMovie(swf_id_);
				if( paneData ) {
					swf_domObj[swfFuncName_onRequest_]( 'loadedData', JSON.stringify({panecode:'shelf',d:paneData}) );
				}
				for( var i=0; i<funcAry_onReadyMyshelf.length; i++ ) {
					funcAry_onReadyMyshelf[i]();
				}
				break;

			case	'getDncomInfo':
				ret = {
					accessorUrl:	urlMyshelfIndex_,
					sessionid:		sessionid
				};
				break;

			default:
logger.error( 'unknown response type['+type+']' );
				break;
		}
		return	JSON.stringify(ret);
	}


	function	exec( actioncode, arg )
	{
logger.info( "exec(actioncode:"+actioncode+")" );

		//shelf.swf内の操作を禁止するために、処理中状態にしておく
		setProcessing( true );

		appendActionQueue(
			{
				'command':		'exec',
				'actioncode':	actioncode,
				"arg":			arg,
				'from_viewcode':'shelf'
			}
		);
	}

	function	send( commandcode, arg )
	{
logger.info( "send(commandcode:"+commandcode+")" );

		appendActionQueue(
			{
				'command':		'send',
				'commandcode':	commandcode,
				"arg":			arg,
				'from_viewcode':'shelf'
			}
		);
	}

	function	execWww( actioncode, arg )
	{
logger.info( "execWww(actioncode:"+actioncode+")" );
		//一般に画面遷移になるはず
		//shelf.swf内の操作を禁止するために、処理中状態にしておく
		setProcessing( true );

		listener_.onExecWww( actioncode, arg );
	}


	function	renewShelf()
	{
logger.info( "renewShelf" );
		if( !processing ) {
			//shelf.swf内の情報が未確定のため、処理中状態にしておく
			processing = true;
			if( swf_domObj ) {
				swf_domObj[swfFuncName_onRequest_]( 'statusChanged', JSON.stringify({active:true,processing:processing}) );
			}
		}

		startRequest_getShelfPaneData_unknownRevision();
	}

	//シェルフを再開する。
	//	主にエラー発生時に必要に応じてセッションを作り直して再表示する。
	function	restartShelf()
	{
		exec( 'insideWww2IframePopup_restartShelf', {companyuuid:companyuuid_} );
	}

	function	setProcessing( processing_ )
	{
		if( processing!=processing_ ) {
			processing = processing_;
			if( swf_domObj ) {
				swf_domObj[swfFuncName_onRequest_]( 'statusChanged', JSON.stringify({active:true,processing:processing}) );
			}
		}
	}
	
	function	addShelfEvent( eventkindName, eventData )
	{
		if( swf_domObj ) {
			swf_domObj[swfFuncName_onRequest_]( 'addShelfEvent', JSON.stringify({eventkindName:eventkindName,eventData:eventData}) );
		}
	}


	//--------

	function	appendActionQueue( command )
	{
		commandQueue.push( command );
logger.info( "isServerConnect:"+isServerConnect );

		if( !isServerConnect ) {
			startRequest_multiSendExecAndGetShelfPaneData( commandQueue );
			commandQueue = [];
		}
	}

	function	startRequest_multiSendExecAndGetShelfPaneData( queue )
	{
logger.info( "startRequest_multiSendExecAndGetShelfPaneData" );
		isServerConnect = true;
		var	data={
			"command":		"multiSendExecAndGetShelfPaneData",
			"sessionid":	sessionid,
	//		"browserid":	browserid,
			"clientqueueid":	clientqueueid,
			"seqno":		clientqueueseqno++,
			"actionCommand_a":	JSON.stringify(queue),
			"viewpaneid":	'shelf',
			"panecode":		'shelf',
			"getMoreThanRevision":	paneRevision
		};
		$.ajax({
			url:	urlMyshelfIndex_,
			type:	"POST",
			data:	data,
			dataType:	"text",
			cache:	false,
			timeout:	15*1000	/*milisec*/,
			success:	function(data, status) {
				isServerConnect = false;
				try{
					// flashplayerでhttpstatusが取得できないブラウザの場合、
					// 文字列に「dbrespons::～::dbrespons」が付与されているので、除去
					data = delGuaranteedStr(data);
//logger.info( "data:"+data );
					data = JSON.parse(data);

					getShelfPaneData_onSuccess( data );

				}
				catch( e ) {
	alert( e );
				}
			},
			error:	function(request, status, errorThrown) {
				isServerConnect = false;
				alert("インターネットの接続が不安定になっています。\n画面のリロード(F5キー)をしてください。");
logger.error( request );
			}
		});
	}

	function	startRequest_getShelfPaneData_unknownRevision()
	{
logger.info( "startRequest_getShelfPaneData_unknownRevision" );
		isServerConnect = true;
		var	data={
			"command":		"getShelfPaneData",
			"sessionid":	sessionid,
	//		"browserid":	browserid,
	//		"from_viewcode":aimViewcode,
	//		"viewcode":		'shelf',
	//		"viewpaneid":	'shelf',
	//		"panecode":		'shelf',
			"getMoreThanRevision":		paneRevision
		};
		$.ajax({
			url:	urlMyshelfIndex_,
			type:	"GET",
			data:	data,
			dataType:	"text",
			cache:	false,		//リビジョン未知なのでキャッシュしない
			timeout:	15*1000	/*milisec*/,
			success:	function(data, status) {
				isServerConnect = false;
				try{
					// flashplayerでhttpstatusが取得できないブラウザの場合、
					// 文字列に「dbrespons::～::dbrespons」が付与されているので、除去
					data = delGuaranteedStr(data);
//logger.info( "data:"+data );
					data = JSON.parse(data);
					getShelfPaneData_onSuccess( data );
				}
				catch( e ) {
	alert( e );
				}
			},
			error:	function(request, status, errorThrown) {
				isServerConnect = false;
				alert("インターネットの接続が不安定になっています。\n画面のリロード(F5キー)をしてください。");
logger.error( request );
			}
		});
	}

	function	startRequest_getShelfPaneData_knownRevision( revision )
	{
logger.info( "startRequest_getShelfPaneData_knownRevision(revision:"+revision+")" );
		isServerConnect = true;
		var	data={
			"command":		"getShelfPaneData",
			"sessionid":	sessionid,
	//		"browserid":	browserid,
	//		"from_viewcode":aimViewcode,
	//		"viewcode":		'shelf',
	//		"viewpaneid":	'shelf',
	//		"panecode":		'shelf',
			"revision":		revision	//キャッシュを特定するためにパラメータに含める。/myshelf/index.php側では感知しない
	//		"getMoreThanRevision":		//未指定(=無効値を指定)して常にデータが返るようにする
		};
		$.ajax({
			url:	urlMyshelfIndex_,
			type:	"GET",
			data:	data,
			dataType:	"text",
			cache:	true,		//リビジョン既知なのでキャッシュする
			timeout:	15*1000	/*milisec*/,
			success:	function(data, status) {
				isServerConnect = false;
				try{
					// flashplayerでhttpstatusが取得できないブラウザの場合、
					// 文字列に「dbrespons::～::dbrespons」が付与されているので、除去
					data = delGuaranteedStr(data);
//logger.info( "data:"+data );
					data = JSON.parse(data);
					getShelfPaneData_onSuccess( data );
				}
				catch( e ) {
	alert( e );
				}
			},
			error:	function(request, status, errorThrown) {
				isServerConnect = false;
				alert("インターネットの接続が不安定になっています。\n画面のリロード(F5キー)をしてください。");
logger.error( request );
			}
		});
	}

	function	getShelfPaneData_onSuccess( data )
	{
//logger.info( "data:"+data );
		if( data && data.viewcode!='shelf' ) {
			//viewが変更された
	logger.info( "change view viewcode:"+data.viewcode );
			if( data.sessionid!=sessionid ) {
	logger.info( "change sessionid:"+sessionid+" → "+data.sessionid );
				sessionid = data.sessionid;
			}
			listener_.onWakeupMyshelf( data.viewcode );

		}else{
			if( !data ) {
				//空データ
				//→変更不要
	logger.info( "empty response. nop!" );
			}else{
				if( data.sessionid!=sessionid ) {
	logger.info( "change sessionid:"+sessionid+" → "+data.sessionid );
					sessionid = data.sessionid;
				}

	logger.info( "revision:"+(data.revision) );
				if( data.revision != paneRevision ) {
	logger.info( "reload!" );
	logger.info( "swf_domObj:"+swf_domObj );
					paneData = data.d;
					paneRevision = data.revision;
					if( swf_domObj ) {
						swf_domObj[swfFuncName_onRequest_]( 'loadedData', JSON.stringify({panecode:'shelf',d:paneData}) );
					}
				}
			}

			if( commandQueue.length==0 ) {
				setProcessing( false );
			}else{
				//キューが残っているので再度送信
				startRequest_multiSendExecAndGetShelfPaneData( commandQueue );
				commandQueue = [];
			}
		}
	}


	//--------

	// JSON文字列に、保障文字列が付与されている場合、削除する
	function delGuaranteedStr(data)
	{
		// flashplayerでhttpstatusが取得できないブラウザの場合、
		// 文字列に「dbrespons::～::dbrespons」が付与されているので、除去
		if((data.substring(0, 11) == "dbrespons::")&&
			(data.substring(data.length - 11, data.length) == "::dbrespons"))
		{
			data = data.substring(11, data.length - 11);
		}

		return data;
	}

	function getThisMovie(movieName) {
		if ( (isWinIE)||(isMacIE)||(isWinIE8) ) {
			return document.getElementById(movieName);
		}else {
			return document[movieName];
		}
	};


	//--------
	//	public
	return	{
		getMyshelfSessionid:	function()	{
			return	sessionid;
		},

		//シェルフの内容を更新する。
		renewShelf:	function()	{
			renewShelf();
		},

		//シェルフを再開する。
		//	主にエラー発生時に必要に応じてセッションを作り直して再表示する。
		restartShelf:	function()	{
			restartShelf();
		},

		add_onReadyMyshelf:	function( func )	{
			add_onReadyMyshelf(func);
		},

		setProcessing:	function( processing_ )	{
			setProcessing( processing_ );
		},
		getProcessing:	function( )	{
			return	processing;
		},
		responseFromShelf:	function( type, argJsonStr )	{
			return	responseFromShelf( type, argJsonStr );
		},
		addShelfEvent:	function( eventkindName, eventData )	{
			return addShelfEvent( eventkindName, eventData );
		}
	};
}



