var Swapper_dragging = 0; //onum dragovaneho, jinak 0
var Swapper_dragging_obj = null; //odkaz na node dragovaneho objektu
var Swapper_dragging_name; //jmeno skupiny, ktere se prave draguje
var Swapper_DragX, Swapper_DragY; //pozice chyceni obrazku na zacatku dragu
var px,py;

if (!document.all){
	HTMLElement.prototype.replaceNode=function(x){
		if (this.parentNode)
			this.parentNode.replaceChild(x, this)
    } 
	HTMLElement.prototype.swapNode=function(x){ 
        var y=x.cloneNode(true), z=this.cloneNode(true); 
        x.replaceNode(z); this.replaceNode(y)
    } 
}

	
function Swapper_Init(objname,first){
	elements=getElementsByClassName(getId(objname),'*','swapobject');
	niceorder=true;
	lastonum=-1;
	orderstr="";
	for(i=0; i < elements.length;i++){
		buttons=getElementByClassName(elements[i],'*','swapbuttons');
		button_left=getElementByClassName(buttons,'*','left');
		button_right=getElementByClassName(buttons,'*','right');
		button_left.style.visibility=(i==0)?'hidden':'visible';
		button_right.style.visibility=(i==elements.length-1)?'hidden':'visible';
		onum=getElementByClassName(elements[i],'*','onum').innerHTML;
		id=getElementByClassName(elements[i],'*','id').innerHTML;
		
		
			catchobj=getElementByClassName(elements[i],'*','catchobj');
			catchobj.onmousedown=new Function('e',"Swapper_DragStart('"+objname+"',"+onum+")");
			elements[i].onmouseup=new Function('e',"Swapper_DragStop('"+objname+"')");
			button_left.onmouseup=new Function('e',"Swapper_Move1('"+objname+"',"+onum+",-1)");
			button_right.onmouseup=new Function('e',"Swapper_Move1('"+objname+"',"+onum+",1)");
		
		
		if (str2int(onum)>str2int(lastonum)) lastonum=onum;
		else               niceorder=false;
		orderstr+= orderstr=="" ? id : "-"+id;
	}
	button=getElementByClassName(getId(objname),'*','swapconfirm');
	if (button)
	  button.style.visibility=niceorder?'hidden':'visible';  
	orderstate=getElementByClassName(getId(objname),'*','orderstate');
	if (orderstate)
		orderstate.value=orderstr;
}
	
//posun od onumu o +-X prvku
function Swapper_Move1(swappername,onum,direction){
	elements=getElementsByClassName(getId(swappername),'*','swapobject');
	for(i=0;i < elements.length;i++)
		if (onum==getElementByClassName(elements[i],'*','onum').innerHTML){
		  onum2=getElementByClassName(elements[i+direction],'*','onum').innerHTML;
		  Swapper_Swap_Init(swappername,onum,onum2);
		  Swapper_Swap_Obj(swappername,elements[i],elements[i+direction]);
		  Swapper_Swap_Finish(swappername,onum,onum2);
		  return;
		}
}
	
/*zahajeni dragu*/
function Swapper_DragStart(swappername,onum){
	if (Swapper_dragging!=0) return;
	
	if( document.captureEvents ) document.captureEvents(Event.MOUSEMOVE);
	document.onmousemove = Swapper_DragAndDrop_Move;
	
	DisableSelecting();
	
	Swapper_dragging=onum;
	Swapper_dragging_name=swappername;
	
	elements=getElementsByClassName(getId(swappername),'*','swapobject');
	for(i=0;i < elements.length;i++)
		if (onum==getElementByClassName(elements[i],'*','onum').innerHTML)
			Swapper_dragging_obj=elements[i];
		
	Swapper_DragX=-1;
	Swapper_DragY=-1;
	//Swapper_dragging_obj.className="swapobject active";
	AddClass(Swapper_dragging_obj,'active');
	Swapper_elements_cache=null;
	}		      
	
