// charset=cp1251 vim: set tw=0 sw=1 et fdm=marker
/**
 * Javascript function set for template library
 *
 * @subpackage template-js
 * @package template
 * @access  public
 * @author  Dmitry Chernyakov <cdsa@yandex.ru>
 * @version $Id: template.js 22 2006-01-26 14:38:49Z Dmitry Chernyakov $
 */

// browser recognition {{{1

var dom = (document.getElementById)? true : false;
var nn4 = (document.layers)? true : false;
var ie = (document.all)? true : false;

// general functions }}}1

/**
 * shows all properties of the given object
 * @param object obj
 */
function showdomobject(obj) /* {{{1 */
{
 w=window.open('', 'info','resizable=yes,width=800,height=600,scrollbars,toolbar');
 w.document.writeln('<pre>');
 for (i in obj) {
  w.document.writeln('['+i+'] = '+obj[i]);
 }
 w.document.writeln('</pre><hr>');
 w.document.close();
}

// table column sorting part {{{1

function createRowsArray(table) /* {{{2 */
{
 var rows = new Array();
 var r = 0;
 if (table.tHead==null && table.tFoot==null)
  for (var r1 = 0; r1<table.rows.length; r1++, r++)
   rows[r] = table.rows[r1];
 else  
  for (var t = 0; t<table.tBodies.length; t++)
   for (var r1 = 0; r1<table.tBodies[t].rows.length; r1++, r++)
    rows[r] = table.tBodies[t].rows[r1];
 return rows;
}
function insertSortedRows(table, rows) /* {{{2 */
{
 if (ie) var rowsCopy = new Array(rows.length)
 for (var r = 0; r<rows.length; r++) {
  if (ie) rowsCopy[r] = rows[r].cloneNode(true);
  table.deleteRow(rows[r].rowIndex);
 }
 var tableSection = table.tBodies[table.tBodies.length - 1];
 for (var r = 0; r<rows.length; r++) {
  var row = ie ? rowsCopy[r] : rows[r];
  tableSection.appendChild(row);
 }
}
function dosortTable(table, sortFun) /* {{{2 */
{
 var rows = createRowsArray(table);
 if (rows.length>0) {
  rows.sort(sortFun);
  insertSortedRows(table, rows);
 }
}
function sortRowsAlpha(row1 , row2) /* {{{2 */
{
 var column = sortRowsAlpha.col;
 var cell1 = row1.cells[column].firstChild.nodeValue;
 var cell2 = row2.cells[column].firstChild.nodeValue;
 return cell1<cell2 ? -1 : (cell1 == cell2 ? 0 : 1);
}
function sortRowsNumber(row1 , row2) /* {{{2 */
{
 var column = sortRowsNumber.col;
 var cell1 = parseFloat(row1.cells[column].firstChild.nodeValue);
 var cell2 = parseFloat(row2.cells[column].firstChild.nodeValue);
 return cell1<cell2 ? -1 : (cell1 == cell2 ? 0 : 1);
}
function sortRowsLink(row1, row2) /* {{{2 */
{
 var column = sortRowsLink.col;
 var cell1 = findFirstLinkChild(row1.cells[column]).href;
 var cell2 = findFirstLinkChild(row2.cells[column]).href;
 return cell1 < cell2 ? -1 : (cell1 == cell2 ? 0 : 1);
}
function findFirstLinkChild(el) /* {{{2 */
{
 var child = el.firstChild;
 while (child.tagName != 'A')
  child = child.nextSibling;
 return child;
}
function sortTable(tab, col) /* {{{2 */
{
 var table = document.getElementById(tab);
 sortRowsAlpha.col = col;
 dosortTable(table, sortRowsAlpha);
 
 var rad = document.getElementById('rad'+col+tab);
 if (rad) rad.checked = true;
 return false;
}
function sortTableNumerical(tab, col) /* {{{2 */
{
 var table = document.getElementById(tab);
 sortRowsNumber.col = col;
 dosortTable(table, sortRowsNumber);
 return false;
}
function sortTableLinks(tab, col) /* {{{2 */
{
 var table = document.getElementById(tab);
 sortRowsLink.col = col;
 dosortTable(table, sortRowsLink);
 return false;
}
function findTableParent(node) /* {{{2 */
{
 while (node.tagName.toUpperCase() != 'TABLE')
  node = node.parentNode;
 return node;
}

