
//---------- Die (quasistatische) Klasse de_zv_Util -----------------------------


//General purpose functions
function de_zv_Util_getElement(id){
 if(document.all)
   return document.all[id];
 else if(document.getElementById)
   return document.getElementById(id);
 else
   return null;
}

function de_zv_Util_getEventObject(eventObject){
 if(eventObject)
   return eventObject;
 else if(window.event)
   return window.event;
 else
   return null;
}

function de_zv_Util_getEventSource(eventObject){
  if(eventObject){
    if(eventObject.target)
      return eventObject.target;
    if(eventObject.srcElement)
      return eventObject.srcElement;
  }
  return null;
}

function de_zv_Util_getPageX(eventObject){

  if(typeof eventObject.pageX != "undefined"){
    //Bug Korrektur am 10.12.2005: statt return pageX jetzt
    return eventObject.pageX;  
  }

  if(document.body &&
     (typeof document.body.scrollLeft != "undefined")&&
     (typeof event.clientX != "undefined"))
    return event.clientX + document.body.scrollLeft;
  return 0;
}

function de_zv_Util_getPageY(eventObject){
  if(typeof eventObject.pageY != "undefined"){
    //Bug Korrektur am 10.12.2005: statt return pageY jetzt
    return eventObject.pageY;  
  }
  if(document.body &&
     (typeof document.body.scrollTop != "undefined")&&
     (typeof event.clientY != "undefined"))
    return event.clientY + document.body.scrollTop;
  return 0;
}

function de_zv_Util_show(id){
  var element =  de_zv_Util_getElement(id);
  if(element){
    if(typeof element.style != "undefined"){
      element.style.visibility = "visible"
    }
  }
}

function de_zv_Util_hide(id){
  var element =  de_zv_Util_getElement(id);
  if(element){
    if(typeof element.style != "undefined"){
      element.style.visibility = "hidden"
    }
  }
}

function de_zv_Util_showOrHide(id){
  var element =  de_zv_Util_getElement(id);
  if(element){
    if(typeof element.style != "undefined"){
      if(element.style.visibility == "hidden"){
        element.style.visibility = "visible";
        return;
      }
      //Bedenke dass style.visibilty initial null (oder "undefined", muss ich testen) ist
      element.style.visibility = "hidden";
    }
  }
}
  //10.12.2005
  function de_zv_Util_calculateOffset(source, target, top){
    if(typeof target == "undefined"){
      target = null;
    }
    if(source == null || typeof source == "undefined") {
      return null;
    }
    var x = 0;
    var current = source;
    var  currentOffset;
    while(current){
      if(current == target)
        return x;
      if(top)
        currentOffset =  current.offsetTop;
      else
         currentOffset =  current.offsetLeft;

      if(typeof currentOffset == "undefined") {
        return null;
      }
      x = x + currentOffset;
      current = current.offsetParent;
    }
    return x;
  }



//---------- Die Klasse SimpleDateFormat ----------------------

  function SimpleDateFormat(){
    if(SimpleDateFormat.arguments.length < 1)
      this.style = SimpleDateFormat_dMMy;
    else
      this.style = SimpleDateFormat.arguments[0];
    this.format = SimpleDateFormat_format;
    this.formatAndPrint = SimpleDateFormat_formatAndPrint;
  }
  SimpleDateFormat_dM=0;  // 04.12
  SimpleDateFormat_dMy=1;// 04.12.2003
  SimpleDateFormat_dMM=2;// 4. Dezember
  SimpleDateFormat_dMMy=3;// 4. Dezember 2003
  SimpleDateFormat_MMy=4;// Dezember 2003

  // später: SimpleDateFormat_DAYS = new Array();
  SimpleDateFormat_MONTHS = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");

  function SimpleDateFormat_formatAndPrint(){
    if(SimpleDateFormat_formatAndPrint.arguments.length < 1)
      document.write(this.format());
    else
      document.write(this.format(SimpleDateFormat_formatAndPrint.arguments[0]));
  }

  function SimpleDateFormat_format(){
    var datum;
    if(SimpleDateFormat_format.arguments.length < 1)
      datum = new Date();
    else
      datum = SimpleDateFormat_format.arguments[0];

    //später var day= datum.getDay();
    //später var dayStr = SimpleDateFormat_DAYS[day];

    var date = datum.getDate();
    var dateStr;
    if((this.style < 2) && (date < 10))
      dateStr= "0" + date;
    else
      dateStr= "" + date;

    var month = datum.getMonth();
    var monthName= SimpleDateFormat_MONTHS[month];
    var monthStr;
    if(month+1 < 10)
      monthStr = "0" + month + 1;
    else
      monthStr = "" + month +1;

    var year = datum.getFullYear();

    var result="";

    //day
    if(this.style < 4)
      result += dateStr;

    //month
    if(this.style < 2)
      result += "." + monthStr;
    else if(this.style < 4)
      result += ". " + monthName;
    else
      result += monthName;

    //year
    if(this.style == SimpleDateFormat_dMy)
      result += "." +year;
    else if(this.style >= 3)
      result += " " +year;

    return result;
  }

