/****
 *** Display routines
 ****   o JS requirements:  none (stand-alone)
 ***/

/* 
   rewriteDocument: rewrites document with substitutions, if any
   This function simulates advanced dHTML through capturing a page's
   original HTML in a JS var, munging the HTML contents (via regex)
   in reponse to a user-driven event, recreating the new document via 
   document.writes, and storing the new HTML in the JS var.
   @params: substitutions (an array of key/val hashes containing the 
            identifier of the substituted text and the substituted
            text itself)
            browser (string "NS" or "IE" from getBrowser()
 */

/* BUILD_JS_PACKAGES: library code
   fn: rewriteDocument
   deps: unmungeHTML insertHTMLIntoJSVar
 */

var open_tag = "_<_";
var close_tag = "_>_";
 
function rewriteDocument(substitutions,browser)
{
  var my_html = window.opener.my_html;
  my_html = unmungeHTML(my_html);
//alert(my_html);
  var doc = window.opener.document;
  for (var i = 0; i < substitutions.length; i++)
  {
    var key = substitutions[i]["key"];
    var pat = new RegExp("<!-- " + key + " -->.*<!-- /" + key + " -->", "g");
    my_html = my_html.replace(pat, "<!-- " + key + " --><SPAN CLASS='small_text'>" + substitutions[i]["val"] + "</SPAN><!-- /" + key + " -->");
  }

  my_html = insertHTMLIntoJSVar(my_html);
  
  doc.open();
  
  if (browser == 'NS')
  {
    var my_lines = my_html.split(/\n/);
    for (var i = 0; i < my_lines.length; i++)
    {
      //if (my_lines[i].match(/SCRIPT/))
        //alert(my_lines[i]);
      doc.writeln(my_lines[i]);
    }
  }
  else if (browser == 'IE')
    doc.writeln(my_html);
    
  doc.close();
  return;
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: insertHTMLIntoJSVar
   deps: mungeHTML
 */

function insertHTMLIntoJSVar(html)
{
  var html_js = mungeHTML(html);
  html = html.replace(/\/\* var my_html = ''; \*\//, "var my_html = '" + html_js + "';");
  return html;
}  
  
/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: unmungeHTML
 */

function unmungeHTML(html)
{
  html = html.replace(/_<_/g, "<");
  html = html.replace(/_>_/g, ">");
  return html;
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: mungeHTML
 */

function mungeHTML(html)
{
  html = html.replace(/'/g, "\\'");
  html = html.replace(/</g, "_<_");
  html = html.replace(/>/g, "_>_");
  html = html.replace(/\\n/, "\\\n");
  html = html.replace(/[\r\n\f]/g, "\\n");
  //html = html.replace(/(['"])?[^'"]*[\r\n\f]\1/g, "\\n");
  return html;
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: openHelpLink
   deps: openWindow
 */

function openHelpLink()
{
  var _tabid = document.body.getCookie("tabid");
  var _helpURL;
  switch(parseInt(_tabid,10))
  {
     case 0:_helpURL="setup_ODBC_help.epl";break;
     case 1:_helpURL="import_addr_help.epl"; break;
     case 2:_helpURL="setup_print_help.epl";break;
     case 3:_helpURL="setup_scanner_help.epl"; break;
     case 4:_helpURL="setup_scale_help.epl"; break;
     case 5:_helpURL="setup_plugin_help.epl"; break;
  }
  openWindow('help/'+_helpURL,'help_win','width=416,height=450,resizable=yes,scrollbars=1,menubar=1');
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: fnTabClick
   deps: isClassname removeClassname addClassname
 */

function fnTabClick( _tabs, _tables, _nTab )
{
  for (var i=0; i<_tabs.length; i++)
  {
    if (_tables)  // sometimes tabs don't have associated content - see rrd's addressbook.epl
      _tables[i].style.display = "none";
    var classname_str = _tabs[i].className;
    // disabled tabs are unaffected
    if (isClassname(_tabs[i], "tabDisabled"))
      continue;
    // add tabNot to current classnames
    removeClassname(_tabs[i], "tabYes");
    addClassname(_tabs[i], "tabNot");
  }

  if (_tables)
    _tables[_nTab].style.display = "inline";
  removeClassname(_tabs[_nTab], "tabNot");
  addClassname(_tabs[_nTab], "tabYes");
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: switchTabs
   deps: isClassname removeClassname addClassname
 */

function switchTabs(tab_ids, table_ids, tab_num)
{
  var tabs = [ ];
  for (var i = 0; i < tab_ids.length; i++)
    tabs.push(document.getElementById(tab_ids[i]));

  var tables = [ ];
  for (var i = 0; i < table_ids.length; i++)
    tables.push(document.getElementById(table_ids[i]));

  for (var i = 0; i < tabs.length; i++) {
    // hide all associated tables
    if (tables.length && tables[i])
      tables[i].style.display = "none";
      
    // disabled tabs are unaffected
    if (isClassname(tabs[i], "tabDisabled"))
      continue;
      
    // add tabNot to current classnames
    removeClassname(tabs[i], "tabYes");
    addClassname(tabs[i], "tabNot");
  }

  // show the forward table
  if (tables.length && tables[tab_num])
    tables[tab_num].style.display = "block";
    
  // change the active tab to correct style
  removeClassname(tabs[tab_num], "tabNot");
  addClassname(tabs[tab_num], "tabYes");
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: addClassname
   deps: isClassname
 */

// returns true if class_name was added to obj, 
//   false otherwise
function addClassname(obj, class_name)
{
  if (isClassname(obj, class_name))
    return false;
  var classname_str = obj.className || "";
  var classnames = classname_str.split(/\s+/) || [ ];
  classnames.push(class_name);
  obj.className = classnames.join(" ");
  return true;
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: removeClassname
   deps: isClassname
 */

// returns true if class_name was removed from obj, 
//   false otherwise
function removeClassname(obj, class_name)
{
  if (! isClassname(obj, class_name))
    return false;
  var classname_str = obj.className || "";
  var classnames = classname_str.split(/\s+/) || [ ];
  // we already know it's there, but be conservative
  // anyway
  var remove_classname = false;
  for (var i = 0; i < classnames.length; i++)
    if (classnames[i] == class_name) {
      remove_classname = true;
      break;
    }
  if (remove_classname)
    classnames.splice(i, 1);
  obj.className = classnames.join(" ");
  return true;
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: isClassname
 */

// checks to see whether obj has class_name as
//   one of its classNames
function isClassname(obj, class_name)
{
  var classname_str = obj.className || "";
  var classnames = classname_str.split(/\s+/) || [ ];
  for (var i = 0; i < classnames.length; i++)
    if (classnames[i] == class_name)
      return true;
  return false;
}

//* from cyberstation/ie/form.js *//

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: showSelects
   deps: intersect
 */

/**  NOTE: this is IE-specific code and will cause an error
 *         if used in DOM browsers
 * use to show or hide all selects on a page that intersect
 * given item
 * @param item reference to an html tag on the page
 * @param show (boolean - whether to show or hide selects)
 * @param get_intersected_selects (boolean - whether to, 
 *        instead of hiding/showing selects, simply return 
 *        a hash of the ones that would have been hidden/shown
 *        because they intersect with item)
 */
function showSelects(item, show, get_intersected_selects)
{
  var intersected_selects = { };
  var showorhide = (show) ? "visible" : "hidden";
  var selects = document.all.tags("select");

  for (var i = 0; i < selects.length; i++) {
    var intersects = intersect(item, selects[i]);
    if (get_intersected_selects && intersects)
      intersected_selects[selects[i].name] = selects[i];
    else {
      // don't do any hiding or visibilizing unless we're changing the visibility
      var currently_visible = (selects[i].style.visibility == "visible" || selects[i].style.visibility == "");
      var currently_hidden  = (selects[i].style.visibility == "hidden");
      if (show || intersects) {
        var current_visibility_matches = showorhide == "visible" ? currently_visible : currently_hidden;
        if (! current_visibility_matches)
          selects[i].style.visibility = showorhide;
      }
      else { // if don't want to show but doesn't intersect, show it
        if (! currently_visible)
          selects[i].style.visibility = "visible";
      }
    }
  }

  return intersected_selects;
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: intersect
   deps: getLeft getTop
 */

/**
 * determines whether item1 and item2 intersect on a page.
 * both item1 and item2 must refer to valid html tags on a page
 */
function intersect(item1, item2)
{
  var w1 = item1.offsetWidth;
  var h1 = item1.offsetHeight;
  var w2 = item2.offsetWidth;
  var h2 = item2.offsetHeight;
  var l1 = getLeft(item1);
  var t1 = getTop(item1);
  var l2 = getLeft(item2);
  var t2 = getTop(item2);
  var r1 = l1 + w1;
  var b1 = t1 + h1;
  var r2 = l2 + w2;
  var b2 = t2 + h2;

  var intersects = (r1>l2 && l1<r2 && t1<b2 && b1>t2);

  return intersects;
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: getLeft
 */

/**
 * computes absolute left coordinate of item on a page
 */
function getLeft(item)
{
  var left = item.offsetLeft;
  if (item.currentStyle.position == "absolute")
    left = 0;
  
  var styleleft = parseInt(item.currentStyle.left);
  if (!isNaN(styleleft))
    left += styleleft;
  
  if (item.offsetParent != null)
    left += getLeft(item.offsetParent);
  
  return left;
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: getTop
 */

/**
 * computes absolute top coordinate of item on a page
 */
function getTop(item)
{
  var top = item.offsetTop;
  
  if (item.currentStyle.position == "absolute")
    top = 0;
  
  var styletop = parseInt(item.currentStyle.top);
  if (!isNaN(styletop))
    top += styletop;
  
  if (item.offsetParent != null)
    top += getTop(item.offsetParent);
  
  return top;
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: transferSelItem
 */

function transferSelItem(from_sel,to_sel)
{
  var from_selected = from_sel.getSelected();

  var to_sel_data = to_sel.getAll();
  to_sel_data.push(from_selected);

  var from_sel_data = from_sel.getAll();
  from_sel_data.splice(from_sel.getSelectedIndex(), 1);

  from_sel.setElements(from_sel_data);
  to_sel.setElements(to_sel_data);
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: getElementPosition
 */

/* demos: gotten from the O'Reilly site, this seems to be cross-browser
   enough for our purposes
 */
function getElementPosition(elem_id,elem_document) {
  elem_document = elem_document || document;
  var offsetTrail = elem_document.getElementById(elem_id);
  var offsetLeft = 0;
  var offsetTop = 0;
  while (offsetTrail) {
    offsetLeft += offsetTrail.offsetLeft;
    offsetTop += offsetTrail.offsetTop;
    offsetTrail = offsetTrail.offsetParent;
  }
  if (navigator.userAgent.indexOf("Mac") != -1 && 
    typeof elem_document.body.leftMargin != "undefined") {
    offsetLeft += elem_document.body.leftMargin;
    offsetTop += elem_document.body.topMargin;
  }
  
  return { left : offsetLeft, top : offsetTop };
}

/* /BUILD_JS_PACKAGES */
