Source: src/modules/contact/contact.js

/**
 * Implements hook_menu().
 * @return {Object}
 */
function contact_menu() {
  try {
    var items = {};
    items['contact'] = {
      title: t('Contact'),
      page_callback: 'drupalgap_get_form',
      page_arguments: ['contact_site_form'],
      pageshow: 'contact_site_form_pageshow',
      access_arguments: ['access site-wide contact form']
    };
    items['user/%/contact'] = {
      title: t('User contact'),
      page_callback: 'drupalgap_get_form',
      page_arguments: ['contact_personal_form', 1],
      pageshow: 'contact_personal_form_pageshow',
      access_arguments: ['access user contact forms'],
      weight: 10,
      type: 'MENU_LOCAL_TASK'
    };
    return items;
  }
  catch (error) { console.log('contact_menu - ' + error); }
}

/**
 * The contact index service resource.
 * @param {Object} options
 */
function contact_index(options) {
  try {
    options.method = 'GET';
    options.path = 'contact.json';
    options.service = 'contact';
    options.resource = 'index';
    Drupal.services.call(options);
  }
  catch (error) { console.log('contact_index - ' + error); }
}

/**
 * The contact site service resource.
 * @param {Object} options
 */
function contact_site(options) {
  try {
    options.method = 'POST';
    options.path = 'contact/site.json';
    options.service = 'contact';
    options.resource = 'site';
    Drupal.services.call(options);
  }
  catch (error) { console.log('contact_site - ' + error); }
}

/**
 * The contact personal service resource.
 * @param {Object} options
 */
function contact_personal(options) {
  try {
    options.method = 'POST';
    options.path = 'contact/personal.json';
    options.service = 'contact';
    options.resource = 'personal';
    Drupal.services.call(options);
  }
  catch (error) { console.log('contact_personal - ' + error); }
}

/**
 * The site contact form.
 * @param {Object} form
 * @param {Object} form_state
 * @return {Object}
 */
function contact_site_form(form, form_state) {
  try {
    form.elements.name = {
      title: t('Your name'),
      type: 'textfield',
      required: true
    };
    form.elements.mail = {
      title: t('Your e-mail address'),
      type: 'email',
      required: true
    };
    form.elements.subject = {
      title: t('Subject'),
      type: 'textfield',
      required: true
    };
    form.elements.cid = {
      title: t('Category'),
      type: 'select',
      required: true
    };
    form.elements.message = {
      title: t('Message'),
      type: 'textarea',
      required: true
    };
    form.elements.copy = {
      title: t('Send yourself a copy?'),
      type: 'checkbox',
      default_value: 0,
      access: false
    };
    form.elements.submit = {
      type: 'submit',
      value: t('Send message')
    };
    // If the user is logged in, set the default values.
    if (Drupal.user.uid != 0) {
      form.elements.name.default_value = Drupal.user.name;
      form.elements.name.disabled = true;
      form.elements.mail.default_value = Drupal.user.mail;
      form.elements.mail.disabled = true;
      form.elements.copy.access = true;
    }
    return form;
  }
  catch (error) { console.log('contact_site_form - ' + error); }
}

/**
 * The pageshow callback for the contact site form.
 */
function contact_site_form_pageshow() {
  try {
    contact_index({
        success: function(results) {
          var select = $('#edit-contact-site-form-cid');
          if (!results || !results.length) { return; }
          for (var index in results) {
              if (!results.hasOwnProperty(index)) { continue; }
              var result = results[index];
              var selected = result.selected == 1 ? 'selected' : '';
              var option = '<option value="' + result.cid + '" ' + selected + '>' + result.category + '</option>';
              $(select).append(option);
          }
          $(select).selectmenu('refresh');
          if (results.length == 1) { $(select).hide(); }
        }
    });
  }
  catch (error) { console.log('contact_site_form_pageshow - ' + error); }
}

/**
 * The site wide contact form submit handler.
 * @param {Ojbect} form
 * @param {Ojbect} form_state
 */
