Array.prototype.shuffle = function() {
    var i = this.length;
    while(i){
        var j = Math.floor(Math.random()*i);
        var t = this[--i];
        this[i] = this[j];
        this[j] = t;
    }
    return this;
}

var data = {};

//開発者カードデータ
data.developers = [
	{no:13, event:"スケジュール延長を説得する", detail:"ステークホルダーを説得し、スケジュールの延長に成功する。期間は延びるが、コストに対する引き締めが厳しくなる。", func:"「協力会社が逃げる」のDelivery変化をゼロにできる", power:"A", risk:true, quality:0, cost:-3, delivery:2},
	{no:14, event:"オフショア開発をする", detail:"開発の一部をオフショアに依頼する。大幅なコスト圧縮とスケジュールの前倒しが見込まれたが、思った以上に品質が悪かった。", func:"「競合他社が新サービスを発表」のDelivery変化を-1にできる。", power:"A", risk:true, quality:-3, cost:2, delivery:1},
	{no:15, event:"プロセス監査を導入する", detail:"プロセス監査を導入して品質を担保する。対応のための作業が増加し、コストとスケジュールに悪影響", func:null, power:"B", risk:false, quality:2, cost:-2, delivery:-1},
	{no:16, event:"難しい技術を使う", detail:"複雑で習得や利用が難しい技術を採用する。生産性が下がり、コストに悪影響を与える。", func:"「パフォーマンスが出ない」をキャンセルできる。", power:"B", risk:true, quality:0, cost:-1, delivery:-1},
	{no:17, event:"メンバーを入れ替える", detail:"プロジェクトメンバーを一部入れ替える。引き継ぎのドタバタに時間を食われるが、品質が改善。", func:"「開発者が大勢退職する」のDelivery変化をゼロにできる。", power:"B", risk:true, quality:1, cost:0, delivery:-1},
	{no:18, event:"残業でこなす", detail:"残業を積み重ねて生産性を上げる。作業は前倒しで進むが、徐々に品質が悪くなっていく。", func:null, power:"C", risk:true, quality:-1, cost:1, delivery:0},
	{no:19, event:"テストを自動化する", detail:"テスト自動化を導入する。品質に好影響があるが、導入と習得までに時間がかかる。", func:"「協力会社が逃げる」のQuality変化をゼロに、Delivery変化を-1にできる。", power:"C", risk:false, quality:1, cost:0, delivery:-1},
	{no:20, event:"厳しい品質管理を導入する", detail:"品質管理プロセスは上がるが、コストもかかる。", func:"「全く動かないモジュールが発見される」をキャンセルできる。", power:"C", risk:false, quality:1, cost:-1, delivery:0},
	{no:21, event:"若く安価なメンバーを調達する", detail:"プロジェクトメンバーを若手中心に構成し、コストを圧縮する。未熟なため品質に問題が出がち。", func:"「開発者が大勢退職する」のQuality変化を-1に、Delivery変化を-1にできる。", power:"D", risk:false, quality:-1, cost:1, delivery:0},
	{no:22, event:"短期リリースする", detail:"リリースを短期で繰り返す。リリースの手間で作業が増えるが、フィードバックを得て品質が上がった。", func:null, power:"D", risk:false, quality:1, cost:-1 , delivery:0},
	{no:23, event:"優秀なメンバーを集める", detail:"コストがかかることを覚悟して、優秀なメンバーを社内外から集める。", func:"「協力会社が逃げる」のQualityとCostの変化をゼロにできる。", power:"D", risk:false, quality:1, cost:-1, delivery:0},
	{no:24, event:"空き要員を活用する", detail:"社内の手空きのメンバーに手伝ってもらう。", func:"「不景気で予算が削減される」のCost変化を-1にできる。", power:"D", risk:true, quality:0, cost:0, delivery:0},
];