// table options part {{{1

var oldX = 0;
var oldY = 0;
var newX = 0;
var newY = 0;
var currdialog = '';
var catched = false;

/**
 * Hides the column of table
 */
function hideColumn(id, colIndex) /* {{{2 */
{
 var table = document.getElementById(id);
 for (var r = 0; r<table.rows.length; r++)
  if (table.rows[r].cells[colIndex])
   table.rows[r].cells[colIndex].style.display = 'none';

 var ch = document.getElementById('ch'+colIndex+id);
 if (ch)
  ch.checked = false;
 return false;
}

/**
 * Shows the column of table
 */
function showColumn(id, colIndex) /* {{{2 */
{
 var table = document.getElementById(id);
 for (var r = 0; r<table.rows.length; r++)
  if (table.rows[r].cells[colIndex])
   table.rows[r].cells[colIndex].style.display = '';

 var ch = document.getElementById('ch'+colIndex+id);
 ch.checked = true;
 return false;
}

/**
 * Hides or shows the options layer. If it needs to allow this function
 * for particular tags only, set the tag parameter to uppercase tag name
 * other then ''
 * @param string id ID of object to show/hide
 * @param string tag event Tag name to allow
 * @param event e Mozilla event
 */
function displOptions(id, tag, e) /* {{{2 */
{
 var src = e&&!ie? e.target : event.srcElement;
 if (tag=='' || src.tagName==tag || src.parentNode.tagName==tag) {
  var div = document.getElementById(id);
  
  if ('block' == div.style.display) {
   div.style.display = 'none';
   
   removeEvent(document, "mousedown", checkclick);
   checkedobject=false;
  } else {
   newX = e&&!ie? e.pageX : event.clientX + document.body.scrollLeft;
   newY = e&&!ie? e.pageY : event.clientY + document.body.scrollTop;
   div.style.left    = newX-10;
   div.style.top     = newY-10;
   div.style.display = 'block';
   
   checkedobject=div;
   addEvent(document, "mousedown", checkclick);
  }
  return false;
 } else {
  return true;
 }
}

var checkedobject=false;
function checkclick(e) { /* {{{2 */
 if (!checkedobject) {
  return false;
 }
 var src = e&&!ie? e.target : event.srcElement;
 for (; src!=null && src!=checkedobject; src = src.parentNode);
 if (src==null) {
  displOptions(checkedobject.id, '', e);
  return stopEvent(e);
 }
};

function move(id, x, y) /* {{{2 */
{
 document.getElementById(id).style.left = x;
 document.getElementById(id).style.top  = y;
}
function movedialog(id, e) /* {{{2 */
{
 newX = e&&!ie? e.pageX : event.clientX + document.body.scrollLeft;
 newY = e&&!ie? e.pageY : event.clientY + document.body.scrollTop;
 var obj = document.getElementById(id);
 var ox = obj.offsetLeft;
 var oy = obj.offsetTop;

 oldY = newY-oy;
 oldX = newX-ox;
 move(id, newX-oldX,newY-oldY);

 catched = true;
 currdialog = id;
 return false;
}
function trackmouse(e) /* {{{2 */
{
 if (catched) {
  newX = e&&!ie? e.pageX : event.clientX + document.body.scrollLeft;
  newY = e&&!ie? e.pageY : event.clientY + document.body.scrollTop;
  move(currdialog, newX-oldX, newY-oldY);
 }
}
function mouseup(e) /* {{{2 */
{
 if (catched) {
  catched = false;
  return false;
 }
 return true;
}
function checkcheck(id) /* {{{2 */
{
 var table = document.getElementById(id);
 var f;
 for (var r = 0; r<table.tBodies[0].rows[0].cells.length; r++) {
  if ((f = document.getElementById('ch'+r+id)) && f.checked)
   return true;
 }
 return false;
}
function applyOptions(id) /* {{{2 */
{
 var f,s;
 var table = document.getElementById(id);
 for (var r = 0; r<table.tBodies[0].rows[0].cells.length; r++) {
  if ((f = document.getElementById('ch'+r+id)) && f.checked)
   showColumn(id, r);
  else
   hideColumn(id, r);
  if ((s = document.getElementById('rad'+r+id)) && s.checked)
   sortTable(id, r);
 }
}