function contact_site_form_submit(form, form_state) {
  var data = {
    name: form_state.values['name'],
    mail: form_state.values['mail'],
    subject: form_state.values['subject'],
    cid: form_state.values['cid'],
    message: form_state.values['message'],
    copy: form_state.values['copy']
  };
  contact_site({
      data: JSON.stringify(data),
      success: function(result) {
        if (result[0]) {
          drupalgap_alert(t('Your message has been sent!'));
        }
        else {
          drupalgap_alert(
            t('There was a problem sending your message!'),
            { title: t('Error') }
          );
        }
        drupalgap_form_clear();
      },
      error: function(xhr, status, message) {
        if (message) {
          message = JSON.parse(message);
          if (message.form_errors) {
            var errors = '';
            for (var element in message.form_errors) {
                if (!message.form_errors.hasOwnProperty(element)) { continue; }
                var error = message.form_errors[element];
                errors += error + '\n';
            }
            if (errors != '') { drupalgap_alert(errors); }
          }
        }
      }
  });
}

/**
 * The personal contact form.
 * @param {Object} form
 * @param {Object} form_state
 * @param {Number} recipient
 * @return {Object}
 */
function contact_personal_form(form, form_state, recipient) {
  try {
    // @TODO - when providing a personal contact form, make sure the user has
    // their personal contact form enabled.
    form.elements.name = {
      title: t('Your name'),
      type: 'textfield',
      required: true
    };
    form.elements.mail = {
      title: t('Your e-mail address'),
      type: 'email',
      required: true
    };
    form.elements.to = {
      type: 'hidden',
      required: true
    };
    var container_id = contact_personal_form_to_container_id(recipient);
    form.elements.to_display = {
      title: 'To',
      markup: '<div id="' + container_id + '"></div>'
    };
    form.elements.subject = {
      title: t('Subject'),
      type: 'textfield',
      required: true
    };
    form.elements.message = {
      title: t('Message'),
      type: 'textarea',
      required: true
    };
    form.elements.copy = {
      title: t('Send yourself a copy?'),
      type: 'checkbox',
      default_value: 0,
      access: false
    };
    form.elements.submit = {
      type: 'submit',
      value: t('Send message')
    };
    // If the user is logged in, set the default values.
    if (Drupal.user.uid != 0) {
      form.elements.name.default_value = Drupal.user.name;
      form.elements.name.disabled = true;
      form.elements.mail.default_value = Drupal.user.mail;
      form.elements.mail.disabled = true;
      form.elements.copy.access = true;
    }
    return form;
  }
  catch (error) { console.log('contact_personal_form - ' + error); }
}

/**
 * The pageshow callback for the personal contact form.
 * @param {Object} form
 * @param {Number} recipient
 */
function contact_personal_form_pageshow(form, recipient) {
  try {
    user_load(recipient, {
        success: function(account) {
          // Make sure the user has their contact form enabled.
          if (!account.data.contact) {
            $('#' + drupalgap_get_page_id() + ' #drupalgap_form_errors').html(
              "<div class='messages warning'>" +
                t("Sorry, this user's contact form is disabled.") +
              '</div>'
            );
            return;
          }
          // Populate hidden value for the 'to' field.
          var container_id = contact_personal_form_to_container_id(recipient);
          $('#' + container_id).html(l(account.name, 'user/' + account.uid));
          var hidden_selector = '#' + drupalgap_get_page_id() +
            ' #edit-contact-personal-form-to';
          $(hidden_selector).val(account.name);
        }
    });
  }
  catch (error) { console.log('contact_personal_form_pageshow - ' + error); }
}

/**
 * The personal contact form submit handler.
 * @param {Ojbect} form
 * @param {Ojbect} form_state
 */
function contact_personal_form_submit(form, form_state) {
  var data = {
    name: form_state.values['name'],
    mail: form_state.values['mail'],
    to: form_state.values['to'],
    subject: form_state.values['subject'],
    message: form_state.values['message'],
    copy: form_state.values['copy']
  };
  contact_personal({
      data: JSON.stringify(data),
      success: function(result) {
        if (result[0]) { drupalgap_alert(t('Your message has been sent!')); }
        else {
          drupalgap_alert(
            t('There was a problem sending your message!'),
            { title: t('Error') }
          );
        }
        drupalgap_form_clear();
      },
      error: function(xhr, status, message) {
        if (message) {
          message = JSON.parse(message);
          if (message.form_errors) {
            var errors = '';
            for (var element in message.form_errors) {
                if (!message.form_errors.hasOwnProperty(element)) { continue; }
                var error = message.form_errors[element];
                errors += error + '\n';
            }
            if (errors != '') { drupalgap_alert(errors); }
          }
        }
      }
  });
}

/**
 * Returns the div container id to use on the "to" markup on the personal
 * contact form.
 * @param {Number} recipient
 * @return {String}
 */
function contact_personal_form_to_container_id(recipient) {
    return 'contact_personal_form_user_' + recipient;
}