/*
*******************************************************************************

    FiForms -- A collection of PHP classes designed 
    to facilitate rapid development of web-database software

    Copyright (C) 2003 - 2007 Daniel McFeeters

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    General Public License for more details.

    You should have received a copy of the GNU General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


    The original author of this library can be contacted at the following 
    address:

    Daniel McFeeters
    312 Bill Neal Rd.
    Whitley City, KY 42653-4209
    email:databases [at] fiforms [dot] org
    http://www.fiforms.org/


Project Started May 4, 2003
*******************************************************************************
fiform.js

Javascript Functions for FiForms

Please see http://www.fiforms.org/ for more information about FiForms PHP
Classes

*******************************************************************************
*/

var FiForms_dirty = false;
var FiForms_confirm = false;
var whichDateField = false;
var FiFormData;
var warnOnUnload = false;
var previewWin = false;
var previewWinLocation = "";
var lastPrintTrigger = false;
var globalShiftOn = false;
var calPopup;
if(typeof(CalendarPopup) != 'undefined')
{
   calPopup = new CalendarPopup('calendardiv');

    calPopup.setReturnFunction("setDateValues");
    calPopup.showYearNavigation();
    calPopup.setCssPrefix("FiForm");
}
else
{
   calPopup = false;
}

var printReportOnOpen = false;
var fiformsDynSel = new Array();
var fiformsSelCount = 0;
var fiformsOptCount = 0;
var fiformsDynSelObjects = new Array();
var iNumberCount = 0;
var fiformsiNumber = new Array();
var reloadTimeout = false;
var sheetView = false;



/* ****************************
   iNumber Functions
   **************************** */

function iNumberSetting(id,digits,decimals,thseperator,decpoint)
{
    this.id = id;
    this.digits = digits;
    this.decimals = decimals;
    this.thseperator = thseperator;
    this.decpoint = decpoint;
}

function filterNumberKeys(e,fieldName)
{
    num = /[\d]/;
}

function getNumberSettings(id)
{
   i = 0;
   while(fiformsiNumber[i].id != id)
   {
       i++;
       if(!fiformsiNumber[i])
       {
           return false;
       }
   }
   return fiformsiNumber[i];
}

function addCommas(nStr,thseperator,maxX1)
// adapted from http://www.mredkj.com/javascript/numberFormat.html
{
        nStr += '';
        x = nStr.split('.');
        x1 = x[0];
        x2 = x.length > 1 ? '.' + x[1] : '';
        // test if the number is too long
        numLen = x1.search("-") == -1 ? x1.length : x1.length - 1;
        if(numLen > maxX1)
        {
            len = maxX1;
            if(len < 1)
            {
                len = 1;
            }
            x1 = x1.substr(x1.length - len);
        }
        // format the number
        var rgx = /(\d+)(\d{3})/;
        while (rgx.test(x1)) {
                x1 = x1.replace(rgx, '$1' + thseperator + '$2');
        }
        return x1 + x2;
}

function validateNumberField(fieldName)
{
    input = document.getElementById(fieldName);
    settings = getNumberSettings(fieldName);
    strValue = input.value;
    if(strValue == "")
    {
        return;
    }
    while(settings.thseperator != "" && strValue.search(settings.thseperator) != -1)
    {
        strValue = strValue.replace(settings.thseperator,"");
    }
    strValue = strValue.replace(settings.decpoint,".");
    try
    {
        strValue = eval(strValue);
    }
    catch(err)
    {
    }
    numValue = new Number(strValue);
    numValue = numValue.toFixed(settings.decimals);
    strValue = numValue.toString();
    if(settings.thseperator != "")
    {
        strValue = addCommas(strValue,settings.thseperator,settings.digits - settings.decimals);
    }
    if(strValue == "NaN")
    {
        numValue = new Number(0.0);
        numValue = numValue.toFixed(settings.decimals);
        strValue = numValue.toString();
    }
    strValue = strValue.replace(".",settings.decpoint);
    input.value = strValue;
}


/* ****************************
   Dynamic Select Box Function
   **************************** */