function saveOptions(id, e) /* {{{2 */
{
 var form = document.getElementById('form'+id);
 var query='',x=0;

 for (var f=0; f<form.elements.length; f++)
  if (/^ch/.test(form.elements[f].id))
   query+= '&ch'+(x++)+'='+form.elements[f].checked;
   
 query = 'form='+form.hash.value+query;
 // template-preference.php returns HTTP 204 (No Content) code to avoid page reload
 query = 'template-preference.php?' + query;
 location.href=query;
 displOptions('div'+id, '', e);
}

// track the mouse  /* {{{2 */
if (dom && !ie) {
 addEventListener("mousemove", trackmouse, false);
 addEventListener("mouseup", mouseup, false);
} else {
 document.onmousemove = this.trackmouse;
 document.onmouseup   = this.mouseup;
}
// }}}1
// clicks on the TRLINK for Table object
// DONT declare functions named 'click'!
function clickhref(id, e) /* {{{1 */
{
 if(dom) {
  a=document.getElementById(id);
//  if(ie) a.click();
//  else
  location.href=a.href;
 }
 return stopEvent(e);
}

function clickcheck(obj, e) /* {{{1 */
{
 if(dom) {
  obj.checked = true;
  obj.parentNode.onclick = "stopEvent(event)";
 }
 return false;
}

var icept=false, iceptalpha=false, iceptnums=false;
var iceptkeyev=false; // external func
function setinterception(str, kind) /* {{{1 */
{
 if (kind=='nums')
  iceptnums = document.getElementById(str);
 else { if (kind=='alpha')
         iceptalpha = document.getElementById(str);
        else
         icept = document.getElementById(str);
      }
 document.onkeydown=intercept;
 
 for (var i=0; i<document.forms.length; i++) {
  for (var j=0; j<document.forms[i].elements.length; j++) {
   var o=document.forms[i].elements[j];
   if (o.type!='submit' && o.type!='button')
    addEvent(o, 'keydown', stopEvent);
   else
    addEvent(o, 'keydown', intercept);
  }
 }
}

function intercept(e) /* {{{1 */
{
// var code = e&&!ie? e.keyCode : event.keyCode;
 var ev = e&&!ie? e : window.event;
 var code = ev.keyCode;

 if (!ev.altKey && !ev.ctrlKey && ((code>47 && code<91) || code==8 // BS
 || code==219 // õ
 || code==221 // ú
 || code==222 // ý
 || code==188 // á
 || code==190 // þ
 || code==192 // ¸
 ) && !ev.target.disabled) {
  if (iceptalpha && (code>57 || code==8)) {
   if (iceptalpha.style.display=='none')
    iceptalpha.style.display = 'block';
   iceptalpha.focus();
  } else if (iceptnums && code>=48 && code<=57 && !ev.shiftKey) {
        if (iceptnumfocus)
         iceptnumfocus(ev);
        if (iceptnums.style.display=='none')
         iceptnums.style.display = 'block';
        iceptnums.focus();
       } else if (icept)
             icept.focus();
  return stopEvent(ev);
 }
 if (iceptkeyev) return iceptkeyev(ev);
 return true;
}

function rowhighlight(over,e) /* {{{1 */
{
 var src = e&&!ie? e.target : event.srcElement;
 if(src.tagName == 'TD')
  thishighlight(src.parentNode,over);
 else if(src.tagName == 'A') thishighlight(src.parentNode.parentNode,over);
}

function cellhighlight(over,e) /* {{{1 */
{
 var src = e&&!ie? e.target : event.srcElement;
 if(src.tagName == 'TD') thishighlight(src,over);
 else if(src.tagName == 'A') thishighlight(src.parentNode,over);
}

