/*
   (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);
  }
}