
    function doHTMLShowHide(elid,istwisty,twistyel,twistyshow) {
    var el=document.getElementById(elid)
    if (istwisty && twistyel) {
    if(twistyshow) {
    var showel=twistyel
    var hideel=twistyel.nextSibling
    } else {
    var showel=twistyel.previousSibling
    var hideel=twistyel
    }
    }
    if (el.style.display=='none') {
    el.style.display='block'
    if (istwisty && twistyel) {
    showel.style.display='none'
    hideel.style.display='inline'
    }
    } else {
    el.style.display='none'
    if (istwisty && twistyel) {
    showel.style.display='inline'
    hideel.style.display='none'
    }
    }
    return false;
    }
    

var undefined;

var tabUICSSInfo={}

function tabActivate (instanceid,tabid,tabnum) {
  var tabCSSInfo=tabUICSSInfo['ii_' + instanceid]
  //[layoutType, titleCSSClass,titleCSSStyle,titleSelectedCSSClass,titleSelectedCSSStyle,titlePaddingPixelWidth,borderPixelWidth]
  for(tabloop=0;tabloop<tabnum;tabloop=tabloop+1) {
    var aelement=document.getElementById('taba_' + instanceid + '_' + tabloop)
    aelement.className=tabCSSInfo[1]
    aelement.style.cssText=tabCSSInfo[2]
    var belement=document.getElementById('tabb_' + instanceid + '_' + tabloop)
    belement.style.display='none'
    if (tabCSSInfo[0]=='table') {
      var hselement=document.getElementById('tabhs_' + instanceid + '_' + tabloop)
      hselement.style.display='none'
    } else {
      var helement=document.getElementById('tabh_' + instanceid + '_' + tabloop)
      helement.style.borderBottom=helement.style.borderTop
    }
  }
  var aelement=document.getElementById('taba_' + instanceid + '_' + tabid)
  var belement=document.getElementById('tabb_' + instanceid + '_' + tabid)
  if (tabCSSInfo[0]=='table') {
    var hselement=document.getElementById('tabhs_' + instanceid + '_' + tabid)
    hselement.style.display=tabInterfaceTRStyleDisplay
    belement.style.display=tabInterfaceTRStyleDisplay
  } else {
    var helement=document.getElementById('tabh_' + instanceid + '_' + tabid)
    helement.style.borderBottom='' + tabCSSInfo[6] + 'px solid ' + helement.style.backgroundColor
    belement.style.display='block'
  }
  if (tabCSSInfo[3]) {
    aelement.className=tabCSSInfo[3]
  }
  if (tabCSSInfo[4]) {
    aelement.style.cssText=tabCSSInfo[4]
  }
  return false
}

function tabInterfaceRegisterCSSInfo(instanceId, layoutType, titleCSSClass, titleCSSStyle, titleSelectedCSSClass, titleSelectedCSSStyle, titlePaddingPixelWidth, borderPixelWidth) {
  tabUICSSInfo['ii_' + instanceId]=[layoutType, titleCSSClass,titleCSSStyle,titleSelectedCSSClass,titleSelectedCSSStyle,titlePaddingPixelWidth,borderPixelWidth]
}

function tabSetSpacerDivWidth(instanceId,tabnum) {
  var tabCSSInfo=tabUICSSInfo['ii_' + instanceId]
  //[layoutType, titleCSSClass,titleCSSStyle,titleSelectedCSSClass,titleSelectedCSSStyle,titlePaddingPixelWidth,borderPixelWidth]
  var tabspacerdiv=getel("tabspacerdiv_" + instanceId)
  var tabspacerspan=getel("tabspacerspan_" + instanceId)
  // Just in case the style of non-selected tabs makes them wider than selected tabs, pick max width
  var firstWidth=tabspacerspan.offsetWidth
  var aelement=0
  for(tabloop=0;tabloop<tabnum;tabloop=tabloop+1) {
    if (aelement) {
      aelement.className=tabCSSInfo[1]
      aelement.style.cssText=tabCSSInfo[2]
    }
    aelement=document.getElementById('taba_' + instanceId + '_' + tabloop)
    if (tabCSSInfo[3]) {
      aelement.className=tabCSSInfo[3]
    }
    if (tabCSSInfo[4]) {
      aelement.style.cssText=tabCSSInfo[4]
    }   
    var tabspacerspan=getel("tabspacerspan_" + instanceId)
    if(firstWidth<tabspacerspan.offsetWidth) {
      firstWidth=tabspacerspan.offsetWidth
    }
  }
  tabspacerdiv.style.width='' + (firstWidth) + 'px'
}

function getel(id) {
  return document.getElementById(id)
}

function arlUpdateValueDisplay(fieldid) {
  sepnode=getel(fieldid+':displaysep')
  if (sepnode) {
    sepnode=sepnode.firstChild
  } else {
    sepnode=document.createTextNode('; ')
  }
  remnode=getel(fieldid+':displayrem')
  if (remnode) {
    remnode=remnode.firstChild
  } else {
    remnode=document.createTextNode('(remove)')
  }
  
  field=getel(fieldid+':displayhidden')
  display=getel(fieldid+':display')  
  while(display.hasChildNodes() == true) {
    display.removeChild(display.childNodes[0])
  }
  if (field.value=='') {
    display.appendChild(document.createTextNode(String.fromCharCode(160)+String.fromCharCode(160)+String.fromCharCode(160)))
    return
  }
  values=field.value.split('~~')
  for (var i=1;i<values.length;i++) {
    if (i>1) {
      display.appendChild(sepnode.cloneNode(true))
    }
    newanchor=document.createElement('a')
    newanchor.href=''
    newanchor.className='addRemoveListRemoveLink'
    newanchor.onclick=new Function("arlRemoveThing('" + fieldid + "'," + i + "); return false")
    newanchor.appendChild(remnode.cloneNode(true))
    display.appendChild(newanchor)
    display.appendChild(document.createTextNode(String.fromCharCode(160) + values[i]))
  }  
}
function arlRemoveThing(fieldid,index) {
  field=getel(fieldid) 
  dispfield=getel(fieldid+':displayhidden')
  values=field.value.split('~~')
  dispvalues=dispfield.value.split('~~')
  newvalue=''
  newdispvalue=''
  for (var i=1; i<values.length;i++) {
    if (i!=index) {
      newvalue=newvalue + '~~' + values[i]
      newdispvalue=newdispvalue + '~~' + dispvalues[i]
    }
  }
  field.value=newvalue
  dispfield.value=newdispvalue
  arlUpdateValueDisplay(fieldid)
  return false
}

function arlAddSingleValue (field,dispfield,value,displayvalue,nodupe) {
  if (nodupe) {
    values=field.value.split('~~')
    dispvalues=dispfield.value.split('~~')
    for (var i=1; i<values.length;i++) {
      if (values[i]==value) {
        return
      }
    }
  }
  field.value=field.value+'~~'+value
  dispfield.value=dispfield.value+'~~'+displayvalue
}


function arlAddThing(fieldid,nodupes) {
  field=getel(fieldid)
  dispfield=getel(fieldid+':displayhidden')
  select=getel(fieldid+':select')
  options=select.options
  for (var i=0;i<select.length;i++) {
    if (options[i].selected) {
      arlAddSingleValue(field,dispfield,options[i].value,options[i].text,nodupes)
    }
  }
  arlUpdateValueDisplay(fieldid)
}

function codeIFrameSave(idsuffix,importsfieldid,importsfieldlabel) {
  ifr=document.getElementById('codeSaveIFrame' + idsuffix)
  sinfodiv=document.getElementById('codeSaveInfoDiv' + idsuffix)
  if (ifr.contentDocument) {
    ifrdoc=ifr.contentDocument
  } else if (ifr.contentWindow) {
    ifrdoc=ifr.contentWindow.document
  } else if (ifr.document) {
    ifrdoc=ifr.document
  }
  sinfodiv.innerHTML='<FONT COLOR="#DD0000">Saving...</FONT>'
  if (ifr.src) {
    var csf=ifrdoc.getElementById('codeSaveField')
    csf.value=document.getElementById('codeTextArea' + idsuffix).value
    if (importsfieldid && importsfieldlabel) {
      var impf=ifrdoc.getElementById('importsSaveField')
      impf.value=document.getElementById(importsfieldid).value
    }
    ifrdoc.forms[0].submit()
  } else {
    bits=idsuffix.split('-')
    extra=''
    if (importsfieldid && importsfieldlabel) {
      extra='&importsFieldId=' + escape(importsfieldid) + '&importsFieldLabel=' + escape(importsfieldlabel)
    }
    ifr.src='/exectemp/fieldcodesaveiframe?doSaveNow=1&target=' + bits[0] + '&targetField=' + escape(bits[1]) + extra
  }
}


