/**
 * Copyright: newmagic datensysteme gmbH
 * Autor:     Matthias Eipeldauer
 * Datum:     25.09.2008
 *
 * mm8UIControl.js (ehemals mm8_Control) stellt die Funktionen für die UI Komponenten zur Verfügung.
 * Hier erfolgt die Forwarddefinition für die Benutzerinteraktionen.
 * 
 **/

//----
include ("mm8Atom.js");

mm8UIControls = {};

/*class*/function mm8UIControl(id)/*extends mm8Atom*/
{
  this.superclass=new mm8Atom(id);
  for (x in this.superclass) (x!="superclass")?this[x]=this.superclass[x]:"";
  this.superclass.childClass = this;
  this.type.push("mm8UIControl");
  
  /*public*/this.IsVisible        = false;
  /*public*/this.IsRolledUp       = false;
  /*public*/this.IsPinned         = false;
  /*public*/this.CanResize        = true;
  /*public*/this.CanMinimize      = false;
  /*public*/this.CanMaximize      = false;
  /*public*/this.CanClose         = true;
  /*public*/this.CanMove          = true;
  /*public*/this.CanPin           = false;
  /*public*/this.CanRollup        = false;
  /*public*/this.iPosX            = 0;
  /*public*/this.iRevPosX         = 0;
  /*public*/this.iPosY            = 0;
  /*public*/this.iRevPosY         = 0;
  /*public*/this.iPosZ            = 0;
  /*public*/this.width            = 0;
  /*public*/this.height           = 0;
  /*public*/this.mm8ContentElem   = mm8BaseContainerTag;
  /*public*/this.rawCode          = [];
  /*public*/this.replacementVals  = {};
  /*public*/this.icon             = "";
  
  this.children         = [];
  
  now = new Date();
  this.baseClass = "mm8UIControl";

  this.ActionMinimize = 'onclick="mm8UIControl_minimize(\'' + this.id + '\')"';
  this.ActionMaximize = 'onclick="mm8UIControl_maximize(\'' + this.id + '\')"';
  this.ActionResize   = 'onclick="mm8UIControl_resize(\'' + this.id + '\')"';
  this.ActionPin      = 'onclick="mm8UIControl_pin(\'' + this.id + '\')"';
  this.ActionClose    = 'onclick="mm8UIControl_close(\'' + this.id + '\')"';

  this.rawControlMinimize = "            <div id='{xID}MinimizeContainer' class='{xBaseClass}MinimizeContainer'><img id='{xID}Minimize'  class='{xBaseClass}Minimize' {xMinAction}   src='{xMinBtn}'></div>";
  this.rawControlMaximize = "            <div id='{xID}MaximizeContainer' class='{xBaseClass}MaximizeContainer'><img id='{xID}Maximize'  class='{xBaseClass}Maximize' {xMaxAction}   src='{xMaxBtn}'></div>";
  this.rawControlClose    = "            <div id='{xID}CloseContainer'    class='{xBaseClass}CloseContainer'   ><img id='{xID}Close'     class='{xBaseClass}Close'    {xCloseAction} src='{xCloseBtn}'></div>";

  resize = ['L', 'R', 'T', 'B', 'LT', 'RT', 'LB', 'RB'];
  this.resizers = new Object();
  for(key in resize)
  {
    this.resizers["xResize" + resize[key]] = 'onmousedown="StartResize(\'' + this.id + '\', \'' + resize[key] + '\')"';
  }

  this.log = log;
 
 /*public abstract */ this.Render = function()
  {};

  /* Zeigt das Objekt an.
   * Wirft keinen Fehler wenn das Objekt bereits dargestellt ist.
   */
  /*public*/this.Show = function()
  {
    if (this.bIsVisible) return;
    try
    {
      document.getElementById(this.id + mm8BaseContainerTag).style.display = "block";
    }
    catch(ex)
    {
      // Handle Error
    }  
  };
  
  /* Versteckt das Objekt.
   * Wirft keinen Fehler wenn das Objekt bereits versteckt ist.
   */
  /*public*/this.Hide = function()
  {
    if (!this.bIsVisible) return;
    try
    {
      document.getElementById(this.id + mm8BaseContainerTag).style.display = "none";
    }
    catch(ex)
    {
      // Handle Error
    }
  };
  
  /* Setzt die Position des Objekts im 3D Raum.
   * iPosZ = z-index.
   */
  /*public*/this.SetPosition = function(iPosX, iPosY, iPosZ)
  {
    this.iPosX = iPosX;
    this.iPosY = iPosY;
    this.iPosZ = iPosZ;
    if (this.mm8BaseContainerTag)
    {
      xElem = document.getElementById(this.id + this.mm8BaseContainerTag);
    }
    else
    {
      xElem = document.getElementById(this.id + mm8BaseContainerTag);
    }
    if (xElem)
    {
      xElem.style.left = this.iPosX + "px";
      xElem.style.top  = this.iPosY + "px";
      if (this.iPosZ) xElem.style.zIndex = this.iPosZ;
    }
  };


  /* Setzt die Position des Objekts im 3D Raum.
   * iPosZ = z-index.
   */
  /*public*/this.SetPositionRB = function(iPosX, iPosY, iPosZ)
  {
    this.iRevPosX = iPosX;
    this.iRevPosY = iPosY;
    this.iPosZ = iPosZ;
    if (this.bIsVisible)
    {
      xElem = document.getElementById(this.id + mm8BaseContainerTag);
      xElem.style.right  = this.iRevPosX + "px";
      xElem.style.bottom = this.iRevPosY + "px";
      if (this.iPosZ) xElem.style.zIndex = this.iPosZ;
    }
  };
  
  /* Diese Funktion zentriert das Objekt auf dem Schirm
   *
   */
  /*public*/this.CenterOnScreen = function(id)
  {
    if (!id) elem = document.getElementById(this.id);
    else elem = document.getElementById(id);
    xWidth = (window.innerWidth ? window.innerWidth: document.body.clientWidth);
    xHeight = (window.innerHeight ? window.innerHeight: document.documentElement.clientHeight);
    xNewX = parseInt((xWidth - elem.offsetWidth) / 2);
    xNewY = parseInt((xHeight - elem.offsetHeight) / 2);
    if (xNewY < 10) xNewY = 10;
    this.SetPosition(xNewX, xNewY);
  };

  /*public*/this.CalculateSize = function(id)
  {
    if (!id) elem = document.getElementById(this.id);
    else elem = document.getElementById(id);
    this.width = (window.innerWidth ? window.innerWidth: document.body.clientWidth);
    this.height = (window.innerHeight ? window.innerHeight: document.body.clientHeight);
  }

  /*public*/this.SetSize = function(iSizeX, iSizeY)
  {
    if (this.mm8BaseContainerTag)
    {
      xElem = document.getElementById(this.id + this.mm8BaseContainerTag);
    }
    else
    {
      xElem = document.getElementById(this.id + mm8BaseContainerTag);
    }
    xElem.style.width = iSizeX;
    xElem.style.height = iSizeY;
    this.width = iSizeX;
    this.height = iSizeY;
  }

  /* Diese Funktion setzt den Inhalt dieses Controls
   *
   */
  /*public*/this.SetContent = function(content)
  {
    rawContent = new Object();
    rawContent['vidstreamMSIE']  = '<OBJECT height="100%" width="100%" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000">';
    rawContent['vidstreamMSIE'] += '  <PARAM value="' + mm8WebDbUrl + '/flvplayer.swf?file={SRC}" name="movie" />';
    rawContent['vidstreamMSIE'] += '  <PARAM value="#000" name="bgcolor" />';
    rawContent['vidstreamMSIE'] += '  <PARAM value="high" name="quality" />';
    rawContent['vidstreamMSIE'] += '</OBJECT>';

    rawContent['vidstream']      = '<embed';
    rawContent['vidstream']     += '  height="100%"';
    rawContent['vidstream']     += '  width="100%"';
    rawContent['vidstream']     += '  quality="high"';
    rawContent['vidstream']     += '  bgcolor="#000"';
    rawContent['vidstream']     += '  style=""';
    rawContent['vidstream']     += '  src="' + mm8WebDbUrl + '/flvplayer.swf?file={SRC}"';
    rawContent['vidstream']     += '  type="application/x-shockwave-flash"/>';


    rawContent['swfMSIE']  = '<OBJECT  height="100%" width="100%" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000">';
    rawContent['swfMSIE'] += '  <PARAM value="{SRC}" name="movie" />';
    rawContent['swfMSIE'] += '  <PARAM value="#000" name="bgcolor" />';
    rawContent['swfMSIE'] += '  <PARAM value="high" name="quality" />';
    rawContent['swfMSIE'] += '</OBJECT>';

    rawContent['swf']      = '<embed';
    rawContent['swf']     += '  height="100%"';
    rawContent['swf']     += '  width="100%"';
    rawContent['swf']     += '  quality="high"';
    rawContent['swf']     += '  bgcolor="#000"';
    rawContent['swf']     += '  style=""';
    rawContent['swf']     += '  src="{SRC}"';
    rawContent['swf']     += '  type="application/x-shockwave-flash"/>';

    rawContent['image'] = '<img src="{SRC}" style="width:100%;height:100%;">';
    
    if (content.substring(0, 5) == 'http:' || content.substring(0, 6) == "https:")
    {
      content = "<iframe src='" + content.replace("IFRAME!!", "") + "' style='width:100%;height:100%;border:none;'></iframe>";
    }
    else if (content.substring(0, 11) == "javascript:")
    {
      content = eval(content.replace("javascript:", ""));
    }
    else if (content.substring(0,5) == "GET!!")
    {
      content = mm8AxCore.SGet(content.replace("GET!!", ""));
    }
    else if (content.toLowerCase().indexOf(".png") > 0 || content.toLowerCase().indexOf(".jpg") > 0 || content.toLowerCase().indexOf(".gif") > 0)
    {
      content = rawContent["image"].replace(/\{SRC\}/g, content);
    }
    else if (content.toLowerCase().indexOf(".swf") > 0)
    {
      if (mm8IsMSIE)
      {
        content = rawContent["swfMSIE"].replace(/\{SRC\}/g, content);
      }
      else
      {
        content = rawContent["swf"].replace(/\{SRC\}/g, content);;
      }
    }
    else if (content.toLowerCase().indexOf(".flv") > 0) 
    {
      if (mm8IsMSIE)
      {
        content = rawContent["vidstreamMSIE"].replace(/\{SRC\}/g, content);
      }
      else
      {
        content = rawContent["vidstream"].replace(/\{SRC\}/g, content);;
      }
    }
    xElem = document.getElementById(this.id + this.mm8ContentElem);
    xElem.innerHTML = content;
  };
  
  this.Write = function(content)
  {
    xElem = document.getElementById(this.id + this.mm8ContentElem);
    xElem.innerHTML += content;
  };
  
  this.Close = function(EventArgs)
  {
    if (this.mm8BaseContainerTag)
    {
      xElem = document.getElementById(this.id + this.mm8BaseContainerTag);
    }
    else
    {
      xElem = document.getElementById(this.id + mm8BaseContainerTag);
    }
    xElem.innerHTML = "";
    xParent = xElem.parentNode;
    xParent.removeChild(xElem);
  };
  
  /* Rendert das Control in das definierte ContainerObjekt.
   * Existiert das Container Objekt NICHT wird es angelegt.
   */
  /*public*/this.RenderToTarget = function(target)
  {
    this.bIsVisible = true;
    if (!document.getElementById(target))
    {
      xNode = document.createElement("div");
      xNode.setAttribute('id', target);
      
      xBody = document.getElementsByTagName("body")[0];
      xBody.appendChild(xNode);
    }
    document.getElementById(target).innerHTML += "<div id='" + this.id + "Container'>" + this.Render() + "</div>";
  };

  /*public abstract */ this.EventMove = function(EventArgs)
  {
    if (this.CanPin && this.IsPinned) return;
    if (this.childClass && this.childClass.CanPin && this.childClass.IsPinned) return;
    if (mm8IsMSIE && this.DoMSIESanityCheck(EventArgs))
    {
      // in this Case MS IE is NOT SANE!
      return;
    }
    xElem = document.getElementById(this.id);
    this.iPosX = EventArgs.X;
    this.iPosY = EventArgs.Y;
    this.iRevPosX = 0;
    this.iRevPosY = 0;
    xElem.style.left = EventArgs.X + "px";
    xElem.style.top  = EventArgs.Y + "px";
  };
  
  /*public abstract */ this.EventDrag = function(EventArgs)
  {};
  
  /*public abstract */ this.EventDrop = function(EventArgs)
  {};
    
  /*public abstract */ this.EventResize = function(EventArgs)
  {
    if (mm8IsMSIE && EventArgs == 0) return;
    elem = document.getElementById(this.id);
    eWidth = parseInt(elem.style.width.replace("px", ""));
    eHeight = parseInt(elem.style.height.replace("px", ""));
    if (EventArgs.rstype.indexOf("L") > -1)
    {
      elem.style.width = eWidth + (EventArgs.X *-1) + "px";
      elem.style.left  = elem.offsetLeft + EventArgs.X + "px";
    }
    if (EventArgs.rstype.indexOf("R") > -1)
    {
      elem.style.width = EventArgs.X + "px";
    }
    if (EventArgs.rstype.indexOf("T") > -1)
    {
      elem.style.height = eHeight + (EventArgs.Y * -1) + "px";
      elem.style.top = elem.offsetTop + EventArgs.Y + "px";
    }
    if (EventArgs.rstype.indexOf("B") > -1)
    {
      elem.style.height = EventArgs.Y + "px";
    }
  };

  this.DoMSIESanityCheck = function(EventArgs)
  {
    if (!EventArgs) return true;
    return false;
  };

  /*public abstract */ this.EventClick = function(EventArgs)
  {
    if (this.childClass) this.childClass.EventClick(EventArgs);
  };

  /*public abstract */ this.EventDblClick = function(EventArgs)
  {
    if (this.childClass) this.childClass.EventDblClick(EventArgs);
  };
  
  /*public abstract */ this.EventClick = function(EventArgs)
  {
    if (this.childClass) this.childClass.EventClick(EventArgs);
  };

  /*public abstract */ this.EventKeyDown = function(EventArgs)
  {
    if (this.childClass) this.childClass.EventKeyDown(EventArgs);  
  };
  
  /*public abstract */ this.EventKeyUp = function(EventArgs)
  {
    if (this.childClass) this.childClass.EventKeyUp(EventArgs);  
  };

  /*public abstract */ this.EventPin = function(EventArgs)
  {
    if (this.childClass) this.childClass.EventPin(EventArgs);
  };
  
  /*public abstract */ this.EventRollup = function(EventArgs)
  {
    if (this.childClass) this.childClass.EventRollup(EventArgs);
  };

  /*public abstract */ this.EventLookupChildren = function(EventArgs)
  {
    if (this.childClass) this.childClass.EventLookupChildren(EventArgs);
  };

  
  // Register in Global Array
  mm8UIControls[this.id] = this;
}

