/*
   (c) 2005, 2007, M-SYS Document Technologies
   No public usage allowed.
*/

function range(low, value, height)
{
  if (value < low) return Number(low);
  if (value > height) return Number(height);
  return Number(value);
}

function extractFilename(fn)
{
  var i = fn.lastIndexOf('/');
  if (i>=0) return fn.slice(i+1,99);
  return fn;
}

function extractFilepath(fn)
{
  var i = fn.lastIndexOf('/');
  if (i>=0) return fn.slice(0, i);
  return "";
}


function changeFileExt(fn, ext)
{
  var i = fn.lastIndexOf(".");
  if (i>0) return fn.slice(0,i-1) + ext;
  return fn;
}

function extractFileExt(fn)
{
  var i = fn.lastIndexOf(".");
  if (i>=0) return fn.slice(i, fn.length-i);
  return "";
}
function showElement(id, idx)
{
  if (isNaN(idx)) idx = 0;
  show(document.getElementsByName(id)[idx]);
}

function hideElement(id, idx)
{
  if (isNaN(idx)) idx = 0;
  hide(document.getElementsByName(id)[idx]);
}

function hide(element)
{
  if (typeof element=='object') {
    element.style.display = "none";
    element.style.visibility = "hidden";
  }
}

function show(element)
{
  if (typeof element=='object') {
    element.style.display = "block";
    element.style.visibility = "visible";
  }
}

function isVisible(htmlitem)
{
  if ((typeof htmlitem!='object') || (!htmlitem)) return false;
  return (htmlitem.style.display == 'block' ||
          htmlitem.style.display == 'inline') ? true : false;
}

function showElement(id, idx)
{
  show(document.getElementsByName(id)[idx]);
}

function isVisible(htmlitem)
{
  if (!htmlitem) return false;
  return (htmlitem.style.display == 'block' ||
          htmlitem.style.display == 'inline') ? true : false;
}

function toggleElement(id)
{
  var itm = getElement(id,0);
  if (isVisible(itm)) hide(itm)
                 else show(itm);
/*
  var list = document.getElementsByName(id);
  if (list.length==0) list = Array([document.getElementById(id)]);
  var item;
  var shownitem = 0;
  var imax = list.length;
  var i;

  if (imax == 1) {
    if (isVisible(list[0])) hide(list[0])
                       else show(list[0]);
  } else {

    for (i=0; i<imax; i++) {
      if (isVisible(list[i])) { // && list[i].style.display != "none") {
        shownitem = i + 1;
        if (i >= imax-1)
          shownitem = 0;
        break;
      }
    }

    for (i=0; i<imax; i++) {
      if (i == shownitem) show(list[i]);
      else hide(list[i]);
    }
  }
*/
}

function infolistShow(id,showitem)
{
  var list = document.getElementsByName(id);
  var imax = list.length;

  for (var i=0; i<imax; i++) {
    if (i == showitem) show(list[i]);
    else hide(list[i]);
  }
}

function showStatus(msg)
{
  var status = getElement('status',0);
  if (status) {
    if (msg.length > 0) {
      status.innerHTML = msg;
      show(status);
    } else
      hide(status);
  }
}

function showMessage(msg)
{
  showStatus(msg);
  setTimeout(hideStatus,8000);
}

function hideStatus()
{
  var status = getElement('status',0);
  if (status)
    hide(status);
}

var
  prehiglightclass = "";

function highlight(item, state)
{
  if (! item) return;
  if (state) {
    prehiglightclass = item.className;
    item.className = prehiglightclass+'_highlighted';
  } else {
    item.className = prehiglightclass;
  }
}

/*
   (c) 2005, 2007, M-SYS Document Technologies
   No public usage allowed.

   Include into project header:
     var browser = new TBrowser();

   Definition:
   
   class TCookies {
     constructor TBrowser();
     var ver: string;     //versionstring
     var agent: string;   //useragent
     var dom: boolean;    //has DOM
     var opera: boolean;  //is Opera
     var opera5: boolean; //is Opera V5
     var ie: boolean;     //is IE
     var ie4: boolean;    //is IE4
     var ie5: boolean;    //is IE5
     var ie6: boolean;    //is IE6
     var mac: boolean;    //is MAC
     var ns4: boolean;    //is Netscape V4
     var ns6: boolean;    //is Netscape V6
     var px: string;      //Name of pixel until
   }
*/