function doShowHideSection(elid,show) {  
  var el=document.getElementById(elid)
  var hidespan=document.getElementById(elid+':sh-hide')
  var showspan=document.getElementById(elid+':sh-show')
  if (show) {
    if (hidespan && showspan && showspan.style.display!='none') {
      hidespan.style.display=showspan.style.display
      showspan.style.display='none'
    }
    if (window.mattMCESafeShow) {
      mattMCESafeShow(el,'block')
    } else {
      el.style.display='block'
    }
  } else {
    if (hidespan && showspan && hidespan.style.display!='none') {
      showspan.style.display=hidespan.style.display
      hidespan.style.display='none'
    }
    el.style.display='none'
  }
  return false;
}


if (typeof((new Array()).push) == "undefined") {
 function push() {
     for (var i = 0 ; i < arguments.length ; i++) {
         this[this.length] = arguments[i];
        }
    } Array.prototype.push = push;
}

var registeredFieldGetValue=new Object()
var registeredFieldValidateValue=new Object()
var registeredFieldSetFocus=new Object()
var primaryTargetId
var primaryTargetDepth
function _fieldGetLookupLabel(fieldLabel, targetId) {
  if (targetId==undefined) {
    targetId=primaryTargetId
  }
  return targetId + ':' + fieldLabel
}
function fieldRegistered(fieldLabel, targetId) {
  lookupLabel=_fieldGetLookupLabel(fieldLabel, targetId)
  var valueFrom=registeredFieldGetValue[lookupLabel]
  if (valueFrom == undefined) {
    return false
  } else {
    return true
  }
}
function formFieldSetValue(field,value) {
  if (typeof field == 'string') {
    field=document.getElementsByName(field)
  } else if (!field.length) {
    field=new Array(field)
  }  
  valueSet=new Object()
  if (typeof value == 'string') {
    valueSet['~~' + value]=1    
  } else if (typeof value == 'object' && value.length) {
    for (var i=0;i<value.length;i++) {
      valueSet['~~' + value[i]]=1
    }
  }
  var fields=field
  for(var i=0; i<fields.length; i++) {
    field=fields[i]
    if(field.tagName=='INPUT') {
      if(field.type=='text' || field.type=='password' || field.type=='file') {
        field.value=value
      } else if(field.type=='radio' || field.type=='checkbox') {
        if (valueSet['~~' + field.value]) {
          field.checked=true
        } else {
          field.checked=false
        }
      }
    } else if (field.tagName=='TEXTAREA') {
      field.value=value
    } else if (field.tagName=='SELECT') {
      var options=field.options
      for (var j=0; j<options.length; j++) {
        if (valueSet['~~' + options[j].value]) {
          options[j].selected=true
        } else {
          options[j].selected=false
        }
      }
    }
  }
}

function formFieldGetValue(field,includeDisplay,includePossible) {
  if (typeof field == 'string') {
    field=document.getElementsByName(field)
  } else if (!field.length) {
    field=new Array(field)
  }
  var fields=field
  var ismulti=0
  var results = new Array()
  var dispResults
  if(includeDisplay) {
    dispResults = new Array()
  }
  var possResults
  if(includePossible) {
    possResults = new Array()
  }
  for(var i=0; i<fields.length; i++) {
    field=fields[i]
    if(field.tagName=='INPUT') {
      if(field.type=='text' || field.type=='password' || field.type=='file' || field.type=='hidden') {
        if(includeDisplay) {
          dispResults.push(field.value)
        }
        results.push(field.value)
      } else if(field.type=='radio' || field.type=='checkbox') {
        if (includePossible) {
          possResults.push(field.value)
        }
        if (field.type=='checkbox') {
          ismulti=1
        }
        if (field.checked) {
          if(includeDisplay) {
            if (field.DISPLAYVALUE || field.displayvalue) {
              dispResults.push(field.DISPLAYVALUE || field.displayvalue)
            } else if (field.attributes['DISPLAYVALUE'] || field.attributes['displayvalue']) {             
              dispResults.push((field.attributes['DISPLAYVALUE'] && field.attributes['DISPLAYVALUE'].value) || (field.attributes['displayvalue'] && field.attributes['displayvalue'].value))
            } else {
              dispResults.push(field.value)
            }
          }
          results.push(field.value)
        }
      }
    } else if (field.tagName=='TEXTAREA') {
      if(includeDisplay) {
        dispResults.push(field.value)
      }
      results.push(field.value)
    } else if (field.tagName=='SELECT') {
      if (field.multiple) {
        ismulti=1
      }
      var options=field.options
      for (var j=0; j<options.length; j++) {
        if (options[j].selected) {
          results.push(options[j].value)
          if(includeDisplay) {
            dispResults.push(options[j].text)
          }
        }
      }
    }
  }
  var returnRes
  if (!ismulti && results.length==0) {
    if(includeDisplay) {
      returnRes=new Array(undefined,undefined)
    } else {
      returnRes=undefined
    }
  } else if (!ismulti && results.length==1) {
    if (includeDisplay) {
      returnRes=new Array(results[0],dispResults[0])
    } else {
      returnRes=results[0]
    }
  } else {
    if (includeDisplay) {
      returnRes=new Array(results,dispResults)
    } else {
      returnRes=results
    }
  }
  if(includePossible) {
    if(includeDisplay) {
      return new Array(returnRes[0],returnRes[1],possResults)
    } else {
      return new Array(returnRes,possResults)  
    }
  } else {
    return returnRes
  }
}
function fieldGetValue(fieldLabel, targetId) {
  var lookupLabel=_fieldGetLookupLabel(fieldLabel, targetId)
  var valueFrom=registeredFieldGetValue[lookupLabel]
  if (valueFrom == undefined) {
    return undefined
  }
  if (typeof valueFrom == "string") {
    return formFieldGetValue(valueFrom)
  } else { 
    if (targetId == undefined) {
      targetId=primaryTargetId
    }
    return valueFrom(fieldLabel,targetId)
  }
}
function fieldValidateValue(fieldLabel, targetId) {
  var lookupLabel=_fieldGetLookupLabel(fieldLabel, targetId)
  var validateFunc=registeredFieldValidateValue[lookupLabel]
  if (validateFunc == undefined) {
    return true
  }
  return validateFunc(fieldGetValue(fieldLabel,targetId), fieldLabel, targetId)
}
function fieldSetFocus(fieldLabel, targetId) {
  var lookupLabel=_fieldGetLookupLabel(fieldLabel, targetId)
  var setFocusTo=registeredFieldSetFocus[lookupLabel]
  if (setFocusTo == undefined) {
    setFocusTo=registeredFieldGetValue[lookupLabel]
    if (typeof(setFocusTo)!='string') {
      return
    }
  }
  if(typeof setFocusTo=='function') {
    setFocusTo=setFocusTo(fieldLabel, targetId)
    if (!setFocusTo) {
      return
    }
  }
  if(typeof setFocusTo=='string') {
    var setFocusToField=document.getElementsByName(setFocusTo)
    if (setFocusToField && setFocusToField.length) {
      setFocusTo=setFocusToField[0]
    } else {
      return
    }
  } 
  if (setFocusTo && setFocusTo.focus) {
    setFocusTo.focus()
  }
}
function fieldRegister(fieldLabel, targetId, depth, getValue, validateValue, setFocus) {
  if(targetId!=undefined && typeof depth=='number' && (primaryTargetDepth==undefined || depth<primaryTargetDepth)) {
    primaryTargetDepth=depth
    primaryTargetId=targetId
  }
  var lookupLabel=_fieldGetLookupLabel(fieldLabel, targetId)
  if(getValue!=undefined) {
    registeredFieldGetValue[lookupLabel]=getValue
  }
  if(validateValue!=undefined) {
    registeredFieldValidateValue[lookupLabel]=validateValue
  }
  if(setFocus!=undefined) {
    registeredFieldSetFocus[lookupLabel]=setFocus
  }
}




