/**
* JS-System-Funktionsbibliothek
*
* Funktionsbloecke
* 
* - jscom
* - basic
* - dialog
* - position und size
* - window
*
* @author Udo Kraemer, Jens Steinert
* @version 0.2 
* @date 2006-09-18
**/
    
/**
* Erstellt ein REQUEST-Objekt als Basis 
* fuer die Kommunikation per jscom
**/
function system_jscom_createRequestObject() 
{
    var ro;
    var browser = navigator.appName;
    
    if((browser != "Microsoft Internet Explorer") || (navigator.userAgent.indexOf("Opera") != -1))
    {
        ro = new XMLHttpRequest();
    }
    else
    {
        ro = new ActiveXObject("Microsoft.XMLHTTP");
    }
    return ro;
}

var  maxhttprequests = 5;
var  lasthttprequest = 0;

function system_jscom_createRequestObjects() 
{
	var arr = new Array();
  for (i=0; i < maxhttprequests; i++)
    arr[i] = system_jscom_createRequestObject();
    return arr;
}

/**
* Basis-REQUEST-Objekt erstellen
**/
var https = system_jscom_createRequestObjects();
//var http = system_jscom_createRequestObject();
var system_last_jscomurl = ''; 

/**
* Sendet einen Request per jscom an 
* den Server 
*
* @param string url
**/

var senddebug = false;

function system_jscom_sendrequest(loadurl)
{
	lasthttprequest++;
	if (lasthttprequest>=maxhttprequests)
	  lasthttprequest = 0;
	  
	var http = https[lasthttprequest];
	
  http.abort();
  loadurl += '?';
  var parts = loadurl.split("?"); 
  //alert(parts[0].length+' '+parts[1].length); 
  http.open('post', parts[0],true);
  http.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
  http.setRequestHeader( 'Content-length', parts[1].length );
  
  http.onreadystatechange = system_jscom_handleResponse;
  http.send(parts[1]);
  
  //http.send( strData );    // param = POST data

  
  
  return;
}

/**
* Behandelt die RESPONSE vom Server 
* Type JS function hallo(a) { alert(a); } => window.hallo=function (a) { alert(a); }
**/
function system_jscom_handleResponse()
{
 for(i=0;i<maxhttprequests;i++)
 {
	 var http = https[i];
	
  if (typeof(http) != "object") 
    return; 
    
  if(http.readyState == 4)
  {
    var response = http.responseText;
    var update = new Array();

    http.abort();
    
    if (senddebug) system_log(response);
    
    if(response.indexOf('~' != -1))
    { 
    	system_handlecxcom(response)
    		  
    }
  }
  
 }
}


function system_handlecxcom(response)
{
    var tilde = /---tilde---/g; //String.fromCharCode(1,2,3);

    var updates = response.split('~');      
      
      for (var i = 0; i < Math.floor((updates.length - 1) / 3);i++)
      {
      	
        switch (updates[ i * 3 ])
        {
          case "divhtml":
            if (document.getElementById(updates[ ( i * 3 ) + 1 ]) != null)
              document.getElementById(updates[ ( i * 3 ) + 1 ]).innerHTML = updates[ ( i * 3 ) + 2 ].replace( tilde ,'~');                       
          break;
          case "adddivhtml":
            if (document.getElementById(updates[ ( i * 3 ) + 1 ]) != null)
              document.getElementById(updates[ ( i * 3 ) + 1 ]).innerHTML = document.getElementById(updates[ ( i * 3 ) + 1 ]).innerHTML + updates[ ( i * 3 ) + 2 ].replace( tilde ,'~');
          break; 
          case "setvalue":
            if (document.getElementById(updates[ ( i * 3 ) + 1 ]) != null)
              document.getElementById(updates[ ( i * 3 ) + 1 ]).value = updates[ ( i * 3 ) + 2 ].replace( tilde ,'~');
          break;
          case "style":
            if (document.getElementById(updates[ ( i * 3 ) + 1 ]) != null)
            {
              var attribs = new Array();
              attribs = updates[ ( i * 3 ) + 2 ].split(';');
              for(var attnr = 0; attnr < (attribs.length); attnr++)
              {
                if ((typeof attribs[ attnr ] == 'string') && (attribs[ attnr ].length > 0))
                {
                  var parts = new Array();
                  parts = attribs[ attnr ].split(':');
                
                  document.getElementById(updates[ ( i * 3 ) + 1 ]).style[parts[0].trim()] = parts[1].trim();  
                }
              }
            }
          break;
          case "js":
            if (document.getElementById(updates[ ( i * 3 ) + 1 ]) != null)
            { //alert(updates[ ( i * 3 ) + 2 ].replace( tilde ,'~'));
            
              eval(updates[ ( i * 3 ) + 2 ].replace( tilde ,'~'));
            }
            
          break;
          default:
            alert("Unknown Server Request: (" + updates[ i * 3 ] + ")");
          break;
        }        
      }
    }
/**
* Kapselfunktion fuer alert
*
* @param string msg
**/
function system_alert(msg)
{
  alert(msg); 
}

function system_dummy()
{
  return true;
}

/**
* Kapselfunktion fuer confirm (ja/nein)
*
* @param string msg
**/
function system_confirm(msg)
{
  return confirm(msg); 
}

/**
* Dumpt ein Objekt/Variable aus
*
* @param mixed Var
**/
function system_dump(mixed)
{
  var output = system_tostring(mixed); 

  system_alert(output); 
}

function system_tostring(mixed)
{
  var output = "";

  if (typeof mixed == 'object' || typeof mixed == 'array')
  {
    // Array?
    if (typeof mixed.length != 'undefined')
    {
      output += 'Typ: array' + "\n";
      output += "Anzahl Elemente: "+mixed.length+"\n"; 
      output += "Wert: \n";
      for (i=0; i < mixed.length; i++)
      {
        var str = ""+mixed[i]; 
        output += '['+i+'] '+str+"\n";       
      }
    }
    else
    {
      output += 'Typ: '+typeof mixed + "\n";
      output += "Wert: \n";
      for (var i in mixed)
      {
        var str = ""+mixed[i]; 
        str = str.replace("\r", "");
        str.replace("\n", "")
        
        output += '['+i+']'+"\n   "+str.replace("\n", "")+"\n";       
      }
    }
  }
  else
  {
    output += 'Typ: '+typeof mixed + "\n";
    output += "Wert: ";
    output += mixed; 
  }
  
  return output; 
}

