// Classlib

// General
Object.prototype.isString = function()
{
  if (typeof(this)=='string') return true;
  
  if (typeof(this) == 'object')
    return this.constructor.toString().match(/string/i)!=null;
  else
    return false;
}

Object.prototype.isArray = function()
{
  if (typeof(this) == 'object')
    return this.constructor.toString().match(/array/i)!=null;
  else
    return false;
}

function $(id)
{
  if (id.isString())
    return document.getElementById(id);
  else
    return id;
}

function $F(id)
{
  return $(id).value;
}


function clone(obj)
{
  if (obj == null || typeof(obj) != 'object')
    return obj;

    var tmp = new Object();

    for (var i in obj)
      tmp[i] = clone(obj[i]);
    
    return tmp;
}


function sprintf()
{
  if (sprintf.arguments.length<2)
    return;

  var data=sprintf.arguments[0];

  for (var k=1; k<sprintf.arguments.length; ++k)
  {
    switch (typeof(sprintf.arguments[k]))
    {
    case 'string':
      data=data.replace(/%s/,sprintf.arguments[k]);
      break;
    case 'number':
      data=data.replace(/%d/,sprintf.arguments[k]);
      break;
    case 'boolean':
      data=data.replace(/%b/,sprintf.arguments[k]? 'true':'false');
      break;
    default:
      /// function | object | undefined
      break;
    }
  }
  return data;
}


function setCookie(name,value)
{
  document.cookie=name+"="+escape(value);
}


function getCookie(name)
{
  var start = document.cookie.indexOf(name+"=");

  if (start<0) {
    return null;
  }

  var len = start + name.length + 1;
  var end = document.cookie.indexOf( ";", len );

  if (end<0) {
    end=document.cookie.length;
  }

  return unescape(document.cookie.substring(len,end));
}


// Link
var last_href;

function __setHref(eventTarget,eventArgument,targetId)
{
  var msg=arguments[3];

  if (msg)
    if (confirm(msg)==false)
      return false;

  last_href = document.getElementById(eventTarget).href;
  document.getElementById(eventTarget).href = "javascript:__doPostBack(\'"+eventTarget+"\',\'"+eventArgument+"\',\'"+targetId+"\')";
//  __doPostBack(eventTarget,eventArgument,targetId);
//  __doPostBackAjax(eventTarget,eventArgument);

  return true;
}


function __doPostBack(eventTarget,eventArgument,targetId)
{
  var theform;

  if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) {
	theform = document.__Form;
  }
  else {
	theform = document.forms["__Form"];
  }

  theform.EVENTTARGET.value = eventTarget.split("$").join(":");
  theform.EVENTARGUMENT.value = eventArgument;
  theform.SCROLLTOP.value = f_scrollTop();
  if (last_href!=null)
    theform.action = last_href;


  if (useAjax) {
    ajax.loadControl("?ajax=1",targetId);
  }
  else {
    theform.submit();
  }
}