function popupframeautosize(popupDiv,popupIFrame,contentDiv,minHeight,minWidth) {
  // popupDiv is the div you'll have popup
  // popupIFrame is optional if your popupdiv doesn't contain an iframe
  // contentDiv is the div in the popupiframe (or just in the popupdiv) which has
  // the contents you wish the resize to size to.
  // minHeight and minWidth are optional minimums for the popup size in pixels
  // (they default to 100 and 200 respectively)
  var extraAmount=30 // Extra amount to add to calculated height and width to avoid scrollbars appearing if the
                     // calculated amount isn't quite enough
  var agt=navigator.userAgent.toLowerCase();
  var is_ie5=agt.indexOf("msie 5.0")!=-1
  if (popupDiv.ownerDocument) {
    var mainBody=popupDiv.ownerDocument.body
  } else {
    var mainBody=popupDiv.document.body
//    var trackEl=popupDiv
//    while (trackEl) {
//      if(trackEl.body) {
//        mainBody=trackEl.body
//        trackEl=undefined
//      } else {
//        trackEl=trackEl.parentNode
//      }    
//    }
  }
  contentDiv.style.width='auto'
  if (!minHeight) {
    minHeight=100
  }
  if (!minWidth) {
    minWidth=200
  }
  var maxWidth=mainBody.scrollWidth-popupDiv.offsetLeft-extraAmount
  var maxHeight=mainBody.clientHeight-10
  if (maxHeight<minHeight) {
    maxHeight=minHeight
  }
  if (maxWidth<minWidth) {
    maxWidth=minWidth
  }
  popupIFrame.style.overflow='auto'
  if (is_ie5) {
    popupDiv.style.height='1px'
    popupDiv.style.width=maxWidth
    if (popupIFrame) {
      popupIFrame.style.height='1px'
      popupIFrame.style.width=maxWidth
    }
    popupDiv.focus()
  } else {
    popupDiv.style.visibility='hidden'
    if (popupIFrame) {
      popupIFrame.style.visibility='hidden'
    }
    popupDiv.style.height='1px'
    popupDiv.style.width=maxWidth
    if (popupIFrame) {
      popupIFrame.style.height='1px'
      popupIFrame.style.width=maxWidth
    }
  }
  var width=contentDiv.scrollWidth+extraAmount
  if (width>maxWidth) {
    width=maxWidth
  } else if (width<minWidth) {
    width=minWidth
  }
  popupDiv.style.width=width + 'px'
  if (popupIFrame) {
    popupIFrame.style.width=width + 'px'
  }
  height=contentDiv.scrollHeight+extraAmount
  if (height>maxHeight) {
    height=maxHeight
  } else if (height<minHeight) {
    height=minHeight
  }
  if (popupDiv.offsetTop-mainBody.scrollTop+height>maxHeight) {
    var topRepos=maxHeight-height
    if (topRepos<10) {
      topRepos=10
    }
    popupDiv.style.top=mainBody.scrollTop+topRepos + 'px'
  }
  popupDiv.style.height=height + 'px'
  if (popupIFrame) {
    popupIFrame.style.height=height + 'px'
  }
  popupDiv.style.visibility='visible'
  if (popupIFrame) {
    popupIFrame.style.visibility='visible'
  }
}

function NEWATTEMPT_popupframeautosize(popupDiv,popupIFrame,contentDiv,minHeight,minWidth) {
  // popupDiv is the div you'll have popup
  // popupIFrame is optional if your popupdiv doesn't contain an iframe
  // contentDiv is the div in the popupiframe (or just in the popupdiv) which has
  // the contents you wish the resize to size to.
  // minHeight and minWidth are optional minimums for the popup size in pixels
  // (they default to 100 and 200 respectively)

  var agt=navigator.userAgent.toLowerCase();
  var is_ie5=agt.indexOf("msie 5.0")!=-1
  if (popupDiv.ownerDocument) {
    var mainBody=popupDiv.ownerDocument.body
  } else {
    var mainBody=popupDiv.document.body
  }
  contentDiv.style.width='auto'
  if (!minHeight) {
    minHeight=100
  }
  if (!minWidth) {
    minWidth=200
  }

  var extHorizMargin = 20
  var extVertMargin = 10

  var intHorizMargin = 10
  var intVertMargin = 10

  var maxWidth = mainBody.scrollWidth - popupDiv.offsetLeft - extHorizMargin
  var maxHeight = mainBody.clientHeight - extVertMargin
  if (maxHeight < minHeight) {
    maxHeight = minHeight
  }
  if (maxWidth < minWidth) {
    maxWidth = minWidth
  }
  popupIFrame.style.overflow='auto'
  if (is_ie5) {
    popupDiv.style.height='1px'
    popupDiv.style.width=maxWidth
    if (popupIFrame) {
      popupIFrame.style.height='1px'
      popupIFrame.style.width=maxWidth
    }
    popupDiv.focus()
  } else {
    popupDiv.style.visibility='hidden'
    if (popupIFrame) {
      popupIFrame.style.visibility='hidden'
    }
    popupDiv.style.height='1px'
    popupDiv.style.width=maxWidth
    if (popupIFrame) {
      popupIFrame.style.height='1px'
      popupIFrame.style.width=maxWidth
    }
  }
  var width=contentDiv.scrollWidth + intHorizMargin
  if (width>maxWidth) {
    width=maxWidth
  }
  popupDiv.style.width=width + 'px'
  if (popupIFrame) {
    popupIFrame.style.width=width + 'px'
  }
  height=contentDiv.scrollHeight + intVertMargin
  if (height>maxHeight) {
    height=maxHeight
  }
  if (popupDiv.offsetTop-mainBody.scrollTop+height>maxHeight) {
    var topRepos=maxHeight-height
    if (topRepos<10) {
      topRepos=10
    }
    popupDiv.style.top=mainBody.scrollTop+topRepos + 'px'
  }
  popupDiv.style.height=height + 'px'
  if (popupIFrame) {
    popupIFrame.style.height=height + 'px'
  }
  popupDiv.style.visibility='visible'
  if (popupIFrame) {
    popupIFrame.style.visibility='visible'
  }

  contentDiv.style.width = (width - intHorizMargin) + 'px'
  contentDiv.style.height = (height - intVertMargin) + 'px'
}



function picker_frameResize(instanceId,frDocument) {
  var dstDiv=frDocument.getElementById('picker_popupdisplaylist_' + instanceId)
  var pudiv=document.getElementById('picker_popupdiv_' + instanceId)
  var puifr=document.getElementById('picker_popupiframe_' + instanceId)
  popupframeautosize(pudiv,puifr,dstDiv)
}
function picker_popupHideEv(instanceId) {
  var info=picker_getInfo(instanceId)
  if (!info['hideEventAdd']) {
    info['hideEventAdd']=1
    return
  }
  if (info['hideEvent']) {
    if (window.removeEventListener) {
      window.removeEventListener("click",info['hideEvent'],false)
    } else if (document.detachEvent) {
      document.detachEvent("onclick",info['hideEvent'])
    }
    info['hideEvent']=undefined
    info['popupDiv'].style.display='none'
  }
  info['hideEventAdd']=0
}
function picker_showPopupPicker(instanceId,inlineChoices) {
  var info=picker_getInfo(instanceId)
  inlineChoices = inlineChoices && 1

  if(info['hideEvent']) {
    info['hideEventAdd']=1
    info['hideEvent']()
    return
  }
  var picker=info['popupDiv']
  var iframe=info['popupFrame']
  var button=document.getElementById('picker_popuplink_' + instanceId)
  var field=document.getElementById('picker_field_' + instanceId)
  var offsetItem=info['popupRelativeToElement']
  if (!offsetItem) {
    offsetItem=button
  }
  positionElementRelativeTo(picker,offsetItem,20,0,1)

  if (!iframe.src) {
    if (iframe.USRC) {
      iframe.src=iframe.USRC
    } else if (iframe.attributes['USRC']) {
      iframe.src=iframe.attributes['USRC'].value
    } else { 
      iframe.src='/exectemp/fieldpopuppicker?frameContents=1&instanceId=' + escape(instanceId) + '&inlineChoices=' + escape(inlineChoices)
    }
  }
  iframe.thisPickerInfo=info
  iframe.thisPickerId=instanceId
  picker.style.display='block'
  if (info['resizeFunc']) {
    try {
      info['resizeFunc'](instanceId,info);
    } catch (e) {
      // Sometimes resizeFunc will be from an old set of frame contents, so cope with that.
      info['resizeFunc']=undefined;
    }
  }
  info['hideEvent']=new Function("picker_popupHideEv('" + instanceId + "')")
  if (window.addEventListener) {
    window.addEventListener("click", info['hideEvent'],false)
  } else if (document.attachEvent) {
    document.attachEvent("onclick",info['hideEvent'])
  }
}
function picker_popupUpdateChoices(instanceId,isView) {
  var info=picker_getInfo(instanceId)
  var pickerWindow=info['pickerWindow']   
  var contentDocument=pickerWindow.document
  if (isView) {
    var fieldName="vpcc_" + instanceId
  } else {
    var fieldName="_ppdivrad_" + instanceId
  }
  var fields=contentDocument.getElementsByName(fieldName)
  for (var i=0;i<fields.length;i++) {
    if (picker_isValuePicked(fields[i].value,instanceId)) {
      fields[i].checked=1
    } else {
      fields[i].checked=0
    }
  }
}
function picker_popupInlineFillFrameChoices(instanceId,frameDocument) {
  var info=picker_getInfo(instanceId)

  var dstDiv=frameDocument.getElementById('picker_popupdisplaylist_' + instanceId)
  var srcDiv=document.getElementById('picker_popupchoices_' + instanceId)
  dstDiv.innerHTML=srcDiv.innerHTML
  picker_popupUpdateChoices(instanceId)
}

