﻿function detectBrowser()
	{	
		var sAgent = navigator.userAgent.toLowerCase();
		this.isIE = (sAgent.indexOf("msie")!=-1); //IE6.0-7
		this.isFF = (sAgent.indexOf("firefox")!=-1);//firefox
		this.isSa = (sAgent.indexOf("safari")!=-1);//safari
		this.isOp = (sAgent.indexOf("opera")!=-1);//opera
		this.isNN = (sAgent.indexOf("netscape")!=-1);//netscape
		this.isMa = this.isIE;//marthon
		this.isOther = (!this.isIE && !this.isFF && !this.isSa && !this.isOp && !this.isNN && !this.isSa);
	}
	var oBrowser = new detectBrowser();


var _dragFix = 
{
Ctrl : false,  //拖动控制开关
Root : null,   //拖动容器
Obj  : null,   //拖动对象
Temp  : null,   //临时插入块
Tempid :"drayTemp",
Sign : false,  //拖动标志
Range :null,   //拖动对象活动范围 in表示只能在当前列拖动，out表示可以任意拖动
Change:false,  //布局是否有改动
Parent:null,   //拖动对象所在列的ID
Header:"yes",  
Shape:null,    //阴影层
Rows  : [],     //所有拖动列ID
PositionsX: [],
Row   :null,   //当前所在列

init:function(id)
{
    _dragFix.Root = document.getElementById(id);
	
		var cooldrag = _dragFix.read("cooldrag");
		if(cooldrag != ""){//读取cookie
			var subcontainer = cooldrag.split("|");
			for(var i=0 ; i < subcontainer.length; i++){
				if($(subcontainer[i])) $('dragCont').appendChild($(subcontainer[i]));
			}
		}else{
		//alert("there is no cookie");	
		}
    cleanWhitespace(_dragFix.Root);//清除空白节点
    var dragRows = _dragFix.Root.childNodes;
    for(var i=0;i<dragRows.length;i++)
    {
     if(dragRows[i].id)
     {
      _dragFix.Rows[i] = dragRows[i].id;
      _dragFix.PositionsX[i] = getRealLeft(dragRows[i])-8;
     }
    }
    if(!_dragFix.Rows.length) return; //如果容器中不含拖动列，结束
    var dragC = _dragFix.Root.getElementsByTagName("DIV");
    for(var i = 0; i < dragC.length; i++)
    {
      if(dragC[i].getAttribute("drag") == "yes")
   {
       var o = dragC[i].firstChild; 
       o.onmousedown = _dragFix.start;
       dragC[i].firstChild.style.cursor = "move";
       dragC[i].style.position = "";
      }
   }//获取所有可拖动的对象
    document.onmousemove = _dragFix.drag;
    document.onmouseup = _dragFix.end;
    _dragFix.Ctrl = true;
   //window.status = "拖动已开启";
},
start:function(e)
{
  if(!_dragFix.Ctrl || $(_dragFix.Tempid)) return;
  if(!e) e = window.event;
  var obj = getT(e);
  if("A" == obj.tagName) return;
  if(obj.getAttribute("header") != _dragFix.Header) obj = obj.parentNode; //拖动头
  _dragFix.Sign = true;           //拖动准备就绪
     _dragFix.Obj = obj.parentNode;  //要拖动的对象
     _dragFix.Range = _dragFix.Obj.getAttribute("range");
     
  
  _dragFix.Obj.initMouseX = getMouseX(e);
  _dragFix.Obj.initMouseY = getMouseY(e);
  _dragFix.Obj.initoffsetL = getRealLeft(_dragFix.Obj);
  _dragFix.Obj.initoffsetY = getRealTop(_dragFix.Obj);
  _dragFix.Obj.style.width = _dragFix.Obj.offsetWidth+"px";
  
     //if("in" == _dragFix.Range) window.status = "这个层只能在当前列拖动";
     //else window.status = "这个层可以任意拖动";
     
     _dragFix.Temp = _dragFix.Obj.cloneNode(true); //临时插入块
     _dragFix.Obj.parentNode.insertBefore(_dragFix.Temp,_dragFix.Obj);
     _dragFix.Temp.id = _dragFix.Tempid;
  
  with(_dragFix.Obj.style)
  {
     position = "absolute";
	 top=(_dragFix.Obj.initoffsetY)+"px";//新增加语句，用于控制按下时的位置
	 filter='alpha(opacity=60)';
	 MozOpacity=0.60;
	 opacity= 0.60;
     zIndex = 1000;
  }
  with(_dragFix.Temp.style)
  {
     width = "auto";
     height = _dragFix.Obj.offsetHeight + "px";
     border = "1px solid #000";
     margin = "0 0 0px 0";
  }
  //document.documentElement.scrollTop=_dragFix.tmpScroll;
},
drag:function(e)
{
  if(!_dragFix.Ctrl || !_dragFix.Sign || _dragFix.Obj==null) return;
  if(!e) e = window.event;
  var currenX = getMouseX(e); //鼠标当前X坐标
  var currenY = getMouseY(e); //鼠标当前Y坐标
  //var currenObjX = currenX;
  //var currenObjY = currenY;

  var currenObjX = getRealLeft(_dragFix.Obj);
  if(oBrowser.isIE){
  	  var currenObjY = getRealTop(_dragFix.Obj)+document.documentElement.scrollTop;
  }else{
	  var currenObjY = getRealTop(_dragFix.Obj);
  }
  //window.status = currenObjX + "-" +currenObjY;
  if(_dragFix.Range != "in")
  {
     _dragFix.Obj.style.left = (_dragFix.Obj.initoffsetL +  currenX - _dragFix.Obj.initMouseX) + "px";
     for(var i = 1; i < _dragFix.PositionsX.length; i++)
     {
     if(currenObjX > _dragFix.PositionsX[i])  _dragFix.Row = _dragFix.Rows[i];
     else
     {
      _dragFix.Row = _dragFix.Rows[i-1];
      break;
     }
     }
  } //如果拖动层设置为只在当前列拖，则保持横坐标(X坐标)不变
  else _dragFix.Row = _dragFix.Obj.parentNode.id;
    //_dragFix.Obj.style.width = $(_dragFix.Row).offsetWidth;
    //_dragFix.Temp.style.height = _dragFix.Obj.offsetHeight;
  //window.status = "所在列："+_dragFix.Row;
  _dragFix.Obj.style.top = (_dragFix.Obj.initoffsetY +  currenY  - _dragFix.Obj.initMouseY) + "px";
  
  var finded = false;
  
    var dragC = $(_dragFix.Row).childNodes;
  for(var i = 0; i < dragC.length; i++)
  {
      var o = dragC[i];
      var sonT = getRealTop(o);
      var sonH = o.offsetHeight;
      var tH = sonT + parseInt(sonH/2);
      var tH2 = sonT + sonH;
      if(o.getAttribute("drag"))
      {
		  if(((oBrowser.isIE)&&(o!=_dragFix.Obj))||(!oBrowser.isIE)){
        if(currenObjY > sonT && currenObjY < tH)
        {
			//aa.value="情况1 "+sonT+"/"+tH+" - "+currenObjY;
			//document.documentElement.scrollTop
         $(_dragFix.Row).insertBefore(_dragFix.Temp,o);
         break;
        }
        else if(currenObjY > tH && currenObjY < tH2 + 8)
        {
			
         if(o.nextSibling) {
			 //aa.value="情况2 "+tH+"/"+tH2+" - "+currenObjY+"有后一个";
			 $(_dragFix.Row).insertBefore(_dragFix.Temp,o.nextSibling);
		 }else{
			 //aa.value="情况2 "+tH+"/"+tH2+" - "+currenObjY+"有后一个";
			 $(_dragFix.Row).appendChild(_dragFix.Temp);
		 }
         break;
        }
		  }
       // else if()
      }
  }
   // if(!finded) $(_dragFix.Row).appendChild(_dragFix.Temp);
  return;
},
end:function()
{
  if(!_dragFix.Ctrl || !_dragFix.Sign) return;
  //_dragFix.Temp.parentNode.removeChild(_dragFix.Temp);
  _dragFix.Sign = false;
  _dragFix.timer = _dragFix.repos(150,15);//放开时回到新的位置
  //window.status = "拖动结束";
},
repos:function(aa,ab)
{
    var tl=getRealLeft(_dragFix.Obj);
	if(oBrowser.isIE){
    var tt=getRealTop(_dragFix.Obj)+document.documentElement.scrollTop;
	var kl=(tl-getRealLeft(_dragFix.Temp)-3)/ab;
	}else{
	var tt=getRealTop(_dragFix.Obj);
	var kl=(tl-getRealLeft(_dragFix.Temp))/ab;
	}
    //var kl=(tl-getRealLeft(_dragFix.Temp)-3)/ab;
    var kt=(tt-getRealTop(_dragFix.Temp))/ab;
    return setInterval(function(){
       if(ab<1)
    {
     clearInterval(_dragFix.timer);
     _dragFix.Temp.parentNode.insertBefore(_dragFix.Obj,_dragFix.Temp);
     _dragFix.Obj.parentNode.removeChild(_dragFix.Temp);
	 
	 
  var str="";
		for(var i=0; i<$('dragCont').childNodes.length; i++){
			var o = $('dragCont').childNodes[i];
			if(i>0)str += "|";
			str += o.id;
		}
  _dragFix.save("cooldrag",str,24);
     with(_dragFix.Obj.style)
     {
        position = "";
		filter='alpha(opacity=100)';
		MozOpacity=1.0;
		opacity= 1.0;
        zIndex = "";
        width = "100%";
     }
     return;
       }
       ab--;
       tl-=kl;
       tt-=kt;
       _dragFix.Obj.style.left=parseInt(tl)+"px";
       _dragFix.Obj.style.top=parseInt(tt)+"px";
	   
    },aa/ab);
},
stop:function()
{
   if(!_dragFix.Root)
   {
    //windowCDtatus = "拖动未开启";
    return;
   }
   var dragC = _dragFix.Root.getElementsByTagName("DIV");
    for(var i = 0; i < dragC.length; i++)
    {
      if(dragC[i].getAttribute("drag") == "yes")
   {
       var o = dragC[i].firstChild; 
       dragC[i].firstChild.style.cursor = "";
      }
   }//获取所有可拖动的对象
   _dragFix.Ctrl = false;
   //window.status = "拖动已关闭";
},
save:function(name, value, hours){
		var expire = "";
		if(hours != null)
		{
		expire = new Date((new Date()).getTime() + hours * 3600000);
		expire = "; expires=" + expire.toGMTString();
		}
		document.cookie = name  + "=" + escape(value) + expire;
},
read:function(name){
		var cookieValue = "";
		var search = name + "=";
		if(document.cookie.length > 0)
		{ 
		offset = document.cookie.indexOf(search);
		if (offset != -1)
		{ 
		  offset += search.length;
		  end = document.cookie.indexOf(";", offset);
		  if (end == -1) end = document.cookie.length;
		  cookieValue = unescape(document.cookie.substring(offset, end))
		}
		}
		return cookieValue;
	}
}
function $(id) {return document.getElementById(id);} 
function getT(e){return e.target || e.srcElement;}
function getMouseX(e){
return e.pageX ? e.pageX : e.clientX + document.body.scrollLeft - document.body.clientLeft;
}
function getMouseY(e){
return e.pageY ? e.pageY : e.clientY + document.body.scrollTop  - document.body.clientTop;
}
function getRealLeft(o){
var l = 0;
while(o){
  l += o.offsetLeft - o.scrollLeft;
  o = o.offsetParent;
}
return(l);
}
function getRealTop(o){
var t = 0;
while(o){
  t += o.offsetTop - o.scrollTop;
  o = o.offsetParent;
}
return(t);
}
function cleanWhitespace(node) {
     var notWhitespace = /\S/;
     for (var i=0; i < node.childNodes.length; i++) {
         var childNode = node.childNodes[i];
         if ((childNode.nodeType == 3)&&(!notWhitespace.test(childNode.nodeValue))) {
             node.removeChild(node.childNodes[i]);
             i--;
         }
         if (childNode.nodeType == 1) {
             cleanWhitespace(childNode);
         }
     }
}