var ajaxStatusOK = "<status>OK</status>";

function isStatusOK(responseText) {
  return responseText.substr(0, ajaxStatusOK.length) == ajaxStatusOK;
}

function ajaxCommunication(frameID, pageURL, openPageEventObj, formData, showWaitWheel, isAppended, keepOriginalUntilLoad) {

  var ajaxCommObj = new ajaxCommClass();

  ajaxCommObj.frameID = frameID;
  ajaxCommObj.pageURL = pageURL;

  if (openPageEventObj)
    ajaxCommObj.eventObj = openPageEventObj;

  ajaxCommObj.formData = formData;
  ajaxCommObj.showWaitWheel = showWaitWheel;
  ajaxCommObj.isAppended = isAppended;
  ajaxCommObj.keepOriginalUntilLoad = keepOriginalUntilLoad;

  if ((frameID == 'contextMenu') || (showWaitWheel == false))
    ajaxCommObj.waitWheelHTML = '<font size="1">Loading...</font>';

  ajaxCommObj.Request();
}

// Ajax Communication Class
function ajaxCommClass() {
  var _ajaxCommClass = this;

  // Properties
  this.pageURL = '';
  this.frameID = '';
  this.frameObj;
  this.eventObj = new onRequestClass();
  this.formData = "";
  this.showWaitWheel = true;
  this.isAppended = false;
  this.keepOriginalUntilLoad = false;
  this.xmlHttp;
  this.waitWheelHTML = waitWheel();
  this.responseText = '';
  this.async = true;
  this.sendMethod = "POST";

  // Methods
  this.Request = function Request() {

    if (this.frameID != '') {
      this.frameObj = document.getElementById(this.frameID);
    }

    if (!this.isAppended && !this.keepOriginalUntilLoad && this.showWaitWheel && this.frameObj)
      this.frameObj.innerHTML = this.waitWheelHTML;

    try {
      this.xmlHttp = new XMLHttpRequest();

    }
    catch (e) {
      try {
        this.xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
      }
      catch (e) {
        try {
          this.xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (e) {
          alert("This system requires Ajax. Please visit www.microsoft.com/ie and download a compatible browser.");
          return false;
        }
      }
    }

    this.xmlHttp.parent = this;

    this.xmlHttp.onComplete = function () {

      if (this.parent.frameObj) {

        if (this.parent.isAppended)
          this.parent.frameObj.innerHTML += this.responseText;
        else {
          this.parent.frameObj.innerHTML = this.responseText;
        }

        scripts = this.parent.frameObj.getElementsByTagName('script');

        for (var s = 0; s < scripts.length; s++) {
          eval(scripts[s].innerHTML);
        }

        if (document.getElementById('contextMenuID') && document.getElementById('contextMenuStatus') && this.parent.frameObj.id != 'contextMenu') {
          //alert(document.getElementById('contextMenuRecordID').value);
          openPage('contextMenu', 'contextMenu.asp?menuItemID=' + document.getElementById('contextMenuID').value + '&entityStatus=' + document.getElementById('contextMenuStatus').value + '&contextMenuRecordID=' + document.getElementById('contextMenuRecordID').value);
        }
      }
      if (this.parent.eventObj.onRequestComplete)
        this.parent.eventObj.onRequestComplete(this.responseText);

      this.parent.responseText = this.responseText;
    }

    this.xmlHttp.onreadystatechange = function () {
      switch (this.readyState) {
        case 0: if (this.parent.eventObj.onRequestNotInit)
            this.parent.eventObj.onRequestNotInit();
          break;

        case 1: if (this.parent.eventObj.onRequestInit)
            this.parent.eventObj.onRequestInit();
          break;

        case 2: if (this.parent.eventObj.onRequestSent)
            this.parent.eventObj.onRequestSent();
          break;

        case 3: if (this.parent.eventObj.onRequestActive)
            this.parent.eventObj.onRequestActive();
          break;

        case 4:
          this.onComplete();
          break;
      }
    }
    //alert(this.pageURL);

    if (this.formData && this.formData != '')
      this.sendMethod = "POST";
    else
      this.sendMethod = "GET";

    this.xmlHttp.open(this.sendMethod, this.pageURL, this.async);
    this.xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    this.xmlHttp.send(this.formData);

    //Firefox doesn't go through the onreadystatechange stuff if the request is syncronous. - Mathew
    if (!this.async && navigator.appName == "Netscape")
      this.xmlHttp.onComplete();
  }

  this.Abort = function abort() {
    if (this.xmlHttp)
      this.xmlHttp.abort();
  }
}

function waitWheel() {
  var reply = ""

  reply += "<table cellspacing=0 cellpadding=0 border=0 width='100%' height='100%'>";
  reply += "<tr><td align='center'><img src='../Images/waitWheel.gif'><font size='1'><br/>Please wait...</font></td></tr>";
  reply += "</table>";

  return reply;
}

function getIntFromPx(px) {
  return parseInt(px.substring(0, px.length - 2));
}




var fiArray;
var fiArrayLowerBound = 0;
var fiArrayUpperBound = 0;
var fiArraySelected = -1; 	// selected element in list

function setAjaxCommAction(ajaxCommObj, onRequestComplete) {
  var requestClass = new onRequestClass();

  requestClass.onRequestComplete = onRequestComplete;

  ajaxCommObj.eventObj = requestClass;
}

function onRequestClass() {
  this.onRequestNotInit = onRequestNotInit;
  this.onRequestInit = onRequestInit;
  this.onRequestSent = onRequestSent;
  this.onRequestActive = onRequestActive;
  this.onRequestComplete = onRequestComplete;

  function onRequestNotInit() { return false; }
  function onRequestInit() { return false; }
  function onRequestSent() { return false; }
  function onRequestActive() { return false; }
  function onRequestComplete() { return false; }
}

function triggerAnotherPageClass(frameID, pageURL) {
  this.onRequestNotInit = onRequestNotInit;
  this.onRequestInit = onRequestInit;
  this.onRequestSent = onRequestSent;
  this.onRequestActive = onRequestActive;

  function onRequestNotInit() { return false; }
  function onRequestInit() { return false; }
  function onRequestSent() { return false; }
  function onRequestActive() { return false; }
  this.onRequestComplete = function () {
    openPage(frameID, pageURL);
  }
}

function triggerAnotherTwoPagesClass(frameID1, pageURL1, frameID2, pageURL2) {
  this.onRequestNotInit = onRequestNotInit;
  this.onRequestInit = onRequestInit;
  this.onRequestSent = onRequestSent;
  this.onRequestActive = onRequestActive;

  function onRequestNotInit() { return false; }
  function onRequestInit() { return false; }
  function onRequestSent() { return false; }
  function onRequestActive() { return false; }
  this.onRequestComplete = function () {
    openPage(frameID1, pageURL1);
    openPage(frameID2, pageURL2);
  }
}

function triggerDashboardClass() {
  this.onRequestNotInit = onRequestNotInit;
  this.onRequestInit = onRequestInit;
  this.onRequestSent = onRequestSent;
  this.onRequestActive = onRequestActive;

  function onRequestNotInit() { return false; }
  function onRequestInit() { return false; }
  function onRequestSent() { return false; }
  function onRequestActive() { return false; }
  this.onRequestComplete = function () {
    openPage('todoFrame', 'dashboard.asp?todo=true');
    //openPage('calendarFrame', 'dashboard.asp?calender=true');	
    openPage('calendarFrame', 'diary.asp?drawCalender=true');
    openPage('announcementsFrame', 'dashboard.asp?announcements=true');
    openPage('systemStatusFrame', 'dashboard.asp?systemStatus=true');
    openPage('commonTasksFrame', 'dashboard.asp?commonTasks=true');
  }
}

function formInsightRequestClass(callingObj, textBoxID) {
  var thisId = callingObj.id;
  this.Parent = onRequestClass;

  this.onRequestNotInit = function () { try { obj('fiProgress0' + thisId).src = '../Images/fiProgressOn.gif'; } catch (err) { } };
  this.onRequestInit = function () { try { obj('fiProgress1' + thisId).src = '../Images/fiProgressOn.gif'; } catch (err) { } };
  this.onRequestSent = function () { try { obj('fiProgress2' + thisId).src = '../Images/fiProgressOn.gif'; } catch (err) { } };
  this.onRequestActive = function () { try { obj('fiProgress3' + thisId).src = '../Images/fiProgressOn.gif'; } catch (err) { } };

  this.onRequestComplete = function (responseText) {
    var nvp, i;

    callingObj.innerHTML = '';
    if (responseText != '') {
      fiArray = responseText.split('!##!');
      for (i = 0; i < fiArray.length; i++) {
        nvp = fiArray[i].split('~');
        insertFIOption(nvp[0], nvp[1], callingObj, textBoxID, '')
      }

      fiArrayLowerBound = 0;
      fiArrayUpperBound = fiArray.length - 1;
    }
  }
}

function saveRequestClass() {
  this.Parent = onRequestClass;

  this.onRequestNotInit = function () { return false; };
  this.onRequestInit = function () { return false; };
  this.onRequestSent = function () {
    // Show save in progress
    showSaveFrame();
  };
  this.onRequestActive = function () { return false; };

  this.onRequestComplete = function onRequestComplete(responseText) {
    // Hide save logo
    hideSaveFrame();

    if (responseText.substring(0, 27) != '<saveStatus>OK</saveStatus>')
      alert(responseText);
  }
}

function printEventClass() {
  this.Parent = onRequestClass;

  this.onRequestNotInit = function () { return false; };
  this.onRequestInit = function () { return false; };
  this.onRequestSent = function () { return false; };
  this.onRequestActive = function () { return false; };

  this.onRequestComplete = function onRequestComplete(responseText) {
    hideWaitWindow();

    if (responseText.length < 5 || responseText.substring(0, 4) != 'url:') {
      alert(responseText);
    }
    else
      printDocumentFinal(responseText.substring(4));
  }
}

function operationEventClass(performFunction) {
  this.Parent = onRequestClass;

  this.onRequestNotInit = function () { return false; };
  this.onRequestInit = function () { return false; };
  this.onRequestSent = function () { return false; };
  this.onRequestActive = function () { return false; };

  this.onRequestComplete = function onRequestComplete(responseText) {
    hideWaitWindow();

    if (!isStatusOK(responseText) && responseText.substring(0, 4) != 'url:') {
      alert(responseText);
    }
    else if (responseText.substring(0, 4) == 'url:')
      performFunction(responseText.substring(4));
    else if (responseText.length > 19)
      performFunction(responseText.substring(19));
    else
      performFunction('');
  }
}

function progressBarClass(progressBarID) {
  this.Parent = onRequestClass;

  this.onRequestNotInit = function () { updateProgress(progressBarID, 10, ''); };
  this.onRequestInit = function () { updateProgress(progressBarID, 20, ''); };
  this.onRequestSent = function () { updateProgress(progressBarID, 40, ''); };
  this.onRequestActive = function () { updateProgress(progressBarID, 50, ''); };
  this.onRequestComplete = function () { updateProgress(progressBarID, 100, ''); };
}

function checkMailClass(callsBtnID) {
  this.Parent = onRequestClass;

  this.onRequestNotInit = function () { return false; };
  this.onRequestInit = function () { return false; };
  this.onRequestSent = function () { return false; };
  this.onRequestActive = function () { return false; };

  this.onRequestComplete = function onRequestComplete(responseText) {
    var callsBtnObj = document.getElementById(callsBtnID + 'Text');
    var callsBtnImgObj = document.getElementById('img' + callsBtnID);
    var newMails = parseInt(responseText);
    if (isNaN(newMails)) newMails = 0;

    if (callsBtnObj && callsBtnImgObj) {
      if (newMails > 0) {
        callsBtnObj.innerHTML = '<b>Mail (' + newMails + ')</b>';
        callsBtnImgObj.src = '../Images/icoCallOn.gif';
      }
      else {
        callsBtnObj.innerHTML = 'Mail';
        callsBtnImgObj.src = '../Images/icoCallOff.gif';
      }
    }
  }
}

function reportGenClass() {
  this.Parent = onRequestClass;

  this.onRequestNotInit = function () { updateProgress('word2007ReportProgress', 10, ''); };
  this.onRequestInit = function () { updateProgress('word2007ReportProgress', 20, ''); };
  this.onRequestSent = function () { updateProgress('word2007ReportProgress', 40, ''); };
  this.onRequestActive = function () { updateProgress('word2007ReportProgress', 50, ''); };
  this.onRequestComplete = function onRequestComplete(responseText) {
    var directoryIDObj = obj('reportDirectoryID');
    var genFilename = obj('reportFilename');

    if (directoryIDObj && genFilename) {
      ajaxCommunication('reportWordFrame', 'reportsInterface.asp?pollWordDoc=true&directoryID=' + directoryIDObj.value + '&filename=' + genFilename.value, new progressBarClass('wordReportProgress'), null, false, false, true);
      ajaxCommunication('reportPDFFrame', 'reportsInterface.asp?pollPDFDoc=true&directoryID=' + directoryIDObj.value + '&filename=' + genFilename.value, new progressBarClass('wordPDFReportProgress'), null, false, false, true);
    }

    updateProgress('word2007ReportProgress', 100, '');
  };
}

function populateFieldsClass() {
  this.Parent = onRequestClass;

  this.onRequestNotInit = function () { return false; };
  this.onRequestInit = function () { return false; };
  this.onRequestSent = function () {
    // Show save in progress
    showSaveFrame();
  };
  this.onRequestActive = function () { return false; };

  this.onRequestComplete = function onRequestComplete(responseText) {
    // Hide save logo
    hideSaveFrame();

    var fields = responseText.split('!##!');
    var nvp;
    var tbObj;
    var validationIconObj;

    for (i = 0; i < fields.length; i++) {
      nvp = fields[i].split('!~~!');
      tbObj = obj(nvp[0]);
      if (tbObj && ((tbObj.value == '') || (nvp[2] == 'true'))) {
        validationIconObj = document.getElementById('vftbiValidationIcon' + tbObj.id.substring(0, tbObj.id.indexOf('~')));

        if (nvp[1].substring(0, 6) == 'error:') {
          tbObj.value = nvp[1].substring(6);
          if (validationIconObj)
            validationIconObj.src = '../Images/icoError.gif';
        }
        else if (nvp[1].substring(0, 5) == 'lock:') {
          tbObj.value = nvp[1].substring(5);
          if (validationIconObj)
            validationIconObj.src = '../Images/icoLocked.gif';
          tbObj.readOnly = true;
          tbObj.disabled = true;
          hideInfoBox();
        }
        else {
          tbObj.value = nvp[1];
          if (validationIconObj)
            validationIconObj.src = '../Images/icoCompleted.gif';
          tbObj.readOnly = false;
        }
      }
    }
  }
}

function populateSelectClass(selectObjID) {
  this.Parent = onRequestClass;

  this.onRequestNotInit = function () { return false; };
  this.onRequestInit = function () { return false; };
  this.onRequestSent = function () { return false; };
  this.onRequestActive = function () { return false; };

  this.onRequestComplete = function onRequestComplete(responseText) {
    var resetList = new Array();
    var optionParameters;
    var objSelect = document.getElementById(selectObjID)
    var selIndex = 0;

    if (objSelect) {
      if (responseText.indexOf('!~~!') > 0) {
        var options = responseText.split('!##!');

        for (var i = 0; i < options.length; i++) {
          optionParameters = options[i].split('!~~!');
          objSelect.options[i + 1] = new Option(optionParameters[1], optionParameters[0]);

          if (optionParameters[2].toLowerCase() == 'selected')
            selIndex = i;
        }
      }
      // remove 'updating...' message and set selected index
      objSelect.options[0] = null;
      if (selIndex > 0)
        objSelect.selectedIndex = selIndex - 1;

      if (objSelect.options.length > 0)
        objSelect.disabled = false;
    }
  }
}

function openPage(frameID, pageURL) {
  // opens with the default event obj
  eventObj = new onRequestClass();
  openPageWithEvents(frameID, pageURL, eventObj, true);
}

function openPageUncurtain(frameID, pageURL) {
  // opens with the default event obj
  eventObj = new onRequestClass();
  eventObj.onRequestComplete = function () { uncurtain(); }
  openPageWithEvents(frameID, pageURL, eventObj, true);
}

function populateFields(optionalFormObj, pageURL) {
  // gets a reply based on pageURL which is encoded to populate page fields automatically.
  var eventObj = new populateFieldsClass();

  if (optionalFormObj)
    ajaxSubmitForm(optionalFormObj, '', pageURL, eventObj, false);
  else
    openPageWithEvents('', pageURL, eventObj, false);
}

function populateSelect(selectObjID, optionalFormObj, pageURL) {
  // gets a reply based on pageURL which is encoded to populate select box(es) automatically.
  var selectObj = document.getElementById(selectObjID);

  if (selectObj) {
    // clear existing select...
    selectObj.options.length = 0;
    selectObj.disabled = true;
    selectObj.options[0] = new Option('Updating...', 'Updating...');

    var eventObj = new populateSelectClass(selectObjID);

    if (optionalFormObj)
      ajaxSubmitForm(optionalFormObj, '', pageURL, eventObj, false);
    else
      openPageWithEvents('', pageURL, eventObj, false);
  }
}

function getAJAXData(objID, pageURL) {
  //gets some generic data and returns it to innerHTML
  eventObj = new onRequestClass();
  openPageWithEvents(objID, pageURL, eventObj, false);
}

//function ajaxSubmitForm(formObj, frameID, pageURL, showWaitWheel)
function ajaxSubmitForm(formObj, frameID, pageURL, eventObj, showWaitWheel) {
  ajaxSubmitFormAdvanced(formObj, frameID, pageURL, eventObj, showWaitWheel, false, false);
}

function ajaxSubmitFormAdvanced(formObj, frameID, pageURL, eventObj, showWaitWheel, isAppended, keepOriginalUntilLoad) {
  if (formObj)
    ajaxCommunication(frameID, pageURL, eventObj, ajaxEncodeForm(formObj), showWaitWheel, isAppended, keepOriginalUntilLoad);
  else
    alert('AJAX ERROR: Unable to locate form.');
}

function ajaxSubmitFormNotAsync(formObj, frameID, pageURL, eventObj, showWaitWheel) {
  var ajaxCommObj = new ajaxCommClass();

  ajaxCommObj.formData = ajaxEncodeForm(formObj);
  ajaxCommObj.frameID = frameID;
  ajaxCommObj.pageURL = pageURL;
  ajaxCommObj.eventObj = eventObj;
  ajaxCommObj.showWaitWheel = showWaitWheel;
  ajaxCommObj.async = false;

  ajaxCommObj.Request();
}

function ajaxCall(pageURL) {
  var reply = false;
  var ajaxCommObj = new ajaxCommClass();


  //alert('pageURL = ' + pageURL)
  ajaxCommObj.pageURL = pageURL;
  ajaxCommObj.async = false;
  ajaxCommObj.Request();

  if (!isStatusOK(ajaxCommObj.responseText))
    alert(ajaxCommObj.responseText);
  else
    reply = true;

  return reply;

}

function ajax(pageURL, formID) {
  var formObj;
  var formData;

  // if they've provided a form, then submit that too
  if (formID) {
    if (formID != '') {
      formObj = document.getElementById(formID);
      if (formObj)
        formData = ajaxEncodeForm(formObj);
    }
  }

  return ajaxSubmit(pageURL, formData);
}

function ajaxSubmit(pageURL, formData) {
  var ajaxCommObj = new ajaxCommClass();

  ajaxCommObj.pageURL = pageURL;
  ajaxCommObj.async = false;
  ajaxCommObj.formData = formData;

  // place request
  ajaxCommObj.Request();

  return ajaxCommObj.responseText;
}

function getFCKEditorValue(instanceName) {
  var oEditor = FCKeditorAPI.GetInstance(instanceName);
  return oEditor.GetXHTML(false);
}

function setFCKEditorValue(instanceName, text) {
  var oEditor = FCKeditorAPI.GetInstance(instanceName);
  oEditor.SetHTML(text);
}

function ajaxEncodeForm(formObj) {
  var i;
  var fieldsList = "";
  var thisElement;
  var lastElement;
  var checkBoxNotWritten = false;

  for (i = 0; i < formObj.elements.length; i++) {
    thisElement = formObj.elements[i];
    if (thisElement.tagName == "INPUT") {
      if (checkBoxNotWritten && lastElement && (lastElement.id != thisElement.id)) {
        // where there have been no boxes checked
        fieldsList += escape(lastElement.id) + "=&";
        checkBoxNotWritten = false;
      }

      switch (thisElement.type) {
        case "text":
          fieldsList += escape(thisElement.id) + "=" + escape(thisElement.value) + "&";
          break;

        case "hidden":
          fieldsList += escape(thisElement.id) + "=" + escape(thisElement.value) + "&";
          break;

        case "checkbox":
          if (thisElement.checked) {
            fieldsList += escape(thisElement.id) + "=" + escape(thisElement.value) + "&";
            checkBoxNotWritten = false;
          }
          else	// ignore this box and test the next one (always returns '' if nothing checked)
            if (lastElement && lastElement.id != thisElement.id)
              checkBoxNotWritten = true;
          break;

        case "radio":
          if (thisElement.checked) {
            fieldsList += escape(thisElement.id) + "=" + escape(thisElement.value) + "&";
            checkBoxNotWritten = false;
          }
          else	// ignore this box and test the next one (always returns '' if nothing checked)
            if (lastElement && lastElement.id != thisElement.id)
              checkBoxNotWritten = true;
          break;

        case "button":
          fieldsList += escape(thisElement.id) + "=" + escape(thisElement.value) + "&";
          break;
      }
      lastElement = thisElement;
    }
    else if (thisElement.tagName == "SELECT") {
      if (thisElement.selectedIndex > -1)
        fieldsList += escape(thisElement.id) + "=" + escape(thisElement.options[thisElement.selectedIndex].value) + "&";
    }
    else if (thisElement.tagName == "TEXTAREA") {
      fieldsList += escape(thisElement.id) + "=" + escape(thisElement.value) + "&";
    }
  }
  // special case where last element has not been checked
  if (checkBoxNotWritten)
    fieldsList += escape(lastElement.id) + "=&";

  fieldsList = fieldsList.substring(0, fieldsList.length - 1);

  if (obj('fckEmail'))
    fieldsList += '&emailBody=' + escape(getFCKEditorValue('fckEmail'));

  return fieldsList;
}

function addFormField(formData, formField, formValue) {
  var reply = '';

  if (nullEmpty(formData) != '')
    reply = formData + '&';

  reply += escape(formField) + '=' + escape(formValue);

  return reply;
}

function openPageWithEvents(frameID, pageURL, openPageEventObj, showWaitWheel) {
  ajaxCommunication(frameID, pageURL, openPageEventObj, null, showWaitWheel, false, false);
}

//A simple object with x and y values that specify the dpi of the screen, will only work in IE. If the img isn't
//garbage collected then the other lines need uncommenting. - Mathew
function getDPI() {
  var ruler = document.createElement('img');

  this.x = 0;
  this.y = 0;

  //		ruler.style.display = "none";
  ruler.style.width = "1in";
  ruler.style.height = "1in";

  if (ruler.style.pixelWidth && ruler.style.pixelHeight) {
    this.x = ruler.style.pixelWidth;
    this.y = ruler.style.pixelHeight;
  }

  //		document.body.appendChild(ruler);

  //		document.body.removeChild(ruler);
}

//Sorry only works in IE. - Mathew
function changePassword(contactID) {
  var ajaxCommObj = new ajaxCommClass();

  with (ajaxCommObj) {
    pageURL = 'vmHome.asp?action=changepassword&contactID=' + contactID;
    frameID = 'changePasswordErrorTarget';
    formData = 'password=' + obj('vftbpassword~password~tblContacts').value + "&password2=" + obj('vftbpassword2~password2~tblContacts').value;
    showWaitWheel = false;
    async = false;
    Request();
  }

  if (obj('changePasswordErrorTarget').innerHTML == "")
    restoreBack();
}

//This function should refresh the layout on the ticket sales page when another ticket type is selected. - Mathew
function updateTicketSalesArea(retainTicketID) {


  var areaID = getField("areaID");
  var layoutID = getField("layoutID");
  var eventID = getField("eventID");

  if (!(areaID && layoutID && eventID))
    return;

  var ticketTypeID = getField("ticketTypeID").substr(0, 38);

  //This line should NOT be in here but it was the quickest way to get the Select a Concession screen working when the ticket type changes.
  updateLinksWithNewTicketTypeID(ticketTypeID);

  if (typeof (stadiumPlan) != 'undefined')
    openPage("stadiumPlan", "vmSellTickets.asp?action=drawStadiumPlan&disableAutoClasses=true&areaID=" + areaID + "&layoutID=" + layoutID + "&eventID=" + eventID + "&ticketTypeID=" + ticketTypeID);
  else
    openPage("cbxAreaSelect", "vmSellTickets.asp?action=drawStadiumPlan&disableAutoClasses=true&areaType=unallocated&areaID=" + areaID + "&layoutID=" + layoutID + "&eventID=" + eventID + "&ticketTypeID=" + ticketTypeID);



  //window.location='vmSellTickets.asp?action=chooseArea&areaID=' + areaID + '&layoutID=' + layoutID + '&eventID=' + eventID + '&ticketTypeID=' + ticketTypeID;
  //openPage("", "vmSellTickets.asp?action=drawStadiumPlan&areaID=" + areaID + "&layoutID=" + layoutID + "&eventID=" + eventID + "&ticketTypeID=" + ticketTypeID);
}

function updateLinksWithNewTicketTypeID(ticketTypeID) {
  for (i = 0; i < document.anchors.length; ++i)
    document.anchors[i].href = document.anchors[i].href.replace(/ticketTypeID=\{.{36}\}/ig, "ticketTypeID=" + ticketTypeID);
}

function updatePackageID() {
  var areaID = document.getElementById("areaID").value;
  var layoutID = document.getElementById("layoutID").value;
  var eventID = document.getElementById("eventID").value;
  var ticketTypeID = document.getElementById("ticketTypeID").value.substr(0, 38);
  var packageID = document.getElementById("packageID").value.substr(0, 38);

  //This line should NOT be in here but it was the quickest way to get the Select a Concession screen working when the ticket type changes.
  //updateLinksWithNewPackageTypeID(packageID);

  openPage("stadiumPlan", "vmSellTickets.asp?action=drawStadiumPlan&areaID=" + areaID + "&layoutID=" + layoutID + "&eventID=" + eventID + "&ticketTypeID=" + ticketTypeID + "&packageID=" + packageID);
}

function updateLinksWithNewPackageTypeID(packageID) {
  for (i = 0; i < document.anchors.length; ++i)
    document.anchors[i].href = document.anchors[i].href.replace(/packageID=\{.{36}\}/ig, "packageID=" + ticketTypeID);
}


//HACK Part of an ugly hack. - Mathew
function showHideConcessionTypes(shown) {
  var concessionTypeTitle = document.getElementById("concessionTypeTitle");
  var concessionTypes = document.getElementById("concessionTypes");

  //		alert("shown = " + shown + " !shown = " + !shown + " !!shown = " + !!shown)

  if (concessionTypeTitle && concessionTypes)
    if (!!shown) {
      concessionTypeTitle.style.display = "table-cell";
      concessionTypes.style.display = "table-cell";
    }
    else {
      concessionTypeTitle.style.display = "none";
      concessionTypes.style.display = "none";
    }
}

function cancelTicket(ticketID, target) {
  if (confirm("Are you sure you want to cancel this ticket?")) {
    target.innerHTML = "Canceling...";

    getAJAXData(target, "vmContacts?action=cancelTicket&ticketID=" + ticketID)
  }
}

function refundTicket(ticketID, target) {
  if (confirm("Are you sure you want to refund this ticket?")) {
    target.innerHTML = "Refunding...";

    getAJAXData(target, "vmContacts?action=refundTicket&ticketID=" + ticketID)
  }
}

//Called when the ticket type dropdown changes. I'm not sure if these parameters are used. - Mathew
function onTicketTypeChange(source, eventID, layoutID, areaID, seatID, concessionTypeID) {
  //		var guid, ticketTypeID, immediateAdd;

  typeID = source.options[source.selectedIndex].value.split("#")[0];
  hideConcessions = source.options[source.selectedIndex].value.split("#")[1] == "True";
  immediateAdd = source.options[source.selectedIndex].value.split("#")[2] == "True";

  //alert(source.options[source.selectedIndex].value + " -> ticket type ID = " + ticketTypeID + "# hideConcessions = " + hideConcessions + "# immediateAdd = " + immediateAdd);

  showHideConcessionTypes(!immediateAdd || hideConcessions);

  if (immediateAdd) {
    getAJAXData("", "vmSellTickets.asp?action=settickettype&value=" + typeID);
    //alert(" ticketTypeID = " & ticketTypeID)




    //If (ticketTypeID = 'D05B5033-4124-490B-A282-ACFCE7A3762F')
    //{
    updateTicketSalesArea(true);
    //}

    //updateTicketSalesArea();
  }
  else {

    //alert(" Else -> ticket type ID = " + ticketTypeID + "# hideConcessions = " + hideConcessions + "# immediateAdd = " + immediateAdd);

    //alert(" eventID=" + eventID + "&areaID=" + areaID + "&layoutID=" + layoutID + "&seatID=" + seatID + "&concessionTypeID=" + concessionTypeID + "&ticketTypeID=" + ticketTypeID);

    openPage("Basket", "vmSellTickets.asp?action=selectseat&forcetickettype=true&eventID=" + eventID + "&areaID=" + areaID + "&layoutID=" + layoutID + "&seatID=" + seatID + "&concessionTypeID=" + concessionTypeID + "&ticketTypeID=" + typeID);

    updateTicketSalesArea(true);


    for (i = 0; i < source.length; ++i)
      if (source.options[i].defaultSelected) {
        source.selectedIndex = i;
        break;
      }
  }
}

function onPackageTypeChange(source) {
  var p, packageID
  p = source.selectedIndex
  packageID = source.options[p].value.split("#")[0];
  getAJAXData("", "vmSellTickets.asp?action=setpackagetype&value=" + packageID);
}

function onExtraTypeChange(listName, qtyFieldName, unitPriceFieldName, lineTotalFieldName) {
  var source = obj(listName);
  var v = source.options[source.selectedIndex].value;
  if (v.indexOf('#') != -1) {
    var extraArray = v.split("#");
    unitPrice = extraArray[1];
    obj(unitPriceFieldName).value = unitPrice;
  }
  onExtraTypeQtyChange(listName, qtyFieldName, unitPriceFieldName, lineTotalFieldName);
}

function onExtraTypeQtyChange(listName, qtyFieldName, unitPriceFieldName, lineTotalFieldName) {
  var qty = obj(qtyFieldName).value;
  if (qty == '') qty = 1;
  var unitPrice = obj(unitPriceFieldName).value;
  if (unitPrice == '') unitPrice = 0;
  obj(lineTotalFieldName).value = unitPrice * qty;
}


function onPackageTicketTypeChange(source) {
  // yes I know this looks totally random but, try not using variables (p) and (packageTypeID) and you will find it doesn't work - Gareth
  var p, ticketTypeID
  p = source.selectedIndex
  ticketTypeID = source.options[p].value.split("#")[0];
  //packageTypeID = source.options[p].value
  getAJAXData("", "vmSetupTickets.asp?action=settickettypee&value=" + ticketTypeID);
  //alert(" packageTypeID = " & packageTypeID)

}

//Used in generating reports.	
function setReportDates() {
  document.getElementById("vftbDateFrom~DateFrom~").value = "";
  document.getElementById("vftbDateTo~DateTo~").value = "";
}

//Takes true, false and null.
function setReportTicketTypes(selectIsSeasonTicket) {
  var ticketTypesList = document.getElementById("ticketTypesList");

  for (var i = 0; i < ticketTypesList.options.length; ++i)
    ticketTypesList.options[i].selected = ((ticketTypesList.options[i].value == ("" + selectIsSeasonTicket)) || selectIsSeasonTicket == null);
}

/* Clientside version, forgot that there was no way to get the values back to the server without more major hacks.
function updateDiscount(totalTextBox, percentageDiscountTextBox, total, percentageUpdate, orderID)
{
var totalValue = new Number(totalTextBox.value).toFixed(2);
var percentageDiscountValue = (Math.round(new Number(percentageDiscountTextBox.value.replace("%", "")) * 100) / 100);
			
if(percentageUpdate)
{
if(percentageDiscountValue > 100)
percentageDiscountValue = "100";
else if(percentageDiscountValue < 0)
percentageDiscountValue = "0";
		
percentageDiscountValue = Math.round(percentageDiscountValue * 100) / 100;
			
totalValue = total * (100 - percentageDiscountValue) / 100;

//I don't like this line. - Mathew			
openPage("basket", "vmSellTickets.asp?action=setPercentageDiscount&orderID=" + orderID + "&value=" + percentageDiscountValue);
}
else
{
if(totalValue > total)
totalValue = total;
else if(totalValue < 0)
totalValue = 0;
				
totalValue = new Number(totalValue).toFixed(2);
			
if(total != 0)
percentageDiscountValue = 100 - ((100 * totalValue) / total);	

//Or this line. - Mathew
openPage("basket", "vmSellTickets.asp?action=setFlatDiscount&orderID=" + orderID + "&value=" + (total - totalValue));
}
		
percentageDiscountTextBox.value = percentageDiscountValue + "%";
totalTextBox.value = totalValue;
} */

//Severside version	
function updateDiscount(totalTextBox, percentageDiscountTextBox, total, percentageUpdate, orderID) {
  if (percentageUpdate) {
    openPage("Basket", "vmSellTickets.asp?action=setPercentageDiscount&orderID=" + orderID + "&value=" + this.value);
  }
  else {
    openPage("Basket", "vmSellTickets.asp?action=setFlatDiscount&orderID=" + orderID + "&value=" + this.value);
  }
}

function comfirmNoDuplicates(forename, surname, postcode) {
  var reply = false;
  var ajaxCommObj = new ajaxCommClass();

  ajaxCommObj.pageURL = "vmContacts.asp?action=checkForDuplicate&forename=" + forename + "&surname=" + surname + "&postcode=" + postcode + "";
  ajaxCommObj.async = false;
  ajaxCommObj.Request();

  if (ajaxCommObj.responseText == "true")
    return confirm("A contact with the same name and postcode already exists. Are you sure you want to add another?");
  else
    return true;
}

function addSelectedPriceGroupMemberTypes(priceGroupID) {
  var timeRangeArray = getAllListBoxSelected('lbMemberTypes');
  var values = "";

  for (var i = 0; i < timeRangeArray.length; i++)
    values += timeRangeArray[i].id;

  if (values)
    openPage('priceGroupMemberTypesList', 'vmSetupTickets.asp?action=addMemberTypesToPriceGroup&priceGroupID=' + priceGroupID + "&values=" + values);
}

function removeSelectedPriceGroupMemberTypes(priceGroupID) {
  var timeRangeArray = getAllListBoxSelected('lbPriceGroupMemberTypes');
  var values = "";

  for (var i = 0; i < timeRangeArray.length; i++)
    values += timeRangeArray[i].id

  if (values)
    openPage('priceGroupMemberTypesList', 'vmSetupTickets.asp?action=removeMemberTypesFromPriceGroup&priceGroupID=' + priceGroupID + "&values=" + values);
}

function removeSelectedPriceGroups(listBoxID) {
  var ajaxCommObj = new ajaxCommClass();
  var formData = '';
  var objArray = getAllListBoxSelected(listBoxID);
  var i;

  for (i = 0; i < objArray.length; i++)
    formData += '~' + objArray[i].id;

  formData = addFormField('', 'selectedIDs', formData);

  ajaxCommObj.formData = formData;
  ajaxCommObj.pageURL = 'vmPriceGroups.asp?action=delete';
  ajaxCommObj.async = false;
  ajaxCommObj.Request();

  if (isStatusOK(ajaxCommObj.responseText))
    removeListBoxSelected(listBoxID);
  else
    alert(ajaxCommObj.responseText);
}

function removeSelectedQualifications(listBoxID) {
  var ajaxCommObj = new ajaxCommClass();
  var formData = '';
  var objArray = getAllListBoxSelected(listBoxID);
  var i;

  for (i = 0; i < objArray.length; i++)
    formData += '~' + objArray[i].id;

  formData = addFormField('', 'selectedIDs', formData);

  ajaxCommObj.formData = formData;
  ajaxCommObj.pageURL = 'vmContacts.asp?action=removeQualifications';
  ajaxCommObj.async = false;
  ajaxCommObj.Request();

  if (isStatusOK(ajaxCommObj.responseText))
    removeListBoxSelected(listBoxID);
  else
    alert(ajaxCommObj.responseText);
}

function addGrade(qualificationID) {
  var lastRow = document.getElementById('gradeLastRow');
  var gradesTable = document.getElementById('gradesTable');
  var noneRow = document.getElementById("gradeNoneRow");
  var newRow = document.createElement("div")
  var result = ajax('vmContacts.asp?action=addGrade&qualificationID=' + qualificationID, null);

  noneRow.style.display = "none";

  newRow.innerHTML = result;

  gradesTable.insertBefore(newRow.firstChild, lastRow);
}

function removeGrade(gradeID) {
  var deadGrade = document.getElementById("grade" + gradeID);
  var deadGradeRow = document.getElementById("gradeRow" + gradeID);
  var gradesTable = document.getElementById("gradesTable");
  var noneRow = document.getElementById("gradeNoneRow");

  deadGrade.name = "dead" + deadGrade.name.substring(deadGrade.name.length - dummyIDNoQuote.length);
  deadGradeRow.style.display = "none";

  for (i = gradesTable.firstChild; i != gradesTable.lastChild; i = i.nextSibling)
    if (i.style.display != "none")
      if (i.id != "gradeLastRow")
        return;

  noneRow.style.display = "block";
}

function addDiscount(priceGroupID, discountsTableName) {
  var lastRow = document.getElementById(discountsTableName + 'LastRow');
  var discountsTable = document.getElementById(discountsTableName);
  var noneRow = document.getElementById(discountsTableName + 'NoneRow');
  var newRow = document.createElement("div")
  var result = ajax('vmPriceGroups.asp?action=addDiscount&priceGroupID=' + priceGroupID, null);

  noneRow.style.display = "none";

  newRow.innerHTML = result;

  discountsTable.insertBefore(newRow.firstChild, lastRow);
}

function removeDiscount(discountID, discountsTableName) {
  var deadDiscount = document.getElementById("discount" + discountID);
  var deadDiscountRow = document.getElementById("discountRow" + discountID);
  var discountsTable = document.getElementById(discountsTableName);
  var noneRow = document.getElementById(discountsTableName + "NoneRow");

  deadDiscount.name = "dead" + deadDiscount.name.substring(deadDiscount.name.length - dummyIDNoQuote.length);
  deadDiscountRow.style.display = "none";

  for (i = discountsTable.firstChild; i != discountsTable.lastChild; i = i.nextSibling)
    if (i.style.display != "none")
      if (i.id != "discountLastRow")
        return;

  noneRow.style.display = "block";
}

function addContactQualification(contactID) {
  var lastRow = document.getElementById('cqLastRow');
  var gradesTable = document.getElementById('cqTable');
  var noneRow = document.getElementById("cqNoneRow");
  var newRow = document.createElement("div")
  var result = ajax('vmContacts.asp?action=addContactdQualification&contactID=' + contactID, null);

  noneRow.style.display = "none";

  newRow.innerHTML = result;

  gradesTable.insertBefore(newRow.firstChild, lastRow);
}

function removeContactQualification(cqID) {
  var deadGrade = document.getElementById("cqGradsb" + cqID + "~~");
  var deadGradeRow = document.getElementById("cqRow" + cqID);
  var gradesTable = document.getElementById("cqTable");
  var noneRow = document.getElementById("cqNoneRow");

  deadGrade.name = "dead" + deadGrade.name.substr("cqGradsb".length, dummyIDNoQuote.length);
  deadGradeRow.style.display = "none";

  for (i = gradesTable.firstChild; i != gradesTable.lastChild; i = i.nextSibling)
    if (i.style.display != "none")
      if (i.id != "cqLastRow")
        return;

  noneRow.style.display = "block";
}

String.prototype.countsubstr = function (searchvalue) {
  var count = 0;
  var start = 0;

  while ((start = this.indexOf(searchvalue, start + 1)) != -1)
    count++;

  return count;
}

String.prototype.trim = function () {
  return this.replace(/^\s*/, "").replace(/\s*$/, "");
}

function replaceDerivedLayoutsAction(listBoxID) {
  var ajaxCommObj = new ajaxCommClass();
  var formData = '';
  var objArray = getAllListBoxSelected(listBoxID);
  var i;
  var layoutIDField = document.getElementById("layoutID");

  if (!layoutIDField) {
    alert("Got lost somewhere. This shouldn't happen.");
    return;
  }

  for (i = 0; i < objArray.length; i++)
    formData += '~' + objArray[i].id;

  formData = addFormField('', 'selectedIDs', formData);

  ajaxCommObj.formData = formData;
  ajaxCommObj.pageURL = 'vmVenueDesigner.asp?action=replaceDerivedLayouts&layoutID=' + layoutIDField.value;
  ajaxCommObj.async = false;
  ajaxCommObj.Request();

  if (isStatusOK(ajaxCommObj.responseText)) {
    alert("Completed updating, returning you to the layout.");
    uncurtain();
    loadLayout(layoutIDField.value);
  }
  else
    alert(ajaxCommObj.responseText);
}

function replaceDerivedTicketLayoutsAction(listBoxID) {
  var ajaxCommObj = new ajaxCommClass();
  var formData = '';
  var objArray = getAllListBoxSelected(listBoxID);
  var i;
  var layoutIDField = layoutID;

  if (!layoutIDField) {
    alert("Got lost somewhere. This shouldn't happen.");
    return;
  }

  for (i = 0; i < objArray.length; i++)
    formData += '~' + objArray[i].id;

  formData = addFormField('', 'selectedIDs', formData);

  ajaxCommObj.formData = formData;

  ajaxCommObj.pageURL = 'vmTicketDesigner.asp?action=replaceDerivedTicketLayouts&layoutID=' + layoutID;

  ajaxCommObj.async = false;

  ajaxCommObj.Request();

  if (isStatusOK(ajaxCommObj.responseText)) {
    alert("Completed updating, returning you to the layout.");
    uncurtain();
    loadLayout(layoutID);
  }
  else
    alert(ajaxCommObj.responseText);
}




function pay(areaID, orderID, layoutID, eventID, ticketTypeID, paymentType) {
  curtain();

  var responseText = ajax("vmSellTickets.asp?action=Payment&areaID=" + areaID + "&orderID=" + orderID + "&layoutID=" + layoutID + "&eventID=" + eventID + "&ticketTypeID=" + ticketTypeID + "&paymentType=" + paymentType);

  var errorMessage = responseText.substring(responseText.indexOf("#") + 1);

  if (errorMessage) {
    uncurtain();
    alert(errorMessage);
  }
  else {
    if (paymentType == 'reserve')
      curtain('Reserving...');
    else
      curtain('Processing Tickets...');

    var shouldPrint = responseText.substring(0, responseText.indexOf("#")) != "0";

    updateTicketSalesArea(false);
   
    if (shouldPrint) {
      window.location = 'vmSellTickets.asp?action=print&orderID=SESSION';
    }
    
    setField('ticketTypeID', document.getElementById('ticketTypeID').getAttribute('exp_defaultTicketID') + '#True#True')
    setField('PackageID', '#True#True')
    openPageUncurtain("Basket", "vmSellTickets.asp?action=drawBasket");
  }
}


//not used
function pay2(areaID, orderID, layoutID, eventID, ticketTypeID, paymentType) {
  curtain();

  var responseText = ajax("vmSellTickets.asp?action=Payment&areaID=" + areaID + "&orderID=" + orderID + "&layoutID=" + layoutID + "&eventID=" + eventID + "&ticketTypeID=" + ticketTypeID + "&paymentType=" + paymentType);

  var errorMessage = responseText.substring(responseText.indexOf("#") + 1);

  if (errorMessage) {
    uncurtain();
    alert(errorMessage);
  }
  else {
    if (paymentType == 'reserve')
      curtain('Reserving...');
    else
      curtain('Processing Tickets...');


    updateTicketSalesArea(false);

    setField('ticketTypeID', document.getElementById('ticketTypeID').getAttribute('exp_defaultTicketID') + '#True#True');
    setField('PackageID', '#True#True');

    var shouldPrint = responseText.substring(0, responseText.indexOf("#")) != "0";

    if (shouldPrint) {
      document.getElementById('iframeTickets').contentWindow.location.href = 'vmSellTickets.asp?action=print&orderID=SESSION';
      openPage("Basket", "vmSellTickets.asp?action=drawBasket");
    } else {
      resetBasket();
    }




    //resetBasket();

    /*
    if (shouldPrint) {
    eventObj = new onRequestClass();
    eventObj.onRequestComplete = function () { resetBasket(); }
    openPageWithEvents("Basket", "vmSellTickets.asp?action=print&orderID=SESSION", eventObj, true);
    } else {
    resetBasket();
    }*/
  }
}



function resetBasket() {
  eventObj = new onRequestClass();
  eventObj.onRequestComplete = function () { uncurtain(); }
  openPageWithEvents("Basket", "vmSellTickets.asp?action=drawBasket", eventObj, true);
}



function addPersonToSession(personType) {
  var objArray = getAllListBoxSelected("lbSessions");

  fadeBack('', '80%', '80%');

  openPage('fadeForeground', 'vmSessions.asp?action=showAssignPerson&personType=' + personType + '&sessionIDs=' + objArray);
}

//I don't like this function. - Mathew
function makeListUseable(listboxID) {
  var content = getAllListBoxSelected(listboxID);
  var result = content.length > 0 ? content[0].id : "";

  for (var i = 1; i < content.length; i++)
    result = contactIDs + "~" + content[i].id;

  return result;
}

function addSelectedPeopleToSelectedSessions(peopleType) {
  openPage("drawPeopleBox", "vmSessions.asp?action=addContactsToSessions&peopleType=" + peopleType + "&contactIDs=" + makeListUseable("lbPeople") + "&sessionIDs=" + makeListUseable("lbSessions") + "&search=" + document.getElementById("searchBox").value);
}

function removeSelectedPeopleFromSelectedSessions(peopleType) {
  openPage("drawPeopleBox", "vmSessions.asp?action=removeContactsFromSessions&peopleType=" + peopleType + "&contactIDs=" + makeListUseable("lbPeople") + "&sessionIDs=" + makeListUseable("lbSessions") + "&search=" + document.getElementById("searchBox").value);
}

//They may loose their selection in between updates but this is 'fast' code. - Mathew
function searchPeople(peopleType) {
  openPage("drawPeopleBox", "vmSessions.asp?action=drawPeople&peopleType=" + peopleType + "&contactIDs=" + makeListUseable("lbPeople") + "&sessionIDs=" + makeListUseable("lbSessions") + "&search=" + document.getElementById("searchBox").value);
}

Array.prototype.find = function (value) {
  for (var i = 0; i < this.length; i++)
    if (this[i] == value)
      return i;

  return this.length;
}

//This should probably invert on control but doesn't for now.
function reportSelectList(e, id, indicies) {
  var list = document.getElementById(id);

  for (var i = 0; i < list.length; i++)
    if (e.ctrlKey)
      if (indicies.find(list.options[i].value) != indicies.length)
        list.options[i].selected = !list.options[i].selected;
      else;
    else
      list.options[i].selected = (e.shiftKey ? list.options[i].selected : false) || indicies.find(list.options[i].value) != indicies.length;
}

function getField(fieldID) {
  var field = document.getElementById(fieldID);

  if (field) {
    switch (field.type) {
      case "checkbox":
        return field.checked;
      default:
        return field.value;
    }
  }
}

function setField(fieldID, value) {
  var field = document.getElementById(fieldID);

  if (field) {
    switch (field.type) {
      case "checkbox":
        field.checked = value;
      default:
        field.value = value;
    }
  }
}

function showRefundsScreen(startNo, endNo, orderNo, onclose) {
  fadeBack('', '80%', '80%');
  openPage("fadeForeground", "vmSellTickets.asp?action=drawRefundScreen&startNo=" + startNo + "&endNo=" + endNo + "&orderNo=" + orderNo + "&onclose=" + onclose);
}

function hideRefundsScreen(onclose) {
  if (getField("ddPaymentMethod~ID~tblPaymentMethods") == dummyIDNoQuote) {
    alert("Please select the payment method.");
    return;
  }
  if (getField("vftbReason~Reason~") == '') {
    alert("Please enter the reason for the refund.");
    return;
  }

  var ticketArray2 = getAllListBox('lbRefundingTickets');
  var i;
  var ids = '';
  var result;

  for (i = 0; i < ticketArray2.length; i++)
    if (ticketArray2[i])
      ids += ticketArray2[i].id;

  result = ajaxSubmit("vmSellTickets.asp?action=refundTickets", "ticketIDs=" + ids + "&paymentMethodID=" + getField("ddPaymentMethod~ID~tblPaymentMethods") + "&total=" + getField("vftbtotal~total~") + "&reason=" + escape(getField("vftbReason~Reason~")))

  if (result != "refunded")
    alert(result);

  restoreBack();
  //		updateTicketSalesArea();

  if (onclose)
    onclose();
}

function refundsSearch() {
  //Yes those are really obvious names.
  openPage("ticketSearch", "vmSellTickets.asp?action=refundsSearch&startNo=" + getField("vftbstartNo~startNo~") + "&endNo=" + getField("vftbendNo~endNo~") + "&orderNo=" + getField("vftborderNo~orderNo~") + "&unavailableTicketIDs=");

  removeAllListBox("lbRefundingTickets");
  setField("vftbtotal~total~", "");
}

//TODO
function addAllTicketsForRefunding() {

}

function addTicketForRefunding() {
  var ticketArray = getAllListBoxSelected('lbTicketSearch');
  var ticketArray2 = getAllListBox('lbRefundingTickets');
  var i;
  var ids = '';

  // Compile update array
  for (i = 0; i < ticketArray.length; i++)
    if (ticketArray[i])
      ids += ticketArray[i].id;

  for (i = 0; i < ticketArray2.length; i++)
    if (ticketArray2[i])
      ids += ticketArray2[i].id;

  // Associate contacts and refresh attendee list
  //openPage('ticketSearch', 'vmClubs.asp?action=addAttendees&clubID=' + clubID + '&contactIDs=' + ids + '&attendeeTypeID=' + obj('attendeeTypeID~ClubAttendeeTypeID~tblClubAttendeeTypes').value);

  //openPage("ticketSearch", "vmSellTickets.asp?action=refundsSearch&startNo=" + getField("vftbstartNo~startNo~") + "&endNo=" + getField("vftbendNo~endNo~") + "&orderID=" + getField("orderID") + "&unavailableTicketIDs=" + getField("selectedTicketIDs"));

  openPage("ticketsTRefunding", "vmSellTickets.asp?action=updateTicketsRefunding&selectedTicketIDs=" + ids);

  // Grey out chosen from contact list
  for (i = 0; i < ticketArray.length; i++)
    if (ticketArray[i]) {
      with (ticketArray[i]) {
        className = 'listBoxGreyLine';
        onmouseover = null;
        onmouseout = null;
        onclick = null;
        ondblclick = null;
        onmouseover = null;
        style.cursor = 'default';
      }
    }

  document.getElementById("btnRefund").disabled = !!makeListUseable("lbRefundingTickets");
  updateTotal(ids);
}

function removeTicketFromRefunding() {
  var ticketArray = getListBoxUnselected('lbRefundingTickets');
  var ids = '';

  // Compile update array
  for (var i = 0; i < ticketArray.length; i++)
    if (ticketArray[i])
      ids += ticketArray[i].id;

  //alert(ids);

  // Associate contacts and refresh attendee list
  openPage("ticketSearch", "vmSellTickets.asp?action=refundsSearch&startNo=" + getField("vftbstartNo~startNo~") + "&endNo=" + getField("vftbendNo~endNo~") + "&orderNo=" + getField("vftborderNo~orderNo~") + "&unavailableTicketIDs=" + ids);

  // remove from attendee list
  removeListBoxSelected('lbRefundingTickets');
  updateTotal();
}

//TODO
function removeAllTicketsFromRefunding() {
}

function updateTotal(ids) {
  if (ids == undefined) {
    var ticketArray2 = getAllListBox('lbRefundingTickets');
    var i;
    var ids = '';

    for (i = 0; i < ticketArray2.length; i++)
      if (ticketArray2[i])
        ids += ticketArray2[i].id;
  }

  setField("baseTotal", ajax('vmSellTickets.asp?action=getTotal&ticketIDs=' + ids, null));

  recalculateRefundTotal();
}

function setSeasonBookNo(seasonTicketBookNo, ticketID) {
  var newBookNo;
  newBookNo = prompt('Enter new Season Ticket Book No.', seasonTicketBookNo);
  if (!((newBookNo == null) || (newBookNo == ''))) {
    obj('SeasonBookNo' + ticketID).innerHTML = newBookNo;
    getAJAXData("", "vmSellTickets.asp?action=setSeasonBookNo&newBookNo=" + newBookNo
	      + "&ticketID=" + ticketID);
  }
}

function refreshPage() {
  location.reload(true);
}

function recalculateRefundTotal() {
  var baseTotal = getField("baseTotal");
  var percentage = getField("vftbpercentage~percentage~");

  //FIXME Use IsNaN
  if (baseTotal && percentage)
    setField("vftbtotal~total~", percentage * baseTotal / 100);
  else
    setField("vftbtotal~total~", "");
}

function recalculateRefundPercent() {
  var baseTotal = getField("baseTotal");
  var total = getField("vftbtotal~total~");

  if (baseTotal && total)
    setField("vftbpercentage~percentage~", 100 * total / baseTotal);
  else
    setField("vftbpercentage~percentage~", "");
}


function getBrowserDimensions() {
  var width = 0;
  var height = 0;

  if (self.innerWidth) {
    width = self.innerWidth;
    height = self.innerHeight;
  }
  else if (document.documentElement && document.documentElement.clientWidth) {
    width = document.documentElement.clientWidth;
    height = document.documentElement.clientHeight;
  }
  else if (document.body) {
    width = document.body.clientWidth;
    height = document.body.clientHeight;
  }

  return [width, height];
}

function unescapeTokens(value) {
  return value.replace("\##", "##")
}




function unhighlight(p) {
  if (p.highlighted) {
    p.style.backgroundColor = p.style.unhighlightedBackgroundColor;
    p.style.color = p.style.unhighlightedColor;
    p.highlighted = false;
  }
}

function showHideOptions() {
  var advanced = document.getElementById("advanced");
  var button = document.getElementById("advancedButton");

  if (advanced.style.display == "none") {
    advanced.style.display = "";
    button.innerHTML = "Less";
  }
  else {
    advanced.style.display = "none";
    button.innerHTML = "More";
  }
}
//var browserDimensions = getBrowserDimensions();

//http://techpatterns.com/downloads/javascript_cookies.php
//This deletes the cookie when called.
function deleteCookie(name, path, domain) {
  document.cookie = name + "=" + (path ? ";path=" + path : "") + (domain ? ";domain=" + domain : "") + ";expires=Thu, 01-Jan-1970 00:00:01 GMT";
}

function executePage(strURL) {
  // function runPage
  // execute a page - no need for any return data
  var ajaxCommObj = new ajaxCommClass();

  ajaxCommObj.pageURL = strURL;
  ajaxCommObj.async = true;
  ajaxCommObj.Request();
}