/**
* Oeffnet ein neues Fenster mit angegeben Parametern
*
* @param string w_name - Fenstername 
* @param string w_url  - Zu ladene Adresse 
* @param string w_option - Optionen des Fensters
* @return object w_w - Handle zum Fenster
**/
function system_window(w_name, w_url, w_option)
{
  var w_top  = '10px';
  var w_left = '10px'; 

  var w_new_opt = 'width=300,height=400,left=100,top=200,scrollbars=yes,resizable=yes,status=yes';
    
  if (typeof w_option == 'object')
  {
    for (var i in w_option)
    {
      w_new_opt += i + '=' + w_option[i] + ',';    
    }
  }
  else
  if (typeof w_option == 'string')
  {
     w_new_opt = w_option;
  }     

  var w_w = window.open(w_url, w_name, w_new_opt);

  return w_w;
}

/**
* Offnet ein Fenster (falls noch nicht geoeffnet) und schreibt dort ein Logmeldung hinein.
*
* @param string logstr - Message
**/
function system_log(logstr)
{
  var logwin = system_window('logwin','');
  logwin.document.open();
  logwin.document.write(logstr+"<br />");
}

/**
* id-Attribute des DIV-Layers fuer den Dialog
**/
var system_dialog_id = 'dialog'; 

/**
* Gibt zurueck, ob es ein dialog-DIV
* vorhanden ist.
*
* @return object - Handle zum DIV-HTMLObjekt oder false
**/
function system_dialog_getdiv(subdivid)
{
  if (typeof subdivid != 'undefined')
    return document.getElementById(subdivid); 
  
  return document.getElementById(system_dialog_id);    
}

/**
* Oeffnet den Modaldialog und lädt eine URL 
* per jscom nach. 
*
* @param string contenturl - URL per JSCOM
* @param string label - Beschriftung des Dialogs 
**/
function system_modaldialog_open(contenturl, label, w, h, visible)
{
  var dialogdiv = system_dialog_getdiv(); 
  
  if (dialogdiv)
  {
    if ((typeof w != 'undefined') && (typeof h != 'undefined'))
      system_htmlobject_setsize(dialogdiv, w, h); 

    system_disablewin(); 
    system_htmlobject_center(dialogdiv); 
    
    var dialoghtml = system_dialog_getdiv('dialoghtml');
    dialoghtml.innerHTML = 'Bitte warten ...'; 
    system_modaldialog_set(contenturl, label); 
    
    if (typeof visible != 'undefined')
    { 
      if (visible == 'visible')
      {
        dialogdiv.style['display'] = 'block'; 
        dialogdiv.style['visibility'] = 'visible'; 
      }
      else
      {
        dialogdiv.style['display'] = 'none'; 
        dialogdiv.style['visibility'] = 'hidden'; 
      }
    }
    else
    {
      dialogdiv.style['display'] = 'block'; 
      dialogdiv.style['visibility'] = 'visible'; 
    }
  }
  else
    alert("Kein Dialogfenster vorhanden"); 
}

function system_disablewin()
{
  /* onresize-Eventueberwachung einschalten  */
  window.onresize = system_disablewin;

  if (document.getElementById('death'))
  {   
    var death    = document.getElementById('death');
    var bodysize = system_htmlobject_getsize(document.body); 
    var winsize  = system_getwinsize(); 

    var w = 0; 
    var h = 0;
   
    var w = (bodysize['w'] >= winsize['w']) ? bodysize['w'] : winsize['w']; 
    var h = (bodysize['h'] >= winsize['h']) ? bodysize['h'] : winsize['h']; 

    system_htmlobject_setsize(death,w,h); 
    system_htmlobject_center(system_dialog_getdiv()); 
    death.style['display'] = 'block';
  }
}

function system_enablewin()
{
  /* onresize-Eventueberwachung ausschalten */
  window.onresize = '';
    
  if (document.getElementById('death'))
  {   
    var death = document.getElementById('death');
    system_htmlobject_setsize(death,0,0); 
    death.style['display'] = 'none';
  }
}

/**
* Laedt URL in Modaldialog nach
*
* @param string contenturl - URL per JSCOM
**/
function system_modaldialog_set(contenturl,label)
{
  var dialogdiv = system_dialog_getdiv('dialoghtml'); 
  if (dialogdiv)
  {
    if (typeof label == 'string')
    {
      var dialoglabel = system_dialog_getdiv('dialoglabel');    
      if (dialoglabel) dialoglabel.innerHTML = label;   
    }
    if (typeof contenturl == 'string')
      system_jscom_sendrequest(contenturl);  
  }
}

/**
* Blendet Modaldialog aus.
**/
function system_modaldialog_close()
{
  var dialogdiv = system_dialog_getdiv(); 
  if (dialogdiv)
  {  
    //if (typeof http == 'object'); 
    //  http.abort(); 
    
    dialogdiv.style['display'] = 'none'; 
    system_htmlobject_setsize(dialogdiv,0,0);
    system_enablewin(); 
  }
}

/**
* Oeffnet Dialog und befuellt diesen mit content
* 
* @param string content - Inhalt als HTML-Code
* @label string label   - Beschriftung des Dialogs
**/
function system_dialog_open(content,label,w,h,visible,contenturl)
{
  var dialogdiv = system_dialog_getdiv(); 
  if (dialogdiv)
  {
    if ((typeof w != 'undefined') && (typeof h != 'undefined'))
      system_htmlobject_setsize(dialogdiv,w,h); 
    else
      system_htmlobject_setsize(dialogdiv,200,100); 

    dialogdiv.style['visibility'] = 'hidden'; 
    dialogdiv.style['display'] = 'block'; 

    if (visible == 'mousepos')
    {
      system_htmlobject_mousepos(dialogdiv);   
    }
    else
      system_htmlobject_center(dialogdiv); 
        
    system_dialog_set(content,label,contenturl); 
    dialogdiv.style['visibility'] = 'visible'; 
  }
}