function thishighlight(object,over) /* {{{1 */
{
// New Technology: Expando properties
 if(over && /total|table/.test(object.className))
  object.polosa = object.className;

 if(!over && object.polosa) {
  object.className = object.polosa;
 } else if(over && object.polosahi)
     object.className = object.polosahi;
    else
     object.className = 'clickrow'+(over?'hover':'');
}

function formvalidate(e) /* {{{1 */
{
 var src = ie?window.event.srcElement:e.target;
 for (var ix=0; ix<src.elements.length; ix++)
  if (src.elements[ix].constraint) {
   var re = new RegExp(src.elements[ix].constraint, "");
   if (!re.test(src.elements[ix].value)) {
    alert((src.elements[ix].rule?src.elements[ix].rule:'Wrong value')
    +': \n'+src.elements[ix].value)
    return false;
   }
  }
 return true;
}

//function constraint() /* {{{1 */
//{
//}

// Context menus {{{1
/** sets Expando properties for context menu table for highlighting */
function contextexpando(id) /* {{{2 */
{
 var obj = document.getElementById(id);
 for (var o1=0; o1<obj.childNodes.length; o1++)
  if (obj.childNodes[o1].tagName && obj.childNodes[o1].tagName=='TABLE') {
   for (var o2=0; o2<obj.childNodes[o1].childNodes.length; o2++)
    if (obj.childNodes[o1].childNodes[o2].tagName &&
    obj.childNodes[o1].childNodes[o2].tagName=='TBODY') {
     ot = obj.childNodes[o1].childNodes[o2].childNodes;
     for (var o3=0; o3<ot.length; o3++)
      if (ot[o3].tagName && ot[o3].tagName=='TR') {
       ot[o3].polosa   = 'lo';
       ot[o3].polosahi = 'hi';
       for (var o4=0; o4<ot[o3].childNodes.length; o4++)
        if (ot[o3].childNodes[o4].tagName && ot[o3].childNodes[o4].tagName=='TD'){
         ot[o3].childNodes[o4].polosa   = 'lo';
         ot[o3].childNodes[o4].polosahi = 'hi';
//         showdomobject(ot[o3].childNodes[o4]);
        }
      }
    }
  }
}
/** stores table body line number into context DIV on event */
function storeline(id, e) /* {{{2 */
{
 var src = ie?window.event.srcElement:e.target;
 var div = document.getElementById(id);
 for (; src!=null && src.tagName!='TR'; src = src.parentNode);
 div.href = src.cells[div.primarykey].firstChild.href;
 div.evsrc = ie?window.event.srcElement:e.target;
}
/** executes click to the context menu item */
function ctxtclick(id, href, e) /* {{{2 */
{
 var src = e&&!ie? e.target : window.event.srcElement;
 var event = e;

 cellhighlight(false, event);
 displOptions(id, '', e);
 if (/javascript:(.*)/.test(href))
  eval(RegExp.$1);
 else
  if (/open:(.*)/.test(href))
   window.open(document.getElementById(id).href+RegExp.$1);
  else
   location.href=document.getElementById(id).href+href;
 return stopEvent(e);
}
// }}}1
// inline table cell editing  /* {{{1 */
function editCell(cell,tid) /* {{{2 */
{
/* if (document.all) {
  cell.innerHTML =
   '<INPUT ' +
   ' ID="editCell"' +
   ' CLASS="inputtext"' +
   ' ONCLICK="event.cancelBubble = true;"' + 
   ' ONCHANGE="setCell(this.parentElement, this.value)" ' +
   ' ONBLUR="setCell(this.parentElement, this.value)" ' +
   ' VALUE="' + cell.innerText + '"' +
   ' SIZE="' + cell.innerText.length + '"' +
   '>';
  document.all.editCell.focus();
  document.all.editCell.select();
 }
 else if (document.getElementById) {*/
  cell.normalize();
  var input = document.createElement('INPUT');
  input.setAttribute('value', cell.firstChild.nodeValue);
  input.setAttribute('size', Math.min(Math.max(cell.firstChild.nodeValue.length,5),40));
  input.setAttribute('class', 'inputtext');
  input.onblur = function (evt) { setCell(this.parentNode,this.value); };
  input.onclick = function (evt) { 
   evt.cancelBubble = true;
   if (evt.stopPropagation) evt.stopPropagation(); };
  input.onchange = function (evt) { fieldchanged(cell,tid); };
  
  cell.replaceChild(input, cell.firstChild);
  input.focus();
/*  input.select();*/
// }
 return false;
}
function setCell(cell, value) /* {{{2 */
{
/* if (document.all)
  cell.innerText = value;
 else if (document.getElementById)*/
  cell.replaceChild(document.createTextNode(value), cell.firstChild);
 return false;
}
function fieldchanged(fld, tid) /* {{{2 */
{
 var form = document.getElementById('f'+tid)
 var f = document.getElementById('f'+tid+'changed')
 if (!f) {
  f = document.createElement('INPUT')
/*  f.setAttribute('type', 'hidden')*/
  f.setAttribute('name', 'f'+tid+'changed')
  f.setAttribute('id', 'f'+tid+'changed')
  f.setAttribute('value', fld.id)
  form.appendChild(f)
 } else
  f.setAttribute('value', f.value+','+fld.id)
// fld.setAttribute('changed', '1')
}
// }}}1
function showbacktrace(div, table) /* {{{1 */
{
 var tableo = document.getElementById(table)
 if (tableo.style.display=="none") {
  tableo.style.display="block"
  div.style.background="#c2b5ce"
 } else {
  tableo.style.display="none"
  div.style.background="#e2d5de"
 }
}
function launchbykey(e, butname) /* {{{1 */
{
 var code = e&&!ie? e.which : event.keyCode;
 if (code==32 || code==13) {
  if(ie) {
   event.cancelBubble = true;
   event.returnValue = false;
  } else {
   e.preventDefault();
   e.stopPropagation();
  }
  document.getElementById(butname).onclick();
  return false;
 } else return true;
}