//ユーザーカードデータ
data.users = [
	{no:1, event:"強引に仕様を確定する", detail:"ユーザーの要求を強引に統一して仕様を確定する。作業と期間を節約できるが、内容として不十分な部分ができてしまう。", func:null, power:"A", risk:true, quality:-3, cost:1, delivery:1},
	{no:2, event:"コスト追加の承認を受ける", detail:"プロジェクトの追加予算を獲得する。ただしスケジュールの遅延は許されない。", func:"「不景気で予算削減される」をキャンセルできる。", power:"A", risk:true, quality:-1, cost:2, delivery:-2},
	{no:3, event:"新しい技術を使う", detail:"未検証の先端的な技術を採用するという決定をする。検証に時間がかかり、また期待通りの機能や性能を発揮できない部分があるが、生産性向上でコストを減らせる。", func:null, power:"A", risk:false, quality:-2, cost:2, delivery:-1},
	{no:4, event:"仕様を頻繁に変える", detail:"途中で仕様の変更が多発する。追加のコストが必要となり、またテスト不十分な部分が出てくる。", func:null, power:"B", risk:false, quality:-1, cost:-1, delivery:0},
	{no:5, event:"厳しい期間を設定する", detail:"スケジュールを厳しめに設定することで、コストの圧縮を図る。", func:null, power:"B", risk:false, quality:0, cost:1, delivery:-2},
	{no:6, event:"厳しい品質要求を提示する", detail:"品質要求を高く設定することで、品質を担保する。検証のためのコストがかかる。", func:"「全く動かないモジュールが発見される」をキャンセルできる。", power:"B", risk:false, quality:1, cost:-2, delivery:0},
	{no:7, event:"大規模な仕様変更を要求する", detail:"ユーザー側の要求を調整した結果、大規模な仕様変更が必要となる。スケジュールを遅らせることはできない。", func:null, power:"B", risk:false, quality:0, cost:0, delivery:-2},
	{no:8, event:"ドキュメント標準を提示する", detail:"包括的ドキュメントの標準を提示し、品質の確保をはかる。標準作成と準拠確認の作業コストが必要。", func:null, power:"C", risk:false, quality:1, cost:-2, delivery:0},
	{no:9, event:"プロセス監査を厳しくする", detail:"厳格なプロセス監査を導入する。品質を担保できるが、追加の作業が必要なため、コストと期間に影響する。", func:null, power:"C", risk:false, quality:1, cost:-1, delivery:-1},
	{no:10, event:"仕様未定で着手する", detail:"仕様が決まるめどが付かないまま見切り発車するため、そのぶんスケジュールが遅延する。", func:null, power:"D", risk:true, quality:0, cost:0, delivery:-1},
	{no:11, event:"膨大な仕様を提示する", detail:"予算とスケジュールに対して仕様が大きすぎる。ただちに影響は出てこないが、どこかにしわよせが行く。", func:"「部署間調整に失敗」をキャンセルできる。", power:"D", risk:true, quality:0, cost:0, delivery:0},
	{no:12, event:"現場のわがままを聞く", detail:"現場の要望を受け入れて仕様を変更する。追加のコストがかかる。", func:"「部署間調整に失敗」の影響を半分にできる。", power:"D", risk:false, quality:0, cost:-1, delivery:0},
];

//リスク
data.risks = [
	{no:1, event:"部署間調整に失敗", quality:0, cost:-2, delivery:-2},
	{no:2, event:"協力会社が逃げる", quality:-1, cost:-1, delivery:-2},
	{no:3, event:"競合他社が新サービスを発表", quality:0, cost:0, delivery:-3},
	{no:4, event:"ユーザー側人事異動で担当者が変わる", quality:0, cost:-3, delivery:-1},
	{no:5, event:"全く動かないモジュールが発見される", quality:-3, cost:0, delivery:-1},
	{no:6, event:"不景気で予算が削減される", quality:-1, cost:-3, delivery:0},
	{no:7, event:"パフォーマンスが出ない", quality:-3, cost:-2, delivery:0},
	{no:8, event:"開発者が大勢退職する", quality:-2, cost:0, delivery:-2},
];

//シャッフル
data.users.shuffle();
data.developers.shuffle();
data.risks.shuffle();