/**
* Setzt den Inhalt des Dialogdivs. 
* 
* @param string content - Inhalt als HTML-Code
**/
function system_dialog_set(content,label,contenturl)
{
  var dialogdiv = system_dialog_getdiv('dialoghtml'); 
  if (dialogdiv)
  {
    if (typeof label == 'string')
    {
      var dialoglabel = system_dialog_getdiv('dialoglabel');    
      if (dialoglabel) dialoglabel.innerHTML = label;   
    }
        
    if (typeof content == 'string')
    {
      dialogdiv.innerHTML = content; 
    }

    if (typeof contenturl == 'string')
    {
      system_jscom_sendrequest(contenturl);  
    }
  }
}

/**
* Schliesst Dialog. 
**/
function system_dialog_close()
{
  var dialogdiv = system_dialog_getdiv(); 
  if (dialogdiv)
  {
    dialogdiv.style['visibility'] = 'hidden'; 
  }
}

/**
* Groesse des Browser-Fenster bestimmen
*
**/
var winw = 0;
var winh = 0;

function system_readwinsize()
{
  // Alter Aufruf
  if (typeof window.innerWidth != 'undefined')
  {
    winw  = window.innerWidth;
    winh = window.innerHeight;
  }
  else
  // ie = normalmodus
  if (typeof document.documentElement.clientWidth != 'undefined')
  {
    winw  = document.documentElement.clientWidth;
    winh = document.documentElement.clientHeight;
  }
  else
  // ie = quircks modus
  if (typeof document.body.clientWidth != 'undefined')
  {
    winw  = document.body.clientWidth;
    winh = document.body.clientHeight;  
  }
  else
  {
    winw = 760;
    winh = 560;
  }
  
  //window.status = 'Window '+winw+' '+winh;   
}

function system_getwinsize(recheck)
{
  var size = new Array; 
  
  var readsize = false; 
  if (recheck == 1)
    readsize = true; 

  if (readsize)
    system_readwinsize(); 
  
  size['w'] = winw;
  size['h'] = winh;
  return size; 
}

/**
* Aktuelle Scrollposition der gesamten Seite ermitteln
*
**/
function system_getscrollpos()
{
  var size = new Array; 
  
  // ff
  if (typeof window.pageXOffset != 'undefined')
  {
    size[ 'x' ]  = window.pageXOffset ;
    size[ 'y' ] = window.pageYOffset ;
  }
  else
  // ie = normalmodus
  if (typeof document.documentElement.scrollLeft != 'undefined')
  {
    size[ 'x' ]  = document.documentElement.scrollLeft;
    size[ 'y' ] = document.documentElement.scrollTop ;
  }
  else
  // ie = quircks modus
  if (typeof document.body.scrollLeft != 'undefined')
  {
    size[ 'x' ]  = document.body.scrollLeft;
    size[ 'y' ] = document.body.scrollTop;  
  }
  else
  {
    size[ 'x' ]  = 0;
    size[ 'y' ] = 0;
  }

  return size; 
}

/**
* Groesse eines HTMLObjektes abfragen
*
* @param object htmlobject 
* @return object size - Objekt (Array) mit Breite und Hoehe
* 
* @todo MOZILLA!!!! 
**/
function system_htmlobject_getsize(htmlobject)
{
  if (typeof htmlobject == 'string')
  {
    if (document.getElementById(htmlobject))
      var htmlobject = document.getElementById(htmlobject);  
  }
  
  if (! htmlobject) return false;
  
  
  if (typeof htmlobject.offsetHeight != 'undefined')
  { 
    var size = new Object; 
    size['w'] = htmlobject.offsetWidth;
    size['h'] = htmlobject.offsetHeight;

/*
system_log('getsize w'+size['w']); 
system_log(system_tostring(htmlobject)); 
*/
  }   
  else
    size = false;
         
  return size;     
}

/**
* Groesse eines HTMLObjektes setzen
*
* @param object htmlobject 
* @return object size - Objekt (Array) mit Breite und Hoehe
**/
function system_htmlobject_setsize(htmlobject, w, h)
{
  if (! htmlobject) return;
  
  if (htmlobject.style)
  { 
    if (typeof w != 'undefined' && w >= 0)
    {
      htmlobject.style[ 'width' ] = w+'px';
    }
    
    if (typeof h != 'undefined' && h >= 0)
    {
      htmlobject.style[ 'minHeight' ] = h+'px';
      htmlobject.style[ 'height' ] = h+'px';
    }
  }
  return;
}

/**
* Style eines HTMLObjektes setzen
*
* @param object htmlobject 
* @param string style
* @param string value  
**/
function system_htmlobject_setstyle(htmlobject, objstyle, val)
{
  if (! htmlobject) return;
  if (typeof objstyle != 'string') return;
  if (typeof val != 'string') return;

  if (htmlobject.style)
  { 
    htmlobject.style[ objstyle ] = val;
  }
  return;
}

/**
* Position eines HTMLObjektes abfragen
*
* @param object htmlobject 
* @return object pos - Objekt (Array) mit x und y
**/
function system_htmlobject_getpos(htmlobject)
{
  if (typeof htmlobject == 'string')
    htmlobject = document.getElementById(htmlobject);
    
  if (! htmlobject) return false;

  if (typeof htmlobject.offsetTop == 'undefined')
    return false; 
  
  var size = new Object; 

  var elem=htmlobject,tagname="",x=0,y=0;

//alert(htmlobject.offsetTop + ' ' + htmlobject.offsetLeft); 


  while ((typeof(elem)=="object")&&(typeof(elem.tagName)!="undefined"))
  {
    y+=elem.offsetTop;     
    x+=elem.offsetLeft;    

    tagname=elem.tagName.toUpperCase(); 
  
    if (tagname=="BODY" || tagname=="HTML")
      elem=0;
      
    if (typeof(elem)=="object")
      if (typeof(elem.offsetParent)=="object")
        elem=elem.offsetParent;
      
  }

  size[ 'x' ] = x;
  size[ 'y' ] = y;
     
  return size;     
}

/**
* Position eines HTMLObjektes setzen
*
* @param object htmlobject 
* @param integer x
* @param integer y 
**/
function system_htmlobject_setpos(htmlobject, x, y)
{
  if (! htmlobject) return;
  if (x < 0) return; 
  if (y < 0) return; 
  
  if (htmlobject.style)
  { 
    htmlobject.style[ 'left' ] = x+'px';
    htmlobject.style[ 'top' ]  = y+'px';
  }
  return;
}