function TBrowser() 
{
  this.ver = navigator.appVersion;
  this.agent = navigator.userAgent;
  this.dom = document.getElementById ? 1 : 0;
  this.opera = (window.opera) ? 1 : 0;
  this.opera5 = this.agent.indexOf("Opera 5") > -1;
  this.ie5 = (this.ver.indexOf("MSIE 5")>-1 && this.dom && !this.opera5) ? 1 : 0;
  this.ie6 = (this.ver.indexOf("MSIE 6")>-1 && this.dom && !this.opera5) ? 1 : 0;
  this.ie4 = (document.all && !this.dom && !this.opera5) ? 1 : 0;
  this.ie  = this.ie4 || this.ie5 || this.ie6;
  this.mac = this.agent.indexOf("Mac") > -1;
  this.ns6 = (this.dom && parseInt(this.ver) >= 5) ? 1 : 0;
  this.ns4 = (document.layers && !this.dom) ? 1 : 0;
  this.bw  = (this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.opera5);

  // A unit of measure that will be added when setting the position of a layer.
  this.px = (this.ns4 || this.opera) ? "" : "px";
  return this;
}


function getElement(id, idx)
{
  if (browser.ie5 || browser.ie6) {
    var list = document.getElementsByName(id);
    return (list.length >= idx) ? list[idx] : false;
  };
  return (idx == 0) ? document.getElementById(id) : false;
}

function GetInnerWidth()
{
  if (typeof(window.innerWidth)=='number') return window.innerWidth;  // Non IE
  if (document.documentElement && 
      document.documentElement.clientWidth) return document.documentElement.clientWidth; // IE6
  if (document.body && document.body.clientWidth) return document.body.clientWidth; // IE4
  return window.width;
}

function GetInnerHeight()
{
  if (typeof(window.innerHeight)=='number') return window.innerHeight;  // Non IE
  if (document.documentElement && 
      document.documentElement.clientHeight) return document.documentElement.clientHeight;  // IE6
  if (document.body && document.body.clientHeight) return document.body.clientHeight; // IE4
  return window.height;
}

function scrollXOffset()
{
   if (window.pageXOffset) return self.pageXOffset;
   if (document.documentElement &&
       document.documentElement.scrollLeft) return document.documentElement.scrollLeft;
   if (document.body) return document.body.scrollLeft;
   return 0;
}

function scrollYOffset()
{
   if (window.pageYOffset) return self.pageYOffset;
   if (document.documentElement && 
       document.documentElement.scrollTop) return document.documentElement.scrollTop;
   if (document.body) return document.body.scrollTop;
   return 0;
}
/* 
   Manager for Cookies

   (c): This source has been written newly, but has some inspirations from OpenSource projects as 
        Bugzilla and WordPress. As tribute, we put this file into GNU Public Licence.
        2007, M-SYS Document Technologies

   Include into project header:
     cookies = new TCookies('thiscookiename',MinutesToExpire);

   class TCookies {
     constructor TCookies(CookieName: String, DefaultMinutesToExpire: Minutes, DefaultDomain: String optional, 
                          DefaultPath: String optional);
     function GetExpiration(MinutesToExpire: Minutes):Date;
     function GetDocumentCookies();
     function SetDocumentCookie();
     function SetCookie(CookieName: String, CookieValue: Variant, MinutesToExpire: Minutes optional, 
                        CookieDomain: String optional, CookiePath: String optional)
     function GetCookie(CookieName: String; DefaultValue: Variant optional):Variant
   }
*/

function TCookies(CookieName, DefaultMinutesToExpire, DefaultDomain, DefaultPath) 
{
  this.name = CookieName;
  this.DefaultExpiration = this.GetExpiration(DefaultMinutesToExpire);
  this.DefaultDomain = (DefaultDomain) ? DefaultDomain : 
                       (document.domain.search(/[a-zA-Z]/) == -1) ? document.domain :
                       document.domain.substring(document.domain.indexOf('.') + 1,document.domain.length);
  this.DefaultPath = (DefaultPath) ? DefaultPath : '/';
  this.cookies = new Object();
  this.expiration = new Object();
  this.domain = new Object();
  this.path = new Object();
  window.onunload = new Function ('cookies.SetDocumentCookies();');
  this.GetDocumentCookies();
}

TCookies.prototype.GetExpiration = function(MinutesToExpire) 
{
  var date = new Date();
  if (! MinutesToExpire) MinutesToExpire = 60 * 24;
  date.setTime(date.getTime() + (MinutesToExpire * 60 * 1000));
  return date.toGMTString();
}

TCookies.prototype.GetDocumentCookies = function() 
{
  var cookie,pair;
  var cookies = document.cookie.split(';');
  var len = cookies.length;
  for(var i=0;i < len;i++) {
    cookie = cookies[i];
    while (cookie.charAt(0)==' ') cookie = cookie.substring(1,cookie.length);
    pair = cookie.split('=');
    this.cookies[pair[0]] = pair[1];
  }
}

