//  Extrema
//  ----------------------------------------------------------------------------
// <p>Title: Extrema</p>
// <p>Description: maintaining the extrema values for scaling operations</p>
// <p>Copyright: Copyright (c) 2003</p>
// <p>Company: SiG Software Integration GmbH</p>
// @author Dr. Horst Walther
// @version 0.2
//  ----------------------------------------------------------------------------
/*
 import com.wal.graph.Point2d;
 import java.util.*;
 */
//  ----------------------------------------------------------------------------
//  ----------------------------------------------------------------------------


function Extrema(x, y) {
  var wordy = false;
  this.id = 'Extrema';
  var xMax = 0;
  var yMax = 0;
  var xMin = 0;
  var yMin = 0;
  var xMaxOld = 0;
  var yMaxOld = 0;
  var xMinOld = 0;
  var yMinOld = 0;

  //  ----------------------------------------------------------------------------
  this.assignEx = function (ex) {
    xMin = ex.getMin().getX();
    yMin = ex.getMin().getY();
    xMax = ex.getMax().getX();
    yMax = ex.getMax().getY();
    return this;
  }

  //  ----------------------------------------------------------------------------
  this.assignValues = function (x1, y1, x2, y2) {
    xMin = x1;
    yMin = y1;
    xMax = x2;
    yMax = y2;
    return this;
  }

  //  ----------------------------------------------------------------------------
  this.find = function (x, y) {
//  alert (this.id+'.find('+x+', '+y+')');
    if (x && y) {
      xMax = x[0];
      yMax = y[0];
      xMin = x[0];
      yMin = y[0];
      compare(x, y);
//    alert (this.id+'.find('+this.toString()+')');
    } else
      alert('Extrema.find (' + x + ', ' + y + ')');
    return this;
  }

  //  ----------------------------------------------------------------------------
  this.del = function () {
    xMin = 0.0;
    yMin = 0.0;
    xMax = 0.0;
    yMax = 0.0;
    return this;
  }

  //  ----------------------------------------------------------------------------
  function comparePoint(p) {
    comparePair(p.getX(), p.getY());
  }

  //  ----------------------------------------------------------------------------
  function comparePair(x, y) {
    if (x > xMax) xMax = x;
    if (y > yMax) yMax = y;
    if (x < xMin) xMin = x;
    if (y < yMin) yMin = y;
    if (wordy) alert("(" + x + ", " + y + ")");
  }

  //  ----------------------------------------------------------------------------
  function compare(x, y) {
    var n = Math.min(x.length, y.length);
    for (var j = 1; j < n; j++) {
      if (x[j] > xMax) xMax = x[j];
      if (y[j] > yMax) yMax = y[j];
      if (x[j] < xMin) xMin = x[j];
      if (y[j] < yMin) yMin = y[j];
      if (wordy) alert(j + ": (" + x[j] + ", " + y[j] + ")");
    }
  }

  //  ----------------------------------------------------------------------------
  this.toString = function () {
    return "(" + xMin.toString() + ", " + yMin.toString() + "), (" + xMax.toString() + ", " + yMax.toString() + ")";
  }

  //  ----------------------------------------------------------------------------
  this.expand = function (x, y) {
    xMaxOld = xMax;
    yMaxOld = yMax;
    xMinOld = xMin;
    yMinOld = yMin;
    compare(x, y);
    return changed();
  }

  //  ----------------------------------------------------------------------------
  this.check = function () {
    return ((getMax().getX() - getMin().getX()) != 0.0) && ((getMax().getY() - getMin().getY()) != 0.0);
  }

  //  ----------------------------------------------------------------------------
  this.changed = function () {
    return (xMax > xMaxOld) || (yMax > yMaxOld) || (xMin < xMinOld) || (yMin < yMinOld);
  }
  //  ----------------------------------------------------------------------------
  this.getXmin = function () {
    return xMin;
  }

  //  ----------------------------------------------------------------------------
  this.getYmin = function () {
    return yMin;
  }

  //  ----------------------------------------------------------------------------
  this.getXmax = function () {
    return xMax;
  }

  //  ----------------------------------------------------------------------------
  this.getYmax = function () {
    return yMax;
  }

  //  ----------------------------------------------------------------------------
  this.getMax = function () {
    return new Point2d(xMax, yMax);
  }

  //  ----------------------------------------------------------------------------
  this.getMin = function () {
    return new Point2d(xMin, yMin);
  }

  //  ----------------------------------------------------------------------------
  if (x && y) this.find(x, y)
  //  ----------------------------------------------------------------------------
}
