/*
	ドラッグ＆ドロップクラス
*/

//深度の始まり
var ddobjDipthStart = 20;

function DDobjList(	onMouseUpCallback,		//onMouseUpコールバック
					onMouseDownCallback,	//onMouseDownコールバック
					onMouseMoveCallback){	//onMouseMoveコールバック

	this.init();
	this.initEvent();

	//つかんでいるobject
	this.captureObj = null;
	//つかみ始めの位置
	this.captureX = 0;
	this.captureY = 0;

	//各コールバック
	this.onMouseUpCallback = onMouseUpCallback;
	this.onMouseDownCallback = onMouseDownCallback;
	this.onMouseMoveCallback = onMouseMoveCallback;
};

DDobjList.prototype = {

	init : function(){
		//windowのマウス制御を追加
		document.onmousemove = gMouseMove;
		document.onmouseup = gMouseUp;
//		document.onmouseout = gMouseUp;


		//objectのリスト
		this.objList = new Object();
	},

	initEvent : function(){
		//Fx系にeventを付加する。
		//他で影響が出るかも……
		if (navigator.appName!="Microsoft Internet Explorer" ) { 
			(
			function(){
				var events = ["mousedown", "mouseover", "mouseout", "mousemove","mousedrag", "click", "dblclick"];
				for (var i = 0; i < events.length; i++){
						window.addEventListener(events[i], function(e){window.event = e;}, true);
				}
			}());
		}
	},

	addObject : function(inObjId){
		var obj = document.getElementById(inObjId);
		if(obj == null || obj == undefined){
			alert("error:オブジェクト["+inObjId+"]は存在しません");
		}

		//リストに追加する
		var length = array_length(this.objList);
		if(length == undefined){
			length = 0;
		}
		//画像をリストに追加
		this.objList[length] = obj;

		//深度を設定
		obj.style.zIndex = ddobjDipthStart + length;

		obj.onmousedown = gMouseDown;
	},

	moveMouse : function(){
		if(this.captureObj == null){
			return;
		}

		var obj = this.captureObj;
		var currentX;
		var currentY;
		if(typeof(event) != "undefined"){
			currentX = event.clientX;
			currentY = event.clientY;
		} else {
			currentX = event.pageX;
			currentY = event.pageY;
		}

		//移動
		//変化量
		var dx = currentX - this.captureX;
		var dy = currentY - this.captureY;
		obj.style.left = (parseInt(obj.style.left) + dx) + "px";
		obj.style.top = (parseInt(obj.style.top) + dy) + "px";

		//スタート位置更新
		this.captureX = currentX;
		this.captureY = currentY;

		if(this.onMouseMoveCallback != undefined){
			this.onMouseMoveCallback(this);
		}
	},

	mouseUp : function(){
		if(this.captureObj == null){
			return;
		}

		this.captureObj = null;

		if(this.onMouseUpCallback != undefined){
			this.onMouseUpCallback(this);
		}
	},

	mouseDown : function(inObj){
		//つかんでいるobject
		this.captureObj = inObj;

		if(typeof(event) != "undefined"){
			this.captureX = event.clientX;
			this.captureY = event.clientY;
		} else {
			this.captureX = event.pageX;
			this.captureY = event.pageY;
		}

		//深度再計算
		var current_zindex = inObj.style.zIndex;
		var max_zindex = ddobjDipthStart + array_length(this.objList);

		for (var i in this.objList) {
			var obj = this.objList[i];

			if(obj.style.zIndex > current_zindex){
				//current_zindexよりも浅い場合はひとつ沈める
				obj.style.zIndex --;
			}else if(obj.style.zIndex == current_zindex){
				obj.style.zIndex =  max_zindex;
			}
		}

		if(this.onMouseDownCallback != undefined){
			this.onMouseDownCallback(this);
		}
	}
}



/*
	グローバル
*/

var ddobjlist = null;

function setDdojList(obj){
	ddobjlist = obj;
}


function temp(){
	//マウスが動いた
	if(typeof(event) != "undefined"){
		currentposX = event.clientX;
		currentposY = event.clientY;
	} else {
		currentposX = event.pageX;
		currentposY = event.pageY;
	}
}


function gMouseMove(){
	//マウスが動いた
	if(ddobjlist != null){
		ddobjlist.moveMouse();

		//掴んでいる場合はFALSEを送る
		if(ddobjlist.captureObj != null){
			return false;
		}else{
			return true;
		}
	}

	return true;
}

function gMouseUp(){
	//マウスがあがった
	if(ddobjlist != null){ddobjlist.mouseUp();return false;}
}

function gMouseDown(){
	//マウスが降りた
	if(ddobjlist != null){ddobjlist.mouseDown(this);return false;}
}

//連想配列の要素数をカウントする
function array_length(inarray){
	var ret = 0;
	for (var i in inarray) {
		ret ++;
	}
	return ret;
}

