/*
 +-----------------------------------------------------------------------+
 | Image Galerie Note Application                                        |
 |                                                                       |
 | This file is part of the LEPD.oRG Website                             |
 | Copyright (C) 2006                                                    |
 |                                                                       |
 | Modified: 2006/05/31 (thkl)                                           |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Thomas Kluge <root@lepd.org>                                  |
 +-----------------------------------------------------------------------+
*/


function GClient(){
  var self=this;
  var buffer;
  var pobj;
  var editmode = false;
  self.env = new Object();				// Umgebungsvariablen
  var startswitch=true;

  this.set_env = function(name,value){self.env[name]=value;}
  
  this.load=function(pid,pobj){
   self.set_env("parentobj", document.getElementById(pobj));
   self.set_env("pid",pid);
   var dm = new DataManager;
   self.buffer = new Hashtable();
   dm.RequestFailedEvent=this.sleep;
   dm.RequestCompleteEvent=this.build;
   dm.LoadData("index.php?src=picture&action=xmlnote&pid="+pid)
   //dm.LoadData("../dummy.xml");
   
  }

  this.store = function(e){
  	if (!e)e=window.event;
  if (e.keyCode==13) {
   newnote = self.buffer.get("new");
   if (newnote){	
   	iobj  = document.getElementById("newNodeValue");
   	newnote.value = iobj.value;
    var dm = new DataManager;
    self.buffer = new Hashtable();
    dm.RequestFailedEvent=this.sleep;
    dm.RequestCompleteEvent=this.build;
    hspar = "left=" + newnote.left;
    hspar = hspar + "&top=" + newnote.top;
    hspar = hspar + "&width=" + newnote.width;
    hspar = hspar + "&height=" + newnote.height;
    hspar = hspar + "&value=" + escape(newnote.value);
    hspar = hspar + "&id=" + newnote.id;
    oldchild = document.getElementById("image_note_" + newnote.id);
  	if (oldchild) headobj.removeChild(oldchild);
    oldchild = document.getElementById("image_note_tx_" + newnote.id);
  	if (oldchild) headobj.removeChild(oldchild);
    
    dm.PostData("index.php?src=picture&action=xmlnotestore&pid="+self.env.pid,hspar)
    }
   }
  }

  this.sleep=function(){
	  // do nothing 
  }

  this.buildnoteobj=function(note){
  
  	obj = document.createElement("DIV");
  	obj.id = "image_note_" + note.id;
  	obj.style.left = note.left + "px";
    obj.style.top = note.top + "px";
    obj.style.width = note.width + "px";
    obj.style.height = note.height + "px";
    obj.style.position="absolute";
    obj.style.borderwidth="1px; top: 0px; left: 0px;";
    
    
    iobj = document.createElement("DIV");
    obj.appendChild(iobj);
    iobj.style.border="0px #d4d82d solid";
    iobj.id = "image_note_inner_" + note.id;
    
    ifobj = document.createElement("DIV");
    ifobj.style.border="1px solid black";
    
    iobj.appendChild(ifobj);

    iifobj = document.createElement("DIV");
    //iifobj.style.width = note.width + "px";
    //iifobj.style.height = note.height + "px";
    iifobj.style.border="1px solid white";
   
    imgobj = document.createElement("IMG");
    imgobj.src = "images/cp.gif";
    imgobj.style.width = note.width + "px";
    imgobj.style.height = note.height + "px";
    imgobj.style.border="0px";
    
   
    iobj.zIndex=1000;
    ifobj.appendChild(iifobj);
    iifobj.appendChild(imgobj);
/*
    iobj.onmousemove=function(e){document.getElementById("image_note_inner_"+note.id).style.border="1px solid #d4d82d";document.getElementById("image_note_tx_"+note.id).style.visibility="visible";window.status="Move over an Element";}
    iobj.onmouseout=function(e){document.getElementById("image_note_inner_"+note.id).style.border="0px solid #d4d82d";document.getElementById("image_note_tx_"+note.id).style.visibility="hidden";window.status="Moveout";}

    ifobj.onmousemove=function(e){document.getElementById("image_note_inner_"+note.id).style.border="1px solid #d4d82d";document.getElementById("image_note_tx_"+note.id).style.visibility="visible";window.status="Move over an Element";}
    ifobj.onmouseout=function(e){document.getElementById("image_note_inner_"+note.id).style.border="0px solid #d4d82d";document.getElementById("image_note_tx_"+note.id).style.visibility="hidden";window.status="Moveout";}
**/
    
    imgobj.onmouseover=function(e){document.getElementById("image_note_inner_"+note.id).style.border="1px solid #d4d82d";document.getElementById("image_note_tx_"+note.id).style.visibility="visible";window.status="Move over an Element";}
    imgobj.onmouseout=function(e){document.getElementById("image_note_inner_"+note.id).style.border="0px solid #d4d82d";document.getElementById("image_note_tx_"+note.id).style.visibility="hidden";window.status="Moveout";}
    
    
    intx = document.createElement("DIV");
    hs =  "<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" id=\"notes_text_table\" style=\"padding: 0px;\"><tbody><tr><td>";
    hs =  hs + "<img width=\"3\" height=\"3\"  border=\"0\" src=\"/relaunch/images/tc_yellow_tl.gif\"/></td><td class=\"td_note_yeller\"/><td>";
    hs = hs + "<img width=\"3\" height=\"3\"  border=\"0\" src=\"/relaunch/images/tc_yellow_tr.gif\"/></td></tr><tr>";
    hs = hs + "<td class=\"td_note_yeller\"/><td style=\"padding: 3px;\" class=\"td_note_yeller\">";
    hs = hs + "<span style=\"font-family: arial; font-size: 12px; display: inline;\" id=\"notes_text_span\">" ;
    if (note.edit==true){
     hs = hs + "<input id=\"newNodeValue\" type=\"text\" />"
    } else { hs = hs + note.value;}
    hs = hs + "</span>";
    hs = hs + "</td><td class=\"td_note_yeller\"/></tr><tr><td>";
    hs = hs + "<img width=\"3\" height=\"3\" border=\"0\" src=\"/relaunch/images/tc_yellow_bl.gif\"/>";
    hs = hs + "</td><td class=\"td_note_yeller\"/><td><img  border=\"0\" width=\"3\" height=\"3\" src=\"/relaunch/images/tc_yellow_br.gif\"/></td></tr></tbody></table>";
    intx.innerHTML=hs;
    intx.style.visibility="hidden";
    intx.style.zIndex=1;
    intx.id="image_note_tx_"+note.id;
    intx.style.position="absolute";
  	intx.style.left = note.left + "px";
    intx.style.top = (parseInt(note.height) + parseInt(note.top))+ "px";

    intx.onmouseover=function(e){document.getElementById("image_note_inner_"+note.id).style.border="1px solid #d4d82d";document.getElementById("image_note_tx_"+note.id).style.visibility="visible";}
    intx.onmouseout=function(e){document.getElementById("image_note_inner_"+note.id).style.border="0px solid #d4d82d";document.getElementById("image_note_tx_"+note.id).style.visibility="hidden";}

    self.env.parentobj.appendChild(obj);
    self.env.parentobj.appendChild(intx);
    inpobj = document.getElementById("newNodeValue");
    if (inpobj){
     inpobj.onkeypress = function(e){return self.store(e);}
    }
  	 

  	obj.style.visibility=(self.startswitch)?"visible":"hidden";

  }

  this.doswitch=function(onoff){
   if (self.buffer){
   keys = self.buffer.keys();
   for (zl=0;zl<keys.length;zl++){
  	 fn = keys[zl];
  	 note = self.buffer.get(fn);
  	 obj = document.getElementById("image_note_" + note.id);
  	 if (obj){obj.style.visibility=(onoff)?"visible":"hidden";}
   }
  }
  }
  this.show=function(){
   headobj = self.env.parentobj;
   if (headobj){
    keys = self.buffer.keys();
  	for (var zl=0;zl<keys.length;zl++){
  	 fn = keys[zl];
  	 note = self.buffer.get(fn);
  	 // Alte Notes löschen
  	 oldchild = document.getElementById("image_note_" + note.id);
  	 if (oldchild) headobj.removeChild(oldchild);
  	 oldchild = document.getElementById("image_note_tx_" + note.id);
  	 if (oldchild) headobj.removeChild(oldchild);
  	 self.buildnoteobj(note);
  	}	
   }
  }

  this.startswitch=function(what){
   self.startswitch=what;	
  }

  this.build=function(Request){
   if(Request){
    self.buffer.clear();
	data = Request.responseXML.getElementsByTagName("xml");
    if (data[0].hasChildNodes()){
     // Wir haben Childs also los
     for (zl=0;zl<=(data[0].getElementsByTagName("note").length-1);zl++){
      cn = data[0].getElementsByTagName("note")[zl];
	  var note = new Object();
      for (azl=0;azl<=(cn.attributes.length-1);azl++) note[cn.attributes[azl].nodeName]=cn.attributes[azl].nodeValue
      note.value=(cn.hasChildNodes())?cn.childNodes[0].nodeValue:"";
      note.edit=false;
      note.left = (parseInt(note.left))-7;
      note.top = (parseInt(note.top))-7;
      self.buffer.put(note.id,note);
	  lnkobj = document.getElementById("nextlink");
	  if (lnkobj) lnkobj.title=null;
	 }
    }
    self.show();
   }
  }
  
   this.getMousePos = function(e) {
    if (!e) e = window.event;
    var mX = (e.pageX) ? e.pageX : e.clientX;
    var mY = (e.pageY) ? e.pageY : e.clientY;
    return { x:mX, y:mY };
   };

  this.getScroll=function(){
  	var x,y;
    if (self.pageYOffset) // all except Explorer
    {x = self.pageXOffset;y = self.pageYOffset;}
    else if (document.documentElement && document.documentElement.scrollTop)
	// Explorer 6 Strict
    {x = document.documentElement.scrollLeft;y = document.documentElement.scrollTop;}
     else if (document.body) // all other Explorers
    {x = document.body.scrollLeft;y = document.body.scrollTop;}
   return {sx:x,sy:y};
  }

  this.startEditMode=function(){
   self.doswitch(false);
   self.env.parentobj.onmousedown = function(e){ return self.startNewNote(e); };
   self.env.parentobj.onmouseover = function(e){ return false; };
   self.env.parentobj.onmouseout = function(e){ return false; };
   self.env.parentobj.onclick = function(e){ return false; };
  }
  
  this.startNewNote = function(e){
   pobj = self.env.parentobj;
   obj = document.getElementById("newNoteFrame");
   // und Frame entfernen
   if ((pobj) && (obj))pobj.removeChild(obj);
   
   
   obj = document.createElement("DIV");
   
   var pobj = self.env.parentobj;
   if (pobj)pobj.appendChild(obj);
   what = self.getMousePos(e);
   obj.id = "newNoteFrame"
   
   
   
   
   obj.x = (what.x);
   obj.y = (what.y);
   obj.style.border="1px solid black";
   obj.style.top=Math.round(what.y)+'px';
   obj.style.left=Math.round(what.x)+'px';
   obj.style.position="absolute"; 
   self.env.parentobj.onmouseover = function(e){ return self.drawNewNote(e); };
   self.env.parentobj.onmousedown = function(e){ return self.endNewNote(e); };
   self.env.parentobj.onmousemove = function(e){ return self.drawNewNote(e); };
   obj.onmouseover = function(e){ return self.drawNewNote(e);window.status="Over"; };
  }
  
  this.drawNewNote = function(e){
   	
   what = self.getMousePos(e);

   obj = document.getElementById("newNoteFrame");
   obj.style.border="1px solid black";
   obj.width=(Math.round(what.x)-obj.x);
   obj.height=(Math.round(what.y)-obj.y);
   obj.style.height=obj.height+'px';
   obj.style.width=obj.width+'px';
   obj.style.position="absolute";
  }

  this.endNewNote = function(e){
   tmpNote = new Object();
   obj = document.getElementById("newNoteFrame");
   pobj = self.env.parentobj;
   if (obj){
   tmpNote.left = obj.x;
   tmpNote.height = obj.height;
   tmpNote.top = obj.y;
   tmpNote.width = obj.width;
   tmpNote.edit=true;
   tmpNote.id = "new";
   if ((pobj) && (obj)) pobj.removeChild(obj);
   self.buildnoteobj(tmpNote,pobj);
   self.buffer.put(tmpNote.id,tmpNote);
   self.doswitch(true);
   // und Frame entfernen
   }
   self.env.parentobj.onmousemove = function(e){ return false;};
   self.env.parentobj.onmouseover = function(e){ self.doswitch(true);};
   self.env.parentobj.onmouseout = function(e){ self.doswitch(false);};
   
  }
}