function picker_registerPopupPicker(instanceId,multi,onChange,frameSrc,inlineChoices,allowReorder,popupRelativeToElementId) {
  var popupLink=getel('picker_popuplink_' + instanceId)
  var displayValueDiv=getel('picker_field_display_' + instanceId)
  var valueField=getel('picker_field_' + instanceId)
  var pickerPopupDiv=getel('picker_popupdiv_' + instanceId)
  var pickerPopupFrame=getel('picker_popupiframe_' + instanceId)
  if (!popupRelativeToElementId) {
    var popupRelativeToElement=undefined
  } else {
    var popupRelativeToElement=getel(popupRelativeToElementId)
  }
  
  pickerInstances['~~' + instanceId]={'instanceId':instanceId,'type':'popup','inlineChoices':inlineChoices,'multi':multi,'onChange':onChange,'frameSrc':frameSrc,
                                            'popupLink':popupLink,'displayValueDiv':displayValueDiv,'fieldWindow':window,'pickerWindow':undefined,'allowReorder':allowReorder,
                                            'valueField':valueField,'popupDiv':pickerPopupDiv,'popupFrame':pickerPopupFrame,'resizeFunc':undefined,'popupRelativeToElement':popupRelativeToElement}
  pickerPopupFrame.thisPickerInfo=pickerInstances['~~' + instanceId]
}




// If relative is set this gets the X and Y of the element relative to the nearest
// containing element which is marked 'relative' (if none exists, will be the body). 
// If relative is not set then it will be the X Y within the document body.

function getElementXY(element, relative) {
  var offsetLeft=0
  var offsetTop=0 
  var offsetItem=element
  var agt=navigator.userAgent.toLowerCase();
  var is_ie55=agt.indexOf("msie 5.5")!=-1 
  // IE 6 under winxp before SP1, and IE 5.5 on all platforms seems to get offsetTop all wrong 
  // if there's a relatively positioned element and an enclosing table 
  // - seems to be double the offset to the enclosing table, but with no offset parent of the table.
  // So for IE 5.5 I work around the issue, for IE 6 under XP I need to do further work to detect if the issue exists
  var is_possiblybrokenie=agt.indexOf("msie 6.0")!=-1 && agt.indexOf("nt 5.1")!=-1  
  var is_brokenie=0
  var count=0
  while (offsetItem && count<1000) {    
    count=count+1
    if (offsetItem.tagName=='BODY' || (relative && offsetItem.style.position=="relative")) {      
      offsetItem=undefined
    } else {
      if(is_ie55 && offsetItem.style.position=="relative") {
        offsetItem=offsetItem.parentNode     
      } else if (is_possiblybrokenie && offsetItem.style.position=="relative") {
        var tableValue=0
        var testItem=offsetItem.parentNode
        while (testItem && count<1000) {
          count=count+1
          if (testItem.tagName=='TABLE' && testItem.offsetTop) {
            tableValue=testItem.offsetTop
            testItem=undefined
          } else {
            testItem=testItem.offsetParent
          }
        }
        var testValue=offsetItem.parentNode.offsetTop*2 + tableValue
        if(testValue<offsetItem.offsetTop) {
          is_brokenie=1
          offsetItem=offsetItem.parentNode
        } else {
          offsetLeft+=offsetItem.offsetLeft
          offsetTop+=offsetItem.offsetTop
          offsetItem=offsetItem.offsetParent
        }
      } else {
        offsetLeft+=offsetItem.offsetLeft
        offsetTop+=offsetItem.offsetTop
        offsetItem=offsetItem.offsetParent
      }
    }
  }
  return new Array(offsetLeft,offsetTop)
}
function positionElementRelativeTo(delement, relativeToElement, x, y, attachToDocBody, autoSize, maxWidth) {
  var baseXY=getElementXY(relativeToElement,!attachToDocBody)  
  positionElement(delement,baseXY[0]+x,baseXY[1]+y,attachToDocBody,autoSize, maxWidth)
}
function positionElement(delement, x, y, attachToDocBody, autoSize, maxWidth) {
  if (attachToDocBody) {
    if (!delement.parentNode || !(delement.parentNode.tagName && delement.parentNode.tagName=='BODY')) {
      if (delement.ownerDocument) {
        var mainDocument=delement.ownerDocument
      } else {
        var mainDocument=delement.document
      }
      var mainBody=mainDocument.body || document.body
      if (delement.parentNode) {
        delement.parentNode.removeChild(delement)
      }
      if (autoSize) {
//        td.noWrap=true
        var table=mainDocument.createElement('TABLE')
        mainBody.insertBefore(table,mainBody.firstChild)
        tr=table.insertRow(table.rows.length)
        td=tr.insertCell(tr.cells.length)
        td.appendChild(delement)
        var height=delement.scrollHeight
        var width=delement.scrollWidth
        if (maxWidth && width>maxWidth) {
          delement.style.width=maxWidth + 'px'
          height=delement.scrollHeight
        } else {
          delement.style.width=width + 'px'
        }
        delement.style.height=height + 'px'
        delement.style.position='absolute' 
        td.removeChild(delement)
        mainBody.removeChild(table)
      }
      mainBody.insertBefore(delement,mainBody.firstChild)
    }
  } 
  delement.style.left=x + 'px'
  delement.style.top=y + 'px'
}

// Find out the position of the element
function getPosition(offsetItem) {
  var offsetLeft = 0
  var offsetTop = 0 
  while (offsetItem) {
    if (offsetItem.style.position == 'relative') {
      offsetItem = undefined
    } else {
      offsetLeft += offsetItem.offsetLeft
      offsetTop += offsetItem.offsetTop
      offsetItem = offsetItem.offsetParent
    }
  }
  return [offsetLeft, offsetTop]
}

function vrppFrameResize(instanceId) {
  var dstDiv = document.getElementById('vrppDisplayDiv_' + instanceId)
  var picker = parent.document.getElementById('vrPopupPicker_' + instanceId)
  var iframe = parent.document.getElementById('vrPopupPickerIFrame_' + instanceId)
  popupframeautosize(picker, iframe, dstDiv, 10, 20, 1) // XXX
}

vrppHideAcceptClick = new Object()
vrppHideFuncs = new Object()

// Hide the pop-up with the given instance ID
function vrppHide(instanceId) {
  // Ignore the first click - it's just the opening click bubbling through to the document
  if (!vrppHideAcceptClick[instanceId]) {
    vrppHideAcceptClick[instanceId] = 1
    return
  }

  // Stop the detach happening multiple times ... just to be on the safe side
  if (vrppHideFuncs[instanceId]) {
    // Detatch the event listener which has just been triggered.
    if (window.removeEventListener) {
      window.removeEventListener("click", vrppHideFuncs[instanceId], false)
    } else if (document.detachEvent) {
      document.detachEvent("onclick", vrppHideFuncs[instanceId])
    }
    vrppHideFuncs[instanceId] = undefined

    // Hide the pop-up
    var picker = document.getElementById('vrPopupPicker_' + instanceId)
    picker.style.display = 'none'

    // Reset the first-click ignoring status
    vrppHideAcceptClick[instanceId] = 0
  }
}

// Pop up the selection pop-up with the given instance ID
function vrppShow(instanceId) {
  var iFrame = document.getElementById('vrPopupPickerIFrame_' + instanceId)
  var src = document.getElementById('vrPopupPickerBaseUrl_' + instanceId).value

  var viewTable = document.getElementById('vrPopupPickerViewTable_' + instanceId)
  var viewRows = viewTable.tBodies.item(0).rows
  for (var i = 1; i < viewRows.length; i++) {
    var row = viewRows.item(i)
    var firstCell = row.cells.item(0)
    var fields = firstCell.getElementsByTagName('INPUT')
    var field = fields.item(0)
    src += '&v=' + field.value
  }

  // Load the contents of the popup
  iFrame.src = src

  // Find out the position of the table
  var table = document.getElementById('vrPopupPickerTable_' + instanceId)
  var position = getPosition(table)

  // Position the picker relative to the table
  var picker = document.getElementById('vrPopupPicker_' + instanceId)
  picker.style.left = position[0] + 20
  picker.style.top = position[1] + 20
  picker.style.display = 'block'

  // Register a new function to close this popup
  hideFunc = new Function("vrppHide(" + instanceId + ")")
  vrppHideFuncs[instanceId] = hideFunc
  if (window.addEventListener) {
    window.addEventListener("click", hideFunc, false)
  } else if (document.attachEvent) {
    document.attachEvent("onclick", hideFunc)
  }
}