/**
* Ermittelt Ecken-Koordination eines HTMLObjektes
**/
function system_htmlobject_getcornerpos(htmlobject,what)
{
  if (! htmlobject) return; 
  
  var pos  = system_htmlobject_getpos(htmlobject);
  var size = system_htmlobject_getsize(htmlobject);
  
  if (what == "ul") // upper left
  {
    return pos;
  }
  else if (what == "ur") // upper right
  {  
    pos['x'] = pos['x']+size['w'];
  }
  else if (what == "dr") // down right
  {  
    pos['x'] = pos['x']+size['w'];
    pos['y'] = pos['y']+size['h'];
  }
  else if (what == "dl") // down left
  {  
    pos['y'] = pos['y']+size['h'];
  }
  
  return pos;    
}

/**
* HTMLObjekt im Fenster zentrieren
*
* @param object htmlobject 
**/
function system_htmlobject_center(htmlobject)
{
  if (! htmlobject) return;

  // Berechnung der zentrierten Position 
  var winsize   = system_getwinsize();
  var scrollpos = system_getscrollpos(); 

/*
system_log('winsize w'+winsize['w']); 
system_log('winsize h'+winsize['h']); 
system_log('scrollpos x'+scrollpos['x']); 
system_log('scrollpos y'+scrollpos['y']); 
  */
  
  var divsize   = system_htmlobject_getsize(htmlobject); 
  var newx = 0;
  var newy = 0; 

/*
system_log('divsize x'+divsize['w']); 
system_log('divsize y'+divsize['h']); 
  */
    
  newx = parseInt(scrollpos['x'] + (winsize['w'] / 2) - (divsize['w'] / 2)); 
  newy = parseInt(scrollpos['y'] + (winsize['h'] / 3) - (divsize['h'] / 2)); 
  
  if (divsize['w']==0) newx = scrollpos['x']+10; 
  if (divsize['y']==0) newy = scrollpos['y']+10; 
    
  if (newx < scrollpos['x']) newx = scrollpos['x']+5; 
  if (newy < scrollpos['y']) newy = scrollpos['y']+5; 

  system_htmlobject_setpos(htmlobject, newx, newy);  

  return;
}

/**
* HTMLObjekt an Mouseposition ausrichten
*
* @param object htmlobject 
**/
function system_htmlobject_mousepos(htmlobject)
{
  if (! htmlobject) return;

  // Berechnung der zentrierten Position 
  var winsize   = system_getwinsize();
  var scrollpos = system_getscrollpos(); 
  
  var divsize   = system_htmlobject_getsize(htmlobject); 
  var newx = 0;
  var newy = 0; 
  
  newx = mousex; 
  newy = mousey; 

  newx = newx + scrollpos['x'];
  newy = newy + scrollpos['y'];

  if ((newx+divsize['w']) > winsize['w']) // Nach rechts aus dem Fenster
    newx = newx - divsize['w']-10; 
  else
  	newx = newx + 15; 
  	
  if ((newy+divsize['h']) > winsize['h'])
  {
    newy = newy - divsize['h']-10; 
  }
  else
    newy = newy + 15; 

  /*
  htmlobject.innerHTML = "<br>Fenster (w h): "+winsize['w']+' '+winsize['h']+"\n"+
                         "<br>Scrollpos (y x): "+scrollpos['y']+' '+scrollpos['x']+"\n"+
                         "<br>Elementsize (w h): "+divsize['w']+' '+divsize['h']+"\n"+
                         "<br>Newpos (x y): "+newx+' '+newy+"\n"+
                         "<br>Mouse (x y): "+mousex+' '+mousey+"\n"; 
  */
  
  system_htmlobject_setpos(htmlobject, newx, newy);  

  return;
}

function system_help_short(helptext)
{
  if (! document.getElementById('cxhelp')) return;

  // CSS Style nicht vergessen
  
  if (typeof helptext != 'string') 
    var helptext = ''; 
  
  var helpdiv = document.getElementById('cxhelp');
  helptext = helptext.trim(); 

  helpdiv.innerHTML = helptext; 

  if (helptext.length > 0)
    helpdiv.style['display'] = 'block'; 
  else
    helpdiv.style['display'] = 'none'; 
}

/**
* Erweiterung des String-Objektes
**/

/**
* Schneidet whitespaces von links und rechts ab
*
* @return string s  
**/
String.prototype.trim = function() 
{
  var s = this.replace(/^(\s)*/, '');
  return s.replace(/(\s)*$/, '');
}

/**
* Schneidet whitespaces von links ab
*
* @return string s  
**/
String.prototype.ltrim = function() 
{
  return this.replace(/^(\s)*/, '');
}

/**
* Schneidet whitespaces von rechts ab
*
* @return string s  
**/
String.prototype.rtrim = function() 
{
  return this.replace(/(\s)*$/, '');
}

/*
Window.prototype.alert = function()
{
   
}
*/


/**
* Formularfelder durchlaufen und an die 
* URL anhaengen, um diese per JSCOM
* abzuschicken.
* Wenn sendaction gesetzt wird, 
*
* @param mixed sendform - ID oder HTMLObject
**/
function system_forms_buildurl(sendform, buttonclicked, sendaction)
{
  var formhandle; 
  var formaction; 

  if (typeof sendform == 'string')
  {
    if (document.forms[sendform])
      formhandle = document.forms[sendform];
    else
    if (document.getElementById(sendform))
      formhandle = document.getElementById(sendform);
  }
  
  if (typeof sendform == 'object')
    formhandle = sendform; 
  
  if (typeof formhandle != 'object') return false;

  if ((typeof sendaction == 'string') && (sendaction.length > 0))
    formaction = sendaction; 
  else
  if ((typeof formhandle.getAttribute("action") == 'string') && (formhandle.getAttribute("action").length > 0))
  {   
      formaction = formhandle.getAttribute("action"); 
  }
  else  
  if ((typeof formhandle.action == 'string') && (formhandle.action.length > 0))
  {   
      formaction = formhandle.action; 
  }
  else
  {
    formaction = document.location.href;   
  }
  // Felder auslesen
  var valarr = new Array; 
  for (i = 0; i < formhandle.length; i++)
  { 
    if ((formhandle.elements[i].type != 'button') &&
        (formhandle.elements[i].type != 'reset'))
    {
      valarr[i] = formhandle.elements[i].name + "=" + encodeURIComponent(system_forms_getvalue(formhandle.elements[i]));
    }
  }

  // Wurde ein Button gedrueckt? 
  if (typeof buttonclicked == 'object')
    if (buttonclicked.type == 'button')
      valarr[i+1] = buttonclicked.name + "=" + encodeURIComponent(buttonclicked.value);
  
  if (valarr.length > 0)
    if (formaction.lastIndexOf("?") < 0)
      formaction += "?";
    else
      formaction += "&";
    
  var furl = formaction + valarr.join("&"); 

//alert(furl); 
  
  return furl;   
}

