//-----------------------------------------------------------------------------'
//                       Copyright (C) 2006 Octrium bv                         '
//-----------------------------------------------------------------------------'
// 
// Octrium standard clientside JavaScript
// 
// Author              : Peter Zuidema
// Initial version     : 20050629
// Last modification   : 20070509
// 
// The PageComponent loads this script.
// 
// 20050629 Initial version
// 20050630 Window and screen width and height.
// 20050701 Hidden field to postback information
// 20050704 Get window and screen size when postback is issued.
// 20050704 Update RTE's (was called from __doPostback() in Form.aspx)
// 20050722 Message in status bar.
// 20050815 Prevent history.back
// 20050818 Server and Client Parsetime
// 20050818 Prevent history.back by using window.history.forward()
// 20050824 Display nothing in statusbar if message empty.
// 20050824 Prevent session timeout.
// 20050908 Return WindowState, offset corrected.
// 20050908 Pass all references to the FC's via one array instead of multiple .push()
// 20051008 Enable browser history.
// 20051014 Browser history removed from script. Handled in the page header.
// 20051025 Removed obsolete code, increased reconnect count and updated comments.
// 20051029 Tracing on.
// 20051102 Added getBodyOffset method, DragDrop added. 
// 20051107 Adapt method to IE.
// 20051212 Hoverstyle functions.
// 20051213 Hoverstyle functions updated.
// 20060220 Test Validators.
// 20060420 Removed Update RTE's.
// 20060515 Trace on for DragDrop.
// 20060519 Tracing on/off setting from web.config
// 20060601 VBox children.
// 20060623 IBox AJAX call.
// 20060628 MaxTrace length increased. Dump added.
// 20060630 Fixed several warnings (option strict).
// 20060710 Alert removed.
// 20060713 Initialize Tree menu's.
// 20060717 IE problems.
// 20060823 Tree state.
// 20060921 IBox with AJAX.
// 20070509 Activate login on enter in Password box.
//
var oScriptversion      = "3.7193.30";
var W3C=(document.all)?false:true;
var W3CDOM=(document.createElement && document.getElementsByTagName)?true:false;

// Store the time when the client is parsing this (thanx to Tweakers.net)
// Preferable is to set the starttime in the top of the page, hense the check.
if (!window.starttime) var starttime = new Date().getTime();

// Hidden Fields defined
var hfBrowserHistory = "BrowserHistory";
var hfBrowserInfo    = "BrowserInfo";
var hfWindowState    = "WindowState_";
var BodyOffset       = 0;

// Prevent Session timeout settings
var ReconnectCount = 0;     // Number of Reconnects done
var ReconnectMaxCount = 10; // Maximum number of Reconnects
var ReconnectInterval;      // Interval object, see Reconnect function.


//----- Standard functions -----
//
var oTraceOn = false; // Via web.config this can be set to true to enable tracing
var oTraceText = "";
var oMaxTraceLen = 120;
function oTrace(message) {
  oTraceText += message + ";";
  if(oTraceOn) {
    if(oTraceText.length>oMaxTraceLen) oTraceText = oTraceText.substring(oTraceText.length-oMaxTraceLen);
    window.status = "Trace=" + oTraceText;
    if (window.dump) window.dump(message+'\n');
  }
}
oTrace("v" + oScriptversion);
oTrace("W3C="+W3C+";W3CDOM="+W3CDOM);

function xGetElementById(e) {
  if(typeof(e)!='string') return e;
  if(document.getElementById) e=document.getElementById(e);
  else if(document.all) e=document.all[e];
  else if(document.layers) e=document.layers[e];
  else e=null;
  return e;
}

function addEvent(obj, eventType, afunction, isCapture) {
  if (obj.addEventListener) {
    // W3C DOM
    obj.addEventListener(eventType, afunction, isCapture);
    return true;
  }
  else if (obj.attachEvent) {
    // M$ Internet Explorer
    return obj.attachEvent("on"+eventType, afunction);
  }
  else return false;
}