/*ukonceni dragu*/
function Swapper_DragStop(swappername){
	if (Swapper_dragging==0) return;
	if (document.releaseEvents) document.releaseEvents(Event.MOUSEMOVE);
	document.onmousemove = null;
	
	EnableSelecting();
	
	Swapper_dragging_obj.style.left=0;
	Swapper_dragging_obj.style.top=0;
	//Swapper_dragging_obj.className="swapobject";
	RemoveClass(Swapper_dragging_obj,'active');
	
	Swapper_dragging=0;
	Swapper_elements_cache=null;
}
	
/*posunu mysi behem dragu*/
var Swapper_elements_cache;
function Swapper_DragAndDrop_Move(e) {
	e = e || window.event || {};
	x=e.clientX ? e.clientX+document.documentElement.scrollLeft : e.pageX;
	y=e.clientY ? e.clientY+document.documentElement.scrollTop : e.pageY;
	if ((!x)||(!y)) return;
	//prvni posun:
	if (Swapper_DragX==-1){
		Swapper_dragging_obj.style.position='relative';
		Swapper_DragX=x;
		Swapper_DragY=y;
		//return
	}
	//posunuti:
	Swapper_dragging_obj.style.left=x-Swapper_DragX+"px";
	Swapper_dragging_obj.style.top=y-Swapper_DragY+"px";
	//test na unik, v IE mozne
	fx=findPosX(Swapper_dragging_obj);
	fy=findPosY(Swapper_dragging_obj);
	if ((x>fx+Swapper_dragging_obj.offsetWidth) ||(x<fx)||
		(y>fy+Swapper_dragging_obj.offsetHeight)||(y<fy)){
		Swapper_DragX=x+Swapper_dragging_obj.offsetWidth/2;
		Swapper_DragY=y+Swapper_dragging_obj.offsetHeight/2;
		Swapper_dragging_obj.style.left=x-Swapper_DragX+"px";
		Swapper_dragging_obj.style.top=y-Swapper_DragY+"px";
	}
	//prehazovani:
	if (!Swapper_elements_cache){
	  Swapper_elements_cache=getElementsByClassName(getId(Swapper_dragging_name),'*','swapobject');
	  for(i=0;i < Swapper_elements_cache.length;i++)
	    if (Swapper_dragging==getElementByClassName(Swapper_elements_cache[i],'*','onum').innerHTML){
	      Swapper_elements_cache[i]=null;
	      break;
	    }
	}
	//elements=getElementsByClassName(getId(Swapper_dragging_name),'*','swapobject');
	for(i=0;i < Swapper_elements_cache.length;i++)
		//if (Swapper_dragging!=getElementByClassName(elements[i],'*','onum').innerHTML){
	  if (Swapper_elements_cache[i]!=null){
		el=elements[i];
		AS=Swapper_dragging_obj.offsetHeight*Swapper_dragging_obj.offsetWidth;
		TS=el.offsetHeight*el.offsetWidth;
		a=Smaller(Swapper_dragging_obj.offsetLeft, el.offsetLeft );
		b=Smaller(Swapper_dragging_obj.offsetTop,  el.offsetTop  );
		c=Bigger(Swapper_dragging_obj.offsetWidth+Swapper_dragging_obj.offsetLeft, el.offsetWidth+el.offsetLeft);
		d=Bigger(Swapper_dragging_obj.offsetHeight+Swapper_dragging_obj.offsetTop, el.offsetHeight+el.offsetTop);
		CS=(c-a)*(d-b);
		P=(AS+TS-CS)/(Bigger(AS,TS));
		if (P>0.5){
		    Swapper_Move(Swapper_dragging_name,Swapper_dragging,getElementByClassName(elements[i],'*','onum').innerHTML);
		    return;
		}
	}
}