function findPos(obj) 
// This handy little function is courtesy of 
// Peter-Paul Koch
// http://www.quirksmode.org/js/findpos.html
// Find the position as X,Y coordinates of an object
// relative to the top of the page.
{
    var curleft = curtop = 0;
    if (obj.offsetParent) 
    {
        curleft = obj.offsetLeft
        curtop = obj.offsetTop
        while (obj = obj.offsetParent) 
        {
                curleft += obj.offsetLeft
                curtop += obj.offsetTop
        }
    }
    return [curleft,curtop];
}

function vPair(name,value)
{
    this.name = name;
    this.value = value;
}

function dropDown(id)
{
    this.id = id;
    this.open = false;
    this.setup = false;
    this.last = "";
    this.reload = document.getElementById(id).getAttribute('class');
}

function findDynSel(objectID)
{
    key = 0;
    while(fiformsDynSelObjects[key] && fiformsDynSelObjects[key].id != objectID)
    {
        key++;
    }
    return(fiformsDynSelObjects[key]);
}

function dynSelectNav(e,objectID)
{
    var newRow = false;
    key = getKeyCode(e);
    if(key == 40 || key == 38)
    {
        currentRow = document.getElementById(objectID+"_selected");
        if(key == 38)  // Up Arrow
        {
            if(currentRow && currentRow.parentNode.previousSibling)
                newRow = currentRow.parentNode.previousSibling.firstChild;
        }
        else if(key == 40)  // Down Arrow
        {
            if(currentRow && currentRow.parentNode.nextSibling)
                newRow = currentRow.parentNode.nextSibling.firstChild;
        }
        if(currentRow && newRow)
        {
            currentRow.id = "";
            currentRow.setAttribute('class','unselected');
            while(currentRow.nextSibling)
            {
                currentRow = currentRow.nextSibling;
                currentRow.setAttribute('class','unselected');
            }
            newRow.id = objectID+"_selected";
            newRow.setAttribute('class','selected');
            while(newRow.nextSibling)
            {
                newRow = newRow.nextSibling;
                newRow.setAttribute('class','selected');
            }
            // Scroll the DIV to new location, if the currently selete row is 2 rows down.
            if(newRow.parentNode)
            {
                distFromTop = 0;
                trow = newRow.parentNode;
                while(trow = trow.previousSibling)
                {
                        distFromTop += trow.offsetHeight;
                }
                sarea = document.getElementById(objectID+"_selectionarea");
                sarea.scrollTop = distFromTop;
            }
        }
    }
    else
    {
        return filterEscape(e);
    }
}

function closeDynSelect(objectID)
{
    sel = findDynSel(objectID);
    sarea = document.getElementById(objectID + '_selectionarea');
    
    if(sel && sel.open) // It's currently open, so we need to close it.
    {
        sarea.style.display = 'none';
        sel.open = false;
    }
}

function openDynSelect(objectID,selectAll)
{
    // Find the properties object in fiformsDynSelObjects
    key = 0;
    while(fiformsDynSelObjects[key] && fiformsDynSelObjects[key].id != objectID)
    {
        key++;
    }
    if(!fiformsDynSelObjects[key])
    {
        fiformsDynSelObjects[key] = new dropDown(objectID);
    }
    
    // find the selectionarea div
    sarea = document.getElementById(objectID + '_selectionarea');
    
    if(!fiformsDynSelObjects[key].open) // It's currently not open, so we need to open it.
    {
            displayObject = document.getElementById(objectID + '_display');
        if(!fiformsDynSelObjects[key].setup)
        {
                // We need to put the dropdown in position relative to the display box
            sarea.style.position = "absolute";
            position = findPos(displayObject);
            sarea.style.top = position[1] + displayObject.offsetHeight + "px";
            sarea.style.left = position[0] + "px";
            sarea.style.overflow = "auto";
        }
        sarea.style.display = 'block';
        fiformsDynSelObjects[key].open = true;
        displayObject.focus();
        if(selectAll)
        {
            displayObject.selectionStart = 0;
            displayObject.selectionEnd = displayObject.value.length;
        }
    }
    //if(fiformsDynSelObjects[key].reload == "always")   //FIXME
    {
        
        reloadSelectRows(objectID,false);
    }
}