/**
* Sendet ein REQUEST an den Server per JSCOM
* Die URL fuer den REQUEST anhand der uebergebenen
* Parameter aufgebaut.  
*
* @param string sendfields - HTMLInput-IDs kommasepariert
* @param string sendurl    - Ziel-URL
**/
function system_forms_send(sendfields, sendurl)
{
  var fields = new Array; 
 
  var furl = "";
  
  if (typeof sendfields == 'string') 
    fields = sendfields.split(',');


  if (typeof sendurl == 'string')
    furl = sendurl; 
  //system_dump(furl);

  // Felder auslesen
  var valarr = new Array; 
  for (i = 0; i < fields.length; i++)
  { 
      var field = document.getElementById(fields[i]);
      valarr[i] = field.name + "=" + encodeURIComponent(system_forms_getvalue(field));
  }
  
  if (valarr.length > 0)
  {
    if (furl.lastIndexOf("?") < 0)
      furl += "?";
    else
      furl += "&";    
  
    furl += valarr.join("&");
  }

  // JSCOM Request absenden
  system_jscom_sendrequest(furl);  
}

/**
* Liefert Wert eines HTMLFormElements zurueck
*
* Besonderer Fall: 
* - radio-Buttons werden in JS als Arrays
*   angesprochen: document.formular.radio[index]
*
* @param mixed field - HTMLObject oder string id
* @return mixed val  - Single vals als String
*                      Multi vals als Array 
**/
function system_forms_getvalue(field)
{
  var fieldobj; 
  var fieldvalue; 
  
  if (typeof field == 'string')
    if (document.getElementById(field))
      fieldobj = document.getElementById(field); 

  if (typeof field == 'object')
    fieldobj = field; 

  if (typeof fieldobj != 'object') return fieldvalue; 
  
  
  var fieldobj_type = fieldobj.type; 
  
  // Sonderfall Radiobuttons 
  if ((typeof fieldobj.type == 'undefined') && (fieldobj.length))
    fieldobj_type = 'radio';   

  switch (fieldobj_type)
  {
    case 'text':
    case 'hidden':
    case 'submit':
    case 'reset':
    case 'password':
    case 'select-one':
    case 'textarea':
      if (typeof fieldobj.value != 'undefined') 
        fieldvalue = fieldobj.value; 
      break; 

    case 'checkbox':
      if (fieldobj.checked)
        fieldvalue = fieldobj.value; 
      else
      // Sonderfall unchecked=Attribut
      if (fieldobj.getAttribute('unchecked'))
        fieldvalue = fieldobj.getAttribute('unchecked'); 
      
      break; 

    case 'radio':
      //
      // radio-Input wird per document.formname.elementname 
      // uebergeben
      if (fieldobj.length)
      {
        for (var i = 0; i < fieldobj.length; i++)
          if (fieldobj[i].checked)
            fieldvalue = fieldobj[i].value;  
      }
      else
      // radio-Input wird als indiziertes input-Tag uebergeben:
      // Bedeutet das jeder radio-Button getrennt verarbeitet wird
      //
      if (fieldobj.name)
      { if (fieldobj.length)
          for (var i = 0; i < fieldobj.length; i++) 
            if (fieldobj[i].checked)
              fieldvalue = fieldobj[i].value;  
      }
      break;
      
    case 'select-multiple':
      if (fieldobj.options)
      {
        fieldopts = new Array; 
        
        var j = 0; 
        for (i = 0; i < fieldobj.options.length; i++) 
          if (fieldobj.options[i].selected)
            fieldopts[j++] = fieldobj.options[i].value;
        
        fieldvalue = fieldopts.join(",");
      }
      break; 

    default:
      //alert('Unbekannter Typ: '+fieldobj+" "+fieldobj.name);
      break;
  }
  return fieldvalue;
}

function system_forms_hideselects(off)
{
  if (typeof off == 'undefined') off = true; 
  
  if (off)
    var visible='hidden'; 
  else
    var visible='visible'; 
  
  if (system_getbrowser() == 'ie' && system_browser_version != '7')
  {
    var selects = document.getElementsByTagName('select'); 
    
    for (var i = 0; i < selects.length; i++)
    {
      selects[i].style.visibility=visible; 
    }
  }  
}


/**
* Kleine einfache Browsererkennung für 
* - Opera
* - Netscape
* - Internet Explorer
* - Firefox
*
* @return string - Browserkürzel
**/
var system_browser = system_getbrowser();
var system_browser_version = 1;

function system_getbrowser()
{
  var res = '';
  
  if (navigator.userAgent.indexOf("Opera") != -1)
    res = 'op';
  else if (navigator.userAgent.indexOf("Netscape") != -1)
    res = 'ns';
  else if (navigator.appName.indexOf("Internet Explorer") != -1)
  {
    res = 'ie';
    if (navigator.userAgent.indexOf("MSIE 7") != -1)
      system_browser_version = '7';
  }
  else if (navigator.userAgent.indexOf("Firefox") != -1)
    res = 'ff';

  return res;
}