//posun onum1 na pozici onum2, vsechny mezi nimi se posunou
function Swapper_Move(swappername,onum1,onum2){
	elements=getElementsByClassName(getId(Swapper_dragging_name),'*','swapobject');
	var i = 0,A=0,B=0;
	for(i=0;i < elements.length;i++){
		onum=getElementByClassName(elements[i],'*','onum').innerHTML;
		if (onum==onum1) A=i;
		if (onum==onum2) B=i;
	}
	//nyni presuny tak, ze A->B, mohou byt 2 ruzne smery!
	Swapper_Swap_Init(Swapper_dragging_name,onum1,onum2);

	direction=B>A ? +1 : -1;
	for(i=A; i!=B; i+=direction)
	  Swapper_Swap_Obj(Swapper_dragging_name,elements[i],elements[i+direction]);
	
	/*
	obj=getId(Swapper_dragging_name);
	if (A>B) obj.insertBefore(elements[A],elements[B]);
	  else elements[B+1] ? obj.insertBefore(elements[A],elements[B+1]) 
	                     : obj.insertBefore(elements[A]);
	*/
	Swapper_Swap_Finish(Swapper_dragging_name,onum1,onum2);
}

function Swapper_Swap_Init(swappername,onum1,onum2){
	if (Swapper_dragging!=0){
		px=findPosX(Swapper_dragging_obj);//fyzicka poloha s posunutim
		py=findPosY(Swapper_dragging_obj);
		Swapper_dragging_obj.style.left=0;
		Swapper_dragging_obj.style.top=0;
		nx=findPosX(Swapper_dragging_obj);//fyzicka poloha bez posunutim
		ny=findPosY(Swapper_dragging_obj);
		//Swapper_dragging_obj.className="swapobject";
		RemoveClass(Swapper_dragging_obj,'active');
		rx=Swapper_DragX-findPosX(Swapper_dragging_obj);//kde je chycen
		ry=Swapper_DragY-findPosY(Swapper_dragging_obj);
		Swapper_elements_cache=null;
	}
}

//prohozeni 2 obrazku dle onum
function Swapper_Swap(swappername,onum1,onum2){
	elements=getElementsByClassName(getId(swappername),'*','swapobject');
	for(i=0;i < elements.length;i++){//najdu indexy
		if (onum1==getElementByClassName(elements[i],'*','onum').innerHTML)
		i1=i;
		if (onum2==getElementByClassName(elements[i],'*','onum').innerHTML)
		i2=i;
	}
	Swapper_Swap_Obj(swappername,elements[i1],elements[i2]);
}
//take prohozeni 2 objektu ale dle objketu
function Swapper_Swap_Obj(swappername,obj1,obj2){
	//obj1.swapNode(obj2); return;
	var o=obj1.innerHTML;	//presouvame obsah
	var oId=obj1.id;		//presouvame i ID, ktere muzeme vyuzivat jinak
	obj1.innerHTML=obj2.innerHTML;
	obj1.id=obj2.id;
	obj2.innerHTML=o;
	obj2.id=oId;
}

function Swapper_Swap_Finish(swappername,onum1,onum2){
	if (Swapper_dragging!=0){
		elements=getElementsByClassName(getId(swappername),'*','swapobject');
		for(i=0;i < elements.length;i++)
			if (onum1==getElementByClassName(elements[i],'*','onum').innerHTML)
				Swapper_dragging_obj=elements[i];
		Swapper_DragX=findPosX(Swapper_dragging_obj)+rx;//stejny bod chyceni
		Swapper_DragY=findPosY(Swapper_dragging_obj)+ry;
		Swapper_dragging_obj.style.position='relative';
		if (px!='px')
			Swapper_dragging_obj.style.left=(px-nx)+(findPosX(Swapper_dragging_obj)-px)+"px";
		if (py!='px')
			Swapper_dragging_obj.style.top=(py-ny)+(findPosY(Swapper_dragging_obj)-py)+"px";
		//Swapper_dragging_obj.className="swapobject active";		
		AddClass(Swapper_dragging_obj,'active');
	}
	Swapper_Init(swappername,false);
}