function encodeSetArgsForUrl(passKey,args) {
  var url=''
  for(var key in args) {
    var v = args[key]
    var t = typeof(v)
    if (t == 'number') {
      url += '&' + passKey + '=i:' + key + ':' + v
    } else if (t == 'object' && v.constructor.toString().match(/Array/)) {
      if(v.length == 0) {
        url += '&' + passKey + '=l:' + key + ':'
      } else {
        for(var i in v) {
          v2 = v[i]
          t = typeof(v2)
          if (t == 'number') {
            url += '&' + passKey + '=i:' + key + ':' + v2
          } else if (t != 'undefined') {
            url += '&' + passKey + '=s:' + key + ':' + v2
          } else {
            url += '&' + passKey + '=n:' + key + ':None'
          }
        }
      }
    } else if (t != 'undefined') {
      url += '&' + passKey + '=s:' + key + ':' + escape(v)
    } else {
      url += '&' + passKey + '=n:' + key + ':None'
    }
  }
  return url
}

var datePickerHideEvTrack={}
var datePickerHideFunctions={}

function datepickeronchange(instanceId) {
  var dateFieldEl=getel('datepicker_field_' + instanceId)
  var onChangeEval
  if (dateFieldEl.ONCHANGEEVENT!=undefined) {
    onChangeEval=dateFieldEl.ONCHANGEEVENT
  } else if (dateFieldEl.attributes && dateFieldEl.attributes['ONCHANGEEVENT']) {
    onChangeEval=dateFieldEl.attributes['ONCHANGEEVENT'].value
  }
  if (!onChangeEval) {
    return
  }
  var hiddenField=datepickergethiddenfield(instanceId)
  if (hiddenField) {
    var value=hiddenField.value
    eval(onChangeEval.replace('this.value','value'))
  }
}
function datepickeronkeyup(instanceId,event) {
  datepickerupdatehiddenfield(instanceId);
  if(event.keyCode == 13) {
    datepickeronchange(instanceId);
  }
  var dateFieldEl=getel('datepicker_field_' + instanceId);
  var onKeyUpEval;
  if (dateFieldEl.ONKEYUPEVENT!=undefined) {
    onKeyUpEval=dateFieldEl.ONKEYUPEVENT
  } else if (dateFieldEl.attributes && dateFieldEl.attributes['ONKEYUPEVENT']) {
    onKeyUpEval=dateFieldEl.attributes['ONKEYUPEVENT'].value
  }
  if (onKeyUpEval) {
    eval(onKeyUpEval);
  }
}
function datepickergethiddenfield(instanceId) {
  var dateFieldEl=getel('datepicker_field_' + instanceId)
  var hiddenField
  if (dateFieldEl.HFID!=undefined) {
    hiddenField=getel(dateFieldEl.HFID)
  } else if (dateFieldEl.attributes && dateFieldEl.attributes['HFID']) {
    hiddenField=getel(dateFieldEl.attributes['HFID'].value)
  }
  return hiddenField
}

function datepickerupdatehiddenfield(instanceId) {
  var dateFieldEl=getel('datepicker_field_' + instanceId)
  var timeFieldEl=getel('datepicker_fieldtime_' + instanceId)
  var hourFieldEl=getel('datepicker_fieldhour_' + instanceId)
  var minuteFieldEl=getel('datepicker_fieldminute_' + instanceId)
  var value=dateFieldEl && dateFieldEl.value
  if(timeFieldEl) {
    value=value + ' ' + timeFieldEl.value
  } else if (hourFieldEl) {
    value=value + ' ' + hourFieldEl.value + ':' + minuteFieldEl.value + ':00'
  }
  var hiddenField=datepickergethiddenfield(instanceId)
  if (hiddenField) {
    hiddenField.value=value
  }
  return value
}

function hidedatepicker(instanceId) {
  if (!datePickerHideEvTrack[instanceId]) {
    datePickerHideEvTrack[instanceId]=1
    return
  }
  if (window.removeEventListener) {
    window.removeEventListener("click",datePickerHideFunctions[instanceId],false)
  } else if (document.detachEvent) {
    document.detachEvent("onclick",datePickerHideFunctions[instanceId])
  }
  getel('datepicker_' + instanceId).style.display='none'
  datePickerHideEvTrack[instanceId]=0
}
function popupdatepicker(instanceId) {
  var focusEl=getel('dpgivefocus_' + instanceId)
  focusEl.focus()
  var buttonEl=getel('dpbutton_' + instanceId)
  var pickerEl=getel('datepicker_' + instanceId)
  var fieldEl=getel('datepicker_field_' + instanceId)
  var iframe=getel('datepicker_iframe_' + instanceId)
  iframe.src='/exectemp/fielddatepicker?frameContents=1&instanceId=' + instanceId + '&displayMonthOffset=0&selectedDate=' + escape(fieldEl.value)
  positionElementRelativeTo(pickerEl,buttonEl,20,0,1)
  pickerEl.style.display='block'
  if (datePickerHideFunctions[instanceId]) {
    var hideFunc=datePickerHideFunctions[instanceId]
  } else {
    var hideFunc=new Function("hidedatepicker('" + instanceId + "')")
    datePickerHideFunctions[instanceId]=hideFunc
  }

  if (window.addEventListener) {
    window.addEventListener("click", hideFunc,false)
  } else if (document.attachEvent) {
    document.attachEvent("onclick", hideFunc)
  }
}
function dpforward () {
  document.location=thisDpForwardLink
}
function dpbackward () {
  document.location=thisDpBackwardLink
}
function dpyearclick() {
  var ycel=document.getElementById('dpyearchangehover')
  if (!ycel) {
    ycel=document.getElementById('dpyearchange')
  }
  ycel.style.display='none'
  var sel=document.getElementById('dpyearchangeselect')
  sel.style.display='inline'
  sel.focus()
}
function dpmonclick() {
  var mcel=document.getElementById('dpmonchangehover')
  if (!mcel) {
    mcel=document.getElementById('dpmonchange')
  }
  mcel.style.display='none'
  var sel=document.getElementById('dpmonchangeselect')
  sel.style.display='inline'
  sel.focus()

}

function dpsetdate (day) {
  var field=parent.document.getElementById("datepicker_field_" + thisDpInstanceId)
  if (day<10) {
    day='0' + day
  }
  field.value=thisDpDateFormat.replace('__DAY__',day)
  parent.hidedatepicker(thisDpInstanceId)
  parent.datepickerupdatehiddenfield(thisDpInstanceId)
  parent.datepickeronchange(thisDpInstanceId)
}

function dpyearchange() {
  var sel=document.getElementById('dpyearchangeselect')
  if (sel.value=='') {
    if (thisDpInitHideDropDown) {
      sel.style.display='none'
      var ycel=document.getElementById('dpyearchangehover')
      if (!ycel) {
        ycel=document.getElementById('dpyearchange')
      }
      ycel.style.display='inline'
    }
  } else {
    document.location=thisDpYearLink.replace('__MONTHS__',sel.value)
  }
}

function dpmonchange() {
  var sel=document.getElementById('dpmonchangeselect')
  if (sel.value=='') {
    if (thisDpInitHideDropDown) {
      sel.style.display='none'
      var mcel=document.getElementById('dpmonchangehover')
      if (!mcel) {
        mcel=document.getElementById('dpmonchange')
      }
      mcel.style.display='inline'
    }
  } else {
    document.location=thisDpYearLink.replace('__MONTHS__',sel.value)
  }
}




function fileMultiUpload(thing,type) {
  if(thing.value) {
    var wasEmpty=0
    // IE is a bit crap about document.getElementsByName seeing new appended elements
    var fileFields=thing.parentNode.getElementsByTagName(thing.tagName)
    for(var i=0;i<fileFields.length;i++) {
      if (fileFields[i].type==thing.type && !fileFields[i].value) {
        wasEmpty=1
        break
      }
    }
    if (!wasEmpty) {
      var br=document.createElement('br')
      var clone=document.createElement('input')
      clone.type=thing.type
      var parentNode=thing.parentNode
      parentNode.appendChild(br)
      parentNode.appendChild(clone)
      clone.id=thing.id
      clone.name=thing.name
      clone.onclick=thing.onclick
      clone.onchange=thing.onchange
      clone.onkeyup=thing.onkeyup
    }
  }
}