/**
* Erstellt oder speichert
* einen Cookie 
*
* @param string key - Cookiename
* @param string val - Wert 
* @param string sec - Sekunden bis dieser Eintrag veraltert
* @param string path - Cookiepfad (CXBASEURL) 
**/
function system_setcookie(key,val,sec,path)
{
  if (typeof key == 'undefined')
    return false; 

  if (typeof val == 'undefined')
    var val = '';

  if (typeof sec == 'undefined')
    var sec = -1;
   
  if (typeof path == 'undefined')
    if (typeof CXBASEURLPREFIX != 'undefined')
      var path = CXBASEURLPREFIX;
    else
      var path = CXBASEURL;
  
  if (path != '/')
    path = path + '/';
  
  expires = '';
  
  if (sec >= 0)
  {
    var today = new Date();
    today.setTime(today.getTime() + (sec*1000));
    var expires = " expires=" + today.toGMTString() + ";";
  }
    
  document.cookie = key + "=" + val + "; path=" + path + "; " + expires;
  
  if (document.cookie)
    return true;
  else
    return false; 
}

/**
* Liest Daten aus einem Cookie aus
* und gibt diese als String zurück.
*
* @param string key - Cookiename
* @param mixed  def - Alternativer Rückgabewert
* @return mixed - Cookiewert oder alternativen Rückgabewert
**/
function system_getcookie(key,def)
{
  // Beispieleintrag: 
  if (typeof def == 'undefined')
    var res = ''; 
  else
    var res = def; 


  if (document.cookie)
  {
    var c = document.cookie; 
     
    if (c.length > 0)
    {
      var a = c.split(";");
  	
      for(var i=0;i<a.length;i++)
      {
        var s = a[i].trim(); 
        //s = a[i];
        if (s.search('^'+key+'=') >= 0)
        {
          var ss = s.split("=");
          if (ss[1].length > 0)
          {
            res = ss[1];
          } 
        }
      }
    }
  }
    
  return res;    
}

/**
*-------------------------------------------------------------
* filago select functions 
*-------------------------------------------------------------
**/

/**
* Löscht alle fids 
* aus dem Cookie
**/
function filago_cookie_init(db,fidstr)
{
  system_setcookie('filagoselect:'+db,fidstr,3600,CXBASEURL);      
}

/**
* Speichert eine fid
* filagoselect-Cookie
*
* @param string fid 
**/
function filago_cookie_addfid(db,fid)
{
  filago_cookie_remfid(db,fid);
  
  var res = system_getcookie('filagoselect:'+db);

  if (res.length > 0)
    res = "-" + res;

  res = fid+''+res; 
  
  system_setcookie('filagoselect:'+db,res,3600,CXBASEURL);
}

/**
* Speichert eine fid
* filagoselect-Cookie
*
* @param string fid 
**/
function filago_cookie_lastfid(db)
{
  var res = system_getcookie('filagoselect:'+db);
  if (res.length > 0)
  {
    var f = res.split("-"); 
    return f[0]; 
  }

  return false;
}

/**
* Liest die fids aus dem 
* Cookie aus und gibt diese
* als assoziatives Array zurück
* 
* @return array - fids
**/
function filago_cookie_getfids(db)
{
  var res = system_getcookie('filagoselect:'+db,'');
  var f = res.split("-"); 

  var n = new Object; 
  for (i = 0; i < f.length; i++)
    n[ f[i] ] = f[i]; 

  return n; 
}

/**
* Überprüft, ob ein fid im 
* Cookie vorhanden ist.
*
* @param string fid 
* @return boolean - Gefunden? 
**/
function filago_cookie_hasfid(db,fid)
{
  var res = system_getcookie('filagoselect:'+db,'');
  
  res = "-"+res+"-";
  
  if (res.search("-"+fid+"-") >= 0)
    return true;
  
  return false; 
}

/**
* Entfernt eine fid aus 
* dem Cookie
*
* @param string fid 
* @return boolean - Enfernt? 
**/
function filago_cookie_remfid(db,fid)
{
  var res = system_getcookie('filagoselect:'+db,'');

  res = "-"+res+"-";
  res = res.replace("-"+fid+"-","-");
  res = res.substr(1,res.length-2);
  
  system_setcookie('filagoselect:'+db,res,3600,CXBASEURL);
}

/**
* Zählt die Anzahl der 
* fids im Cookie.
* 
* @return int 
**/
function filago_cookie_countfids(db)
{
  var i = 0;
  var res = system_getcookie('filagoselect:'+db,'');
  
  if (res.length > 0)
  {
    s = res.split("-");
    i = s.length; 
  }
  
  return i; 
}


/**
* Funktionen je nach Anzahl ausgewählter 
* Bilder aktivieren/deaktivieren
**/
function filago_menu_update(db)
{
  // var ctx - Object mit Kontexteintraegen

  if (typeof ctx == 'object')
  {
    var d = filago_cookie_countfids(db); 

    for (var v in ctx)
    {
      var ctxon  = document.getElementById('ctxon'+v); 
      var ctxoff = document.getElementById('ctxoff'+v); 

      if (! ctxon) continue; 
      if (! ctxoff) continue; 

      if (ctx[v]==1)
      {
        if (d == 1)
        {
          ctxon.style.display  = 'inline';
          ctxoff.style.display = 'none';
        }
        else
        {
          ctxon.style.display  = 'none';
          ctxoff.style.display = 'inline';
          
        }
      }  
      else if (ctx[v]==2)
      {
        if (d > 1)
        {
          ctxon.style.display  = 'inline';
          ctxoff.style.display = 'none';
        }
        else
        {
          ctxon.style.display  = 'none';
          ctxoff.style.display = 'inline';
        }
      }  
      else if (ctx[v]==3)
      {
        if (d >= 1)
        {
          ctxon.style.display  = 'inline';
          ctxoff.style.display = 'none';
        }
        else
        {
          ctxon.style.display  = 'none';
          ctxoff.style.display = 'inline';
        }
      }  
    }
 
    //ctxoff.style.display = 'none';

  }
  
  if (document.getElementById("filagono"))
  {
    //alert(document.getElementById("filagono").parentNode.parentNode.parentNode.style['backgroundImage']); 
//    document.getElementById("filagono").parentNode.parentNode.parentNode.style['backgroundImage']='url(/dms/ld/designs/bs1~design/css/gen/w10_h110_bcccccc_fffff99_t0.gif)'; 
    
    //window.panode = document.getElementById("filagono").parentNode.parentNode.parentNode;
    
    //ldurl = CXBASEURL+'/ld/designs/bs1~design/css/gen/'; 
    //window.panode.style['backgroundImage']='url('+ldurl+'w10_h110_bcccccc_fffff99_t0.gif)';
    
    //document.getElementById("filagono").parentNode.parentNode.parentNode.className='tdflowbarhello'; 
    
    document.getElementById("filagono").innerHTML = filago_cookie_countfids(db);
    
    //window.setTimeout('document.getElementById("filagono").parentNode.parentNode.parentNode.className="tdflowbar";',500); 
    //window.setTimeout("window.panode.style['backgroundImage']='url('+ldurl+'w10_h110_bcccccc_faaaaaa_t0.gif)';",500); 
    
    
  }
}