function dynamic(name) /* {{{1 */
{
 window.onscroll = function() {
  var b = document.body;
//  window.status=b.scrollHeight-b.scrollTop-b.clientHeight;
  if ((b.scrollHeight-b.scrollTop-b.clientHeight) <= 0) {
   var x = document.getElementById(name).tBodies[0].rows.length;
   ajaxread('template/template-ajax.php?table='+name+'&from='+x+'&to='+(x+20), name);
  }
 };
 addEventListener('DOMMouseScroll', onscroll, false);
}

function ajaxread(url, name) /* {{{1 */
{
 var req = new XMLHttpRequest();
 req.onreadystatechange = function()
 { if (req.readyState==4)
    if(req.status == 200) {
     window.status = 'received: '+url;
     var b = document.createElement('DIV');
     b.innerHTML = '<table>'+req.responseText+'<table>';
     var obj = document.getElementById(name);
     var t = obj.tBodies[0];
     var len = b.firstChild.rows.length;
     for (var ix = 0; ix<len; ix++) {
      var r = t.insertRow(t.rows.length);
      t.replaceChild(b.firstChild.rows[0], r);
     }
     recalcviewport(obj);
     if (fixbody) fixbody(obj);
    }
 }
 req.open('GET', url, true);
 req.send('');
}

function checkboxall(form, prefix, onoff) /* {{{1 */
{
 var form = document.forms[form].elements;
 var re = new RegExp(prefix);
 for (var ix=0; ix<form.length; ix++) {
  if (re.test(form[ix].name)) form[ix].checked = onoff;
 }
}

// Utility functions copied from DHTML Calendar {{{1
function getAbsolutePos(el) /* {{{2 */
{
 if (!el) return { x: 0, y: 0 };
 var SL = 0, ST = 0;
 var is_div = /^div$/i.test(el.tagName);
 if (is_div && el.scrollLeft)
  SL = el.scrollLeft;
 if (is_div && el.scrollTop)
  ST = el.scrollTop;
 var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };
 if (el.offsetParent) {
  var tmp = getAbsolutePos(el.offsetParent);
  r.x += tmp.x;
  r.y += tmp.y;
 }
 return r;
}