// Class Ajax
function Ajax()
{
  var lock_request=0;
  var pageReload=false;


  this.getXMLHttpRequest=function()
  {
    try {			// W3C-Standard
      xmlhttp = new XMLHttpRequest();
    } catch(w3c) {
      try {			// Internet Explorer
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
      } catch(msie) {
        try {		// Internet Explorer alt
          xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch(msie_alt) {
          //alert("XMLHttpRequest (AJAX) not available!");
          return null;
          }
      }
    }

    return xmlhttp;
  }


  this.loadControl=function(url,targetId)
  {
    var xmlhttp;
    var params;
  
    lock_request++;
  
    if (lock_request>10)
    {
      alert("Please wait untill former request is fully executed!");
      lock_request--;
      return false;
    }

    changeMouseToWait(targetId);
  
    xmlhttp=this.getXMLHttpRequest();

    params=collectParams();

    xmlhttp.open('POST',url,true);

    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.setRequestHeader("Content-length", params.length);
    xmlhttp.setRequestHeader('If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT');

    xmlhttp.send(params);

    xmlhttp.onreadystatechange = function()
    {
      if (xmlhttp.readyState == 4)
      {
        if (xmlhttp.status != 200 && xmlhttp.status != 0)
	    {
          alert("File not found!");
          lock_request--;
          return false;
        }
        xmlhttp_loaded(xmlhttp);

        document.body.style.cursor="auto";
      
        lock_request--;

        return true;
      }
    }
  }
 

  function xmlhttp_loaded(xmlhttp)
  {
    var theform;
    var pos;
    var pos2;
    var pagenum;

    if (! xmlhttp.responseText)
    {
      alert("No response!");
      return true;
    }

    if (xmlhttp.responseText.substr(0,1)==":")
    {
      pos=xmlhttp.responseText.indexOf(":",1);
      pagenum=Number(xmlhttp.responseText.substr(1,pos-1));
    
      pos2=xmlhttp.responseText.indexOf(":",pos+1);
      targetId=xmlhttp.responseText.substr(pos+1,pos2-pos-1);
    
      //alert(xmlhttp.responseText);
    
      waitAndWriteHTML(pagenum,targetId,xmlhttp.responseText.substr(pos2+1),0);
    }
    else
    {
      document.getElementById("page").innerHTML="";
      document.getElementById("page").innerHTML="Page timeout!";

//      var newDoc=document.open("text/html","replace");
//      newDoc.write(xmlhttp.responseText);
//      newDoc.close();
    }

    return true;
  }


  function waitAndWriteHTML(pagenum,targetId,html,count)
  {
    var doc;

    if (pagenum>getPagenum()+1 && count<10)  // just to make sure: wait for correct page-order; wait max. 2sec
    {
      count++;
      setTimeout(function() { waitAndWriteHTML(pagenum,targetId,html,count); },200);
    }
    else
    {
      //alert(targetId);
      document.getElementById(targetId).innerHTML="";
      document.getElementById(targetId).innerHTML=html;
    
      if (! pageReload)
      {
        if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1)
	    {
          doc=document.getElementById("iframe").contentWindow.document;
          doc.open("javascript:'<html></html>'");
//          doc.open("text/html");
          doc.write('<html><body><input type="text" id="state" value="'+pagenum+'"/></body></html>');
          doc.close();
        }
        else
        {
          if (pagenum>=1)
          {
            location.hash=pagenum;
          }
        }
      }

      pageReload=false;

      setPagenum(pagenum);
    }
  }
  
  

  function getPagenum()
  {
    if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) {
      theform = document.__Form;
    }
    else {
      theform = document.forms["__Form"];
    }

    return Number(theform.PAGENUM.value);
  }


  function setPagenum(pagenum)
  {
    if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) {
      theform = document.__Form;
    }
    else {
      theform = document.forms["__Form"];
    }

    theform.PAGENUM.value=pagenum;
  }


  function setEventTarget(eventTarget)
  {
    if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) {
      theform = document.__Form;
    }
    else {
      theform = document.forms["__Form"];
    }

    theform.EVENTTARGET.value=eventTarget;
  }


  function collectParams()
  {
    var form;
    var params="";
    var i;

    form=document.getElementById("__Form");

    for (i=0;i<form.length;i++)
    {
      params=params+form.elements[i].name+"="+encodeURI(form.elements[i].value)+"&";
    }
  
    return params;
  }


  function changeMouseToWait(targetId)
  {
    var list=document.getElementById(targetId).getElementsByTagName("a");
  
    for (var i=0;i<list.length;i++)
    { 
      list[i].style.cursor="progress";   // w-resize, n-resize, move, help, wait, text
    }
  }


  this.pollHash=function()
  {
    var this_=this;
    var hash;
    var href;
    var pos;
  
    if (!useAjax) return;
  
//    alert("("+window.location.hash+")");
//    alert(document.getElementById("iframe").contentWindow.document.getElementById("state").value);

    if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) {
      hash=document.getElementById("iframe").contentWindow.document.getElementById("state").value;
    }
    else {
      hash=1;
      if (location.hash) {
        hash=Number(location.hash.substr(1));
      }
      if (hash<=0) {
        hash=1;
      }
    }
    
    if (!pageReload && getPagenum()!=hash)
    {
      pageReload=true;

//      alert("change "+hash+", "+getPagenum());
      setPagenum(hash);
      setEventTarget("0000");
    
      href=location.href;
      pos=href.indexOf("#");
      if (pos>-1)
      {
        href=href.substr(0,pos);
      }
    
      this.loadControl(href+"?ajax=1","page");
    }

    window.setTimeout(function() { this_.pollHash(); },250);

    return true;
  }


  this.doUnload=function()
  {
//    setCookie("window",getPagenum());

    setPagenum(1)
  }

}


// newEventNum
function newEventNum()
{
  var now = new Date();

  $('EVENTNUM').value=Math.floor((now.getTime()-1237539252614)/100);
  
}


// File-upload
function cloneForm(formId)
{
  var o=$(formId+"_form");
  var p=o.parentNode;
  var form=$('_endForm');

  o.style.display='none';
  p.getElementsByTagName('div')[0].style.display='block';
  form.appendChild(o);
  
  
  $('PAGENUM2').value = $F('PAGENUM');
  $('EVENTTARGET2').value = formId;
  $('EVENTARGUMENT2').value = '';

  form.action='?if=1&gui='+form.WINDOWNUM2.value+':'+$F('PAGENUM')+':'+formId;
//  form.action='?if=1&gui='+formId;

  form.submit();
  
  form.reset();
  
  p.appendChild(o);
  
  return false;
}

function uploadFinished(formId)
{
  $(formId).parentNode.getElementsByTagName('div')[0].style.display='none';
  $(formId).style.display='block';
}

function setPagenum(pagenum)
{
  $("PAGENUM").value=pagenum;
}

function setNodeValue(targetId,html)
{
  document.getElementById(targetId).innerHTML="";
  document.getElementById(targetId).innerHTML=html.split('\n').join('');
}


// get Client ScrollTop
function f_scrollTop() {
  return f_filterResults (
  window.pageYOffset ? window.pageYOffset : 0,
  document.documentElement ? document.documentElement.scrollTop : 0,
  document.body ? document.body.scrollTop : 0
);
}
function f_filterResults(n_win, n_docel, n_body) {
  var n_result = n_win ? n_win : 0;
  if (n_docel && (!n_result || (n_result > n_docel)))
    n_result = n_docel;
  return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}

function storeScrollTop()
{
  $('__Form').SCROLLTOP.value=f_scrollTop();
}


// Image
function transferImageUrl(self,targetId,url)
{
  $(targetId).src=url;
  $(targetId).title=self.title;
}

// Textarea
function textareaMaxLength(e,self,max)
{
  var keynum;
  var keychar;
  var pattern=/./;

  if (self.value.length<max)
    return true;

  if (window.event) // IE
    keynum=e.keyCode;
  else if (e.which) // Netscape/Firefox/Opera
    keynum=e.which;

//  keychar=String.fromCharCode(keynum);
  
  if (keynum==8 || keynum==undefined)
    return true;

  return false;
  return !pattern.test(keychar);
}

