var FORMFIELD_TYPE_SINGLELINETEXT = 1;
var FORMFIELD_TYPE_PARAGRAPHTEXT  = 2;
var FORMFIELD_TYPE_NUMBER         = 3;
var FORMFIELD_TYPE_EMAIL          = 4;
var FORMFIELD_TYPE_WEBSITE        = 5;
var FORMFIELD_TYPE_NAME           = 6;
var FORMFIELD_TYPE_DATE           = 7;
var FORMFIELD_TYPE_TIME           = 8;
var FORMFIELD_TYPE_PHONE          = 9;
var FORMFIELD_TYPE_PRICE          = 10;
var FORMFIELD_TYPE_ADDRESS        = 11;
var FORMFIELD_TYPE_SECTIONBREAK   = 12;
var FORMFIELD_TYPE_MULTIPLECHOICE = 13;
var FORMFIELD_TYPE_CHECKBOXES     = 14;
var FORMFIELD_TYPE_DROPDOWN       = 15;
var FORMFIELD_TYPE_TITLE          = 16;

var FORMFIELD_TYPE_INFORMATION    = { };

FORMFIELD_TYPE_INFORMATION[FORMFIELD_TYPE_SINGLELINETEXT] = {
  name : "Single Line Text",
  parameterOptions : "size",
  defaultParameter : "medium",
  requiredVisible : true,
  defaultVisible : true,
  choicesVisible : false
};

FORMFIELD_TYPE_INFORMATION[FORMFIELD_TYPE_PARAGRAPHTEXT] = {
  name : "Paragraph Text",
  parameterOptions : "size",
  defaultParameter : "medium",
  requiredVisible : true,
  defaultVisible : true,
  choicesVisible : false
};

FORMFIELD_TYPE_INFORMATION[FORMFIELD_TYPE_NUMBER] = {
  name : "Number",
  parameterOptions : "size",
  defaultParameter : "medium",
  requiredVisible : true,
  defaultVisible : true,
  choicesVisible : false
};

FORMFIELD_TYPE_INFORMATION[FORMFIELD_TYPE_EMAIL] = {
  name : "Email",
  parameterOptions : "size",
  defaultParameter : "medium",
  requiredVisible : true,
  defaultVisible : true,
  choicesVisible : false
};

FORMFIELD_TYPE_INFORMATION[FORMFIELD_TYPE_WEBSITE] = {
  name : "Website",
  parameterOptions : "size",
  defaultParameter : "medium",
  requiredVisible : true,
  defaultVisible : true,
  choicesVisible : false
};

FORMFIELD_TYPE_INFORMATION[FORMFIELD_TYPE_NAME] = {
  name : "Name",
  parameterOptions : "name",
  defaultParameter : "normal",
  defaultVisible : false,
  requiredVisible : true,
  choicesVisible : false
};

FORMFIELD_TYPE_INFORMATION[FORMFIELD_TYPE_DATE] = {
  name : "Date",
  parameterOptions : "date",
  defaultParameter : "mmddyyyy",
  defaultVisible : false,
  requiredVisible : true,
  choicesVisible : false
};

FORMFIELD_TYPE_INFORMATION[FORMFIELD_TYPE_TIME] = {
  name : "Time",
  parameterOptions : "none",
  defaultParameter : "",
  defaultVisible : false,
  requiredVisible : true,
  choicesVisible : false
};

FORMFIELD_TYPE_INFORMATION[FORMFIELD_TYPE_PHONE] = {
  name : "Phone",
  parameterOptions : "phone",
  defaultParameter : "normal",
  defaultVisible : false,
  requiredVisible : true,
  choicesVisible : false
};

FORMFIELD_TYPE_INFORMATION[FORMFIELD_TYPE_PRICE] = {
  name : "Price",
  parameterOptions : "price",
  defaultParameter : "dollars",
  defaultVisible : false,
  requiredVisible : true,
  choicesVisible : false
};

FORMFIELD_TYPE_INFORMATION[FORMFIELD_TYPE_ADDRESS] = {
  name : "Address",
  parameterOptions : "none",
  defaultParameter : "",
  defaultVisible : false,
  requiredVisible : true,
  choicesVisible : false
};

FORMFIELD_TYPE_INFORMATION[FORMFIELD_TYPE_SECTIONBREAK] = {
  name : "Section Break",
  parameterOptions : "none",
  defaultParameter : "",
  requiredVisible : false,
  defaultVisible : false,
  choicesVisible : false
};

FORMFIELD_TYPE_INFORMATION[FORMFIELD_TYPE_TITLE] = {
  name : "Title Text",
  parameterOptions : "none",
  defaultParameter : "",
  requiredVisible : false,
  defaultVisible : false,
  choicesVisible : false
};

FORMFIELD_TYPE_INFORMATION[FORMFIELD_TYPE_MULTIPLECHOICE] = {
  name : "Multiple Choice",
  parameterOptions : "none",
  defaultParameter : "",
  requiredVisible : true,
  defaultVisible : false,
  choicesVisible : true
};

FORMFIELD_TYPE_INFORMATION[FORMFIELD_TYPE_CHECKBOXES] = {
  name : "Checkboxes",
  parameterOptions : "none",
  defaultParameter : "",
  requiredVisible : true,
  defaultVisible : false,
  choicesVisible : true
},

FORMFIELD_TYPE_INFORMATION[FORMFIELD_TYPE_DROPDOWN] = {
  name : "Drop Down",
  parameterOptions : "size",
  defaultParameter : "medium",
  requiredVisible : true,
  defaultVisible : false,
  choicesVisible : true
};