function clickDynRow(selectedRow,objectID)
{
    currentRow = document.getElementById(objectID+"_selected");
    currentRow.id = "";
    currentRow.setAttribute('class','unselected');
    while(currentRow.nextSibling)
    {
        currentRow = currentRow.nextSibling;
        currentRow.setAttribute('class','unselected');
    }
    newRow = selectedRow.firstChild;
    newRow.id = objectID+"_selected";
    newRow.setAttribute('class','selected');
    while(newRow.nextSibling)
    {
        newRow = newRow.nextSibling;
        newRow.setAttribute('class','selected');
    }
    updateDynSelect(objectID,true);
}

function updateDynSelect(objectID,closeMe,isblur)
{
    svalue = document.getElementById(objectID);
    object = document.getElementById(objectID+'_selected');
    if(object)
    {
        value = object.getAttribute("title");
    }
    if(!object || !object.firstChild)
    {
        closeDynSelect(objectID);  // close the dropdown
        return;
    }
    displayValue = object.firstChild.nodeValue;
    sdisplay = document.getElementById(objectID+"_display");
    if(sdisplay.value == '' && isblur)
    {
        svalue.value = '';
    }
    else if(value || displayValue)
    {
        svalue.value = value;
        sdisplay.value = displayValue;
    }
    if(closeMe)
    {
            closeDynSelect(objectID);  // close the dropdown
    }
    reloadSelectDepends(objectID,false);    
} // function updateDynSelect

function dynSelectChange(e,objectID)
{
    if(xmlDatasetReq && xmlDatasetReq.readyState == 1)
    {
        return false;
    }
    key = getKeyCode(e);
    if(key == 9 || key == 13 || key == 27)
    {
        return false;
    }
    // FIXME: Filter out all navigation keys
    sel = findDynSel(objectID);
    display = document.getElementById(objectID+"_display");
    if(!sel || !sel.open)
    {
        openDynSelect(objectID, false);
    }
    else
    {
        //if(sel.reload == "always")  //FIXME
        {
            if(reloadTimeout)
            {
                window.clearTimeout(reloadTimeout);
            }
            reloadTimeout = window.setTimeout('reloadSelectRows("'+objectID+'",false);',500);
        }
    }
    return filterShiftUp();
}

/* ****************************
   Filtering Functions
   **************************** */

function buildFiFormFilter(fieldName)
{
    filterDiv = document.getElementById(fieldName + '_filter_div');
    filterDiv.style.display = "block";
    
}

function cancelFiFormFilter(fieldName)
{
    filterDiv = document.getElementById(fieldName + '_filter_div');
    filterDiv.style.display = "none";
    
}

function removeFiFormFilter(fieldName)
{
    theForm = document.getElementById(fieldName + '_filter_form');
    allForms = document.getElementsByTagName('form');
    i = 0;
    while(allForms[i])
    {
        if(allForms[i] != theForm)
        {
            fParent = allForms[i].parentNode;
            fParent.removeChild(allForms[i]);
            i = -1;
            allForms = document.getElementsByTagName('form');
        }
        i++;
    }
    canceledInput = document.getElementById(fieldName);
    theFieldset = canceledInput.parentNode;
    theFieldset.removeChild(canceledInput);

    theForm.submit();
    
}

function enableInheritedFields(formName)
{
    theForm = document.getElementById(formName);
    inputTags = document.getElementByTagName('input');
    i = 0;
    while(inputTags[i])
    {
        if(inputTags[i].id.indexOf("_"+formName))
        {
            inputTags[i].id = inputTags[i].id.substr(0,inputTags[i].id.indexOf("_"+formName));
        }
    }
}

/* ****************************
   Calendar Functions
   **************************** */

function showCalendar(fieldname)
{
    whichDateField = fieldname;
    calPopup.select(FiFormData[fieldname+'_MONTH'],'select_'+fieldname,'M/d/yyyy',FiFormData[fieldname+'_MONTH'].value+'/'+FiFormData[fieldname+'_DAY'].value+'/'+FiFormData[fieldname+'_YEAR'].value);
    return false;
}