function oLoginEvent(event) {
  var inp = new Object();
  var key;
  inp = (W3C)?event.currentTarget:event.srcElement;
  key = (W3C)?event.which:event.keyCode;
  oTrace('id='+inp.id+';type='+event.type+';key='+key);
  if (key==13) {
    // trigger login button
    var btnLogin = document.getElementById('ibLogin');
    if (btnLogin) {
      btnLogin.click();
    }
  }
}

// Updates the global BodyOffset number.
function getBodyOffset() {
  var bodydiv = xGetElementById("BodyDiv");
  if (bodydiv!=null) {
    BodyOffset = bodydiv.offsetLeft;  // is ok for IE6 and FF1.06
  }
  return BodyOffset;
}

//
// Initialize all FormComponents
// message     = text with server parsetime to display on the window statusbar.
// reconnect_s = Reconnect time in seconds to prevent session timeout.
function initializeForms(message, reconnect_s) {
  var parsetime = ((new Date().getTime() - starttime) / 1000).toString()+"s";
  oTrace("iFs - "+message+parsetime);
  if (!oTraceOn) {
    if (message.length!=0) {
      window.status = message+parsetime;
    }
  }
  // Prevent session timeout
  ReconnectInterval = window.setInterval('Reconnect()', reconnect_s * 1000);
  
  // Get Drag&Drop array
  if (window.MoveArray) {
    oTrace("MoveArray.len="+MoveArray.length);
    var para = new String('"' + MoveArray.join('","') + '"');
    //oTrace("para="+para);
    eval("SET_DHTML("+para+")");
    if (dd.elements.fc1_v1) {
      var v1 = dd.elements.fc1_v1;
      oTrace("v1="+v1.children.length);
      for (var i=0;i<v1.children.length;i++)
        oTrace(v1.children[i].name);
    } else {
      oTrace("!v1");
    }
  }
  
  // Init login event. When pressing enter within the password box
  var elem = document.getElementById('tbPassword');
  if (elem!=null) {
    if (!addEvent(elem, "keyup", oLoginEvent, false))
      oTrace('!addEvent oLoginEvent');
    if(!W3C) {  // IE needs extra event to detect the special keys
      if (!addEvent(elem, "keypress", oLoginEvent, false))
        oTrace('!addEvent IE oLoginEvent');
    }
  }
  
  if (!window.FCNames) {
    oTrace("No Forms to initialize.");
    return;
  }
  var elem = new Object();
  for (var i=0;i<FCNames.length;i++) {
    var FCname = FCNames[i];
    elem = document.getElementById(FCname);
    if (elem!=null) {
      oTrace("form "+i.toString()+"="+FCname);
      
      // Find hidden WindowState var
      var ws = document.forms[0].elements[hfWindowState+FCname];
      if (ws==null) {
        oTrace("!WinState");
      } else {
        oTrace("WindowState="+ws.value);
      }
    } else {
      oTrace("form not found");
    }
  }
  
  // Get Body offset (just for tracing here, see updateForms)
  oTrace("BodyOffset="+getBodyOffset());
}