// pickerDrag is used to provide drag reordering for pickers
var pickerDrag = {

  obj : null,
  
  offsets : new Array(),

  init : function(o,oRoot)
  {
    o.onmousedown  = pickerDrag.start;

    // Picker drag root is the object to actually be dragged (which defaults to the one that triggered the event)
    o.root = oRoot && oRoot != null ? oRoot : o ;

    if (isNaN(parseInt(o.root.style.left  ))) o.root.style.left   = "0px";
    if (isNaN(parseInt(o.root.style.top   ))) o.root.style.top    = "0px";

    // Constrain drag to be vertical
    o.minX  = 0;
    o.maxX  = 0;    
    o.minY  = null;
    o.maxY  = null;

    // Default drag events on object to being empty functions if we don't want hooks
    //o.root.onDragStart  = new Function();
    //o.root.onDragEnd  = new Function();
    //o.root.onDrag    = new Function();
    
    // Drag events we hook in for picker.
    o.root.onDragStart  = pickerDrag.itemOnDragStart;
    o.root.onDrag = pickerDrag.itemOnDrag;
    o.root.onDragEnd = pickerDrag.itemOnDragEnd;
  },

  initWrap : function (o,oRoot,e) {
    // Wrapper so we can initialise our objects optionally by putting initWrap as their first onmousedown
    pickerDrag.init(o,oRoot);
    pickerDrag.start(e,o)
  },
  
  start : function(e,wrapThis)
  {
    var o = pickerDrag.obj = wrapThis ? wrapThis : this;
    e = pickerDrag.fixE(e);
    var y = parseInt(o.root.style.top);
    var x = parseInt(o.root.style.left);
    o.root.onDragStart(x, y, o.root);

    o.lastMouseX  = e.clientX;
    o.lastMouseY  = e.clientY;

    if (o.minX != null)  o.minMouseX  = e.clientX - x + o.minX;
    if (o.maxX != null)  o.maxMouseX  = o.minMouseX + o.maxX - o.minX;
    if (o.minY != null)  o.minMouseY  = e.clientY - y + o.minY;
    if (o.maxY != null)  o.maxMouseY  = o.minMouseY + o.maxY - o.minY;

    document.onmousemove  = pickerDrag.drag;
    document.onmouseup    = pickerDrag.end;
    document.onmousedown  = pickerDrag.falsefunc; // in some browers this prevents cascading of events (and cures text selection going off)

    return false;
  },

  drag : function(e)
  {
    e = pickerDrag.fixE(e);
    var o = pickerDrag.obj;

    var ey  = e.clientY;
    var ex  = e.clientX;
    var y = parseInt(o.root.style.top);
    var x = parseInt(o.root.style.left);
    var nx, ny;

    if (o.minX != null) ex = Math.max(ex, o.minMouseX);
    if (o.maxX != null) ex = Math.min(ex, o.maxMouseX);
    if (o.minY != null) ey = Math.max(ey, o.minMouseY);
    if (o.maxY != null) ey = Math.min(ey, o.maxMouseY);

    nx = x + (ex - o.lastMouseX);
    ny = y + (ey - o.lastMouseY);

    o.root.style.left = nx + "px";
    o.root.style.top = ny + "px";
    o.lastMouseX  = ex;
    o.lastMouseY  = ey;

    o.root.onDrag(nx, ny, o.root);
    return false;
  },
  
  resetPosition : function() {
    var o = pickerDrag.obj;  
    var ex = o.lastMouseX;
    var ey = o.lastMouseY; 
    var y = parseInt(o.root.style.top);
    var x = parseInt(o.root.style.left);
    var nx, ny;

    if (o.minX != null) ex = Math.max(ex, o.minMouseX);
    if (o.maxX != null) ex = Math.min(ex, o.maxMouseX);
    if (o.minY != null) ey = Math.max(ey, o.minMouseY);
    if (o.maxY != null) ey = Math.min(ey, o.maxMouseY);

    nx = x + (ex - o.lastMouseX);
    ny = y + (ey - o.lastMouseY);

    o.root.style.left = nx + "px";
    o.root.style.top = ny + "px";
    o.lastMouseX  = ex;
    o.lastMouseY  = ey;
     
  },

  end : function()
  {
    // Finish the drag
    document.onmousemove = null;
    document.onmouseup   = null;
    var o = pickerDrag.obj;    
    o.root.onDragEnd(  parseInt(o.root.style.left), 
                      parseInt(o.root.style.top), o.root);
    o.root.style.backgroundColor = "";   
    pickerDrag.obj = null;
  },

  fixE : function(e)
  {
    // Normalise parameters
    if (typeof e == 'undefined') e = window.event;
    if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
    if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
    return e;
  },
  
  recalcOffsets : function() {
    var o = pickerDrag.obj;
    var offsets = pickerDrag.offsets;
    var container = o.root.parentNode;
    var elems = container.getElementsByTagName("div")
    for (var i = 0; i < elems.length; i++) {
      offsets[i] = elems[i].offsetTop
    }
  },
  
  getItemOffset : function (elem) {
    var o = pickerDrag.obj;
    var offsets = pickerDrag.offsets;
    var container = o.root.parentNode;
    var elems = container.getElementsByTagName("div")
    for (var i = 0; i < elems.length; i++) {
      if (elems[i] == elem) { return i }
    }    
  },
  
  itemOnDrag : function (x,y,elem) {
    var container = elem.parentNode;  
    var offsets = pickerDrag.offsets;
    // We're only really interested in the y value    
    y = elem.offsetTop;
    pickerDrag.recalcOffsets();
    var pos = pickerDrag.getItemOffset(elem);
    var elems = container.getElementsByTagName("div");
    if (pos != elems.length-1 && y > offsets[pos + 1]) { 
      var currentOffset=elem.offsetTop
      container.removeChild(elem);
      if(pos+1>=elems.length) {
        container.appendChild(elem);      
      } else {
        container.insertBefore(elem, elems[pos+1]);
      }
      if(pos==0) {
        elems[0].className='pickerValueItem pickerValueFirstItem'
        elems[1].className='pickerValueItem pickerValueNotFirstItem'
      }
      elem.style.top = "0px";
      var newOffsetTop=currentOffset-elem.offsetTop
      elem.style.top = '' + newOffsetTop + 'px'
    }
    if (pos != 0 && y < offsets[pos - 1]) { 
      var currentOffset=elem.offsetTop
      container.removeChild(elem);
      container.insertBefore(elem, elems[pos-1]);
      elem.style.top = "0px";
      var newOffsetTop=currentOffset-elem.offsetTop
      elem.style.top = '' + newOffsetTop + 'px'
      if(pos==1) {
        elems[0].className='pickerValueItem pickerValueFirstItem'
        elems[1].className='pickerValueItem pickerValueNotFirstItem'
      }
    }  
  },
  itemOnDragStart : function (x,y,elem) {
     elem.style.backgroundColor = "#f5f5f5";
     pickerDrag.startingPosition = pickerDrag.getItemOffset(elem)
  },
  itemOnDragEnd : function (x,y,elem) {
    var originalPos=pickerDrag.startingPosition
    var newPos=pickerDrag.getItemOffset(elem)
    elem.style.top="0px";
    if (originalPos!=newPos) {
      var container=elem.parentNode;
      var elems=container.getElementsByTagName("div");
      var insertBeforeValue;
      if(newPos<elems.length-1) {
         insertBeforeValue=picker_removeLinkGetInfo(elems[newPos+1].getElementsByTagName('a')[0])[0]
      }
      var elemValueInfo=picker_removeLinkGetInfo(elem.getElementsByTagName('a')[0])
      picker_moveValuePosition(elemValueInfo[1],elemValueInfo[0],insertBeforeValue)
    }
    pickerDrag.offsets=new Array();
  },
  
  falsefunc : function () { return false; } // used to block cascading events
};

function picker_getInfo(instanceId) {
  info=pickerInstances['~~' + instanceId] 
  if (!info && window.frameElement && window.frameElement.thisPickerInfo) {
    info=window.frameElement.thisPickerInfo
  }
  return info
}
function picker_showBrowseFrame(instanceId,url,forceUrlReset) {
  // Assumes browse picker frame will be at the bottom and will be part of the same set as the current window
  var info=picker_getInfo(instanceId)
  var frame=info['pickerFrameElement']
  var frameSet=frame.parentNode
  url=url||info['frameSrc']
  if (info['filterValuesCallback']) {
    var filterValues = {}
    info['filterValuesCallback'](filterValues)
    url += encodeSetArgsForUrl('filterArgs', filterValues)
  }
  if (forceUrlReset || frame.src!=url || info!=frame.thisPickerInfo) {
    frame.src=url
  }
  if (info['rowsTemplate']) {
    frameSet.rows=info['rowsTemplate'].replace('FRAMESIZE',info['showSize'])
  }
  if (info['colsTemplate']) {
    frameSet.cols=info['colsTemplate'].replace('FRAMESIZE',info['showSize'])
  }
  frame.thisPickerInfo=info
  frame.thisPickerId=instanceId
  info['popupLink'].focus()
}
function picker_getValue(instanceId,getDisplayValue) {
  // instanceId is optional for picking windows
  var info=picker_getInfo(instanceId)
  var hiddenField=info['valueField']
  var multi=info['multi']

  var options=hiddenField.options
  var value=new Array()
  for (var j=0; j<options.length; j++) {
    if (options[j].selected) {
      if (getDisplayValue) {
        if (getDisplayValue==2) {
          value.push([options[j].value,options[j].text])
        } else {
          value.push(options[j].text)
        }
      } else {
        value.push(options[j].value)
      }
    }
  }
  if (value.length) {
    if(multi) {
      return value
    } else {
      return value[0]
    }
  } else {
    if (multi) {
      return []
    } else {
      return ''
    }
  }
}
function picker_isValuePicked(value,instanceId) {
  // instanceId is optional for picking windows
  var info=picker_getInfo(instanceId)
  var multi=info['multi']
  var hiddenField=info['valueField']
  var options=hiddenField.options
  for (var j=0; j<options.length; j++) {
    var option=options[j]
    if (option.value==value && option.selected) {
      return true
    }
  }
  return false
}
function picker_onChange(instanceId) {
  // instanceId is optional for picking windows
  var info=picker_getInfo(instanceId)
  if (!info['onChange']) {
    return
  }
  if (info['fieldWindow']!=window) {
    // Call in context of parent window
    info['fieldWindow'].picker_onChange(instanceId)
    return
  }
  var hiddenField=info['valueField']
  var multi=info['multi']
  var value=picker_getValue(instanceId)
  var displayValue=picker_getValue(instanceId,1)
  var persistEl=document.getElementById('picker_persistfield_' + instanceId)
  if (persistEl && thingToJSONString) {
    persistEl.value=thingToJSONString([value,displayValue])
  }
  eval(info['onChange'])
}

