/* oHuangKeo
 2006.7.8
 V1.0
hkDrag( [可容纳移动的BOX], 保存当前设置的回调函数,可移动对象的className, 可移动对象标签, 手式对的className)
<script src=cookies.js></script>
<script src=hkdrag-1.0.js></script>
<script>
function save(){
	var ids = h.get();
	setCookie('xx',ids);
}
function get(){
	var ids = eval(getCookie('xx'));
	return ids;
}
var boxs = ['b_1','b_2','b_3'];
var init = get();
var h = new hkDrag( boxs,init,save, 'div', 'div', 'title');
if( document.all){
	document.onmousedown = function(event){ h.dragDown(event,h)};
	document.onmousemove = function(event){ h.dragMove(event,h)};
	document.onmouseup   = function(event){ h.dragUp(event,h)};
}
else{
	window.document.addEventListener("mousedown", function(event){ h.dragDown(event,h)}, false);
	window.document.addEventListener("mousemove", function(event){ h.dragMove(event,h)}, false);
	window.document.addEventListener("mouseup", function(event){ h.dragUp(event,h)}, false);
}
</script>
*/
var hkDrag = function(){
	if( !arguments.length) return;
	if( !arguments[0].length) return;

	this._DEBUG_ = true;
	this.iMouseDown = false;
	this.dragObj = null;
	this.e_m = {x:0,y:0};
	this.dragTemp = null;
	this.dragBoxs = arguments[0];
	this.initDiv = arguments[1]        || [];
	this.callBackFun = arguments[2]    || null;
	this.dragElementBox = arguments[3] || 'div';
	this.dragElement = arguments[4]    || 'div';
	this.dragHandle = arguments[5]     || 'title';

	this.get = function(){
		var ids = [];
		for(var i=0; i<this.dragBoxs.length; i++){
			ids[i] = [];
			var box = document.getElementById(this.dragBoxs[i]);
			var childs = box.childNodes;
			for(var j=0; j<childs.length; j++){
				if( childs[j].id && childs[j].className == this.dragElementBox) ids[i].push( childs[j].id);
			};
		};
		temp_ids = [];
		for(var i=0; i<ids.length; i++){
			if( ids[i].length == 0) temp_ids.push('');
			else temp_ids.push('"'+ids[i].join('","')+'"');
		};
		ids = '[['+temp_ids.join('],[')+']]';
		return ids;
	};
	this.set = function(){
		if( this.initDiv.length == 0) return;
		for(var i=0; i<this.dragBoxs.length; i++){
			var box = document.getElementById(this.dragBoxs[i]);
			for(var j=0; j<this.initDiv[i].length; j++){
				box.appendChild(document.getElementById(this.initDiv[i][j]));
			};
		};
	};
	this.set();

	this.show_debug = function( str){
		if( this._DEBUG_ && document.getElementById('msg')){
			document.getElementById('msg').innerHTML += str + '<br>';
			document.getElementById('msg').scrollTop = document.getElementById('msg').scrollHeight;
		};
	};

	for(var i=0; i<this.dragBoxs.length; i++){
		var box = document.getElementById(this.dragBoxs[i]);
		box.dragBox = true;
		var childs = box.getElementsByTagName(this.dragElement);
		for(var j=0; j<childs.length; j++){
			if( childs[j].className == this.dragHandle) childs[j].style.cursor = 'move';
		};
	};

	this.dragTemp = document.createElement('DIV');
	this.dragTemp.style.cssText = 'display: none;border:2px #777777 dashed';
	document.body.appendChild( this.dragTemp);


	this.getMousePosition = function(event){
		if(event.pageX || event.pageY) return {x:event.pageX, y:event.pageY};
		return {
			x:event.clientX + document.body.scrollLeft - document.body.clientLeft,
			y:event.clientY + document.body.scrollTop  - document.body.clientTop
		};
	};
	this.getElementPosition = function(e){
		var left = 0;
		var top  = 0;
		while(e){
			left += e.offsetLeft;
			top  += e.offsetTop;
			e     = e.offsetParent;
		};
		return {x:left, y:top};
	};
	this.getInfo = function(o){
		var info = new Object();
		info.left = info.right = info.top = info.bottom = 0;
		var twidth = o.offsetWidth;
		var theight = o.offsetHeight;
		while( o){
			info.left += o.offsetLeft;
			info.top += o.offsetTop;
			o = o.offsetParent;
		};
		info.right = info.left + twidth;
		info.bottom = info.top + theight;
		return info;
	};
	this.getNowElement = function(mouse){
		if( !this.iMouseDown) return;
		if( !this.dragObj) return;

		var divs = document.getElementsByTagName(this.dragElement);
		for( var i=(divs.length-1); i>=0; i--){
			var d = this.getInfo(divs[i]);
			if( divs[i] == this.dragObj) continue;
			if( d.top<mouse.y && d.right>mouse.x && d.bottom>mouse.y && d.left<mouse.x && divs[i].className == this.dragElementBox) return divs[i];
		};
		return null;
	};
	this.getNowBox = function(mouse){
		if( !this.iMouseDown) return;
		if( !this.dragObj) return;
		for(var i=0; i<this.dragBoxs.length; i++){
			var box = document.getElementById(this.dragBoxs[i]);
			var d = this.getInfo(box);
			if( d.top<mouse.y && d.right>mouse.x && d.bottom>mouse.y && d.left<mouse.x && box.dragBox) return box;
		};
		return null;
	};
	this.setDragTemp = function(o,i_a){
		if( !this.iMouseDown) return;
		if( !this.dragObj) return;
		if( !o) return;
		if( this.dragTemp == o) return;
		if( !o.offsetParent) return;
		i_a = i_a || 0;

		this.dragTemp.style.display = '';
		this.dragTemp.style.display = '';
		if( i_a == 0) o.parentNode.insertBefore(this.dragTemp,o);
		else if( i_a == 1) o.parentNode.insertBefore( this.dragTemp,o.nextSibling);
		else if( i_a == 2) o.appendChild( this.dragTemp);
	};


	this.dragMove = function(event,obj){
		if( !this.iMouseDown) return;
		if( !this.dragObj) return;

		event = event || window.event;
		var target = event.target || event.srcElement;
		var mP = this.getMousePosition(event);


		this.dragObj.style.left = mP.x-e_m.x;
		this.dragObj.style.top = mP.y-e_m.y;

		var e = this.getNowElement(mP);
		if( e){
			eP = this.getInfo(e);
			if( (mP.y-eP.top) > (eP.bottom-eP.top)/2) this.setDragTemp(e,1);
			else this.setDragTemp(e,0);
		}
		else
		{
			e = this.getNowBox(mP);
			if( e && e.getElementsByTagName(this.dragElement).length==0) this.setDragTemp(e,2);
		};
		return false;
	};
	this.dragUp = function(event,obj){
		this.iMouseDown = false;
		if( !this.dragObj) return;
		if( document.all) this.dragObj.releaseCapture();
		else window.releaseEvents(event.mousemove);
		this.dragTemp.style.display = 'none';
		if( document.all) this.dragObj.style.cssText = 'position:inherit;filter:alpha(opacity=100);';
		else this.dragObj.style.cssText = 'position:inherit;-moz-opacity:1; opacity: 1;';

		if( this.dragTemp.parentNode.dragBox){
			if( this.dragTemp.nextSibling) this.dragTemp.parentNode.insertBefore(this.dragObj,this.dragTemp.nextSibling);
			else this.dragTemp.parentNode.appendChild( this.dragObj);
		}
		this.dragObj = null;
		this.callBackFun();
	};
	this.dragDown = function(event,obj){
		this.iMouseDown = true;
		event = event || window.event;
		var target = event.target || event.srcElement;

		if( target.className == this.dragHandle){
			var e = target;
			while( e.parentNode){
				if( e.parentNode.className == this.dragElementBox){
					this.dragObj = e.parentNode;
					break;
				}
				else e = e.parentNode;
			}
			if( document.all) this.dragObj.setCapture();
			else window.captureEvents(event.mousemove);

			var mP = this.getMousePosition(event);
			var eP = this.getElementPosition(target);

			e_m = {x:mP.x-eP.x, y:mP.y-eP.y};

			if( document.all) this.dragObj.style.cssText = 'width:'+this.dragObj.offsetWidth+'px;height:'+this.dragObj.offsetHeight+'px;position:absolute;filter:alpha(opacity=50);';
			else this.dragObj.style.cssText = 'width:'+this.dragObj.offsetWidth+'px;height:'+this.dragObj.offsetHeight+'px;position:absolute;-moz-opacity:0.50; opacity: 0.5;';
			this.dragObj.style.left = eP.x;
			this.dragObj.style.top = eP.y;

			this.dragTemp.style.height = this.dragObj.offsetHeight;
			this.dragTemp.style.width = this.dragObj.offsetWidth;
		}
		else this.iMouseDown = false;
	};
};