function refreshCalendar(fieldname)
{
    var isVisible = document.getElementById('calendardiv').style.visibility == "visible";
    calPopup.hideCalendar();
    if(isVisible)
    showCalendar(fieldname);
    fillMasterDate(fieldname);
}

function fillMasterDate(fieldname)
{
    if(FiFormData[fieldname])
    {
        year = FiFormData[fieldname+'_YEAR'].value;
        month = FiFormData[fieldname+'_MONTH'].value;
        if(month.length == 1)
        {
           month = "0" + month;
           //FiFormData[fieldname+'_MONTH'].value = month;
        }
        day = FiFormData[fieldname+'_DAY'].value;
        if(day.length == 1) 
        {
            day = "0" + day;
            //FiFormData[fieldname+'_DAY'].value = day;
        }
        if(month.length == 2 && day.length == 2 && year.length == 4)
        {
            FiFormData[fieldname].value = year + "-" + month + "-" + day;
        }
        else
        {
            FiFormData[fieldname].value = "";
        }
    }
}

function setDateValues(y,m,d) 
{
     FiFormData[whichDateField+"_YEAR"].value=y;
     FiFormData[whichDateField+"_MONTH"].value=m;
     FiFormData[whichDateField+"_DAY"].value=d;
     markDirty(); 
     fillMasterDate(whichDateField);

}

/* ****************************
   Record Save/Warning Functions
   **************************** */

function disableWarning()
{
    warnOnUnload = false;
}

function confirmLink(url,target,opts)
{
  if(target == '')
  {
    if(FiForms_dirty && warnOnUnload)
    {

        if(!window.confirm("This will discard all changes to this record. Do you want to continue?"))
        {
           return 0;
        }
        else
        {
            FiForms_confirm = true;
        }
    }
    window.location.href = url;
  }
  else
  {
      window.open(url,target,opts);
  }
}

function confirmUnload()
{
    if(previewWin && previewWin.close)
    {
        //previewWin.close();
    }
    if(!warnOnUnload)
      return;
      
    if(FiForms_dirty && !FiForms_confirm)
    {
      if(!(window.event && document.getElementById('calendardiv').style.visibility == "visible"))
      {
        message = "You are about to lose the changes you made to this record."
        return message;
      }
    }
}

function markDirty()
{
    FiForms_dirty = true;
    //FiFormData.submitButton.style.color = '#8080ff';
    //FiFormData.submitButton.style.bordercolor = '#8080ff';
}

function markClean()
{
        FiForms_dirty = false;
        //document.getElementById('submitButton').attributes['class'] = 'disabled_button';
        //FiFormData.submitButton.style.color = '#d0d0d0';
        //FiFormData.submitButton.style.bordercolor = '#e0e0e0';
        FiFormData.reset();
}

function validateSubmit()
{
    rememberPosition();
    FiForms_confirm = true;
}

/* ****************************
   Key Capturing Functions
   **************************** */

function getKeyCode(e)
{
    if(!e)
        return false;
    // adapted from http://www.mredkj.com/tutorials/validate.html
    var key;
    if(window.event) {
        // for IE, e.keyCode or window.event.keyCode can be used
        //key = e.keyCode; 
        key = window.event.keyCode;
    }
    else if(e.which) {
        // netscape
        key = e.which; 
    }
    else {
        // no event, so pass through
        return true;
    }
    return key;
}

/* ****************************
   Date Input Keystroke Functions
   **************************** */

function date_day_keypress(e,fieldname)
{
    var key;
    var keychar;
    var reg;    
    var day;
    var year;

    day = FiFormData[fieldname+'_DAY']
    year = FiFormData[fieldname+'_YEAR'];

    key = getKeyCode(e);
    keychar = String.fromCharCode(key);
    reg = /[\x00-\x1F\x30-\x39]/;
    num = /\d/;

    moveNext = false;
    if(window.event && document.selection)
    {
      if((document.selection.createRange().text.length == 0 && day.value.length == 2) && num.test(keychar))
        moveNext = true;
    }
    else
    {
      if(day.selectionStart == 2 && day.selectionEnd == 2 && num.test(keychar))
        moveNext = true;
    }
    if(moveNext)
    {
        year.focus();
        year.value = keychar;
        return false;
    }
    if(keychar == '/' || keychar == '-')
    {
        year.focus();
        year.value = "";
        return false;
    }
    if(keychar == " ")
    {
        if(document.getElementById('calendardiv').style.visibility != "visible")
            showCalendar(fieldname);
        return false;
    }
    if(!reg.test(keychar) && !num.test(keychar))
    {
        return false;
    }
    refreshCalendar(fieldname);
    return true;
}