//---------- Die Klasse ToolTip -----------------------------
function ToolTip(layname,renderer){//Konstruktor
  //attributes
  this.onMouseOverColor=null;
  this.onMouseOutColor=null;
  this.text=new Array();
  this.renderer=renderer; //ein renderer object
  this.layref=de_zv_Util_getElement(layname);

  //"public" methods
  this.setText=setText;
  this.setContent=setContent;
  this.getText=getText;
  this.setOnMouseOverColor=setOnMouseOverColor;
  this.setOnMouseOutColor=setOnMouseOutColor;
  this.layoutOnMouseOver=layoutOnMouseOver;
  this.layoutOnMouseOut=layoutOnMouseOut;
  this.ein=ein;
  this.aus=aus;

  //private methods
  this.laden=laden;
  this.showLayer=showLayer;
  this.hideLayer=hideLayer;
  this.relposit=relposit;
  this.resizeTo=resizeTo;
}

  function setText(key,value){
    this.text[key]=value;
  }


  function getText(key){
    return this.text[key];
  }

  function setContent(key,captionText,hintText){
    this.text[key]=this.renderer.render(captionText,hintText);
  }

  function setOnMouseOverColor(color){
    this.onMouseOverColor=color;
  }
  //Leider ist style.color style.xyz undefiniert, bis explizit
  //etwas zugewiesen wurde per Js, auch wenn durch stylesheets existieren
  //Ausnahme könnte vielleicht sein, wenn inline im element per style="" deklariert, das müsste ich prüfen.
  //Deswegen diese methode, sonst könnte man den vorgabewert auslesen
  function setOnMouseOutColor(color){
    this.onMouseOutColor=color;
  }

  function ein(textKey, positionedElementId, eventObject, translateX, translateY){
    eventObject=de_zv_Util_getEventObject(eventObject);
    this.layoutOnMouseOver(eventObject);
    if(this.laden(textKey)){
      this.relposit(positionedElementId, eventObject, translateX, translateY);
      this.showLayer();
    }
  }

  function aus(eventObject){
    eventObject=de_zv_Util_getEventObject(eventObject);
    this.hideLayer();
    this.layoutOnMouseOut(eventObject);
  }



  // ------- "private" Methoden: ---------

  function layoutOnMouseOver(eventObject){
    if(!this.onMouseOverColor)
      return;
    var src=null;
    if(eventObject)
      src=de_zv_Util_getEventSource(eventObject);
    if(src && src.style ){
      src.style.color=this.onMouseOverColor;
    }

  }

  function layoutOnMouseOut(eventObject){
    if(!this.onMouseOutColor)
      return;
    var src=null;
    if(eventObject)
      src=de_zv_Util_getEventSource(eventObject);
    if(src && src.style ){
      src.style.color=this.onMouseOutColor;
    }
  }

  function laden(textKey){
    //event.srcElement.style.color='#00ff00';
    //event.srcElement.className='ttt';
    this.hideLayer();
    if(this.layref && this.text[textKey] && (typeof this.layref.innerHTML != "undefined")){
      this.layref.innerHTML=this.text[textKey];
      return true;
    }
    return false;
  }

  //positionedElementId: füge in die html Seite
  //<div id="idname" style="position:absolute"></div> ein
  //offsetLeft/Right geben dann die pixelkoordinaten im dokument zurück
  //bloß nicht <span... nehmen,da probleme mit netscape( bei resize verschwinden
  //bilder in der Nähe etc.)

  function relposit(positionedElementId, eventObject, translateX, translateY){
    if(! this.layref)
      return;
    var a=this.layref.style;
    if(! a)
      return;

    var element=null;

    if(positionedElementId)
      element= de_zv_Util_getElement(positionedElementId);

    if(element){
      a.left=translateX + element.offsetLeft;
      a.top=translateY + element.offsetTop;
    }
    else if(eventObject){
      //Einschub 10.12.2005
      var source = de_zv_Util_getEventSource(eventObject);
      var left =  de_zv_Util_calculateOffset(source, null, false);
      var top =  de_zv_Util_calculateOffset(source, null, true);
    
      //Bug Korrektur am 10.12.2005 Firefox erwartet Einheit, z. B. "px"
      //(sonst wird offenbar 0px angenommen). IE kommt auch ohne Einheit klar und interpretiert zu pixel
      if(left == null){
        left = de_zv_Util_getPageX(eventObject);
      }
      if(top == null){
        top = de_zv_Util_getPageY(eventObject);
      }      

      a.left = (translateX + left)+"px";
      a.top = (translateY + top)+"px";
    }

    /*
    a.left=(translateY + de_zv_Util_getElement(id).offsetLeft)+"px";
    a.top=(translateY + de_zv_Util_getElement(id).offsetTop)+"px";
    */
    /* event.offsetX,event.offsetY hat Mac probleme
    a.left=translateY+event.clientX+document.body.scrollLeft-event.offsetX;
    a.top=translateY+event.clientY+document.body.scrollTop-event.offsetY;
    */
    /* Funktioniert einwandfrei; allerdings abhängig vom clickpunkt wie bei netscape
    a.left=translateX+event.clientX+document.body.scrollLeft;
    a.top=translateY+event.clientY+document.body.scrollTop;
    */

  }


  /*
  function absposit(pX, pY){
    var a=this.layref.style;
    a.left=pX;
    a.top=pY;
  }*/

  function showLayer(){
    if(this.layref && this.layref.style)
      this.layref.style.visibility="visible";
  }

  function hideLayer(){
    if(this.layref && this.layref.style)
      this.layref.style.visibility="hidden";
  }

  function resizeTo(breite,hoehe){
   this.layref.style.width=breite;
   this.layref.style.height=hoehe;
  }

//------------------------------------------------------------
//---------- Die Klasse Renderer -----------------------------

function Renderer(begin, afterCaption, end){//Konstruktor
  this.begin=begin;
  this.afterCaption=afterCaption;
  this.end=end;
  this.render=Renderer_render;
}

  function Renderer_render(captionText,hintText){
    return this.begin+captionText+this.afterCaption+hintText+this.end;
  }