function picker_backCheckRefresh(instanceId) {
  var persistEl=document.getElementById('picker_persistfield_' + instanceId)
  if (persistEl && persistEl.value && parseJSONString) {
    valueInfo=parseJSONString(persistEl.value)
    picker_setValue(valueInfo[0],valueInfo[1],instanceId,1)
  }
}

function picker_clearValue(instanceId) {
  // instanceId optional for picker windows
  var info=picker_getInfo(instanceId)
  var hiddenField=info['valueField']
  var displayField=info['displayValueDiv']
  var pickerWindow=info['pickerWindow']
  var options=hiddenField.options
  var firstBlank=1
  for (var j=0; j<options.length; j++) {
    if (!info['multi'] && options[j].value=='') {
      options[j].selected=true
    } else {
      options[j].selected=false
    }
  }
  displayField.innerHTML='&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
  picker_onChange(instanceId)
  if (pickerWindow && pickerWindow.frameElement && pickerWindow.frameElement.thisPickerId==instanceId && pickerWindow.picker_handleValueChange) {
    if (info['multi']) {
      pickerWindow.picker_handleValueChange(instanceId,[],1)
    } else {
      pickerWindow.picker_handleValueChange(instanceId,'',0)
    }
  }
}

function picker_removeLinkGetInfo(linkObject) {
  if (linkObject.PICKERINSTANCEID!=undefined) {
    var value=linkObject.PICKERVALUE
    var instanceId=linkObject.PICKERINSTANCEID
  } else if (linkObject.attributes && linkObject.attributes['PICKERVALUE']) {
    var value=linkObject.attributes['PICKERVALUE'].value
    var instanceId=linkObject.attributes['PICKERINSTANCEID'].value
  }
  return [value,instanceId]
}

// Handle clicking on a value remove element
function picker_removeLinkClick(arg) {
  if(!arg || !arg.href) {
    linkObject=this;
    if(arg && arg.target && arg.preventDefault) {
      arg.preventDefault();
    }
  } else {
    linkObject=arg;
  }
  linkInfo=picker_removeLinkGetInfo(linkObject)
  value=linkInfo[0]
  instanceId=linkInfo[1]
  var info=picker_getInfo(instanceId)
  var pickerWindow=info['pickerWindow']
  picker_unpickValue(value,'',instanceId)
  if (pickerWindow && pickerWindow.frameElement && pickerWindow.frameElement.thisPickerId==instanceId && pickerWindow.picker_handleValueChange) {
    pickerWindow.picker_handleValueChange(instanceId,picker_getValue(instanceId),info['multi'])
  }
  return false;
}

function picker_moveValuePosition(instanceId,value1,value2) {
  // instanceId is optional for picking windows
  var info=picker_getInfo(instanceId)
  var hiddenField=info['valueField']
  var options=hiddenField.options
  multi=info['multi']
  if (!multi) {
    return false
  }
  var pos1=-1;
  var pos2=-1;
  for(var i=0;i<options.length;i++) {
    if(options[i].value==value1 && options[i].selected) {
      pos1=i
    }
    if(value2!=undefined && options[i].value==value2 && options[i].selected) {
      pos2=i
    }
  }
  if (pos1<0 || (value2!=undefined && pos2<0)) {
    return false;
  }
  if (value2==undefined) {
    var option1=options[pos1]
    hiddenField.removeChild(option1)
    hiddenField.appendChild(option1)
  } else {
    var option1=options[pos1]
    var option2=options[pos2]
    hiddenField.removeChild(option1)
    hiddenField.insertBefore(option1,option2)
  }

  info['fieldWindow'].picker_updateDisplayDiv(info['instanceId'])
  picker_onChange(instanceId)
  var pickerWindow=info['pickerWindow']
  if (pickerWindow && pickerWindow.frameElement && pickerWindow.frameElement.thisPickerId==instanceId && pickerWindow.picker_handleValueChange) {
    pickerWindow.picker_handleValueChange(instanceId,picker_getValue(instanceId),info['multi'])
  }
  return false;
}

function picker_updateDisplayDiv(instanceId) {
  // instanceId is optional for picking windows
  var info=picker_getInfo(instanceId)
  var displayDiv=info['displayValueDiv']
  var originalHeight=displayDiv.style.height
  if (originalHeight) {
    displayDiv.style.overflow='auto'
    displayDiv.style.height=''
  }

  var fieldWindow=info['fieldWindow']
  var displayValue=picker_getValue(instanceId,2)
  if ((info['multi'] && !displayValue.length) || (!info['multi'] && displayValue=='')) {
    displayDiv.innerHTML='&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
  } else {
    if (!info['multi']) {
      displayValue=[displayValue]
    }
    while(displayDiv.hasChildNodes()) {
      displayDiv.removeChild(displayDiv.childNodes[0])
    }
    for(var i=0;i<displayValue.length;i++) {
      var value=displayValue[i][0]
      var dValue=displayValue[i][1]
      var vDiv=fieldWindow.document.createElement('div')
      if(i==0) {
        vDiv.className='pickerValueItem pickerValueFirstItem'
      } else {
        vDiv.className='pickerValueItem pickerValueNotFirstItem'
      }
      if (info['multi']) {
        link=fieldWindow.document.createElement('a')
        link.appendChild(fieldWindow.document.createTextNode('x'))
        link.style.textDecoration='none'
        link.href='#'
        link.PICKERVALUE=value
        link.PICKERINSTANCEID=info['instanceId']
        link.title="Remove"
        if (link.addEventListener) {
          link.addEventListener('click',picker_removeLinkClick,false)
        } else {
          link.onclick=picker_removeLinkClick
        }
        vDiv.appendChild(link)
        vDiv.appendChild(fieldWindow.document.createTextNode(String.fromCharCode(160)))
      }
      if(dValue=='' || dValue==' ') {
        // non-breaking space
        dValue=String.fromCharCode(160)
      }
      if (info['allowReorder']) { 
        var vSpan=fieldWindow.document.createElement('span')
        vSpan.appendChild(fieldWindow.document.createTextNode(dValue))
        vDiv.appendChild(vSpan)
      } else {
        vDiv.appendChild(fieldWindow.document.createTextNode(dValue)) 
      }
      displayDiv.appendChild(vDiv)
      if (info['allowReorder']) { 
        vDiv.style.position='relative'
        pickerDrag.init(vSpan,vDiv)
      }
    }
  }
  if (originalHeight) {
    displayDiv.style.overflow='scroll'
    displayDiv.style.height=originalHeight
    displayDiv.style.overflow='auto'
  }
}
function picker_setValue(value,displayValue,instanceId,noOnChange) {
  // instanceId is optional for picking windows
  var info=picker_getInfo(instanceId)
  var hiddenField=info['valueField']
  var options=hiddenField.options
  while (options.length) {
    options[0]=null
  }
  if (info['multi']) {
    displayValue=displayValue || new Array()
    for(var i=0;i<value.length;i++) {
      var v=value[i]
      var d=v
      if (displayValue.length>i) {
        d=displayValue[i]
      }
      var newOption = new Option(d,v,false,false)
      newOption.selected=true
      options[options.length]=newOption
    }
  } else {
    var newOption = new Option(value,displayValue || value,false,false)
    options[0]=newOption
    newOption.selected=true
  }
  info['fieldWindow'].picker_updateDisplayDiv(info['instanceId'])
  if(! noOnChange) {
    picker_onChange(instanceId)
  }
}
function picker_pickValue(value,displayValue,instanceId) {
  // instanceId is optional for picking windows
  var info=picker_getInfo(instanceId)
  var hiddenField=info['valueField']
  var options=hiddenField.options
  var multi=info['multi']
  var wasFound=0
  for(var i=0;i<options.length;i++) {
    if(options[i].value==value) {
      wasFound=1
      options[i].selected=true
      options[i].text=displayValue || value
    } else if (!multi) {
      options[i].selected=false
    }
  }
  if (!wasFound) {
    var newOption = new Option(displayValue || value,value,false,false)
    options[options.length]=newOption
    newOption.selected=true
  }
  info['fieldWindow'].picker_updateDisplayDiv(info['instanceId'])
  picker_onChange(instanceId)
}
function picker_unpickValue(value,displayValue,instanceId) {
  // instanceId is optional for picking windows
  var info=picker_getInfo(instanceId)
  var hiddenField=info['valueField']
  var options=hiddenField.options
  var multi=info['multi']
  var wasFound=0
  for(var i=0;i<options.length;i++) {
    if(options[i].value==value) {
      if (multi) {
        options[i].selected=false
      } else {
        wasFound=1
      }
    }
  }
  if (wasFound) {
    for(var i=0;i<options.length;i++) {
      if(options[i].value=='') {
        options[i].selected=true
      }
    }
  }
  info['fieldWindow'].picker_updateDisplayDiv(info['instanceId'])
  picker_onChange(instanceId)
}
function picker_fieldClick(field,instanceId) {
  if (field.DISPLAYVALUE || field.displayvalue) {
    var displayValue=field.DISPLAYVALUE  || field.displayvalue
  } else if (field.attributes['DISPLAYVALUE'] || field.attributes['displayvalue']) {
    var displayValue=(field.attributes['DISPLAYVALUE'] && field.attributes['DISPLAYVALUE'].value) || (field.attributes['displayvalue'] && field.attributes['displayvalue'].value)
  } else {
    var displayValue=field.value
  }
  if(field.checked) {
    picker_pickValue(field.value,displayValue,instanceId)
  } else {
    picker_unpickValue(field.value,displayValue,instanceId)
  }
}
function picker_hideBrowseFrame(instanceId,clearFrame) {
  // instanceId is optional for picking windows
  // Assumes browse picker frame will be at the bottom and will be part of the same set as the current window
  var info=picker_getInfo(instanceId)
  if (info) {
    var frame=info['pickerFrameElement']
    var frameSet=frame.parentNode
    if (info['rowsTemplate']) {
      frameSet.rows=info['rowsTemplate'].replace('FRAMESIZE','0')
    }
    if (info['colsTemplate']) {
      frameSet.cols=info['colsTemplate'].replace('FRAMESIZE','0')
    }
    if (clearFrame) {
      frame.src='about:blank'
      frame.thisPickerInfo=undefined
    }
  }
}
function picker_postViewRefreshCallback () {
  var info=picker_getInfo()
  var value=picker_getValue(info['instanceId'])
  picker_handleValueChange(info['instanceId'],value,info['multi'])  
}