function selectAll(box)
{
    box.selectionStart = 0;
    box.selectionEnd = box.value.length;
}

function date_month_keypress(e,fieldname)
{
    var key;
    var keychar;
    var reg;    
    var month;
    var day;

    month = FiFormData[fieldname+'_MONTH'];
    day = FiFormData[fieldname+'_DAY']

    key = getKeyCode(e);
    keychar = String.fromCharCode(key);
    reg = /[\x00-\x1F\x30-\x39]/;
    num = /\d/;

    moveNext = false
    if(window.event && document.selection)
    {
      if((document.selection.createRange().text.length == 0 && month.value.length == 2) && num.test(keychar))
        moveNext = true;
    }
    else
    {
      if(month.selectionStart == 2 && month.selectionEnd == 2 && num.test(keychar))
        moveNext = true;
    }
    if(moveNext)
    {
        day.focus();
        if(!(window.event && document.selection))
          day.value = keychar;
        return false;
    }
    if(keychar == '/' || keychar == '-')
    {
        day.focus();
        day.value = "";
        return false;
    }
    if(keychar == " ")
    {
        if(document.getElementById('calendardiv').style.visibility != "visible")
            showCalendar(fieldname);
        return false;
    }
    if (!reg.test(keychar) && !num.test(keychar))
    {
        return false;
    }
    if(num.test(keychar))
    {
       markDirty();
    }
    refreshCalendar(fieldname);
    return true;
}

function date_year_keypress(e,fieldname)
{
    key = getKeyCode(e);
    keychar = String.fromCharCode(key);
    reg = /[\x00-\x1F\x30-\x39]/;
    num = /\d/;
    if(keychar == " ")
    {
        if(document.getElementById('calendardiv').style.visibility != "visible")
            showCalendar(fieldname);
        return false;
    }
    if (!reg.test(keychar) && !num.test(keychar))
    {
        return false;
    }
    if(num.test(keychar))
    {
       markDirty();
    }
    refreshCalendar(fieldname);
    return true;
}

function date_day_lostfocus(fieldname)
{
    if(!(FiFormData[fieldname+'_DAY'].value * 1 > 0 && FiFormData[fieldname+'_DAY'].value * 1 <= 31))
    {
        FiFormData[fieldname+'_DAY'].value = "01";
    }
    date_year_lostfocus(fieldname);
}

function date_month_lostfocus(fieldname)
{
    if(!(FiFormData[fieldname+'_MONTH'].value * 1 > 0 && FiFormData[fieldname+'_MONTH'].value * 1 <= 12))
    {
        if(FiFormData[fieldname+'_MONTH'].value)
        {
            FiFormData[fieldname+'_MONTH'].value = "01";
        }
        else
        {
            FiFormData[fieldname+'_DAY'].value = "";
            FiFormData[fieldname+'_YEAR'].value = "";
        }
    }
    else
    {
        date_day_lostfocus(fieldname);
    }
}

function date_year_lostfocus(fieldname)
{
    year = FiFormData[fieldname+'_YEAR'].value;
    if(!year && FiFormData[fieldname+'_MONTH'].value.length)
    {
        d = new Date();
        year = d.getFullYear();
    }
    else if(year && year <= 50)
    {
        year = year * 1 + 2000;
    }
    else if(year && year < 100)
    {
        year = year * 1 + 1900
    }
    FiFormData[fieldname+'_YEAR'].value = year;
    if(document.getElementById('calendardiv').style.visibility == "visible")
    {
        calPopup.hideCalendar();
    }
}
/* ****************************
   Other Key filtering functions
   **************************** */

function moveNext()
{
}

function filterKeypress(e)
{
}

