﻿function startDesk(desk, cabinet){
	desk.dragging=false;
	desk.draggedNote=null;
	desk.Mouse={X:0, Y:0};
	desk.diffMouse={X:0, Y:0};
	desk.oldMouse={X:0, Y:0};
	desk.slot=null;
	desk.Cookies=new CookieManager("DandD", 31);
	desk.notes=new Array();
	desk.folders=new Array();
	var _folders=desk.getElementsByTagName("DIV");
	for(var i=0; i<_folders.length; i++){
		var folder=_folders[i];
		if(IncludesClass(folder, "folder")){
			desk.folders.push(folder);
			folder.dragLeft=GetAbsolute(folder).X;
			folder.dragRight=folder.dragLeft+folder.offsetWidth;

			folder.PosNotes=function(){
				this.notes=new Array();
				var _notes=this.getElementsByTagName("DIV");
				var n=0;
				var prev=0;
				for(var i=0; i<_notes.length; i++){
					var note=_notes[i];
					if(IncludesClass(note, "note")){
						this.notes.push(note);
						note.dragTop=GetAbsolute(note).Y;
						note.dragBottom=note.dragTop+(note.offsetHeight/2);
						if(n>0){note.dragTop-=_notes[prev].dragBottom;}
						n++;
						prev=i;
					}
				}
			}
			folder.PosNotes();
		}
	}

	if(cabinet!=null){
		cabinet.desk=desk;
		cabinet.Open=function(note){
			var folderID=note.parentNode.id;
			if(folderID.indexOf("hidden")!=0){return;}
			var deskFolderID=folderID.substring("hidden".length);
			if((note.movable)||(!note.movable && document.getElementById(deskFolderID).notes.length==0)){
				document.getElementById(deskFolderID).appendChild(note);
			}
			else if(!note.movable && document.getElementById(deskFolderID).notes.length>0){
				document.getElementById(deskFolderID).insertBefore(note, document.getElementById(deskFolderID).notes[0]);
			}
			document.getElementById(deskFolderID).PosNotes();
			note.closed=false;
			this.desk.Save();
		}
		cabinet.Close=function(note){
			var folderID="hidden"+note.defaultFolder;
			var deskFolder=note.parentNode;
			document.getElementById(folderID).appendChild(note);
			deskFolder.PosNotes();
			note.closed=true;
			this.desk.Save();
		}
	}

	desk.Reset=function(){
		this.Cookies.Clear();
		window.location.reload();
	}

	desk.FindSlot=function(){
		var folder=null;
		for(var i=0; i<this.folders.length; i++){
			var _folder=this.folders[i];
			if((_folder.dragLeft<this.Mouse.X)&&(_folder.dragRight>this.Mouse.X)){
				folder=_folder;
				break;
			}
		}
		
		if((folder==null)||(folder.notes.length==0)){
			return folder;
		}
		
		folder.PosNotes();

		var note=null;
		for(var i=0; i<folder.notes.length; i++){
			var _note=folder.notes[i];
			if(IncludesClass(_note, "note")){
				if(((_note.dragTop<this.Mouse.Y)&&(_note.dragBottom>this.Mouse.Y))||((i==0) && (_note.dragTop>this.Mouse.Y))){
					if(!_note.movable){continue;}
					note=_note;
					break;
				}
			}
		}
		
		if(note==null){return folder;}
		return note;
	}
	
	desk.onmousemove=function(e){
		if(e==null){e=window.event;}
		this.oldMouse.X=this.Mouse.X;
		this.oldMouse.Y=this.Mouse.Y;
		this.Mouse.X=e.clientX;

		var ScrollTop = document.body.scrollTop;
		if (ScrollTop == 0){
			if (window.pageYOffset){ScrollTop = window.pageYOffset;}
			else{ScrollTop = (document.body.parentElement) ? document.body.parentElement.scrollTop : 0;}
		}
		this.Mouse.Y=e.clientY+ScrollTop;

		this.diffMouse.X=this.Mouse.X-this.oldMouse.X;
		this.diffMouse.Y=this.Mouse.Y-this.oldMouse.Y;
		if(this.dragging){
			this.dummy.Update(this.diffMouse);
			var newSlot=this.FindSlot();
			if(newSlot!=this.slot){
				if(newSlot!=null){
					if(IncludesClass(newSlot, "note")){newSlot.parentNode.insertBefore(this.draggedNote, newSlot);}
					else if(IncludesClass(newSlot, "folder")){newSlot.appendChild(this.draggedNote);}
				}
				this.slot=this.draggedNote;
			}
		}
	}
	
	desk.dummy=desk.appendChild(document.createElement("DIV"));
	desk.dummy.style.display="none";
	desk.dummy.className="dummy note";
	desk.dummy.style.position="absolute";
	desk.dummy.X=0;
	desk.dummy.Y=0;
	desk.dummy.Update=function(add){
		if(this.style.display=="none"){return;}

		this.X+=add.X;
		this.Y+=add.Y;
		this.style.left=this.X+"px";
		this.style.top=this.Y+"px";
	}
	
	desk.onmouseup=function(){
		this.StopDragging();
	}
	
	desk.StartDragging=function(note){
		if((note!=null)&&(this.dragging)){return;}
		this.dragging=true;
		this.draggedNote=note;
		this.draggedNote.style.visibility="hidden";
		this.dummy.innerHTML=note.innerHTML;
		this.dummy.style.display="block";
		var abs=GetAbsolute(note);
		this.dummy.style.width=note.offsetWidth+"px";
		this.dummy.Update(abs);
	}
	desk.StopDragging=function(note){
		if((note!=null)&&((!this.dragging)||(this.draggedNote!=note))){return;}
		this.dragging=false;
		if(this.draggedNote){this.draggedNote.style.visibility="visible";}
		this.draggedNote=null;
		this.dummy.innerHTML="";
		this.dummy.style.display="none";
		this.dummy.X=0;
		this.dummy.Y=0;
		
		this.Save();
	}
	
	desk.Save=function(){
		for(var n=0; n<this.notes.length; n++){
			var note=this.notes[n];
			var folder=note.parentNode.id;
			if(folder.indexOf("hidden")==0){folder=folder.substring("hidden".length);}
			this.Cookies.Set("Note"+note.id,folder+"|"+note.expanded+"|"+note.closed);
		}
	}
	desk.Load=function(note){
		var temps=this.Cookies.Get("Note"+note.id);
		if((temps=="")||(temps==null)){return false;}
		var temp=temps.split("|");
		var noteFolder=temp[0];
		var noteExpanded=temp[1]=="true";
		var noteClosed=temp[2]=="true";
		if(noteClosed){noteFolder="hidden"+noteFolder;}
		note.expanded=noteExpanded;
		note.closed=noteClosed;
		document.getElementById(noteFolder).appendChild(note);

		var folder=note.parentNode.id;
		if(folder.indexOf("hidden")==0){folder=folder.substring("hidden".length);}
		this.Cookies.Get("Note"+note.id);
	}
	
	desk.SetupNote=function(note, folder, movable, expandable, closable){
		note.desk=desk;
		note.cabinet=cabinet;
		note.movable=movable;
		note.expandable=expandable;
		note.closable=closable;
		note.closed=(note.parentNode.parentNode==cabinet);

		note.defaultFolder=folder;

		this.notes.push(note);

		this.Load(note);

		if(!note.movable){note.className+=" nonMovable";}
		if(!note.expandable){note.className+=" nonExpandable";}
		if(!note.closable){note.className+=" nonClosable";}

		if(!IncludesClass(note, "note") || IncludesClass(note, "dummy")){return;}
		
		var handle=null;
		var expander=null;
		var content=null;
		var closer=null;
		var temps=note.getElementsByTagName("DIV");
		for(var i=0; i<temps.length; i++){
			var temp=temps[i];
			if(temp.parentNode!=note){continue;}
			if(IncludesClass(temp, "handle")){handle=temp; continue;}
			if(IncludesClass(temp, "expander")){expander=temp; continue;}
			if(IncludesClass(temp, "content")){content=temp; continue;}
			if(IncludesClass(temp, "closer")){closer=temp; continue;}
		}
				
		if(handle!=null){
			handle.note=handle.parentNode;
			handle.desk=desk;
			handle.onmousedown=function(){
				if(this.note.movable && !this.note.closed){this.desk.StartDragging(this.note);}
				return false;
			}
			handle.onmouseup=function(){
				if(this.note.movable && !this.note.closed){this.desk.StopDragging(this.note); return true;}
				if(this.note.closed){this.note.cabinet.Open(this.note); return true;}
			}
		}

		if(expander!=null && note.expandable){
			if(note.expanded==null){note.expanded=true;}
			note.content=content;
			expander.className+=" collapse";
			expander.note=note;
			expander.onclick=function(){
				this.note.expanded=!this.note.expanded;
				this.Update();
				return false;
			}
			expander.Update=function(){
				if(this.note.expanded){
					this.note.content.style.display="block";
					this.className=this.className.replace(" expand", " collapse");
				}
				else{
					this.note.content.style.display="none";
					this.className=this.className.replace(" collapse", " expand");
				}
				this.note.desk.Save();
			}
			expander.Update();
		}

		if(closer!=null && note.closable){
			if(note.expanded==null){note.expanded=true;}
			note.closer=closer;
			closer.note=note;
			closer.onclick=function(){
				this.note.cabinet.Close(this.note);
				return false;
			}
		}
	}
}