// This function should be called on the browse frame if the value of the field
// is updated other than by clicking on a picking field so as to select or
// unselected the picking fields as appropriate.
// Also gets called if "clear" is clicked on.
// This function can be overridden if a frame wishes to handle it differently.

function picker_handleValueChange(instanceId,value,multi) {
  var fields=document.getElementsByName('pickerField')
  var selectedValues=new Object()
  if(multi) {
    for(var i=0;i<value.length;i++) {
      selectedValues['~~' + value[i]]=true
    }
  } else {
    selectedValues['~~' + value]=true
  }
  for(var i=0;i<fields.length;i++) {
    fields[i].checked=selectedValues['~~' + fields[i].value] && true
  }
}

var pickerInstances = new Object()
function picker_registerBrowsePicker(instanceId,frameName,multi,onChange,frameSrc,showSize,allowReorder,filterValuesCallback) {
  var popupLink=getel('picker_popuplink_' + instanceId)
  var displayValueDiv=getel('picker_field_display_' + instanceId)
  var valueField=getel('picker_field_' + instanceId)
  var pickerWindow=window.parent.frames[frameName]
  var frameSet=window.frameElement.parentNode
  var frameRowsTemplate=frameSet.rows
  var frameColsTemplate=frameSet.cols
  var frameOffset
  var frameCount=0
  for (frameOffset=0;frameOffset<frameSet.childNodes.length;frameOffset++) {
    if (frameSet.childNodes[frameOffset].tagName=='FRAME') {
      if (frameSet.childNodes[frameOffset].name==frameName) {
        pickerFrameElement=frameSet.childNodes[frameOffset]
        break;
      }
      frameCount++;
    }
  }
  if (frameRowsTemplate) {
    var bits=frameRowsTemplate.split(',')
    bits[frameCount]='FRAMESIZE'
    frameRowsTemplate=bits.join(',')
  }
  if (frameColsTemplate) {
    var bits=frameColsTemplate.split(',')
    bits[frameCount]='FRAMESIZE'
    frameColsTemplate=bits.join(',')
  }
  pickerInstances['~~' + instanceId]={'instanceId':instanceId,'type':'browse','frameName':frameName,'multi':multi,'onChange':onChange,'frameSrc':frameSrc,
                                            'popupLink':popupLink,'displayValueDiv':displayValueDiv,'showSize':showSize,'filterValuesCallback':filterValuesCallback,
                                            'valueField':valueField,'fieldWindow':window,'pickerWindow':pickerWindow,'pickerFrameElement':pickerFrameElement,
                                            'rowsTemplate':frameRowsTemplate,'colsTemplate':frameColsTemplate,'allowReorder':allowReorder}
  pickerWindow.thisPickerInfo=pickerInstances['~~' + instanceId]
}


    function dependentPicklist( select, secondaryId, depPicklistPrefix ) {
        /*
         * select              select element that fires event
         * secondaryId         prefix for IFRAME and DIV elements involved
         * depPicklistPrefix   prefix for the labels of the dependent picklists
         *                     (e.g. for a group of dependent picklists named
         *                     "Type - A", "Type - B", "Type - C"; the value of
         *                     depPicklistPrefix would be "Type")
         */
        depPicklistPrefix += ' - ';
        var divSelect  = document.getElementById( secondaryId + 'SELECT' );
        var divLoading = document.getElementById( secondaryId + 'Loading' );
        var divEmpty   = document.getElementById( secondaryId + 'Empty' );
        var iframe     = document.getElementById( secondaryId + 'Iframe' );
        var value      = select ? select.value : '';

        if( value == '' ) {
            // hide select DIV, show empty DIV
            divSelect.style.display  = 'none';
            divEmpty.style.display   = 'inline';

        } else {
            // hide select and empty DIVs, show loading message
            divEmpty.style.display   = 'none';
            divSelect.style.display  = 'none';
            divLoading.style.display = 'inline';

            // fetch choices in hidden IFRAME
            iframe.src = '/exectemp/javascriptdependentpicklist?frameContents=1&pprefix=' + escape( depPicklistPrefix ) + '&opt=' + escape( value ) + '&secondaryId=' + escape( secondaryId );
        };
    };
    

function hidePlusChildren(element,onlyRecurseIfIE,recurseCall) {
  // recurseCall argument not for public use, used internally to indicate
  // recursive call

  if (!recurseCall && element) {
    if (element.hpcHidden) {
      // Don't bother if it's already hidden
      return
    } else {
      element.hpcHidden=1
    }
  }

  if (element && element.style && (typeof element.style.display=='string')) {
    element.hpcOldDisplayStyle=element.style.display
    element.style.display='none'
  }
  if (!recurseCall && onlyRecurseIfIE && navigator.userAgent.toLowerCase().indexOf("msie") == -1) {
    // Don't recurse if not IE and we don't want to if it's not IE
    return
  }
  if (element && element.childNodes && element.childNodes.length) {
    for (var i=0; i<element.childNodes.length; i++) {
      hidePlusChildren(element.childNodes[i],onlyRecurseIfIE,1)
    }
  }
}
function showPlusChildren(element,onlyRecurseIfIE,recurseCall) {
  // recurseCall argument not for public use, used internally to indicate
  // recursive call
  if (!recurseCall && element) {
    if (element.hpcHidden) {
      element.hpcHidden=0
    } else {
      // Don't bother if it's not hidden
      return
    }
  }
  if (element && (typeof element.hpcOldDisplayStyle=='string')) {
    element.style.display=element.hpcOldDisplayStyle
  }
  if (!recurseCall && onlyRecurseIfIE && navigator.userAgent.toLowerCase().indexOf("msie") == -1) {
    // Don't recurse if not IE and we don't want to if it's not IE
    return
  }
  if (element && element.childNodes && element.childNodes.length) {
    for (var i=0; i<element.childNodes.length; i++) {
      showPlusChildren(element.childNodes[i],onlyRecurseIfIE,1)
    }
  }
}