function myback()
{
   
 
  //document.getElementById("filagono").parentNode.parentNode.parentNode.style['backgroundImage']='url(/dms/ld/designs/bs1~design/css/gen/w10_h110_bcccccc_fffff99_t0.gif)'; 
       
}

/**
* Alle Markierungen aufheben
*
**/
function filago_views_unselectall(db)
{
  if (typeof filago_result_set == 'object')
  {
    for (var i in filago_result_set)
    {
      filago_views_select(db,filago_result_set[i],false); 
    }

    filago_cookie_init(db,""); 
    filago_menu_update(db);
  }
}

/**
* Alle Bilder einer Seite markieren
**/
function filago_views_selectall(db)
{
  if (typeof filago_result_set == 'object')
  {
    // Cursor auf wait setzen
    document.body.style['cursor'] = 'wait'; 
    
    for (var i in filago_result_set)
    { 
      filago_cookie_addfid(db,filago_result_set[i]);
      filago_views_select(db,filago_result_set[i],true); 
    }

    filago_menu_update(db);
    
    document.body.style['cursor'] = ''; 
    //alert(buf + "\nPreCookie: " + precookie + "\nCookie: " + document.cookie + "\nAnzahl: " + filago_cookie_countfids(db)); 
  }
}

/**
* Speichert oder entfernt fid, 
* je nach Vorhandensein in Cookie.
*
* @param string fid
* @return boolean - In/out
**/

//var    = "clicksave"; // Einfache und mehrfache Selektion per Click
//var filago_selection_mode = "clicklost"; // Einfache Selektion per Mouseclick / Mehrfach mit gedrückter CTRL-Taste

function filago_views_reversefid(db,fid)
{
  if (typeof filago_selection_mode == "undefined")
    window.filago_selection_mode="clicklost";

  if (window.getselection)
  { 
    selection = window.getSelection();
    selection.removeAllRanges(); 
  }

  if (document.selection)
    if (document.selection.empty)
      document.selection.empty(); 

/*
  var ctrl = false; 
  
  if (window.event)      
    if (window.event.ctrlKey)
      ctrl = true;
    
  if (! ctrl)
    if (filago_selection_mode == "clicklost")
      filago_views_unselectall(db);
*/

  if (! window.event.ctrlKey)
    if (filago_selection_mode == "clicklost")
      filago_views_unselectall(db);



  if (filago_cookie_hasfid(db,fid))
  {
    filago_cookie_remfid(db,fid);
    
    if (typeof filago_views_select == 'function')
      filago_views_select(db,fid,false); 

    filago_menu_update(db);
    return false;
  }
  else
  {
    filago_cookie_addfid(db,fid); 

    if (typeof filago_views_select == 'function')
      filago_views_select(db,fid,true); 

    filago_menu_update(db);

    return true;
  }  
}

function filago_views_switch_selectionmode(db)
{
  if (typeof filago_selection_mode == "undefined")
    window.filago_selection_mode="clicklost";

  if (filago_selection_mode=="clicksave")
  {
    filago_views_unselectall(db);
    filago_selection_mode="clicklost";
  }
  else
  {
    filago_selection_mode="clicksave";
  }

  system_setcookie('filagoselectionmode',filago_selection_mode,3600,CXBASEURL);      

  if (document.getElementById("clicksave"))
    if (filago_selection_mode=="clicksave")
      document.getElementById("clicksave").style['display']=''; 
    else
      document.getElementById("clicksave").style['display']='none';

  if (document.getElementById("clicklost"))
    if (filago_selection_mode=="clicklost")
      document.getElementById("clicklost").style['display']=''; 
    else
      document.getElementById("clicklost").style['display']='none';
}


//
// Funktionen für den sizebar
//

/**
* 
*
**/

function filago_sizebar_start(e)
{
  if(! e)
    e = window.event;
  
  if (e.srcElement)
    s=e.srcElement;
  else
  if (e.target)
    s=e.target;
  
  if (document.getElementById('sizeselector'))
    document.getElementById('sizeselector').style.backgroundColor="red";

  if (e.button)
  {
    if (e.button != 1)
      filago_sizebar_stop();
  }
  else
  if (e.which)
  {
    if (e.which != 1)
      filago_sizebar_stop();
  }
  else
    filago_sizebar_stop();
  
  if (e.type == 'mousedown')
  {
    if (s.id != 'sizeselector')
    {
      filago_sizebar_stop();
      return false; 
    }
  }

  if (window['cxtbhide'])
    cxtbhide();

  if (sizebar_oldmousex == -1)
  {
    sizebar_oldmousex = e.clientX;
  }
  else
  { 
    
    if (document.getElementById('sizeselector'))
      oldleft = document.getElementById('sizeselector').offsetLeft; 

    newleft = oldleft-(sizebar_oldmousex - e.clientX);
    sizebar_oldmousex=e.clientX;
    if (newleft < 0)
      newleft = 0;
    if (newleft > 90)
      newleft = 90;
    
    //newleft factor 
    var p = newleft/90; 
    var op = oldleft/90; 
    
    // Resizen der Kacheln anstoßen 
    filago_sizebar_resize(p,op);
    if (document.getElementById('sizeselector'))
      document.getElementById('sizeselector').style.left = newleft + "px";
  }
  
  //system_event_registerdocumentfunction('onmousemove','filago_sizebar_start');
  system_event_registerfunction(document,'onmousemove','filago_sizebar_start');
 // document.onmousemove = filago_sizebar_start; 
}