SSForm = Class.create({


  initialize: function(instanceName, fieldContainerName, errorFieldName, submitButtonName, moduleId, renderForUsage, fixedForm) {

    this._instanceName           = instanceName;

    this._currentModuleId        = moduleId;
    this._renderForExternalUsage = renderForUsage;
    this._fixedForm              = fixedForm;

    this._targetContainer        = document.getElementById(fieldContainerName);
    this._errorContainer         = document.getElementById(errorFieldName);
    this._submitButton           = document.getElementById(submitButtonName);

    this._fieldsByUniqueId       = { };
    this._fieldIdsToDatabaseIds  = { };
    this._databaseIdsToFieldIds  = { };
    this._visibleErrors          = new Array();
    this._titleFieldIds          = new Array();

    this._uniqueFieldId          = 0;
    this._lastFocusedFieldId     = null;
    this._nfOpen                 = false;
    this._autosaveRequired       = false;

    this._targetContainer.innerHTML = "<strong>You have not added any fields to this form.</strong>  Select &quot;Add a New Field&quot; above to begin adding elements to this form.";

    var afc = document.getElementById("formAddFieldControl");

    if (this._fixedForm && afc) {
      afc.style.display = "none";
    }

  },

  renderField: function(f) {

    var defv = '';
    var el = document.getElementById("formFieldContainer" + f.fieldId);

    if (f.fieldType == "unknown") {

      var ev = '';

      ev = '<div id="adminEditingControlsBlock"><div class="adminEditingControlsTop">&nbsp;</div><div class="adminEditingControlsMiddle"><div class="adminEditingControlsMiddleInner">' +
        '<div class="adminEditingControlsTitle">Select New Field Type</div>' +
        '<select class="singlelinetext-medium" id="newFieldType">';

      for( fv in FORMFIELD_TYPE_INFORMATION ) {
        ev += '<option value="' + fv + '">' + FORMFIELD_TYPE_INFORMATION[fv].name + '</option>';
      }

      ev += '</select>' +
        '<div style="padding-top: 12px;"><input type="button" onclick="' + this._instanceName + '.addFieldByType(\'' + f.fieldId + '\', document.getElementById(\'newFieldType\').value);" class="adminEditingControlNewFieldButton" value="Create Field"/> <input type="button" onclick="' + this._instanceName + '.deleteField(' + f.fieldId + ');" class="adminEditingControlNewFieldButton" value="Cancel"/></div>' +

      '</div></div><div class="adminEditingControlsBottom">&nbsp;</div></div>';

      el.className = "fieldContainerNew";

      el.innerHTML = ev;

      return;

    } else {

      el.className = (f.fieldId == this._lastFocusedFieldId ? "fieldContainerActive" : "fieldContainer");

    }

    if (this._renderForExternalUsage) {
      roCode = "";
    } else {
      roCode = "readonly=\"readonly\"";
    }

    if (f.fieldType == FORMFIELD_TYPE_SINGLELINETEXT) {

      objCode = '<input ' + roCode + ' id="formFieldEl' + f.fieldId + '" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-' + f.parameters + '" value="' + f.defaultValue + '"/>';

    } else if (f.fieldType == FORMFIELD_TYPE_PARAGRAPHTEXT) {

      objCode = '<textarea ' + roCode + ' id="formFieldEl' + f.fieldId + '" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="paragraphtext-' + f.parameters + '">' + f.defaultValue + '</textarea>';

    } else if (f.fieldType == FORMFIELD_TYPE_NUMBER) {

      objCode = '<input ' + roCode + ' id="formFieldEl' + f.fieldId + '" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-' + f.parameters + '" value="' + (f.defaultValue != '' ? f.defaultValue  : '0123456789') + '"/>';

    } else if (f.fieldType == FORMFIELD_TYPE_EMAIL) {

      objCode = '<input ' + roCode + ' id="formFieldEl' + f.fieldId + '" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-' + f.parameters + '" value="' + (f.defaultValue != '' ? f.defaultValue  : '@') + '"/>';

    } else if (f.fieldType == FORMFIELD_TYPE_WEBSITE) {

      objCode = '<input ' + roCode + ' id="formFieldEl' + f.fieldId + '" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-' + f.parameters + '" value="' + (f.defaultValue != '' ? f.defaultValue  : 'http://') + '"/>';

    } else if (f.fieldType == FORMFIELD_TYPE_DROPDOWN) {

      objCode = '<select ' + roCode + ' id="formFieldEl' + f.fieldId + '" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" class="singlelinetext-' + f.parameters + '">';

      var opts = f.choices.split("\n");

      for(var i = 0; i < opts.length; ++i) {
        var def = '';
        var v = opts[i];
        if (opts[i].indexOf('*') == opts[i].length - 1) {
          def = 'default="default"';
          v = opts[i].substring(0, opts[i].length - 1);
          defv = v;
        }
        if (v.length > 0) {
          objCode += '<option ' + def + ' value="' + v + '">' + v + '</option>';
        }
      }

      objCode += '</select>';

    } else if (f.fieldType == FORMFIELD_TYPE_MULTIPLECHOICE) {

      objCode = '';

      var opts = f.choices.split("\n");

      for(var i = 0; i < opts.length; ++i) {
        var def = '';
        var v = opts[i];
        if (opts[i].indexOf('*') == opts[i].length - 1) {
          def = 'checked="checked"';
          v = opts[i].substring(0, opts[i].length - 1);
          defv = v;
        }
        if (v.length > 0) {
          objCode += '<div class="optionRow"><input ' + roCode + ' id="formFieldEl' + f.fieldId + '-' + i + '" name="formFieldEl' + f.fieldId + '" type="radio" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');"/> ' + v + '</div>';
        }
      }

    } else if (f.fieldType == FORMFIELD_TYPE_CHECKBOXES) {

      objCode = '';

      var opts = f.choices.split("\n");

      for(var i = 0; i < opts.length; ++i) {
        var def = '';
        var v = opts[i];
        if (opts[i].indexOf('*') == opts[i].length - 1) {
          def = 'checked="checked"';
          v = opts[i].substring(0, opts[i].length - 1);
          defv = v;
        }
        if (v.length > 0) {
          objCode += '<div class="optionRow"><input ' + roCode + ' id="formFieldEl' + f.fieldId + '-' + i + '" name="formFieldEl' + f.fieldId + '" type="checkbox" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');"/> ' + v + '</div>';
        }
      }

    } else if (f.fieldType == FORMFIELD_TYPE_ADDRESS) {

      objCode =
                '<div style="padding-bottom: 2px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'A1" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-medium" style="width: 300px;" value=""/>' +
                  '<div class="fieldHelp">Street Address</div>' +
                '</div>' +
                '<div style="padding-bottom: 2px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'A2" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-medium" style="width: 300px;" value=""/>' +
                  '<div class="fieldHelp">Address Line 2</div>' +
                '</div>' +
                '<div style="float: left; padding-right: 10px; padding-bottom: 2px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'CT" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-medium" style="width: 140px;" value=""/>' +
                  '<div class="fieldHelp">City</div>' +
                '</div>' +
                '<div style="float: left; padding-right: 10px; padding-bottom: 2px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'ST" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-medium" style="width: 140px;" value=""/>' +
                  '<div class="fieldHelp">State / Province / Region</div>' +
                '</div>' +
                '<div style="clear: both;"><div style="float: left; padding-right: 10px; padding-bottom: 2px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'ZP" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-medium" style="width: 140px;" value=""/>' +
                  '<div class="fieldHelp">Zip / Postal Code</div>' +
                '</div>' +
                '<div style="float: left; padding-right: 10px; padding-bottom: 2px;">' +
                  '<select onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" id="formFieldEl' + f.fieldId + 'CO" class="singlelinetext-small" style="width: 147px;"/>' +
                    '<option value="US">United States</option>' +
                    '<option value="CA">Canada</option>' +
                    '<option value="AF">Afghanistan</option>' +
                    '<option value="AL">Albania</option>' +
                    '<option value="DZ">Algeria</option>' +
                    '<option value="AS">American Samoa</option>' +
                    '<option value="AD">Andorra</option>' +
                    '<option value="AO">Angola</option>' +
                    '<option value="AI">Anguilla</option>' +
                    '<option value="AQ">Antarctica</option>' +
                    '<option value="AG">Antigua and Barbuda</option>' +
                    '<option value="AR">Argentina</option>' +
                    '<option value="AM">Armenia</option>' +
                    '<option value="AW">Aruba</option>' +
                    '<option value="AU">Australia</option>' +
                    '<option value="AT">Austria</option>' +
                    '<option value="AZ">Azerbaijan</option>' +
                    '<option value="BS">Bahamas</option>' +
                    '<option value="BH">Bahrain</option>' +
                    '<option value="BD">Bangladesh</option>' +
                    '<option value="BB">Barbados</option>' +
                    '<option value="BY">Belarus</option>' +
                    '<option value="BE">Belgium</option>' +
                    '<option value="BZ">Belize</option>' +
                    '<option value="BJ">Benin</option>' +
                    '<option value="BM">Bermuda</option>' +
                    '<option value="BT">Bhutan</option>' +
                    '<option value="BO">Bolivia</option>' +
                    '<option value="BA">Bosnia and Herzegovina</option>' +
                    '<option value="BW">Botswana</option>' +
                    '<option value="BV">Bouvet Island</option>' +
                    '<option value="BR">Brazil</option>' +
                    '<option value="IO">British Indian Ocean Territory</option>' +
                    '<option value="BN">Brunei Darussalam</option>' +
                    '<option value="BG">Bulgaria</option>' +
                    '<option value="BF">Burkina Faso</option>' +
                    '<option value="BI">Burundi</option>' +
                    '<option value="KH">Cambodia</option>' +
                    '<option value="CM">Cameroon</option>' +
                    '<option value="CV">Cape Verde</option>' +
                    '<option value="KY">Cayman Islands</option>' +
                    '<option value="CF">Central African Republic</option>' +
                    '<option value="TD">Chad</option>' +
                    '<option value="CL">Chile</option>' +
                    '<option value="CN">China</option>' +
                    '<option value="CX">Christmas Island</option>' +
                    '<option value="CC">Cocos (Keeling) Islands</option>' +
                    '<option value="CO">Colombia</option>' +
                    '<option value="KM">Comoros</option>' +
                    '<option value="CG">Congo</option>' +
                    '<option value="CK">Cook Islands</option>' +
                    '<option value="CR">Costa Rica</option>' +
                    '<option value="HR">Croatia (Hrvatska)</option>' +
                    '<option value="CU">Cuba</option>' +
                    '<option value="CY">Cyprus</option>' +
                    '<option value="CZ">Czech Republic</option>' +
                    '<option value="CS">Czechoslovakia (former)</option>' +
                    '<option value="DK">Denmark</option>' +
                    '<option value="DJ">Djibouti</option>' +
                    '<option value="DM">Dominica</option>' +
                    '<option value="DO">Dominican Republic</option>' +
                    '<option value="TP">East Timor</option>' +
                    '<option value="EC">Ecuador</option>' +
                    '<option value="EG">Egypt</option>' +
                    '<option value="SV">El Salvador</option>' +
                    '<option value="GQ">Equatorial Guinea</option>' +
                    '<option value="ER">Eritrea</option>' +
                    '<option value="EE">Estonia</option>' +
                    '<option value="ET">Ethiopia</option>' +
                    '<option value="FK">Falkland Islands (Malvinas)</option>' +
                    '<option value="FO">Faroe Islands</option>' +
                    '<option value="FJ">Fiji</option>' +
                    '<option value="FI">Finland</option>' +
                    '<option value="FR">France</option>' +
                    '<option value="FX">France, Metropolitan</option>' +
                    '<option value="GF">French Guiana</option>' +
                    '<option value="PF">French Polynesia</option>' +
                    '<option value="TF">French Southern Territories</option>' +
                    '<option value="GA">Gabon</option>' +
                    '<option value="GM">Gambia</option>' +
                    '<option value="GE">Georgia</option>' +
                    '<option value="DE">Germany</option>' +
                    '<option value="GH">Ghana</option>' +
                    '<option value="GI">Gibraltar</option>' +
                    '<option value="GB">Great Britain (UK)</option>' +
                    '<option value="GR">Greece</option>' +
                    '<option value="GL">Greenland</option>' +
                    '<option value="GD">Grenada</option>' +
                    '<option value="GP">Guadeloupe</option>' +
                    '<option value="GU">Guam</option>' +
                    '<option value="GT">Guatemala</option>' +
                    '<option value="GN">Guinea</option>' +
                    '<option value="GW">Guinea-Bissau</option>' +
                    '<option value="GY">Guyana</option>' +
                    '<option value="HT">Haiti</option>' +
                    '<option value="HM">Heard and McDonald Islands</option>' +
                    '<option value="HN">Honduras</option>' +
                    '<option value="HK">Hong Kong</option>' +
                    '<option value="HU">Hungary</option>' +
                    '<option value="IS">Iceland</option>' +
                    '<option value="IN">India</option>' +
                    '<option value="ID">Indonesia</option>' +
                    '<option value="IR">Iran</option>' +
                    '<option value="IQ">Iraq</option>' +
                    '<option value="IE">Ireland</option>' +
                    '<option value="IL">Israel</option>' +
                    '<option value="IT">Italy</option>' +
                    '<option value="JM">Jamaica</option>' +
                    '<option value="JP">Japan</option>' +
                    '<option value="JO">Jordan</option>' +
                    '<option value="KZ">Kazakhstan</option>' +
                    '<option value="KE">Kenya</option>' +
                    '<option value="KI">Kiribati</option>' +
                    '<option value="KP">Korea (North)</option>' +
                    '<option value="KR">Korea (South)</option>' +
                    '<option value="KW">Kuwait</option>' +
                    '<option value="KG">Kyrgyzstan</option>' +
                    '<option value="LA">Laos</option>' +
                    '<option value="LV">Latvia</option>' +
                    '<option value="LB">Lebanon</option>' +
                    '<option value="LS">Lesotho</option>' +
                    '<option value="LR">Liberia</option>' +
                    '<option value="LY">Libya</option>' +
                    '<option value="LI">Liechtenstein</option>' +
                    '<option value="LT">Lithuania</option>' +
                    '<option value="MO">Macau</option>' +
                    '<option value="MK">Macedonia</option>' +
                    '<option value="MG">Madagascar</option>' +
                    '<option value="MW">Malawi</option>' +
                    '<option value="MY">Malaysia</option>' +
                    '<option value="MV">Maldives</option>' +
                    '<option value="ML">Mali</option>' +
                    '<option value="MT">Malta</option>' +
                    '<option value="MH">Marshall Islands</option>' +
                    '<option value="MQ">Martinique</option>' +
                    '<option value="MR">Mauritania</option>' +
                    '<option value="MU">Mauritius</option>' +
                    '<option value="YT">Mayotte</option>' +
                    '<option value="MX">Mexico</option>' +
                    '<option value="FM">Micronesia</option>' +
                    '<option value="MD">Moldova</option>' +
                    '<option value="MC">Monaco</option>' +
                    '<option value="MN">Mongolia</option>' +
                    '<option value="MS">Montserrat</option>' +
                    '<option value="MA">Morocco</option>' +
                    '<option value="MZ">Mozambique</option>' +
                    '<option value="MM">Myanmar</option>' +
                    '<option value="NA">Namibia</option>' +
                    '<option value="NR">Nauru</option>' +
                    '<option value="NP">Nepal</option>' +
                    '<option value="NL">Netherlands</option>' +
                    '<option value="AN">Netherlands Antilles</option>' +
                    '<option value="NT">Neutral Zone</option>' +
                    '<option value="NC">New Caledonia</option>' +
                    '<option value="NZ">New Zealand (Aotearoa)</option>' +
                    '<option value="NI">Nicaragua</option>' +
                    '<option value="NE">Niger</option>' +
                    '<option value="NG">Nigeria</option>' +
                    '<option value="NU">Niue</option>' +
                    '<option value="NF">Norfolk Island</option>' +
                    '<option value="MP">Northern Mariana Islands</option>' +
                    '<option value="NO">Norway</option>' +
                    '<option value="OM">Oman</option>' +
                    '<option value="PK">Pakistan</option>' +
                    '<option value="PW">Palau</option>' +
                    '<option value="PA">Panama</option>' +
                    '<option value="PG">Papua New Guinea</option>' +
                    '<option value="PY">Paraguay</option>' +
                    '<option value="PE">Peru</option>' +
                    '<option value="PH">Philippines</option>' +
                    '<option value="PN">Pitcairn</option>' +
                    '<option value="PL">Poland</option>' +
                    '<option value="PT">Portugal</option>' +
                    '<option value="PR">Puerto Rico</option>' +
                    '<option value="QA">Qatar</option>' +
                    '<option value="RE">Reunion</option>' +
                    '<option value="RO">Romania</option>' +
                    '<option value="RU">Russian Federation</option>' +
                    '<option value="RW">Rwanda</option>' +
                    '<option value="GS">S. Georgia and S. Sandwich Isls.</option>' +
                    '<option value="KN">Saint Kitts and Nevis</option>' +
                    '<option value="LC">Saint Lucia</option>' +
                    '<option value="VC">Saint Vincent and the Grenadines</option>' +
                    '<option value="WS">Samoa</option>' +
                    '<option value="SM">San Marino</option>' +
                    '<option value="ST">Sao Tome and Principe</option>' +
                    '<option value="SA">Saudi Arabia</option>' +
                    '<option value="SN">Senegal</option>' +
                    '<option value="SC">Seychelles</option>' +
                    '<option value="SL">Sierra Leone</option>' +
                    '<option value="SG">Singapore</option>' +
                    '<option value="SK">Slovak Republic</option>' +
                    '<option value="SI">Slovenia</option>' +
                    '<option value="Sb">Solomon Islands</option>' +
                    '<option value="SO">Somalia</option>' +
                    '<option value="ZA">South Africa</option>' +
                    '<option value="ES">Spain</option>' +
                    '<option value="LK">Sri Lanka</option>' +
                    '<option value="SH">St. Helena</option>' +
                    '<option value="PM">St. Pierre and Miquelon</option>' +
                    '<option value="SD">Sudan</option>' +
                    '<option value="SR">Suriname</option>' +
                    '<option value="SJ">Svalbard and Jan Mayen Islands</option>' +
                    '<option value="SZ">Swaziland</option>' +
                    '<option value="SE">Sweden</option>' +
                    '<option value="CH">Switzerland</option>' +
                    '<option value="SY">Syria</option>' +
                    '<option value="TW">Taiwan</option>' +
                    '<option value="TJ">Tajikistan</option>' +
                    '<option value="TZ">Tanzania</option>' +
                    '<option value="TH">Thailand</option>' +
                    '<option value="TG">Togo</option>' +
                    '<option value="TK">Tokelau</option>' +
                    '<option value="TO">Tonga</option>' +
                    '<option value="TT">Trinidad and Tobago</option>' +
                    '<option value="TN">Tunisia</option>' +
                    '<option value="TR">Turkey</option>' +
                    '<option value="TM">Turkmenistan</option>' +
                    '<option value="TC">Turks and Caicos Islands</option>' +
                    '<option value="TV">Tuvalu</option>' +
                    '<option value="UM">US Minor Outlying Islands</option>' +
                    '<option value="SU">USSR (former)</option>' +
                    '<option value="UG">Uganda</option>' +
                    '<option value="UA">Ukraine</option>' +
                    '<option value="AE">United Arab Emirates</option>' +
                    '<option value="UK">United Kingdom</option>' +
                    '<option value="UY">Uruguay</option>' +
                    '<option value="UZ">Uzbekistan</option>' +
                    '<option value="VU">Vanuatu</option>' +
                    '<option value="VA">Vatican City State (Holy See)</option>' +
                    '<option value="VE">Venezuela</option>' +
                    '<option value="VN">Viet Nam</option>' +
                    '<option value="VG">Virgin Islands (British)</option>' +
                    '<option value="VI">Virgin Islands (U.S.)</option>' +
                    '<option value="WF">Wallis and Futuna Islands</option>' +
                    '<option value="EH">Western Sahara</option>' +
                    '<option value="YE">Yemen</option>' +
                    '<option value="YU">Yugoslavia</option>' +
                    '<option value="ZR">Zaire</option>' +
                    '<option value="ZM">Zambia</option>' +
                    '<option value="ZW">Zimbabwe</option>' +
                  '</select>' +
                  '<div class="fieldHelp">Country</div></div>' +
                '</div>';

      objCode += '<div style="clear: both; line-height: 1px; height: 1px;">&nbsp;</div>';

    } else if (f.fieldType == FORMFIELD_TYPE_NAME) {

      objCode = '<div style="float: left; padding-right: 10px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'NF" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 85px;" value=""/>' +
                  '<div class="fieldHelp">First</div>' +
                '</div>' +
                '<div style="float: left; padding-right: 10px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'NL" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 85px;" value=""/>' +
                  '<div class="fieldHelp">Last</div>' +
                '</div>';

      if (f.parameters == "extended") {

        objCode = '<div style="float: left; padding-right: 10px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'TI" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 35px;" value=""/>' +
                  '<div class="fieldHelp">Title</div>' +
                '</div>' + objCode +
                '<div style="float: left; padding-right: 10px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'SF" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 35px;" value=""/>' +
                  '<div class="fieldHelp">Suffix</div>' +
                '</div>';
      }

      objCode += '<div style="clear: both; line-height: 1px; height: 1px;">&nbsp;</div>';

    } else if (f.fieldType == FORMFIELD_TYPE_DATE) {

      if (f.parameters == "mmddyyyy") {

        objCode = '<div style="float: left; padding-right: 4px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'MM" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 35px;" value=""/>' +
                  '<div class="fieldHelp">MM</div>' +
                '</div>' +
                '<div style="float: left; padding-right: 4px;">/</div>' +
                '<div style="float: left; padding-right: 4px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'DD" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 35px;" value=""/>' +
                  '<div class="fieldHelp">DD</div>' +
                '</div>' +
                '<div style="float: left; padding-right: 4px;">/</div>' +
                '<div style="float: left; padding-right: 4px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'YY" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 35px;" value=""/>' +
                  '<div class="fieldHelp">YYYY</div>' +
                '</div>';

      } else {

        objCode = '<div style="float: left; padding-right: 4px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'DD" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 35px;" value=""/>' +
                  '<div class="fieldHelp">DD</div>' +
                '</div>' +
                '<div style="float: left; padding-right: 4px;">/</div>' +
                '<div style="float: left; padding-right: 4px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'MM" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 35px;" value=""/>' +
                  '<div class="fieldHelp">MM</div>' +
                '</div>' +
                '<div style="float: left; padding-right: 4px;">/</div>' +
                '<div style="float: left; padding-right: 4px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'YY" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 35px;" value=""/>' +
                  '<div class="fieldHelp">YYYY</div>' +
                '</div>';

      }

      objCode += '<div style="clear: both; line-height: 1px; height: 1px;">&nbsp;</div>';

    } else if (f.fieldType == FORMFIELD_TYPE_TIME) {

      objCode = '<div style="float: left; padding-right: 4px;">' +
                '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'HH" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 35px;" value=""/>' +
                '<div class="fieldHelp">HH</div>' +
              '</div>' +
              '<div style="float: left; padding-right: 4px;">:</div>' +
              '<div style="float: left; padding-right: 4px;">' +
                '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'MM" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 35px;" value=""/>' +
                '<div class="fieldHelp">MM</div>' +
              '</div>' +
              '<div style="float: left; padding-right: 4px;">:</div>' +
              '<div style="float: left; padding-right: 4px;">' +
                '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'SS" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 35px;" value=""/>' +
                '<div class="fieldHelp">SS</div>' +
              '</div>' +
              '<div style="float: left; padding-right: 4px;">' +
                '<select onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" id="formFieldEl' + f.fieldId + 'AP" class="singlelinetext-small" style="width: 45px;"/>' +
                  '<option value="am">AM</option>' +
                  '<option value="pm">PM</option>' +
                '</select>' +
              '</div>';

      objCode += '<div style="clear: both; line-height: 1px; height: 1px;">&nbsp;</div>';

    } else if (f.fieldType == FORMFIELD_TYPE_PHONE) {

      if (f.parameters == "normal") {

        objCode = '<div style="float: left; padding-right: 4px;">' +
                  '<input ' + roCode + ' maxlength="3" id="formFieldEl' + f.fieldId + 'P1" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 35px;" value=""/>' +
                  '<div class="fieldHelp">(###)</div>' +
                '</div>' +
                '<div style="float: left; padding-right: 4px;">-</div>' +
                '<div style="float: left; padding-right: 4px;">' +
                  '<input ' + roCode + ' maxlength="3" id="formFieldEl' + f.fieldId + 'P2" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 35px;" value=""/>' +
                  '<div class="fieldHelp">###</div>' +
                '</div>' +
                '<div style="float: left; padding-right: 4px;">-</div>' +
                '<div style="float: left; padding-right: 4px;">' +
                  '<input ' + roCode + ' maxlength="4" id="formFieldEl' + f.fieldId + 'P3" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 35px;" value=""/>' +
                  '<div class="fieldHelp">####</div>' +
                '</div>';

      } else {

        objCode = '<div style="float: left; padding-right: 10px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + '" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 130px;" value=""/>' +
                '</div>';

      }

      objCode += '<div style="clear: both; line-height: 1px; height: 1px;">&nbsp;</div>';

    } else if (f.fieldType == FORMFIELD_TYPE_PRICE) {

      if (f.parameters == "dollars") {

        objCode = '<div style="float: left; padding-right: 4px;">&#36;</div>' +
                '<div style="float: left; padding-right: 4px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'DL" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 75px;" value=""/>' +
                  '<div class="fieldHelp">Dollars</div>' +
                '</div>' +
                '<div style="float: left; padding-right: 4px;">.</div>' +
                '<div style="float: left; padding-right: 10px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'CT" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 35px;" value=""/>' +
                  '<div class="fieldHelp">Cents</div>' +
                '</div>';

      } else if (f.parameters == "euros") {

        objCode = '<div style="float: left; padding-right: 4px;">&euro;</div>' +
                '<div style="float: left; padding-right: 4px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'DL" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 75px;" value=""/>' +
                  '<div class="fieldHelp">Euros</div>' +
                '</div>' +
                '<div style="float: left; padding-right: 4px;">.</div>' +
                '<div style="float: left; padding-right: 10px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'CT" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 35px;" value=""/>' +
                  '<div class="fieldHelp">Cents</div>' +
                '</div>';

      } else if (f.parameters == "pounds") {

        objCode = '<div style="float: left; padding-right: 4px;">&pound;</div>' +
                '<div style="float: left; padding-right: 4px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'DL" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 75px;" value=""/>' +
                  '<div class="fieldHelp">Pounds</div>' +
                '</div>' +
                '<div style="float: left; padding-right: 4px;">.</div>' +
                '<div style="float: left; padding-right: 10px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + 'CT" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 35px;" value=""/>' +
                  '<div class="fieldHelp">Pence</div>' +
                '</div>';

      } else if (f.parameters == "yen") {

        objCode = '<div style="float: left; padding-right: 4px;">&yen;</div>' +
                '<div style="float: left; padding-right: 4px;">' +
                  '<input ' + roCode + ' id="formFieldEl' + f.fieldId + '" onfocus="' + this._instanceName + '.focusField(' + f.fieldId + ');" type="text" class="singlelinetext-small" style="width: 135px;" value=""/>' +
                  '<div class="fieldHelp">Yen</div>' +
                '</div>';

      }

      objCode += '<div style="clear: both; line-height: 1px; height: 1px;">&nbsp;</div>';

    } else {

      objCode = '';

    }

    if (f.fieldType == FORMFIELD_TYPE_TITLE || f.fieldType == FORMFIELD_TYPE_SECTIONBREAK) {
      instructionCode = '<div id="formField' + f.fieldId + 'Subtitle" class="formTitle">' + f.instructions.replace(/\n/gi, '<br/>') + '</div>';
    } else {
      instructionCode = '<div id="formField' + f.fieldId + 'Subtitle" class="fieldHelp">' + f.instructions.replace(/\n/gi, '<br/>') + '</div>';
    }

    errorCode = '<div id="formField' + f.fieldId + 'Error" style="display: none;" class="fieldTitle error-text"></div>';

    if (f.fieldType == FORMFIELD_TYPE_TITLE) {
      titleCode = '<h3 id="formField' + f.fieldId + 'Title" class="caption">' + f.title + '</h3>';
    } else {
      titleCode = '<div id="formField' + f.fieldId + 'Title" class="fieldTitle">' + f.title + ' <span class="fieldRequiredStar">' + (f.required ? '*' : '') + '</span></div>';
    }

    el.innerHTML = errorCode + titleCode +
            '<div class="fieldObjects">' + objCode + '</div>' +
            instructionCode;

    if (f.fieldType == FORMFIELD_TYPE_SECTIONBREAK) {

      el.innerHTML = '<div class="sectionBreak">' + el.innerHTML + '</div>';

    }

    if (f.fieldType == FORMFIELD_TYPE_DROPDOWN) {

      document.getElementById("formFieldEl" + f.fieldId).value = defv;

    } else if (f.fieldType == FORMFIELD_TYPE_MULTIPLECHOICE) {

      var opts = f.choices.split("\n");

      for(var i = 0; i < opts.length; ++i) {
        if (opts[i].length > 0 && opts[i].indexOf('*') == opts[i].length - 1) {
          document.getElementById("formFieldEl" + f.fieldId + "-" + i).checked = true;
        }
      }

    } else if (f.fieldType == FORMFIELD_TYPE_CHECKBOXES) {

      var opts = f.choices.split("\n");

      for(var i = 0; i < opts.length; ++i) {
        if (opts[i].length > 0 && opts[i].indexOf('*') == opts[i].length - 1) {
          document.getElementById("formFieldEl" + f.fieldId + "-" + i).checked = true;
        }
      }

    }

  },

  getFieldEditingControls: function(f) {

    if (f.fieldType == "unknown") { return( "" ); }

    var fieldFormat = "", defaultCode = "", requiredCode = "", editingTitle = "";

    var editingTitle = "Adjusting " + FORMFIELD_TYPE_INFORMATION[f.fieldType].name + " Properties";

    if (FORMFIELD_TYPE_INFORMATION[f.fieldType].parameterOptions == "size") {

      fieldFormat =
        '<div class="adminEditingControlTitle">Field Size</div>' +
        '<div><select type="text" id="formFieldParameters" style="width: 136px;" class="adminEditingControlText" onchange="' + this._instanceName + '.adjustFieldProperties(' + f.fieldId + ');">' +
          '<option value="small">Small</option>' +
          '<option value="medium">Medium</option>' +
          '<option value="large">Large</option>' +
        '</select></div>';

    } else if (FORMFIELD_TYPE_INFORMATION[f.fieldType].parameterOptions == "name") {

      fieldFormat =
        '<div class="adminEditingControlTitle">Type</div>' +
        '<div><select type="text" id="formFieldParameters" style="width: 136px;" class="adminEditingControlText" onchange="' + this._instanceName + '.adjustFieldProperties(' + f.fieldId + ');">' +
          '<option value="normal">Normal</option>' +
          '<option value="extended">Extended</option>' +
        '</select></div>';

    } else if (FORMFIELD_TYPE_INFORMATION[f.fieldType].parameterOptions == "date") {

      fieldFormat =
        '<div class="adminEditingControlTitle">Type</div>' +
        '<div><select type="text" id="formFieldParameters" style="width: 136px;" class="adminEditingControlText" onchange="' + this._instanceName + '.adjustFieldProperties(' + f.fieldId + ');">' +
          '<option value="mmddyyyy">MM / DD / YYYY</option>' +
          '<option value="ddmmyyyy">DD / MM / YYYY</option>' +
        '</select></div>';

    } else if (FORMFIELD_TYPE_INFORMATION[f.fieldType].parameterOptions == "phone") {

      fieldFormat =
        '<div class="adminEditingControlTitle">Phone</div>' +
        '<div><select type="text" id="formFieldParameters" style="width: 136px;" class="adminEditingControlText" onchange="' + this._instanceName + '.adjustFieldProperties(' + f.fieldId + ');">' +
          '<option value="normal">Normal</option>' +
          '<option value="international">International</option>' +
        '</select></div>';

    } else if (FORMFIELD_TYPE_INFORMATION[f.fieldType].parameterOptions == "price") {

      fieldFormat =
        '<div class="adminEditingControlTitle">Price</div>' +
        '<div><select type="text" id="formFieldParameters" style="width: 136px;" class="adminEditingControlText" onchange="' + this._instanceName + '.adjustFieldProperties(' + f.fieldId + ');">' +
          '<option value="dollars">Dollars</option>' +
          '<option value="euros">Euros</option>' +
          '<option value="pounds">Pounds</option>' +
          '<option value="yen">Yen</option>' +
        '</select></div>';

    }

    if (FORMFIELD_TYPE_INFORMATION[f.fieldType].defaultVisible) {

      defaultCode = '<div class="adminEditingControlTitle">Default Value</div>' +
        '<div><input type="text" maxlength="300" id="formFieldDefaultValue" class="adminEditingControlText" onkeyup="' + this._instanceName + '.adjustFieldProperties(' + f.fieldId + ');"/></div>';

    }

    if (FORMFIELD_TYPE_INFORMATION[f.fieldType].choicesVisible) {

      defaultCode = '<div class="adminEditingControlTitle">Choices (One per line / Mark default with a *)</div>' +
        '<div><textarea type="text" style="height: 60px;" id="formFieldChoices" class="adminEditingControlText" onkeyup="' + this._instanceName + '.adjustFieldProperties(' + f.fieldId + ');"></textarea></div>';

    }

    if (FORMFIELD_TYPE_INFORMATION[f.fieldType].requiredVisible) {

      if (this._fixedForm) {
        requiredCode = '<input style="display: none;" id="formFieldRequired" type="checkbox"/>';
      } else {
        requiredCode = '<div style="padding-top: 3px;"><input onclick="' + this._instanceName + '.adjustFieldProperties(' + f.fieldId + ');" id="formFieldRequired" type="checkbox" class="adminEditingControlCheckbox"/>&nbsp;&nbsp;<span class="adminEditingControlTitle">Required Field?</span></div>';
      }

    }

    return(

      '<div class="adminEditingControlsTop">&nbsp;</div><div class="adminEditingControlsMiddle"><div class="adminEditingControlsMiddleInner">' +
        '<div class="adminEditingControlsFlyoutTitle">' + editingTitle + '</div>' +

        '<div style="float: left;">' +
          '<div class="adminEditingControlTitle">Field Title</div>' +
          '<div><input type="text" maxlength="100" id="formFieldTitle" style="width: 136px;" class="adminEditingControlText" onkeyup="' + this._instanceName + '.adjustFieldProperties(' + f.fieldId + ');"/></div>' +
        '</div>' +

        '<div style="float: left; padding-left: 20px;">' +
          fieldFormat +
        '</div>' +
        '<div style="clear: both;"></div>' +

        defaultCode +

        '<div class="adminEditingControlTitle">User Instructions</div>' +
        '<div><textarea type="text" id="formFieldInstructions" class="adminEditingControlTextarea" onkeyup="' + this._instanceName + '.adjustFieldProperties(' + f.fieldId + ');" value="' + f.instructions + '"/></textarea></div>' +

        requiredCode +

        '<div style="padding-top: 6px;"><input type="button" onclick="' + this._instanceName + '.saveField(' + f.fieldId + '); ' + this._instanceName + '.blurField(' + f.fieldId + ');" class="adminEditingControlButton" value="Save"/>' +
        (!this._fixedForm ? ' <input type="button" onclick="' + this._instanceName + '.deleteField(' + f.fieldId + ');" class="adminEditingControlButton" value="Delete"/></div>' : '') +

      '</div></div><div class="adminEditingControlsBottom">&nbsp;</div>'

    );

  },

  adjustFieldProperties: function(id) {

    var fc = document.getElementById("formFieldContainer" + id);
    var fo = this._fieldsByUniqueId[id];

    fo.title = document.getElementById("formFieldTitle").value;

    if (FORMFIELD_TYPE_INFORMATION[fo.fieldType].defaultVisible) {
      fo.defaultValue = document.getElementById("formFieldDefaultValue").value;
    }
    if (FORMFIELD_TYPE_INFORMATION[fo.fieldType].choicesVisible) {
      fo.choices = document.getElementById("formFieldChoices").value.replace(/\r/gi, "");
    }
    if (FORMFIELD_TYPE_INFORMATION[fo.fieldType].parameterOptions != "none") {
      fo.parameters = document.getElementById("formFieldParameters").value;
    }
    if (FORMFIELD_TYPE_INFORMATION[fo.fieldType].requiredVisible) {
      fo.required = document.getElementById("formFieldRequired").checked;
    }

    fo.instructions = document.getElementById("formFieldInstructions").value;

    this._autosaveRequired = true;

    this.renderField(fo);

    // repos admin ui

    var xy = YAHOO.util.Dom.getXY(fc);
    document.getElementById("adminEditingControlsFloat").style.left = (xy[0]) + "px";
    document.getElementById("adminEditingControlsFloat").style.top  = (xy[1] + fc.offsetHeight) + "px";

  },

  deleteField: function(id) {

    this.blurField(id);

    var t = document.getElementById("formFieldContainer" + id) ;
    t.parentNode.removeChild(t);

    this._nfOpen = false;

    // remove from db

    f = this._fieldsByUniqueId[id];
    var existingId = this._fieldIdsToDatabaseIds[f.fieldId];

    if (existingId != null) {

      var func = "/process/admin/RemoveFormFieldAsync";
      var data = "moduleId=" + this._currentModuleId + "&itemId=" + existingId;

      // process with the server

      YAHOO.util.Connect.asyncRequest("POST", func, {

        timeout : 10000,

        failure : function(o) {
          alert("Warning!  Some dynamic changes have not been saved, as your request has failed to reach the server.  You might want to check your connection to the internet before proceeding with more changes.");
        }

      }, data);

    }

    delete this._fieldsByUniqueId[id];
    delete this._fieldIdsToDatabaseIds[id];

  },

  hideFlyout: function() {

    document.getElementById("adminEditingControlsFloat").style.display  = "none";

  },

  positionFlyout: function() {

    if (this._lastFocusedFieldId != null) {

      var fc = document.getElementById("formFieldContainer" + this._lastFocusedFieldId);

      // set up admin dialog

      var xy = YAHOO.util.Dom.getXY(fc);
      document.getElementById("adminEditingControlsFloat").style.left = (xy[0]) + "px";
      document.getElementById("adminEditingControlsFloat").style.top  = (xy[1] + fc.offsetHeight) + "px";

      document.getElementById("adminEditingControlsFloat").style.display  = "block";

    }

  },

  focusField: function(id) {

    var fc = document.getElementById("formFieldContainer" + id);
    var fo = this._fieldsByUniqueId[id];

    if (fo.fieldType == "unknown") { return; }

    if (this._lastFocusedFieldId != id) {

      if (this._lastFocusedFieldId != null) {

        if (!this._renderForExternalUsage && this._autosaveRequired) {
          this.saveField(this._lastFocusedFieldId);
        }
        this.blurField();

      }

      this._lastFocusedFieldId = id;

      fc.className = "fieldContainerActive";

      // set up admin dialog

      if (!this._renderForExternalUsage) {

        document.getElementById("adminEditingControlsFloat").innerHTML = this.getFieldEditingControls(fo);

        this.positionFlyout();

        document.getElementById("formFieldTitle").value = fo.title;

        if (FORMFIELD_TYPE_INFORMATION[fo.fieldType].defaultVisible) {
          document.getElementById("formFieldDefaultValue").value = fo.defaultValue;
        }
        if (FORMFIELD_TYPE_INFORMATION[fo.fieldType].choicesVisible) {
          document.getElementById("formFieldChoices").value = fo.choices;
        }
        if (FORMFIELD_TYPE_INFORMATION[fo.fieldType].parameterOptions != "none") {
          document.getElementById("formFieldParameters").value = fo.parameters;
        }
        if (FORMFIELD_TYPE_INFORMATION[fo.fieldType].requiredVisible) {
          document.getElementById("formFieldRequired").checked = fo.required;
        }

        document.getElementById("formFieldInstructions").value = fo.instructions;

        document.getElementById("formFieldTitle").focus();

      }

    }

  },

  blurField: function(id) {

    if (!id) { id = this._lastFocusedFieldId; }

    var fc = document.getElementById("formFieldContainer" + id);
    var fo = this._fieldsByUniqueId[id];

    fc.className = "fieldContainer";

    if (!this._renderForExternalUsage) {

      document.getElementById("adminEditingControlsFloat").style.display  = "none";

    }

    this._lastFocusedFieldId = null;

  },

  beginAddField: function() {

    if (this._nfOpen) { return; }

    // add form data

    var f = this.internalAddField("unknown");

    // render it

    this.renderField(f);

    if (this._lastFocusedFieldId != null) { this.blurField(); }

    this._nfOpen = true;

  },

  internalAddField: function(type) {

    ++this._uniqueFieldId;

    var f = new Object();

    f.fieldType = type;
    f.fieldId = this._uniqueFieldId;

    this._fieldsByUniqueId[f.fieldId] = f;

    if (f.fieldId == 1) {

      this._targetContainer.innerHTML = "";
      this._submitButton.style.display = "block";

    }

    // add a container for this field

    var litem = document.createElement("li");
    litem.id = "formField" + f.fieldId;
    litem.onclick = new Function(this._instanceName + ".focusField(" + f.fieldId + ");");


    var litem2 = document.createElement("div");
    litem2.id = "formFieldContainer" + f.fieldId;
    litem2.className = "fieldContainer";

    litem.appendChild(litem2);

    // adjust pointer for fixed fields

    if  (this._fixedForm && !this._renderForExternalUsage) {
      litem.style.cursor = "pointer";
    }

    // remember titles

    if (f.fieldType == FORMFIELD_TYPE_TITLE) {
      this._titleFieldIds.push(f.fieldId);
    }

    // hmm -- hacky crap to get around the fact that a DD list item will insert an invisible last element into our form area

    if (this._renderForExternalUsage || this._fixedForm || this._targetContainer.lastChild == null) {

      this._targetContainer.appendChild(litem);

    } else {

      this._targetContainer.insertBefore(litem, this._targetContainer.lastChild);

    }

    if (f.fieldType != "unknown" && !this._renderForExternalUsage && !this._fixedForm) {

      new Squarespace.DDListItem("formField" + f.fieldId, this._currentModuleId, "formFields");

    }

    return( f );

  },

  addFieldByType: function(id, type) {

    this._nfOpen = false;

    f = this._fieldsByUniqueId[id];
    this._fieldIdsToDatabaseIds[id] = null;

    f.fieldType = type;
    f.parameters = FORMFIELD_TYPE_INFORMATION[f.fieldType].defaultParameter;
    f.title = "New Field";
    f.instructions = "";
    f.required = false;
    f.choices = (FORMFIELD_TYPE_INFORMATION[f.fieldType].choicesVisible ? "One\nTwo\nThree" : "");
    f.defaultValue = "";

    // initialize draggability

    new Squarespace.DDListItem("formField" + f.fieldId, this._currentModuleId, "formFields");

    // render

    this.renderField(f);

    // save

    this.saveField(id);

  },

  callbackMapExternalIdToDatabaseId: function(externalId, databaseId) {
    this._fieldIdsToDatabaseIds[externalId] = databaseId;
  },

  saveField: function(id) {

    f = this._fieldsByUniqueId[id];
    var existingId = this._fieldIdsToDatabaseIds[f.fieldId];

    var func = "/process/admin/CreateOrModifyFormFieldAsync";
    var data = "moduleId=" + this._currentModuleId + "&fieldType=" + f.fieldType
      + (existingId != null ? "&fieldId=" + existingId : "")
      + "&externalId=" + encodeURIComponent(f.fieldId)
      + "&title=" + encodeURIComponent(f.title)
      + "&parameters=" + encodeURIComponent(f.parameters)
      + "&choices=" + encodeURIComponent(f.choices)
      + "&instructions=" + encodeURIComponent(f.instructions)
      + "&defaultValue=" + encodeURIComponent(f.defaultValue)
      + "&required=" + encodeURIComponent(f.required)
      + "&instanceName=" + encodeURIComponent(this._instanceName);

    // process with the server

    YAHOO.util.Connect.asyncRequest("POST", func, {

      timeout : 10000,

      success : function(o) {
        eval(o.responseText);
      },

      failure : function(o) {
        alert("Warning!  Some dynamic changes have not been saved, as your request has failed to reach the server.  You might want to check your connection to the internet before proceeding with more changes.");
      }

    }, data);

    this._autosaveRequired = false;

  },

  initializeField: function(type, parameters, title, instructions, required, choices, defaultValue, databaseId) {

    var f = this.internalAddField(type);

    f.parameters = parameters;
    f.title = title;
    f.instructions = instructions;
    f.required = required;
    f.choices = choices.replace(/\r/gi, "");
    f.defaultValue  = defaultValue;

    this._fieldIdsToDatabaseIds[f.fieldId] = databaseId;
    this._databaseIdsToFieldIds[databaseId] = f.fieldId;

    this.renderField(f);

  },

  generateParameterFromField: function(fieldId, suffix) {
    return( "formFieldEl" + this._fieldIdsToDatabaseIds[fieldId] + suffix + "=" + encodeURIComponent(document.getElementById("formFieldEl" + fieldId + suffix).value) + "&" );
  },

  getDatabaseIdByFieldId: function(id) {
    return( this._fieldIdsToDatabaseIds[id] );
  },

  callbackShowFieldError: function(databaseId, message) {

    var fieldId = this._databaseIdsToFieldIds[databaseId];

    document.getElementById("formField" + fieldId + "Title").className = document.getElementById("formField" + fieldId + "Title").className + " error-text";
    document.getElementById("formField" + fieldId + "Error").style.display = "block";
    document.getElementById("formField" + fieldId + "Error").innerHTML = "[ " + message + " ]";

    if (this._visibleErrors.length == 0) {

      this._submitButton.disabled = false;
      this._submitButton.value = "Re-Submit";

      this._errorContainer.innerHTML = "<strong>Your form contains errors and could not be submitted.</strong>  Navigate above to correct these errors, then click below to re-submit your form.";

      for(var i = 0; i < this._titleFieldIds.length; ++i) {
        var titleId = this._titleFieldIds[i];
        document.getElementById("formField" + titleId + "Title").className    = document.getElementById("formField" + titleId + "Title").className + " error-text";
        document.getElementById("formField" + titleId + "Subtitle").className = document.getElementById("formField" + titleId + "Subtitle").className + " error-text";
      }

      window.scrollTo(0, 0);

    }

    this._visibleErrors.push(fieldId);

  },

  callbackClearErrors: function() {

    for(var i = 0; i < this._visibleErrors.length; ++i) {
      var fieldId = this._visibleErrors[i];
      document.getElementById("formField" + fieldId + "Title").className = "fieldTitle";
      document.getElementById("formField" + fieldId + "Error").innerHTML = "";
      document.getElementById("formField" + fieldId + "Error").style.display = "none";
    }

    for(var i = 0; i < this._titleFieldIds.length; ++i) {
      var fieldId = this._titleFieldIds[i];
      document.getElementById("formField" + fieldId + "Title").className    = "caption";
      document.getElementById("formField" + fieldId + "Subtitle").className = "formTitle";
    }

    this._errorContainer.innerHTML = "";

    this._visibleErrors = new Array();

  },

  callbackSuccess: function() {

    this._submitButton.value = "Success!";
    document.location.href = document.location.href + "?success=true";

  },

  callbackFailure: function(message) {

    this._submitButton.disabled = false;
    this._submitButton.value = "FAILURE!";
    alert(message);

  },

  submitCustomForm: function() {

    if (!this._renderForExternalUsage) { return; }

    var submitVal = "";

    this._submitButton.disabled = true;
    this._submitButton.value = "Submitting...";

    fieldsSubmitted = new Array();

    for(id in this._fieldsByUniqueId) {

      var f = this._fieldsByUniqueId[id];
      var x = null;
      var fieldDatabaseId = this._fieldIdsToDatabaseIds[id];

      if (f.fieldType == FORMFIELD_TYPE_SINGLELINETEXT || f.fieldType == FORMFIELD_TYPE_PARAGRAPHTEXT || f.fieldType == FORMFIELD_TYPE_NUMBER || f.fieldType == FORMFIELD_TYPE_EMAIL || f.fieldType == FORMFIELD_TYPE_WEBSITE || f.fieldType == FORMFIELD_TYPE_DROPDOWN) {

        x = this.generateParameterFromField(f.fieldId, "");

      } else if (f.fieldType == FORMFIELD_TYPE_CHECKBOXES || f.fieldType == FORMFIELD_TYPE_MULTIPLECHOICE) {

        x = "";

        var opts = f.choices.replace(/\r/gi, "").split("\n");
        var is = 0;

        for(var i = 0; i < opts.length; ++i) {
          if (opts[i].length > 0 && document.getElementById("formFieldEl" + f.fieldId + "-" + i).checked) {
            if (opts[i].indexOf('*') == opts[i].length - 1) {
              x += "formFieldEl" + this._fieldIdsToDatabaseIds[f.fieldId] + "-" + is + "=" + encodeURIComponent(opts[i].substring(0, opts[i].length - 1)) + "&";
            } else {
              x += "formFieldEl" + this._fieldIdsToDatabaseIds[f.fieldId] + "-" + is + "=" + encodeURIComponent(opts[i]) + "&";
            }
            ++is;
          }
        }

      } else if (f.fieldType == FORMFIELD_TYPE_ADDRESS) {

        x = this.generateParameterFromField(f.fieldId, "A1") +
            this.generateParameterFromField(f.fieldId, "A2") +
            this.generateParameterFromField(f.fieldId, "CT") +
            this.generateParameterFromField(f.fieldId, "ST") +
            this.generateParameterFromField(f.fieldId, "ZP") +
            this.generateParameterFromField(f.fieldId, "CO");

      } else if (f.fieldType == FORMFIELD_TYPE_NAME) {

        if (f.parameters == "extended") {

          x = this.generateParameterFromField(f.fieldId, "TI") +
              this.generateParameterFromField(f.fieldId, "NF") +
              this.generateParameterFromField(f.fieldId, "NL") +
              this.generateParameterFromField(f.fieldId, "SF");

        } else {

          x = this.generateParameterFromField(f.fieldId, "NF") +
              this.generateParameterFromField(f.fieldId, "NL");

        }

      } else if (f.fieldType == FORMFIELD_TYPE_DATE) {

        x = this.generateParameterFromField(f.fieldId, "MM") +
            this.generateParameterFromField(f.fieldId, "DD") +
            this.generateParameterFromField(f.fieldId, "YY");

      } else if (f.fieldType == FORMFIELD_TYPE_TIME) {

        x = this.generateParameterFromField(f.fieldId, "HH") +
            this.generateParameterFromField(f.fieldId, "MM") +
            this.generateParameterFromField(f.fieldId, "SS") +
            this.generateParameterFromField(f.fieldId, "AP");

      } else if (f.fieldType == FORMFIELD_TYPE_PHONE) {

        if (f.parameters == "normal") {

          x = this.generateParameterFromField(f.fieldId, "P1") +
              this.generateParameterFromField(f.fieldId, "P2") +
              this.generateParameterFromField(f.fieldId, "P3");

        } else {

          x = this.generateParameterFromField(f.fieldId, "")

        }

      } else if (f.fieldType == FORMFIELD_TYPE_PRICE) {

        if (f.parameters == "yen") {

          x = this.generateParameterFromField(f.fieldId, "")

        } else {

          x = this.generateParameterFromField(f.fieldId, "DL") +
              this.generateParameterFromField(f.fieldId, "CT");

        }

      }

      if (x != null) {
        fieldsSubmitted.push( fieldDatabaseId );
        submitVal += x;
      }

    }

    submitVal += "fieldsSubmitted=" + fieldsSubmitted.join(",");

    // submit data to server

    var func = "/process/CreateFormEntry";
    var data = "moduleId=" + this._currentModuleId + "&instanceName=" + encodeURIComponent(this._instanceName) + "&" + submitVal;

    // process with the server

    YAHOO.util.Connect.asyncRequest("POST", func, {

      timeout : 10000,

      success : function(o) {

        eval(o.responseText);

      },

      failure : function(o) {

        alert("Unable to send your form to the server.  Please check your internet connection.");

        this._submitButton.disabled = false;
        this._submitButton.value = "Submit";

      }

    }, data);

  }

});