TCookies.prototype.SetDocumentCookies = function() 
{
  var expires = '';
  var cookies = '';
  var domain = '';
  var path = '';
  for(var name in this.cookies) {
    expires = (this.expiration[name]) ? this.expiration[name] : this.DefaultExpiration;
    path = (this.path[name]) ? this.path[name] : this.DefaultPath;
    domain = (this.domain[name]) ? this.domain[name] : this.DefaultDomain;
    cookies = name + '=' + this.cookies[name] +  
              ((path) ? '; path=' + path : '') +
              ((expires) ? '; expires=' + expires : '') +
              ((domain) ? '; domain=' + domain : '');
    document.cookie = cookies;
  }
  return true;

}

TCookies.prototype.SetCookie = function(CookieName, CookieValue, MinutesToExpire, CookieDomain, CookiePath) 
{
  this.cookies[CookieName] = CookieValue;
  if (MinutesToExpire) this.expiration[CookieName] = this.GetExpiration(MinutesToExpire);
  if (CookieDomain) this.domain[CookieName] = CookieDomain;
  if (CookiePath) this.path[CookieName] = CookiePath;
  //alert('SetCookie: '+CookieName+'='+CookieValue);
  return true;
}

TCookies.prototype.GetCookie = function(CookieName, DefaultValue) 
{ 
  var value = this.cookies[CookieName]
  if (!value) value = (DefaultValue) ? DefaultValue : false;
  //alert('GetCookie: '+CookieName+'='+value);
  return value;
}

TCookies.prototype.GetCookieNumber = function(CookieName, DefaultValue) 
{ 
  var value = this.GetCookie(CookieName, DefaultValue);
  if (isNaN(value)) value = DefaultValue;
  return value;
}

/*
   (c) 2005, 2007, M-SYS Document Technologies
   No public usage allowed.

   Include into project header:
     var sizing = new TSizing();

   class TImageInfo {
     constructor TImageInfo(img: ImageTag);
     var initialWidth: integer;
     var initialHeight: integer;
     var initialSrc: String;      //aus Tag IMG[src]
   }
   
   class TSizing {
     constructor TSizing(Cookiename: String);
     function smaller();
     function bigger();
     
*/

//Possible sizings: Fonts and image sizes in percent
//var sizing_fonts  = new Array(/*"4pt",*/ "6pt", "8pt", "9pt", "10pt", "12pt", "14pt", "16pt", "18pt", "20pt", "22pt", "24pt");
var sizing_fonts  = new Array(/*"4pt",*/ "6pt", "8pt", "9pt", "10pt", "12pt", "14pt", "16pt", "18pt", "20pt", "22pt", "24pt");
var sizing_images = new Array(/*   40,*/    60,    80,    90,    100,    120,    140,    160,    180,    200,    220,   240);
var sizing_widths = new Array(/*    0,*/   250,   450,   550,    800,    1000,   1200,   1500);
var sizing_defaultindex = 3;

//Subobject: TImageInfo
//Usage: holds initial image properties
function TImageInfo(img) {
  this.img = img;
  this.initialWidth = img.width;
  this.initialHeight= img.height;
  this.initialSrc = img.src;
}

function TSizing(DynamicZoom, Cookiename)
{
  this.lastWidth = 0;
  this.lastHeight = 0;
  this.sizeIndex = sizing_defaultindex; //Actual index in sizes
  this.enabled = true;
  this.dynamicZoom = DynamicZoom;
  this.cookieName = (Cookiename) ? Cookiename : 'sizing';
  this.svgObjects = new Array();   //Cache for resizeable svg-objects
  this.imgObjects = new Array();   //Cache for resizeable images
  this.sizeAdjustment = ((typeof cookies == 'object') && (this.cookieName)) ? cookies.GetCookieNumber(this.cookieName, 0) : 0;
  
  showElement('sizinglinks');

  if (typeof document.getElementsByTagName == 'function') {
  //Resizeable - images suchen und in imgObjects eintragen
  var allimages = document.getElementsByTagName("img");
  var i, j, img;
  for (i=0, j=0; i<allimages.length; i++) {
    img = allimages[i];
    if (img.className == "resizeable") {
      this.imgObjects[j] = new TImageInfo(img);
      j++;
    }
  }

  //Object-Tags mit svg-inhalten suchen und in svgObjects eintragen
  var mimeType;
  var allobjects = document.getElementsByTagName("object");
  for (i=0, j=0; i<allobjects.length; i++) {
    mimeType = allobjects[i].getAttribute("type");
    if (mimeType == "image/svg+xml" || mimeType == "application/x-shockwave-flash") {
      this.svgObjects[j] = allobjects[i];
      j++;
    }
  }

  //Search meta-tags <meta name="font-size-adjustment" content="-2" />
  //useful for stretching content
  var name;
  var meta = document.getElementsByTagName("meta");
  for (i=0; i<meta.length; ++i) {
    name = meta[i].getAttribute("name");
    if (name && name.toLowerCase() == "font-size-adjustment") {
      this.sizeAdjustment = 1 * meta[i].getAttribute("content");
      break;
    }
  }
  }

  this.refresh();
  return this;
}