//
// Always called before postback
//
function updateForms() {
  oTrace("updateForms");
  
  // Update the Body offset
  getBodyOffset();
  
  var wWidth, wHeight;
  var sWidth, sHeight;
  if (W3C) {
    wWidth = window.innerWidth;
    wHeight = window.innerHeight;
  } else {
    // offsetHeight is NOT the window size unless body style is set to: "height:100%;"
    wWidth = document.body.offsetWidth;
    wHeight = document.body.offsetHeight;
  }
  sWidth = window.screen.width;
  sHeight = window.screen.height;
  //oTrace("innerWH="+wWidth+","+wHeight);
  //oTrace("screenWH="+sWidth+","+sHeight);
  
  // get the BrowserInfo HiddenField
  var BI = document.forms[0].elements[hfBrowserInfo];
  if (BI!=null) {
    // set the values in the HiddenField
    BI.value = "w="+wWidth+","+wHeight+";s="+sWidth+","+sHeight;
  } else {
    oTrace("!hfBrowserInfo");
  }
  
  // get the Window states
  if (window.FCNames) {
    var elem = new Object();
    for (var i=0;i<FCNames.length;i++) {
      var FCname = FCNames[i];
      elem = document.getElementById(FCname);
      if (elem!=null) {
        oTrace("form "+i.toString()+"="+FCname);
        // Find hidden WindowState var
        var ws = document.forms[0].elements[hfWindowState+FCname];
        if (ws!=null) {
          // Get the window information (TODO: limited to 1 window, fixed code)
          var FrameDiv = document.getElementById("frame");
          var winX = dd.elements.frame.x-BodyOffset;
          var winY = dd.elements.frame.y;
          var winW = FrameDiv.clientWidth;
          var winH = FrameDiv.clientHeight;
          // TEST:
          var winDOM = FrameDiv.offsetLeft;
          // Set it
          oTrace("WindowState set");
          ws.value = "x="+winX+";y="+winY+";w="+winW+";h="+winH+";DOM="+winDOM;
        }
      }
    }
  }
  
  // Collect the Tree states
  if (window.TreeArray && window.TreeScripts) {
    for (var i=0;i<TreeArray.length;i++) {
      oTrace("3 "+i.toString()+"="+TreeArray[i]);
      //oTrace(""+TreeScripts[i]);
      var cmd = "result="+TreeScripts[i]+"_state('"+TreeArray[i]+"')";
      oTrace('cmd='+cmd);
      try {
        var result = false;
        eval(cmd);
        if (!result) {
          oTrace("!3");
        }
      } catch (err) {
        oTrace(err.name+": "+err.message);
      }
    }
  }
  
  // Popup before the postback to check above code
//alert('doPostback()');
  
}

//
// Prevents Session timeout by downloading a none-cachable object. 
//
function Reconnect() {
  if (ReconnectCount < ReconnectMaxCount) {
    ReconnectCount++;
    oTrace('Refreshed session ' + ReconnectCount.toString()+' time(s)');
    var img = new Image(1,1);
    img.src = 'Reconnect.aspx';
  } else {
    window.clearInterval(ReconnectInterval);
  }
}

//
// Hoverstyle functions
//
function setHover(elem, styleclass) {
  if (elem==null) return false;
  oTrace("sH "+elem.id);
  var orgStyleClass = new String("");
  if (elem.className) {
    orgStyleClass = elem.className;
  } else {
    oTrace("!className");
  }
  //INFO: document.createAttribute("orgStyle") + setAttributeNode() does not work in FF
  elem.setAttribute("orgStyle", orgStyleClass);
  elem.className = styleclass;
  return true;
}
function unsetHover(elem) {
  if (elem==null) return false;
  oTrace("uH "+elem.id);
  // INFO: elem.hasAttribute("orgStyle") does not work in IE6
  var orgStyle = elem.getAttribute("orgStyle");
  if (orgStyle==null) orgStyle="";
  oTrace("orgStyle="+orgStyle);
  elem.className = orgStyle;
  elem.removeAttribute("orgStyle");
  return true;
}

//
// Initialize all Tree menu's. Called just once for all menu's at the end of the page.
//
// displayTime = menu collaps timeout
function initializeTrees(displayTime) {
  oTrace("init3s");
  
  if (!window.TreeArray || !window.TreeScripts) {
    oTrace("No tree's to initialize.");
    return;
  }
  
  var elem = new Object();  // ?
  
  for (var i=0;i<TreeArray.length;i++) {
    oTrace("3 "+i.toString()+"="+TreeArray[i]);
    //oTrace(""+TreeScripts[i]);
    var cmd = "result="+TreeScripts[i]+"('"+TreeArray[i]+"',"+displayTime+")";
    //oTrace('cmd='+cmd);
    try {
      var result = false;
      eval(cmd);
      if (!result) {
        oTrace("!3");
      }
    } catch (err) {
      oTrace(err.name+": "+err.message);
    }
  }
  
}

//~Octrium standard script