function mm8UIControl_move(id, EventArgs)
{
  mm8UIControls[id].EventMove(EventArgs);
};
function mm8UIControl_drag(id, EventArgs)
{
  mm8UIControls[id].EventDrag(EventArgs);
};
function mm8UIControl_drop(id, EventArgs)
{
  mm8UIControls[id].EventDrop(EventArgs);
};
function mm8UIControl_resize(id, EventArgs)
{
  mm8UIControls[id].EventResize(EventArgs);
};
function mm8UIControl_click(id, EventArgs)
{
  mm8UIControls[id].EventClick(EventArgs);
};
function mm8UIControl_dblclick(id, EventArgs)
{
  mm8UIControls[id].EventDblClick(EventArgs);
};
function mm8UIControl_click(id, EventArgs)
{
  mm8UIControls[id].EventClick(EventArgs);
};
function mm8UIControl_keydown(id, EventArgs)
{
  mm8UIControls[id].EventKeyDown(EventArgs);
};
function mm8UIControl_keyup(id, EventArgs)
{
  mm8UIControls[id].EventKeyUp(EventArgs);
};
function mm8UIControl_close(id, EventArgs)
{
  mm8UIControls[id].Close(EventArgs);
};
function mm8UIControl_pin(id, EventArgs)
{
  mm8UIControls[id].EventPin(EventArgs);
};
function mm8UIControl_rollup(id, EventArgs)
{
  mm8UIControls[id].EventRollup(EventArgs);
};
function mm8UIControl_lookupChildren(id)
{
  mm8UIControls[id].EventLookupChildren();
}

mm8Callback("mm8UIControl.js");