function filterEscape(e)
{
    var numCharCode;
    var elTarget;
    var strType;
    //window.alert(getKeyCode(e));
    if(!keyFilter)
    {
        return true;
    }
    if(getKeyCode(e) == 27 && FiForms_dirty)
    {
        markClean();
    }
    if(getKeyCode(e) == 113 || (getKeyCode(e) == 13 && sheetView))
    {
          FiForms_dirty = false;
          FiFormData = document.forms['FiFormData'];
          lastInputID = e.target.id;
          rememberPosition();
          FiFormData.submit();
    }
    if(window.event)
    {
       ctrlOn = window.event.ctrlKey;
    }
    else if(e.which)
    {
       ctrlOn = e.ctrlKey;
    }
    if(ctrlOn)
    {
      switch(getKeyCode(e))
      {
        case 83:  // S
          FiForms_dirty = false;
          // Save Record
          FiFormData = document.forms['FiFormData'];
          /*if(!(FiFormData))
          {
            FiFormData = document.forms[0];
          }*/
          lastInputID = e.target.id;
          rememberPosition();
          FiFormData.submit();
          break;
        case 188:  // Page Up
            // Step Back
            if(URL_previousRec && URL_previousRec != "#")
            {
                lastInputID = e.target.id;
                rememberPosition();
                window.location = URL_previousRec;
            }
            return false;
          break;
        case 190:  // Page Down
            // Step Forward
            if(URL_nextRec && URL_nextRec != "#")
            {
                lastInputID = e.target.id;
                rememberPosition();
                window.location = URL_nextRec;
            }
            return false;
          break;
        case 77:  // Home
            // Beginning
            if(URL_firstRec && URL_firstRec != "#")
            {
                lastInputID = e.target.id;
                rememberPosition();
                window.location = URL_firstRec;
            }
            return false;
          break;
        case 191:  // End
            // End
            if(URL_lastRec && URL_lastRec != "#")
            {
                lastInputID = e.target.id;
                rememberPosition();
                window.location = URL_lastRec;
            }
            return false;
          break;
        case 78:  // N
            // New Record
            if(URL_newRec && URL_newRec != "#")
            {
                window.location = URL_newRec;
            }
            return false;
          break;
        case 66:  // B
            // Sheet View
            if(URL_sheetV && URL_sheetV != "#")
            {
                window.location = URL_sheetV;
            }
            return false;
          break;
        case 68:  // D
            // Delete
            if(URL_deleteRec && URL_deleteRec != "#")
            {
                window.location = URL_deleteRec;
            }
            return false;
          break;
        default:
          return true;
      }
      return false;
    }
    if(getKeyCode(e) == 16)
    {
        globalShiftOn = true;
    }
    
    
    // Process Enter into Tab on most fields
    // Code adapted from http://www.bigbold.com/snippets/posts/show/2272

    // get character code of key pressed
    numCharCode =getKeyCode(e);

    // get target
    if(window.event)
    {
        if (window.event.target)
        {
            elTarget = window.event.target;
        }
        else if (window.event.srcElement) 
        {
            elTarget = window.event.srcElement;
        }
    }
    else
    {
        if (e.target)
        {
            elTarget = e.target;
        }
        else if (e.srcElement) 
        {
            elTarget = e.srcElement;
        }
    }

    // if form input field
    if (!( elTarget.tagName.toLowerCase() == 'input' || elTarget.tagName.toLowerCase() == 'select' || elTarget.tagName.toLowerCase() == 'textarea'))
    {
        return false;
    }

    // get type
    if(elTarget.tagName.toLowerCase() == 'input')
    {
        name = elTarget.getAttribute('name');
        if(elTarget.getAttribute('type'))
        {
            strType = elTarget.getAttribute('type').toLowerCase();
        }
        else
        {
            strType = "input";
        }
    }
    else
    {
        strType = elTarget.tagName.toLowerCase();
    }
    
    // based on type
    if( (numCharCode == 37 || numCharCode == 39) && elTarget.getAttribute('class').toLowerCase() == 'no_border')
    {

        offset = numCharCode - 38;
        FiFormData = document.forms['FiFormData'];
        for(i = 0;i <= FiFormData.length; i++)
        {
            if(FiFormData.elements[i] == elTarget)
            {
                if((FiFormData.elements[i].selectionStart == FiFormData.elements[i].selectionEnd && FiFormData.elements[i].selectionEnd == FiFormData.elements[i].value.length && offset == 1) || (FiFormData.elements[i].selectionStart == 0 && FiFormData.elements[i].selectionEnd == 0 && offset == -1))
                {
                    j = i + offset;
                    if(FiFormData.elements[j].getAttribute('class').toLowerCase() == 'no_border')
                    {
                        FiFormData.elements[j].focus();
                        FiFormData.elements[j].select();
                        return false;
                    }
                }
            }  // if equals elTarget
        }  // for loop over FiFormData
    }  // if numCharCode
    if( (numCharCode == 13 && strType != 'textarea') || numCharCode == 9)
    // process enter (13) if not in textarea, or tab (9)
    {
        //FIXME: Add code to close dynamic select
        move = 1;
        if(elTarget.getAttribute('class') && elTarget.getAttribute('class').toLowerCase() == 'no_border')
        {
            if(globalShiftOn)
            {
                if(elTarget.getAttribute('name').indexOf('_MONTH') > 0)
                {
                    move = -1;
                }
                if(elTarget.getAttribute('name').indexOf('_DAY') > 0)
                {
                    move = -2;
                }
                if(elTarget.getAttribute('name').indexOf('_YEAR') > 0)
                {
                    move = -3;
                }
            }
            else
            {
                if(elTarget.getAttribute('name').indexOf('_MONTH') > 0)
                {
                    move = 3;
                }
                if(elTarget.getAttribute('name').indexOf('_DAY') > 0)
                {
                    move = 2;
                }
                if(elTarget.getAttribute('name').indexOf('_YEAR') > 0)
                {
                    move = 1;
                }
            }
        }
        if(!FiFormData)
        {
            FiFormData = document.forms['FiFormData'];
        }
        if(!FiFormData)
        {
            return false;
        }
        for(i = 0;i <= FiFormData.length; i++)
        {
            if(FiFormData.elements[i] == elTarget)
            {
                if(globalShiftOn)
                {
                    j = i - move;
                }
                else
                {
                    j = i+move;
                }
                while(j < 0 || j >= FiFormData.length || ( FiFormData.elements[j].type != 'select-one' && FiFormData.elements[j].type != 'text' && FiFormData.elements[j].type != 'textarea' && FiFormData.elements[j].type != 'checkbox' && FiFormData.elements[j].type != 'radio') || (FiFormData.elements[j].getAttribute('readonly')))
                {
                    if(globalShiftOn)
                    {
                    if(j <= 0)
                        j = FiFormData.length;
                    else
                        j--;
                    }
                    else
                    {
                    if(j >= FiFormData.length)
                        j = 0;
                    else
                        j++;
                    }
                } 
                if(globalShiftOn && FiFormData.elements[j].getAttribute('class') && FiFormData.elements[j].getAttribute('class').toLowerCase() == 'no_border')
                {
                    j -= 2;
                }
                FiFormData.elements[j].focus();

                if(FiFormData.elements[j].tagName.toLowerCase() == 'input' && FiFormData.elements[j].getAttribute('disabled') != 'disabled')
                {
                    FiFormData.elements[j].select();
                }
            }
        }
        return false;
    }  // if (process enter or tab)
}  // function filterEscape