function stopEvent(e) /* {{{2 */
{
 e || (e = window.event);
 if (ie) {
  e.cancelBubble = true;
  e.returnValue = false;
 } else {
  e.preventDefault();
  e.stopPropagation();
 }
 return false;
}

function stopBubble(e) /* {{{2 */
{
 e || (e = window.event);
 if (ie)
  e.cancelBubble = true;
 else
  e.stopPropagation();
 return false;
}

function addEvent(el, evname, func) /* {{{2 */
{
 if (el.attachEvent) { // IE
  el.attachEvent("on" + evname, func);
 } else if (el.addEventListener) { // Gecko / W3C
  el.addEventListener(evname, func, true);
 } else {
  el["on" + evname] = func;
 }
}

function removeEvent(el, evname, func) /* {{{2 */
{
 if (el.detachEvent) { // IE
  el.detachEvent("on" + evname, func);
 } else if (el.removeEventListener) { // Gecko / W3C
  el.removeEventListener(evname, func, true);
 } else {
  el["on" + evname] = null;
 }
}

function createElement(type, parent) /* {{{2 */
{
 var el = null;
 if (document.createElementNS) {
  // use the XHTML namespace; IE won't normally get here unless
  // _they_ "fix" the DOM2 implementation.
  el = document.createElementNS("http://www.w3.org/1999/xhtml", type);
 } else {
  el = document.createElement(type);
 }
 if (typeof parent != "undefined") {
  parent.appendChild(el);
 }
 return el;
}

// }}}1
// O_VIEWPORT functions {{{1
var vpobj;                              // table object
var vprownum=0;                         // current row number
var vprows;                             // array of TRs of table
var vpcellnum=0;                        // current cell number
var iheight, iwidth;                    // iframe inner size
var vpdiv;                              // iframe container
var vpiframe;                           // iframe itself
var txtforvp;                           // text field to link with VP
var mainobj;                            // hidden field filled with code
var vpevent = null;                     // on viewport change event handler
var vpkeyev = null;                     // on keypress user-def handler
var vpcurrentrow;                       // element of vprows
var vpcurrentcell;                      // current cell for VIEWGRID
var vpyoffset = 0;                      // from top of window to table header
/**
 * @param string name: table id
 * @param string type: 'line' = VIEWPORT, 'cell' = VIEWGRID
 */
function setviewport(name, type) /* {{{2 */
{
 vpobj    = document.getElementById(name);
// vprownum = vpcellnum = 0;
 recalcviewport(vpobj);
 document.onkeypress = vpkeyevent;
 var highvpbody = "vpcurrentrow = vprows[vprownum]; "; // {{{
 if (type=='line') {
  highvp = new Function('over', highvpbody+"if (over) { \n\
   vpcurrentrow.polosa    = vpcurrentrow.className; \n\
   vpcurrentrow.className = 'viewport'; \n\
   if (vpevent) vpevent(); \n\
  } else { \n\
   vpcurrentrow.className = vpcurrentrow.polosa; \
  }");
 } else if (type=='cell') {
  highvp = new Function('over', highvpbody+"\
  vpcurrentcell = vprows[vprownum].cells[vpcellnum]; \n\
  if (over) { \n\
   vpcurrentcell.polosa    = vpcurrentcell.className; \n\
   vpcurrentcell.className = 'viewport'; \n\
   if (vpevent) vpevent(); \n\
  } else { \n\
   vpcurrentcell.className = vpcurrentcell.polosa; \n\
  }");
  vphoriz = new Function('code', "switch(code) { \n\
  case 37: // left \n\
   if (vpcellnum>0) { highvp(false); vpcellnum--; highvp(true); } \n\
   break; \n\
  case 39: // right \n\
   if (vpcellnum<vpcurrentrow.cells.length-1) { highvp(false); vpcellnum++; highvp(true); } \n\
   break; \
  }");
 }
 highvp(true); // }}}
}