function filago_sizebar_stop()
{
  system_event_unregisterdocumentfunction('onmousemove','filago_sizebar_start');
  if (document.getElementById('sizeselector'))
    document.getElementById('sizeselector').style.backgroundColor="#000";
  sizebar_oldmousex = -1;
  return false;
}

function filago_sizebar_init()
{
  sizebar_oldmousex = -1;
  sizebar_view_width = 10;
  sizebar_view_height = 10;
  sizebar_timeout = null;
  sizebar_actleft = null; 
  
  //system_event_registerdocumentfunction('onmouseup','filago_sizebar_stop');
  system_event_registerfunction(document,'onmouseup','filago_sizebar_stop');

  //system_event_registerdocumentfunction('onmousedown','filago_sizebar_start');
  system_event_registerfunction(document,'onmousedown','filago_sizebar_start');
}

function filago_sizebar_resize(p,op)
{
  // Neue Kachelgröße berechnen
  var x = parseInt(sizebar_view_maxwidth*p);
  if (x < sizebar_view_minwidth) x = sizebar_view_minwidth; 
  
  var y = parseInt(sizebar_view_maxheight*p);
  if (y < sizebar_view_minheight) y = sizebar_view_minheight; 
  
  for (var i in filago_result_set)
  {
    var myo = document.getElementById("gal_"+filago_result_set[i]);
    var myi = document.getElementById("img_gal_"+filago_result_set[i]);
    
    if (myo && myi)
    {
      system_htmlobject_setsize(myo,x,y);
      if (filago_result_widths[i] >= filago_result_heights[i])
      {
        var ix = x-14;
        var iy = filago_result_heights[i]*ix/filago_result_widths[i]; 
      }
      else
      {
        var iy = y-20;
        var ix = iy*filago_result_widths[i]/filago_result_heights[i];
      }
      
      var myd = document.getElementById("inner_gal_"+filago_result_set[i]);
      if (myd)
        myd.style.marginTop=Math.round((y-iy)/2)+'px';

         
      system_htmlobject_setsize(myi,ix,iy);
    }
  }
}


/**
* Funktionen zur Arbeit mit document-Events 
* 
* Im Object documentevent werden alle Eventfunktionen
* gespeichert und dann beim Eintreten des Events nachein-
* ander ausgeführt! 
**/
var documentevent = new Object; 

var cxevents = new Object; 

function system_event_registerfunction(obj, what, funcname)
{
  var name = "";
  
  if (obj == window)
    name = 'window'; 
  else
  if (obj == document)
  {
    name = 'document'; 
  }
  else
  {
    name = obj.name; 
  }

  if (! cxevents[name])
    cxevents[name] = new Object; 
  
  if (! cxevents[name][what])
  { 
    cxevents[name][what] = new Object; 

    // Globalen Eventhandler installieren
    if (obj == window)
      obj[what]=system_window_event_do;
    else
      obj[what]=system_event_do;
  }

  cxevents[name][what][funcname]=funcname;
}

function system_event_registerdocumentfunction(what, funcname)
{
  system_event_registerfunction(document, what, funcname)    
}

function system_event_unregisterfunction(obj, what, funcname)
{
  var name = "";
  
  if (obj == window)
    name = 'window'; 
  else
  if (obj == document)
    name = 'document'; 
  else
    name = obj.name; 

  if (cxevents[name])
    if (cxevents[name][what])
      cxevents[name][what][funcname]=null;
}


function system_event_unregisterdocumentfunction(what, funcname)
{
  system_event_unregisterfunction(document,what,funcname);
}

/**
* Funktion zum Ausführen der event-Funktion für
* das document-Object bzw. untergeordnete Objekte 
**/
function system_event_do(e)
{
  if (e)
    window.event = e; 
  else
  {
    e = window.event; 
    window.event.cancelBubble = true;
  }

  // Welches Target? 
  

  var name = '';
  name = 'document'; 

  if (typeof cxevents[name] == 'object')
  {
    if (typeof cxevents[name]['on'+e.type] == 'object')
    {
      for (var i in cxevents[name]['on'+e.type])  
      {
        if (cxevents[name]['on'+e.type][i] != null)
        {
          var funcname = cxevents[name][ 'on'+e.type ][i]; 
          
          if (funcname)
            if (funcname.length > 0)
              eval(cxevents[name][ 'on'+e.type ][i] + '();'); 
        }
      }
    }
  } 
}

/**
* Funktion zum Ausfuehren der event-Funktion
* fuer das window-Objekt
**/
function system_window_event_do(e)
{
  if (e)
    window.event = e; 
  else
  {
    e = window.event; 
    window.event.cancelBubble = true;
  }

  if (typeof cxevents['window'] == 'object')
  {
    if (typeof cxevents['window']['on'+e.type] == 'object')
    {
      for (var i in cxevents['window']['on'+e.type])  
      {
        if (cxevents['window']['on'+e.type][i] != null)
        {
          if (cxevents['window']['on'+e.type][i])
            eval(cxevents['window'][ 'on'+e.type ][i] + '();'); 
        }
      }
    }
  } 
}


function system_insertatcursor(myField, myValue)
{
  //IE support
  if (document.selection)
  {
    myField.focus();
    sel = document.selection.createRange();
    sel.text = myValue+'x';
  }
  //MOZILLA/NETSCAPE support
  else if (myField.selectionStart || myField.selectionStart == '0')
  {
    var startPos = myField.selectionStart;
    var endPos = myField.selectionEnd;
    myField.value = myField.value.substring(0, startPos)
                  + myValue 
                  + myField.value.substring(endPos, myField.value.length);
  }
  else
  {
    myField.value += myValue;
  } 
}

// 
// Funktion zur Mouse-Überwachung
// 
var mousex = ''; 
var mousey = ''; 

function system_refresh_mousepos(eee)
{
  mousex = window.event.clientX;
  mousey = window.event.clientY;    
  //window.status = 'Mouse '+mousex+' '+mousey;   
}

// Mouseposition ueberwachen
system_event_registerfunction(document,'onmousemove','system_refresh_mousepos');

// Fenstergroesse ueberwachen
system_event_registerfunction(window,'onresize','system_readwinsize');

// Fenster zu Beginn lesen
system_readwinsize(); 