function DataManager() {

	var self = this;
	self.RequestCompleteEvent = null;
	this.RequestCompleteEvent = self.RequestCompleteEvent;
	self.RequestFailedEvent = null;
	this.RequestFailedEvent = self.RequestFailedEvent;
	
	this.CreateDataHandler = function(Request) {
	 var DataHandler = function() {if (Request.readyState == 4) {if (Request.status == 200) {self.RequestCompleteEvent(Request);} else {self.RequestFailedEvent(Request);}}}
	 DataHandler.Request = Request;
	 DataHandler.RequestCompleteEvent = self.RequestCompleteEvent;
	 DataHandler.RequestFailedEvent = self.RequestFailedEvent;
	 return DataHandler;
	};

	this.InitiateXmlHttpRequest = function() {
	 var Request = null;
	 try {Request = new ActiveXObject("Msxml2.XMLHTTP");} catch(e) {try {Request = new ActiveXObject("Microsoft.XMLHTTP");} catch(oc) {Request = null;}}
	 if (!Request && typeof(XMLHttpRequest) != "undefined") Request = new XMLHttpRequest();
	 if (!Request) document.location = 'upgrade.html';
	 return Request;
	};
	
	this.LoadData = function(DataSource) {
	 var Request = this.InitiateXmlHttpRequest();
	 if (Request != null) {
	 try {Request.onreadystatechange = this.CreateDataHandler(Request);
	  Request.open("GET", DataSource, true);
	  Request.send(null);} catch(oc) {alert(oc);}
	 }
	};
	
	this.PostData = function(DataSource,Parameters){
	 var Request = this.InitiateXmlHttpRequest();
	 if (Request != null) {
	  try {Request.onreadystatechange = this.CreateDataHandler(Request);
  	   Request.open("POST", DataSource, true);
       Request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
       Request.setRequestHeader("Content-length", Parameters.length);
       Request.setRequestHeader("Connection", "close");
	   Request.send(Parameters);} catch(oc) {alert(oc);}
	 }
    };
};