function filterShiftUp(e)
{
    key = getKeyCode(e);
    if(key == 16)
    {
        globalShiftOn = false;
    }
    keychar = String.fromCharCode(key);
    reg = /[\x08\x0D\x20-\x24\x28-\x7E]/;
    if (reg.test(keychar))
    {
        markDirty();
    }
}

/* ****************************
   Onload functions
   **************************** */

function FiForm_onLoad()
{
    if(window.bkgHere)
    {
        bkload_pageSetup();
    }
    FiForms_dirty = false;
    // Check to see if a form named FiFormData is on the page
    FiFormData = document.forms['FiFormData'];
    // If not, we'll just have to assume we're using the first
    // form on the page
    if(!(FiFormData))
    {
        FiFormData = document.forms[0];
    }
    // First of all, check if there is a search box, and select it
    FiFormSearch = document.getElementById('_FiFormSearch');
    if(FiFormSearch)
    {
        FiFormSearch.focus();
        FiFormSearch.selectionStart = 0;
        FiFormSearch.selectionEnd = FiFormSearch.value.length;
        return false;
    }

    // Otherwise, select the proper control in the form
    
    // Search through the form to find the first "text" control,
    // then focus and select it.
    errorCtl = document.getElementById(errorField);
        if(errorCtl)
        {
          if(errorCtl.firstChild)
          {
            errorCtl = errorCtl.firstChild;
          }
          errorCtl.focus();
          errorCtl.selectionStart = 0;
          errorCtl.selectionEnd = errorCtl.value.length;
          position = findPos(errorCtl);
          window.scrollTo(position[0],position[1]-40); 
        }
    else if(!restorePosition())
    {
        for(i = 0;i < FiFormData.length; i++)
        {
        if(FiFormData.elements[i].type == 'text' || FiFormData.elements[i].type == 'select-one' || FiFormData.elements[i].type == 'checkbox' || FiFormData.elements[i].type == 'textarea')
        {
            try {
            FiFormData.elements[i].focus();
            FiFormData.elements[i].selectionStart = 0;
            if(FiFormData.elements[0].value)
            {
                FiFormData.elements[i].selectionEnd = FiFormData.elements[0].value.length;
            }
            }
            catch(err)
            {
                
            }
            break;
        }
        }
    }
    pingTimeout = window.setTimeout('pingServer();',30000);
}