var Game = function(){
	
	var this_ = this;

	//ステータス初期化
	var _score = $("#score");
	_score.slider({
		step:1,
		min:-5,
		max:5,
		value:0,
		change:function(e, ui){
		//	$('#risk_value').html(ui.value);
		}
	});
	var _quality = $("#quality");
	_quality.slider({
		orientation:'vertical',
		step:1,
		min:0,
		max:10,
		value:0,
		change:function(e, ui){
			$('#quality_value').html(ui.value);
		}
	});
	var _cost = $("#cost");
	_cost.slider({
		orientation:'vertical',
		step:1,
		min:0,
		max:10,
		value:0,
		change:function(e, ui){
			$('#cost_value').html(ui.value);
		}
	});
	var _delivery = $("#delivery");
	_delivery.slider({
		orientation:'vertical',
		step:1,
		min:0,
		max:10,
		value:0,
		change:function(e, ui){
			$('#delivery_value').html(ui.value);
		}
	});
	var _risk = $("#risk");
	_risk.slider({
		orientation:'vertical',
		step:1,
		min:0,
		max:7,
		value:0,
		change:function(e, ui){
			$('#risk_value').html(ui.value);
		}
	});

	//開発者カード生成
	var developers = new Array();
	$.each(data.developers, function(idx, data) {
		var elm = $(document.createElement("div"));
		elm.setTemplate('<div class="dc"><div class="no">M{$T.no}</div><div class="kind">{$P.kind}</div><div class="event">{$T.event}</div><div class="detail">{$T.detail}<span class="function">{#if $T.func}{$T.func}{#/if}</span></div><div class="power">{$T.power}</div><div class="risk">{#if $T.risk}RISK{#/if}</div><div class="quality"><div class="heading">Quality</div>{$T.quality}</div><div class="cost"><div class="heading">Cost</div>{$T.cost}</div><div class="delivery"><div class="heading">Deliverty</div>{$T.delivery}</div><div class="copyright">(C) やっとむ <a target="_blank" href="http://yattom.jp">http://yattom.jp</a></div></div>');
		elm.setParam('kind', 'DEVELOPER');
		elm.processTemplate(data);
		developers.push(elm);
	});

	//ユーザーカード生成
	var users = new Array();
	$.each(data.users, function(idx, data) {
		var elm = $(document.createElement("div"));
		elm.setTemplate('<div class="dc"><div class="no">M{$T.no}</div><div class="kind">{$P.kind}</div><div class="event">{$T.event}</div><div class="detail">{$T.detail}<span class="function">{#if $T.func}{$T.func}{#/if}</span></div><div class="power">{$T.power}</div><div class="risk">{#if $T.risk}RISK{#/if}</div><div class="quality"><div class="heading">Quality</div>{$T.quality}</div><div class="cost"><div class="heading">Cost</div>{$T.cost}</div><div class="delivery"><div class="heading">Deliverty</div>{$T.delivery}</div><div class="copyright">(C) やっとむ <a target="_blank" href="http://yattom.jp">http://yattom.jp</a></div></div>');
		elm.setParam('kind', 'USER');
		elm.processTemplate(data);
		users.push(elm);
	});
	
	//リスクカード生成
	var risks = new Array();
	$.each(data.risks, function(idx, data) {
		var elm = $(document.createElement("div"));
		elm.setTemplate('<div class="rc"><div>RISK</div><div class="no">K{$T.no}</div><div class="event">{$T.event}</div><div class="quality"><div class="heading">Quality</div>{$T.quality}</div><div class="cost"><div class="heading">Cost</div>{$T.cost}</div><div class="delivery"><div class="heading">Deliverty</div>{$T.delivery}</div><div class="copyright">(C) やっとむ <a target="_blank" href="http://yattom.jp">http://yattom.jp</a></div></div>');
		elm.processTemplate(data);
		risks.push(elm);
	});

	//3枚引く
	var developer_setting = new Array();
	developer_setting.push(developers.pop());
	developer_setting.push(developers.pop());
	developer_setting.push(developers.pop());
	var user_setting = new Array();
	user_setting.push(users.pop());
	user_setting.push(users.pop());
	user_setting.push(users.pop());
	$.each(developer_setting, function(){
		$('#developer').append(this);
	});
	$.each(user_setting, function(){
		$('#user').append(this);
	});
	
	//4枚配る
	var developer_having = new Array();
	developer_having.push(developers.pop());
	developer_having.push(developers.pop());
	developer_having.push(developers.pop());
	developer_having.push(developers.pop());
	var user_having = new Array();
	user_having.push(users.pop());
	user_having.push(users.pop());
	user_having.push(users.pop());
	user_having.push(users.pop());
	
	var work = $("#work");
	var work_cards = $("#work_cards");
	work.hide();
	
	//ユーザー開くボタン
	$("#btn_user").click(function(){
		work_cards.html("");
		$.each(user_having, function(idx, elm){
			elm.draggable({
				revert: 'invalid',
			});
			work_cards.append(elm);
		});
		work.css("left", "200px");
		work.show();
	});
	//開発者開くボタン
	$("#btn_developer").click(function(){
		
		work.css("left", "1px");
		work.show();
		
		work_cards.html("");
		$.each(developer_having, function(idx, elm){
			elm.draggable({
				revert: 'invalid',
			});
			work_cards.append(elm);
		});

	});
	//閉じるボタン
	$("#btn_close").click(function(){
		work.hide();
	});
	

	//引くボタン
	$("#btn_user_one").click(function(){
		user_having.push(users.pop());
		work.hide();
	});
	$("#btn_developer_one").click(function(){
		developer_having.push(developers.pop());
		work.hide();
	});
	

	//流すボタン
	$("#clear").click(function(){
		$('#stage_l').html("");
//alert(user_setting.length + ":" + user_having.length + ":" + developer_setting.length + ":" + developer_having.length + ":" + users.length + ":" + developers.length);
	});
	//リスクボタン
	$("#get_risk").click(function(){
		var risk = risks.pop();
		risk.css('float','left').appendTo($('#stage_l'));
		risks.unshift(risk);
	});
	

	$.each(user_setting, function(){
		this.draggable({
			revert: 'invalid',
		});
	});
	$.each(developer_setting, function(){
		this.draggable({
			revert: 'invalid',
		});
	});

	$("#stage").droppable({
		drop: function(event, ui) {
			this_.send(ui.draggable);
		}
	});

	//カードを出す
	this.send = function($item) {
		$item.fadeOut(function() {
			$item.remove().css('left','0').css('top','0').css('float','left').appendTo($('#stage_l')).fadeIn();
		});
		//配列から消す処理。なんだこの実装。
		var m = parseInt($('div[class="no"]', $item).html().substr(1), 10);
		if(m > 12){
			this_.recycle(developer_setting, developers, m);
			this_.recycle(developer_having, developers, m);
		} else {
			this_.recycle(user_setting, users, m);
			this_.recycle(user_having, users, m);
		}
	}

	//
	this.recycle = function($sa, $da, no){
		$.each($sa, function(idx, elm){
			if(no == parseInt($('div[class="no"]', elm).html().substr(1), 10)){
				$da.unshift(elm);
				$sa.splice(idx, 1);
			}
		});
		
	}
	
}