function recalcviewport(obj) /* {{{2 */
{
 iheight = window.innerHeight;
 iwidth  = window.innerWidth;

 vprows   = new Array();
 var x    = 0;
 var body = findchild(obj, 'TBODY');
 if (!body) return false;

 for(var i=0; i<body.childNodes.length; i++) {
  if (body.childNodes[i].tagName=='TR') {
   body.childNodes[i].vpnum = x;
   vprows[x++] = body.childNodes[i];
  }
 }

 body.onmousedown = vpclick;
}


/*function highvp(over)
{
 vpcurrentrow = vprows[vprownum];
 if (over) {
  vpcurrentrow.polosa    = vpcurrentrow.className;
  vpcurrentrow.className = 'viewport';
  if (vpevent)
   vpevent();
 } else {
  vpcurrentrow.className = vpcurrentrow.polosa;
 }
}*/
function vpclick(e) /* {{{2 */
{
 highvp(false);
 vprownum = e.target.parentNode.vpnum;
 highvp(true);
 if (vpkeyev) vpkeyev(e);
 return true;
}
function vpselected() /* {{{2 */
{
 if (vprows[vprownum].childNodes[0] && vprows[vprownum].childNodes[1]) {
  parent.divselect.txtforvp.value = vprows[vprownum].childNodes[1].innerHTML;
  parent.divselect.mainobj.value  = vprows[vprownum].childNodes[0].innerHTML;
 }
 parent.window.divselect.closedivselect();
}
function vpkeyevent(e) /* {{{2 */
{
 var code = e&&!ie? e.keyCode : event.keyCode;
 var retval = true;

 switch (code) {
  case 32: // KEY space
  case 13: // KEY enter
      if (parent.divselect)
       vpselected();
      break;
  case 27: // KEY esc
      if (parent.window.divselect) {
       parent.window.divselect.closedivselect();
       return false;
      }
      retval = true;
      break;
  case 37: // KEY left
  case 39: // KEY right
      if (vphoriz) vphoriz(code);
      break;
  case 33: // KEY pgup
      if (vprownum>0) {
       var localoff = 0;
       highvp(false);
       while (localoff<(iheight-vpyoffset) && vprownum>0) {
        vprownum -= Math.min(1, vprownum);
        window.scrollBy(0, -vprows[vprownum].offsetHeight);
        localoff += vprows[vprownum].offsetHeight;
       }
       highvp(true);
       window.onscroll();
      }
      retval = false;
      break;
  case 34: // KEY pgdn
      if (vprownum<vprows.length-1) {
       var localoff = 0;
       highvp(false);
       while (localoff<(iheight-vpyoffset) && vprownum<(vprows.length-1)) {
        vprownum += Math.min(1, vprows.length-vprownum-1);
        window.scrollBy(0, vprows[vprownum].offsetHeight);
        localoff += vprows[vprownum].offsetHeight;
       }
       highvp(true);
       window.onscroll();
      }
      retval = false;
      break;
  case 36: // KEY home
      highvp(false);
      vprownum = 0;
      highvp(true);
      retval = false;
      break;
  case 35: // KEY end
      highvp(false);
      vprownum = vprows.length-1;
      highvp(true);
      retval = false;
      break;
  case 38: // KEY up
      if (vprownum>0) {
       highvp(false); vprownum--; highvp(true);
      }
      retval = false;
      break;
  case 40: // KEY down
      if (vprownum<vprows.length-1) {
       highvp(false); vprownum++; highvp(true);
      }
      retval = false;
      break;
 }
 stayvisible();
 if (vpkeyev) vpkeyev(e);
 return retval;
}
function stayvisible() /* {{{2 */
{
 var p = getAbsolutePos(vprows[vprownum]);
 var lev = p.y+vprows[vprownum].offsetHeight-iheight;
 if (lev>window.pageYOffset) {
  window.scroll(0, lev);
  window.onscroll();
 } else if (p.y<(window.pageYOffset+vpyoffset)) {
  window.scroll(0, p.y-vpyoffset);
  window.onscroll();
 }
}
function findchild(object, childtag) /* {{{2 */
{
 for (var i=0; i<object.childNodes.length; i++) {
  if (object.childNodes[i].tagName==childtag) return object.childNodes[i];
 }
 return false;
}
// }}}1