function Hashtable(){
    this.clear = hashtable_clear;
    this.containsKey = hashtable_containsKey;
    this.containsValue = hashtable_containsValue;
    this.get = hashtable_get;
    this.isEmpty = hashtable_isEmpty;
    this.keys = hashtable_keys;
    this.put = hashtable_put;
    this.remove = hashtable_remove;
    this.size = hashtable_size;
    this.toString = hashtable_toString;
    this.values = hashtable_values;
    this.hashtable = new Array();
}

/*=======Private methods for internal use only========*/

function hashtable_clear(){this.hashtable = new Array();}

function hashtable_containsKey(key){
    var exists = false;
    for (var i in this.hashtable) {if (i == key && this.hashtable[i] != null) {exists = true;break;}}
    return exists;
};

function hashtable_containsValue(value){
    var contains = false;
    if (value != null) {for (var i in this.hashtable) {if (this.hashtable[i] == value) {contains = true;break;}}}
    return contains;
};

function hashtable_get(key){
    return this.hashtable[key];
};

function hashtable_isEmpty(){
    return (parseInt(this.size()) == 0) ? true : false;
};

function hashtable_keys(){
    var keys = new Array();
    for (var i in this.hashtable) {if (this.hashtable[i] != null)keys.push(i);}
    return keys;
};

function hashtable_put(key, value){
    if (key == null || value == null) {throw "NullPointerException {" + key + "},{" + value + "}";}else{this.hashtable[key] = value;}
};

function hashtable_remove(key){
    var rtn = this.hashtable[key];
    this.hashtable[key] = null;
    return rtn;
};

function hashtable_size(){
    var size = 0;
    for (var i in this.hashtable) {if (this.hashtable[i] != null) size ++;}
    return size;
};

function hashtable_toString(){
    var result = "";
    for (var i in this.hashtable){if (this.hashtable[i] != null)result += "{" + i + "},{" + this.hashtable[i] + "}\n";}
    return result;
};

function hashtable_values(){
    var values = new Array();
    for (var i in this.hashtable) {if (this.hashtable[i] != null)values.push(this.hashtable[i]);}
    return values;
};
