// *********************************************************
//  ダイス 処理
// *********************************************************

	// *********************************************************
	//  変数宣言部
	// *********************************************************
	var colEdgeComboMax = 500;	// 列に配置できる次元/メジャーの各段のメンバの積の最大値
	var rowEdgeComboMax = 2000;	// 行に配置できる次元/メジャーの各段のメンバの積の最大値
	var spreadComboMax = 20000;	// Spread上に配置できる行・列の次元/メジャーの各段のメンバの積の最大値

	var dragColor="pink";		// 軸タイトルが、入れ替え/挿入可能な位置にある場合につく色
	var defaultColor="";		// 軸タイトルセルのデフォルト色

	var dragLineWidth="3px";	// 次元挿入位置で表示する罫線の太さ
	var sourceTd="";			// ドラッグ元の軸タイトルを表すTDオブジェクト
	var sourceDim="";			// ドラッグ元のエッジ（0:COL,1:ROW,2:PAGE）
	var sourceNum="";			// ドラッグ元のエッジ内の軸のIndex(=hieIndex)
	var targetDim="";			// ドラッグ先のエッジ（0:COL,1:ROW,2:PAGE）
	var targetNum="";			// ドラッグ元のエッジ内の軸のIndex(=hieIndex)
	var diceType="";			// ダイスのタイプ（入れ替え or 挿入）

	var dragableObj = null;		// ドラッグ中にマウスポインタの後を追うオブジェクトを格納
	var axisTitleDepth = 5; 	// 軸タイトルセルの階層の深さの最大値

	// *********************************************************
	//  イベント関数
	// *********************************************************

	// ドラッグスタート
	function axisTitleDown(obj) {

		//移動元オブジェクト(TD)を取得
		sourceTd = obj.parentNode.parentNode.parentNode;

		//ドラッグ時についてくるイメージオブジェクト(DIV)を表示
		dragableObj               = document.all("dragNode");
		dragableObj.style.left    = event.clientX;
		dragableObj.style.top     = event.clientY;
		dragableObj.firstChild.nextSibling.innerText = sourceTd.firstChild.firstChild.firstChild.nextSibling.innerText;
		dragableObj.style.display = "inline";

		// イベントの付与
		document.attachEvent( "onmousemove", dragAxis );	// ドラッグイベント
		document.attachEvent( "onmouseup", dragStatusClear ); // ドラッグ状態のクリアイベント
	}

	// 軸のドラッグ
	function dragAxis() {
		if ( dragableObj == null ) { return; }

		// ドラッグに合わせて次元/メジャーアイコンと名称を移動する
		dragableObj.style.left    = event.clientX;
		dragableObj.style.top     = event.clientY;

		// 軸タイトルセルのスタイルを変更
		var axisTitleCell = getAxisTitleCell(window.event.srcElement);
		if ( axisTitleCell != null ) {
			adjustAxisNameCellStyle(axisTitleCell);
		} else {
			// null の場合は軸タイトルセル上にマウスが無いため何もしない
		}

	}

	// ダイス処理実行
	function axisTitleUp(targetTd) {
		if ( sourceTd == "" ) { return; }
		if ( sourceTd == targetTd ) { return; }

		sourceDim=sourceTd.dragtype;
		sourceNum=sourceTd.cellIndex;
		targetDim=targetTd.dragtype;
		targetNum=targetTd.cellIndex;

		if ( targetTd.id == "insertArea" ) {	// PageEdgeに次元が未設定で、target=PageEdgeの場合
			diceType="insert";
		} else {
			//移動先をセルの３分割計算により調整
			if(cellCheck(targetTd)=="1"){
				diceType="insert";
			}else if(cellCheck(targetTd)=="2"){
				diceType="replace";
			}else if(cellCheck(targetTd)=="3"){
				targetNum=targetNum+1;
				diceType="insert";
			}
		}

		//その結果、移動先が移動元と同じであればreturn;
		if(((sourceDim==targetDim)&&(sourceNum==targetNum)) || ((sourceDim=="2")&&(targetDim=="2"))){
			return;
		}

		// ＝＝＝＝＝ XML更新処理 ＝＝＝＝＝
		// 初期設定
		var sourceDimName;
		var targetDimName;
			if ( sourceDim == "0" ) {
				sourceDimName = "COL";
			} else if ( sourceDim == "1" ) {
				sourceDimName = "ROW";
			} else if ( sourceDim == "2" ) {
				sourceDimName = "PAGE";
			}
			if ( targetDim == "0" ) {
				targetDimName = "COL";
			} else if ( targetDim == "1" ) {
				targetDimName = "ROW";
			} else if ( targetDim == "2" ) {
				targetDimName = "PAGE";
			}

		// ===== 入れ替え・挿入条件の判定 =====
		var colEdgeNode  = axesXMLData.selectSingleNode("/root/OlapInfo/AxesInfo/COL");
		var rowEdgeNode  = axesXMLData.selectSingleNode("/root/OlapInfo/AxesInfo/ROW");
		var pageEdgeNode = axesXMLData.selectSingleNode("/root/OlapInfo/AxesInfo/PAGE");
		var colNodes  = colEdgeNode.selectNodes("./HierarchyID");
		var rowNodes  = rowEdgeNode.selectNodes("./HierarchyID");
		var pageNodes = pageEdgeNode.selectNodes("./HierarchyID");

		var sourceNodes;
		var targetNodes;
			if ( sourceDimName == "COL" ) {
				sourceNodes = colNodes;
			} else if ( sourceDimName == "ROW" ) {
				sourceNodes = rowNodes;
			} else if ( sourceDimName == "PAGE" ) {
				sourceNodes = pageNodes;
			}

			if ( targetDimName == "COL" ) {
				targetNodes = colNodes;
			} else if ( targetDimName == "ROW" ) {
				targetNodes = rowNodes;
			} else if ( targetDimName == "PAGE" ) {
				targetNodes = pageNodes;
			}

		var checkFLG = isDragOK( diceType, sourceDimName, sourceNum, sourceNodes, targetDimName, targetNum,targetNodes, colNodes, rowNodes );

		if ( checkFLG == false ) {
			return;
		}

		// ===== 次元入れ替え/挿入処理 =====

		var sourceEdgeNode;	// 移動元のエッジのＸＭＬノード
		var targetEdgeNode;	// 移動先のエッジのＸＭＬノード
			if ( sourceDimName == "COL" ) {
				sourceEdgeNode = colEdgeNode;
			} else if ( sourceDimName == "ROW" ) {
				sourceEdgeNode = rowEdgeNode;
			} else if ( sourceDimName == "PAGE" ) {
				sourceEdgeNode = pageEdgeNode;
			}
			if ( targetDimName == "COL" ) {
				targetEdgeNode = colEdgeNode;
			} else if ( targetDimName == "ROW" ) {
				targetEdgeNode = rowEdgeNode;
			} else if ( targetDimName == "PAGE" ) {
				targetEdgeNode = pageEdgeNode;
			}

		var sourceNode = sourceNodes[sourceNum];	// 移動元の次元/メジャーのＸＭＬノード
		var targetNode = targetNodes[targetNum];	// 移動先の次元/メジャーのＸＭＬノード

		if ( diceType == "replace" ) {	// 次元入れ替えの場合

			var sourceNextNode = sourceNodes[sourceNum+1];
			targetEdgeNode.replaceChild( sourceNode, targetNode );

			if ( sourceNextNode == null ) {	// ドラッグ元が最終段
				sourceEdgeNode.appendChild( targetNode );
			} else {
				if ( targetNode.childNodes[0].text == sourceNextNode.childNodes[0].text) {
					// 挿入場所を、入れ替え後のXMLの状態から取得するため、再度取得する
					var insertNode = axesXMLData.selectSingleNode("/root/OlapInfo/AxesInfo/"+ sourceDimName +"/HierarchyID[" + (sourceNum+1) + "]");
					sourceEdgeNode.insertBefore( targetNode, insertNode );
				}
				sourceEdgeNode.insertBefore( targetNode, sourceNextNode );
			}

		} else if ( diceType == "insert" ) {	// 次元挿入の場合
			if ( targetNode == null ) {	// target軸の最後へ追加 or 
										// ページエッジに次元が無い場合のページエッジへの追加
				targetEdgeNode.appendChild( sourceNode );
			} else {
				targetEdgeNode.insertBefore( sourceNode, targetNode );
			}
		}

		// ＝＝＝＝＝ サーバー側のSpread情報更新＆再表示 ＝＝＝＝＝

		// GIFイメージを動かす（サーバーへのアクセス中を示す）
		parent.display_area.setLoadingStatus(true);

		// 軸の配置情報
		var colAxisListString  = getAxisIdListInEdge( "COL", axesXMLData );
		var rowAxisListString  = getAxisIdListInEdge( "ROW", axesXMLData );
		var pageAxisListString = getAxisIdListInEdge( "PAGE", axesXMLData );
		document.SpreadForm.colItems.value  = colAxisListString;
		document.SpreadForm.rowItems.value  = rowAxisListString;
		document.SpreadForm.pageItems.value = pageAxisListString;

		// 色情報を取得
		var colorInfoArray = getColorArray();
		if( colorInfoArray != null ) {
			document.SpreadForm.hdrColorInfo.value = colorInfoArray[0];	// ヘッダー部の色情報
			document.SpreadForm.dtColorInfo.value  = colorInfoArray[1];	// データテーブルの色情報
		}

		// サーバーへ送信・再表示処理呼び出し
		document.SpreadForm.action='Controller?action=renewHtmlAct&mode=registColorSetings';
		document.SpreadForm.target='display_area';
		document.SpreadForm.submit();
	}


	// 軸タイトルセルからマウスが出た
	function axisTitleOut(tdObj) {
		cellClear(tdObj);	// セルのスタイルをクリア
	}

	// *********************************************************
	//  スタイル関数（設定）
	// *********************************************************

	// 軸タイトルセルのスタイルを変更
	function adjustAxisNameCellStyle(targetTd) {
		if ( sourceTd == targetTd ) { return; } // 移動元と移動先が同じセルの場合、無効
		if ( ( sourceTd.parentNode.parentNode.parentNode.id == "pageEdgeTable" ) && 
	         ( targetTd.parentNode.parentNode.parentNode.id == "pageEdgeTable" )
	       ) { 
			return; 
		}

		if ( targetTd.id == "insertArea" ) {	
		// ページエッジの挿入用エリアへ次元/メジャーを挿入
		// ※ページエッジの挿入用エリア：ページエッジに次元/メジャーが配置されていない場合に表示
			targetTd.style.backgroundColor=dragColor;
			targetTd.firstChild.firstChild.firstChild.nextSibling.style.backgroundColor=dragColor;
		} else {
			if(cellCheck(targetTd)=="1"){
				if ( targetTd.dragtype != "2" ) {	// ドラッグ先が行か列
					targetTd.style.padding="0px "+dragLineWidth+" 0px 0px";
					targetTd.style.borderLeftWidth=dragLineWidth;
				}
				targetTd.style.borderLeftColor=dragColor;
			}else if( ( cellCheck(targetTd)=="2" ) ){
				if ( targetTd.dragtype == "2" ) {	// ドラッグ先がページ
					targetTd.style.borderColor=dragColor;
				}
				targetTd.style.backgroundColor=dragColor;
				targetTd.firstChild.firstChild.firstChild.nextSibling.style.backgroundColor=dragColor;
			}else if(cellCheck(targetTd)=="3"){
				if ( targetTd.dragtype != "2" ) {	// ドラッグ先が行か列
					targetTd.style.padding="0px 0px 0px "+dragLineWidth;
					targetTd.style.borderRightWidth=dragLineWidth;
				}
				targetTd.style.borderRightColor=dragColor;
			}
		}

	}


	// *********************************************************
	//  スタイル関数（クリア）
	// *********************************************************

	// ドラッグ状態をクリア
	function clearDragStatus() {

		//ドラッグ時についてくるイメージオブジェクト(DIV)を消去
		dragableObj.style.display = "none";
		dragableObj = null;

		// イベントを削除
		document.detachEvent( "onmousemove", dragAxis );
		document.detachEvent( "onmouseup", dragStatusClear );

	}

	//セルのスタイル（わきの線幅・セル色）をクリア
	function cellClear(tdObj){

		if ( tdObj.dragtype != "2" ) {	// ドラッグ先が行か列
			tdObj.style.borderLeftWidth  = "0";
			tdObj.style.borderRightWidth = "0";
			tdObj.style.padding = "0px "+dragLineWidth+" 0px "+dragLineWidth;
			tdObj.style.borderLeftColor  = defaultColor;
			tdObj.style.borderRightColor = defaultColor;
		} else {
			tdObj.style.borderColor  = defaultColor;
		}

		tdObj.style.backgroundColor  = defaultColor;
		tdObj.firstChild.firstChild.firstChild.nextSibling.style.backgroundColor = defaultColor;
	}

	function dragStatusClear() {//初期化
		sourceTdClear();
		clearDragStatus();
	}

	function sourceTdClear(){
		sourceTd="";	// TDの初期化
	}

	// *********************************************************
	//  位置取得関数
	// *********************************************************

	// 軸タイトルセル内のメンバであれば、軸タイトルセルを求める
	function getAxisTitleCell( node ) {

		if (node == null) { return null; }
		if ( (node.tagName != "DIV") && (node.tagName != "A") && (node.tagName != "NOBR") && (node.tagName != "TD") ) { return null; }

		// 軸タイトルセルの階層の深さの分だけ上に辿って軸タイトルセルを探す
		for ( var i = 0; i < axisTitleDepth; i++ ) { 
			if (node == null) {
				break;
			}

			if (node.axisTitle == "1") {//軸タイトルセル内のメンバであった
				return node; //軸タイトルセルを返す
			}

			node = node.parentNode;
		}

		return null;
	}


	//セルを三分割にして何番目にマウスポインタがあるかを返す（引数：TDエレメント、戻り値：番号）
	function cellCheck(tdObj) {

		// マウスポインタのセル内でのX座標を取得
		var x = event.offsetX;

		// クロスヘッダに位置する行ヘッダの場合、X座標を補正する
		if ( (isInCrossHeaderAreaByTDObj(tdObj)) && (event.srcElement.style.backgroundImage != "") ) {
			x += event.srcElement.offsetLeft - parseInt(dragLineWidth);
		}

		if(x<=tdObj.offsetWidth*0.2){
			return "1";
		}else if(x<=tdObj.offsetWidth*0.8){
			return "2";
		}else{
			return "3";
		}
	}

	// *********************************************************
	//  その他関数
	// *********************************************************

	// ドラッグ可否を判断する
	function isDragOK ( diceType, sourceDimName, sourceNum, sourceNodes, targetDimName, targetNum,targetNodes, colNodes, rowNodes ) {


		// 次元の挿入を行なっても、行または列の段数が0にならないか？
		if ( ( diceType == "insert" ) && 
	         ( sourceDimName == "COL" || sourceDimName == "ROW" ) &&
	         ( sourceNodes.length == 1 ) ) {
			showMessage( "1", sourceDimName );
			return false;
		}

		// 次元の挿入を行なっても、行または列の段数が4以上にならないか？
		if ( ( diceType == "insert" ) && 
	         ( targetDimName == "COL" || targetDimName == "ROW" ) &&
	         ( targetNodes.length == 3 ) ) {
			showMessage( "2", targetDimName );
			return false;
		}

		// 次元の入れ替え・挿入後のデータテーブルの行または列の数が
		// 規定値(colEdgeComboMax or rowEdgeComboMax)以内か

		// 行または列の数が変化しうる場合
		if ( ( targetDimName == "COL" || targetDimName == "ROW" ) &&
		     ( sourceDimName != targetDimName ) ) {

			var edgeComboNum = 1;
			var edgeID    = 0;
			var tmpMemNum = 0;

			// 移動先のエッジの各段の次元/メジャーメンバ数の積を求める
			for ( var i = 0; i < targetNodes.length; i++ ) {
				// 次元IDを取得
				edgeID = targetNodes[i].text;

				// 次元入れ替え時には入れ替え対象次元/メジャーをスキップ
				if ( ( diceType == "replace" ) && 
				     ( targetNum  == i ) ) {
					continue;
				}

				// 組み合わせ数を取得
				tmpMemNum = parseInt( document.all("dimNumbers").all(edgeID).innerText );
				edgeComboNum = edgeComboNum * tmpMemNum;
			}

			// さらに移動元の次元/メジャーのメンバ数を乗算する
			edgeID = sourceNodes[sourceNum].text;	// 次元ID
			tmpMemNum = parseInt( document.all("dimNumbers").all(edgeID).innerText );
			edgeComboNum = edgeComboNum * tmpMemNum;

			// 上限を超えていないか

			if ( targetDimName == "COL" ) {
				if ( edgeComboNum > colEdgeComboMax ) {
					showMessage( "3", colEdgeComboMax, targetDimName );
					return false;
				}
			} else if ( targetDimName == "ROW" ) {
				if ( edgeComboNum > rowEdgeComboMax ) {
					showMessage( "3", rowEdgeComboMax, targetDimName );
					return false;
				}
			}
		}

		// データテーブルのセル数（行と列の各段のメンバ合計の積）が
		// 規定値(spreadComboMax)以内か

		// データテーブルセル数が変化しうる場合
		if ( ( sourceDimName == "PAGE" ) && 
		     ( targetDimName == "COL" || targetDimName == "ROW" ) ) {

			var spreadComboNum = 1;

			// 列エッジの計算
			for ( var i = 0; i < colNodes.length; i++ ) {
				// 次元IDを取得
				edgeID = colNodes[i].text;

				// ページエッジからの次元入れ替え時：入れ替え対象次元/メジャーをスキップ
				if ( ( sourceDimName == "PAGE" ) &&
				     ( targetDimName == "COL"  ) &&
				     ( diceType == "replace" ) &&
				     ( targetNum  == i ) ) {
					continue;
				}

				// 組み合わせ数を取得
				tmpMemNum = parseInt( document.all("dimNumbers").all(edgeID).innerText );
				spreadComboNum = spreadComboNum * tmpMemNum;
			}

			// 行エッジの計算(列エッジの計算結果に対して乗算)
			for ( var i = 0; i < rowNodes.length; i++ ) {
				// 次元IDを取得
				edgeID = rowNodes[i].text;

				// ページエッジからの次元入れ替え時：入れ替え対象次元/メジャーをスキップ
				if ( ( sourceDimName == "PAGE" ) &&
				     ( targetDimName == "ROW" ) &&
				     ( diceType == "replace" ) && 
				     ( targetNum  == i ) ) {
					continue;
				}

				// 組み合わせ数を取得
				tmpMemNum = parseInt( document.all("dimNumbers").all(edgeID).innerText );
				spreadComboNum = spreadComboNum * tmpMemNum;
			}

			// 移動元がページエッジ：さらに移動元の次元/メジャーのメンバ数を乗算する
			if ( sourceDimName == "PAGE" ) {
				edgeID = sourceNodes[sourceNum].text;	// 次元ID
				tmpMemNum = parseInt( document.all("dimNumbers").all(edgeID).innerText );
				spreadComboNum = spreadComboNum * tmpMemNum;
			}

			// 上限を超えていないか
			if ( ( targetDimName == "COL" || targetDimName == "ROW" ) &&
		         ( spreadComboNum > spreadComboMax ) ) {

				showMessage( "4", spreadComboMax );
				return false;
			}

		}

		return true;
	}