TSizing.prototype.adjustObjects = function(width, height)
{
  //Resize SVG-objects. The work around is to save width/height attributes
  //and then to recompute absolute width/height dimensions on resizing
  var i, obj, w, newW, h, newH;
  for (i=0; i<this.svgObjects.length; i++) {
    obj = this.svgObjects[i];

    if ( !obj.initialWidth )
      obj.initialWidth = obj.getAttribute("width");
    if ( !obj.initialHeight )
      obj.initialHeight = obj.getAttribute("height");

    if ( obj.initialWidth && obj.initialWidth.charAt(obj.initialWidth.length-1) == "%" ) {
      w = parseInt(obj.initialWidth.slice(0, obj.initialWidth.length-1));
      newW = width * (w/100.0);
      obj.setAttribute("width",newW);
    }
    if ( obj.initialHeight && obj.initialHeight.charAt(obj.initialHeight.length-1) == "%" )  {
      h = parseInt(obj.initialHeight.slice(0, obj.initialHeight.length-1));
      newH = height * (h/100.0);
      obj.setAttribute("height", newH);
    }
  }

  //Resize images through changing the src-attribute. If file not exists, imgError should provide
  //very basic scaling of the file.
  var img, fn;
  var si = range(0, this.sizeIndex, sizing_images.length-1);
  for (i=0; i<this.imgObjects.length; i++) {
    img = this.imgObjects[i].img;
    fn = this.imgObjects[i].initialSrc;
    if (img.onError != 'undefined') {
      img.src = (sizing_images[si] == 100) ? fn :
         extractFilepath(fn) + "/zoom" + sizing_images[si] + "/" + extractFilename(fn);
    } else {
      img.width=this.imgObjects[i].initialWidth * sizing_images[si] / 100.0;
      img.height=this.imgObjects[i].initialHeight * sizing_images[si] / 100.0;
    }
  }
}

TSizing.prototype.refresh = function(force)
{
  var width = GetInnerWidth();
  var height = GetInnerHeight();
  if (force || width != this.lastWidth || height != this.lastHeight) {
    var si;
    //Search fitting index in scaling table.
    if (this.dynamicZoom) {
      si = sizing_widths.length-1;
      for (var i=0; i<sizing_widths.length; i++) {
        if (width < sizing_widths[i] && sizing_widths[i]>0) {
          si = i-1;
          break;
        }
      }
    } else {
      si = sizing_defaultindex;
    }
    this.sizeIndex = range(0, Number(si) + Number(this.sizeAdjustment), sizing_fonts.length-1);
    if (isNaN(this.sizeIndex)) this.sizeIndex = sizing_defaultindex;

    //adjust image and object sizes
    if (this.dynamicZoom) this.adjustObjects(width, height);

    //adjust font size
    
    //alert('fonts: '+this.sizeIndex+ ' si:'+si+ ' adj:'+this.sizeAdjustment);
    document.body.style.fontSize = sizing_fonts[this.sizeIndex];

    this.lastWidth = width;
    this.lastHeight = height;
  }
}

TSizing.prototype.adjust = function(sizeAdjustment)
{
  var sa = 0;
  //alert('sadj: '+sizeAdjustment);
  if (!isNaN(sizeAdjustment) && (sizeAdjustment < sizing_fonts.length+2) && (sizeAdjustment > -sizing_fonts.length-2))
    sa = range(-sizing_fonts.length, sizeAdjustment, sizing_fonts.length);
  //alert('bigger: ' + sizeAdjustment + ' sa:'+sa+' size' +  this.sizeAdjustment)
  if (sa != this.sizeAdjustment) {
    this.sizeAdjustment = sa;
    //alert('size' +  this.sizeAdjustment);
    this.refresh(true);
    if ((typeof cookies == 'object') && (this.cookieName)) {
      cookies.SetCookie(this.cookieName, this.sizeAdjustment);
    }
  }
}

TSizing.prototype.reset = function()
{
  this.adjust(0);
}

TSizing.prototype.smaller = function()
{
  if (this.sizeIndex > 1)
    this.adjust(this.sizeAdjustment-1);
}

TSizing.prototype.bigger = function()
{  
  if (this.sizeIndex < sizing_fonts.length - 2)
    this.adjust(Number(this.sizeAdjustment)+1);
}

TSizing.prototype.next = function ()
{
  if (this.sizeIndex < sizing_fonts.length - 2) {
    this.adjust(Number(this.sizeAdjustment)+1);
  } else {
    this.adjust(1);
  }
}

