DnD = {};
DnD.addEvent = function(el, evname, func) {
   if (el.attachEvent) {
      el.attachEvent("on" + evname, func);
   } else if (el.addEventListener) {
      el.addEventListener(evname, func, false);
   } else {
      el["on" + evname] = func;
   }
};
DnD.removeEvent = function(el, evname, func) {
   if (el.detachEvent) {
      el.detachEvent("on" + evname, func);
   } else if (el.removeEventListener) {
      el.removeEventListener(evname, func, false);
   } else {
      el["on" + evname] = null;
   }
};
var ErrorTimer=0
defaultSlideTime=500;
defaultSlideSteps=30;
DnD.initDragObjects=function(className,el,recursive,attribObject){
   if(!className) return;
   el=DnD.idOrObject(el);
   var changeArray=DnD.getElementsByAttribute('className',className,el,recursive);
   for(a in changeArray){a=new DnD.Draggable(changeArray[a],attribObject)};
}
DnD.img2div=function(el){
   if(el.nodeName.match(/img/i)){
      var div=document.createElement('div');
      DnD.changeAttributes(div,{
         offsetWidth:el.offsetWidth,offsetHeight:el.offsetHeight,offsetLeft:el.offsetLeft,
         offsetTop:el.offsetTop,className:el.className,
         style:{
            backgroundImage:'url('+el.src+')',backgroundColor:'transparent'
         }
      });
      var id=el.id;
      el.parentNode.replaceChild(div,el);
      div.id=id;
      return div
   }else{
      return el
   }
};
DnD.eventPosition=function(ev){
      ev||(ev=window.event);
      var ret={};
      ret.X = ev.pageX || ev.clientX + window.document.body.scrollLeft || 0;
      ret.Y = ev.pageY || ev.clientY + window.document.body.scrollTop || 0;
      return ret
};
DnD.idOrObject=function(el,errorMessage,errorAction){
   if(typeof(el)=='string'){el=document.getElementById(el)||el};
   if(typeof(el)!='object'){
      if(errorAction)errorAction();
      return false
   }else{
      return el
   }
};
DnD.getElementsByAttribute=function(attr, val, el, recursive){
   if(!attr) return false;
   el=DnD.idOrObject(el);
   el||(el=window.document.body);
   var a=el.firstChild;retArray=[]
   while(a){
      if(a[attr]){
         if(val){
            if(a[attr]==val) retArray=retArray.concat([a])
         }else{
            retArray=retArray.concat([a])
         }
      };
      if(recursive&&a.hasChildNodes()){
         retArray=retArray.concat(DnD.getElementsByAttribute(attr, val, a, recursive))
      };
      a=a.nextSibling
   };
   return retArray
};
DnD.Draggable=function(el,left,top,right,bottom,direction,followShape,handler,dragCSS,dragLayer,method,dropName){
   el=DnD.idOrObject(el);
   if(!el) return;
   el=DnD.img2div(el);
   if(typeof(left)=='object'){
      el.Atr=left
   }else{
      var Atr={};
      if(left)Atr.left=left;
      if(top)Atr.top=top;
      if(right)Atr.right=right;
      if(bottom)Atr.bottom=bottom;
      if(direction)Atr[direction]=true;
      if(followShape)Atr.followShape=true;
      if(handler)Atr.handler=handler;
      if(dragCSS)Atr.dragCSS=dragCSS;
      if(dragLayer)Atr.dragLayer=dragLayer;
      if(method)Atr.method=method;
      if(dropName)Atr.dropName=dropName;
      el.Atr=Atr
   };
   if(el.Atr.followShape){
      if(el.Atr.right)el.Atr.right-=el.offsetWidth;
      if(el.Atr.bottom)el.Atr.bottom-=el.offsetHeight
   };
   if(el.Atr.handler){
      el.Atr.handler=DnD.idOrObject(el.Atr.handler,'cannot find the handlerobject:'+el.Atr.handler)
   }
   if(el.Atr.handler){
      el.Atr.handler=DnD.img2div(el.Atr.handler)
   };
   el.Atr.dragLayer=DnD.idOrObject(el.Atr.dragLayer,'cannot find the dragLayer:'+el.Atr.dragLayer)||(el.Atr.horizontal||el.Atr.vertical)?0:window.document.body;
   DnD.addEvent(el.Atr.handler||el, "mousedown", function(ev){
      if(!el.cState){
      el.cState='mouseDown';//document.title=el.cState;
      el.mouseStart=DnD.eventPosition(ev);
      DnD.addEvent(window.document, "mousemove", el.mouseMoveEv);
      DnD.addEvent(window.document, "mouseup", el.mouseUpEv);}
   });
   el.dragStartEv=function(ev){
      el.Atr.Start={};
      el.Atr.Start.X=el.offsetLeft;
      el.Atr.Start.Y=el.offsetTop;
      /*el.Atr.beforeDrag={};
      el.Atr.beforeDrag.nextSibling=el.nextSibling;
      el.Atr.beforeDrag.parentNode=el.parentNode;
      el.Atr.beforeDrag.className=el.className;
      el.Atr.beforeDrag.offsetLeft=el.offsetLeft;
      el.Atr.beforeDrag.offsetTop=el.offsetTop;
      el.Atr.beforeDrag.style={display:el.style.display,position:el.style.position};*/
      if(el.Atr.dragLayer){
         el.Atr.Start=DnD.getRelativePos(el,el.Atr.dragLayer);
         //el.Atr.dragLayer.appendChild(el);
      };
      el.Atr.beforeDrag=DnD.changeAttributes(el,{
         className:el.Atr.dragCSS||'',parentNode:el.Atr.dragLayer,nextSibling:null,
         offsetLeft:el.Atr.Start.X,offsetTop:el.Atr.Start.Y,style:{
            display:'block',position:'absolute'
         }
      });
      var initObjects=DnD.getElementsByAttribute('onDragInit',0, el.Atr.dragLayer, true);
      if (initObjects.length){
         for(a in initObjects){
            if(initObjects[a]!=el)initObjects[a].onDragInit(ev);
         }
      }
   }
   el.mouseMoveEv=function(ev){
      if(el.cState=='mouseDown'){
         el.cState='dragStart';
         el.dragStartEv(ev)
         el.cState='drag';
      };
      var mouse=DnD.eventPosition(ev);
      if(!el.Atr.vertical){
      var X=el.Atr.Start.X+mouse.X-el.mouseStart.X;
      if(X<el.Atr.left){X=el.Atr.left}else{if(el.Atr.right&&X>el.Atr.right)X=el.Atr.right};
      el.style.left=X+'px'};
      if(!el.Atr.horizontal){
      var Y=el.Atr.Start.Y+mouse.Y-el.mouseStart.Y;
      if(Y<el.Atr.top){Y=el.Atr.top}else{if(el.Atr.bottom&&Y>el.Atr.bottom)Y=el.Atr.bottom};
      el.style.top=Y+'px'};
      var overel=DnD.getTopElementByPos(el.Atr.dragLayer,mouse.X,mouse.Y,el,true,'dropName')
      if((overel!=el.Atr.overEl)){
         if(el.Atr.overEl&&el.Atr.overEl.onDragOut)el.Atr.overEl.onDragOut(el);
         el.Atr.overEl=overel;
         if(overel.onDragOver)overel.onDragOver(el)
      }
   };
   el.mouseUpEv=function(ev){
      if(el.cState=='drag'){
         if(el.Atr.overEl&&el.Atr.overEl.onDrop){
            var returnToOldPos=!(el.Atr.overEl.onDrop(el));
            if(returnToOldPos){
               DnD.Slide(el,el.Atr.Start.X,el.Atr.Start.Y);
               //DnD.changeAttributes(el,el.Atr.beforeDrag)
            }
         }else{
            el.className=el.Atr.beforeDrag.className;
         };
         DnD.removeEvent(window.document, "mousemove", el.mouseMoveEv);
         DnD.removeEvent(window.document, "mouseup", el.mouseUpEv);
         
         el.cState='';
         var uninit=DnD.getElementsByAttribute('onDragEnd',0,0,1);
         for(a in uninit){uninit[a].onDragEnd(el, ev)}
      };
   };
};
DnD.getRelativePos=function(el,con){
   if(!(el=DnD.idOrObject(el,'relativePos - no object:'+el)))return;
   con=DnD.idOrObject(con,'relativePos - no container:'+con);
   var SL = 0, ST = 0;
   if (el.scrollLeft)SL = el.scrollLeft;
   if (el.scrollTop)ST = el.scrollTop;
   var r = { X: el.offsetLeft - SL, Y: el.offsetTop - ST };
   if (el.offsetParent&&el.offsetParent!=con) {
      var tmp = DnD.getRelativePos(el.offsetParent,con);
      r.X += tmp.X;
      r.Y += tmp.Y;
   }
   return r;
};
DnD.changeAttributes=function(el,newValues,dontSet){
   if(!(el=DnD.idOrObject(el))||!newValues)return;
   var ret={};
   for(a in newValues){
      var b=newValues[a];
      if(b&&typeof(b)=='object'&&!b.nodeName){
         ret[a]=DnD.changeAttributes(el[a],b,false)
      }else{
         ret[a]=el[a]||'';
         if(a=='nextSibling'){
            if(ret[a]==null)ret.parentNode=el.parentNode
         }
      }
   }
   if(!dontSet){
      if(newValues.parentNode&&newValues.nextSibling){
         delete(newValues.parentNode);
      };
      for(a in newValues){
         var b=newValues[a];
         if(b&&typeof(b)=='object'&&!b.nodeName){
            if(!el[a])el[a]={};
            ret[a]=DnD.changeAttributes(el[a],b)
         }else{
            //ret[a]=el[a]||'';
            if(/^offset/.test(a)){
               el.style[a.replace(/^offset(.*)$/,'$1').toLowerCase()]=(b||0)+'px'
            }else if(a=='parentNode'){
               if(b&&b.nodeType==1)b.appendChild(el)
            }else if(a=='nextSibling'){
               if(b)b.parentNode.insertBefore(el,b);
            }else{
               try{el[a]=b}catch(e){}
            }
         }
      }
   };
   return ret
}
function showTux(tux) {
       document.getElementById(tux).style.display = 'block';
}