/* ****************************
   Report Functions
   **************************** */

function openFiReport()
{
    print = printReportOnOpen;
    if(globalShiftOn)
    {
      return true;
    }
    params = "";
    FiFormData = document.forms['FiFormData'];
    if(!(FiFormData))
    {
        FiFormData = document.forms[0];
    }
    if(!noReopenReport)
    {
        for(i = 0;i < FiFormData.length; i++)
        {
            if(FiFormData.elements[i].name.length > 5 && FiFormData.elements[i].name.substring(FiFormData.elements[i].name.length - 6) == "_MONTH")
            {
            refreshCalendar(FiFormData.elements[i].name.substring(0,FiFormData.elements[i].name.length - 6)); 
            }
            params = params + FiFormData.elements[i].name;
            params = params + "=";
            params = params + FiFormData.elements[i].value;
            params = params + "&";
        }
        try
        {
            if(previewWin && previewWin.location && print)
            {
                previewWin.print();
                return false;
            }
        
            previewWin.close();
        }
        catch(err)
        {
        // ignore any errors
        }
        previewWinLocation = "generate.php?"+params;
        try
        {
            windowname = params;
            if(reportTargetName)
            {
                windowname = reportTargetName;
            }
        }
        catch(err)
        {
           windowname = 'FiReport';
        }
        try
        {
            previewWin = window.open(previewWinLocation,windowname,"menubar=no,scrollbars=yes,toolbar=no,width=1000,height=720");
    
            if(print && previewWin)
            {
            previewWin.onLoad = new function() { window.print();}
            }
        }
        catch(err)
        {
        // ignore more errors
        }
    }
    else
    {
        previewWin = parent.document.getElementById(reportTargetName);
        previewWin.contentWindow.print();
    }
    return false;
}

function printPreviewWin()
{
    if(previewWin.location && previewWin.location.href && previewWin.location.href != "about:blank")
    {
    window.alert(previewWin.document);
         lastPrintTrigger = 0;
         previewWin.print();
    }
    else
    {
        //window.alert(previewWinLocation);
        //window.alert(previewWin.location.href);
        lastPrintTrigger = window.setTimeout('printPreviewWin();',100);
    }
}

//document.captureEvents(Event.KEYDOWN);
//document.onkeypress = filterKeypress;
window.onbeforeunload = confirmUnload;
document.onkeydown = filterEscape;
document.onkeyup = filterShiftUp;
errorField = '';
noReopenReport = false;
var keyFilter = true;

