<?php

if ( ! class_exists( 'GFForms' ) ) {
	die();
}

class GFFormList {

	public static function form_list_page() {
		global $wpdb;

		if ( ! GFCommon::ensure_wp_version() ) {
			return;
		}

		echo GFCommon::get_remote_message();

		$action      = RGForms::post( 'action' );
		$bulk_action = RGForms::post( 'bulk_action' );
		$bulk_action = ! empty( $bulk_action ) ? $bulk_action : RGForms::post( 'bulk_action2' );

		if ( $action == 'trash' ) {
			check_admin_referer( 'gforms_update_forms', 'gforms_update_forms' );
			$form_id = RGForms::post( 'action_argument' );
			RGFormsModel::trash_form( $form_id );
			$message = __( 'Form moved to the trash.', 'gravityforms' );
		} else if ( $action == 'restore' ) {
			check_admin_referer( 'gforms_update_forms', 'gforms_update_forms' );
			$form_id = RGForms::post( 'action_argument' );
			RGFormsModel::restore_form( $form_id );
			$message = __( 'Form restored.', 'gravityforms' );
		} else if ( $action == 'delete' ) {
			check_admin_referer( 'gforms_update_forms', 'gforms_update_forms' );
			$form_id = RGForms::post( 'action_argument' );
			if ( GFCommon::current_user_can_any( 'gravityforms_delete_forms' ) ) {
				RGFormsModel::delete_form( $form_id );
				$message = __( 'Form deleted.', 'gravityforms' );
			} else {
				$message = __( "You don't have adequate permission to delete forms.", 'gravityforms' );
			}
		} else if ( $action == 'duplicate' ) {
			check_admin_referer( 'gforms_update_forms', 'gforms_update_forms' );
			$form_id = RGForms::post( 'action_argument' );
			RGFormsModel::duplicate_form( $form_id );
			$message = __( 'Form duplicated.', 'gravityforms' );
		}

		if ( $bulk_action ) {

			check_admin_referer( 'gforms_update_forms', 'gforms_update_forms' );
			$form_ids   = is_array( rgpost( 'form' ) ) ? rgpost( 'form' ) : array();
			$form_count = count( $form_ids );

			switch ( $bulk_action ) {
				case 'trash':
					GFFormsModel::trash_forms( $form_ids );
					$message = _n( '%s form moved to the trash.', '%s forms moved to the trash.', $form_count, 'gravityforms' );
					break;
				case 'restore':
					GFFormsModel::restore_forms( $form_ids );
					$message = _n( '%s form restored.', '%s forms restored.', $form_count, 'gravityforms' );
					break;
				case 'delete':
					if ( GFCommon::current_user_can_any( 'gravityforms_delete_forms' ) ) {
						GFFormsModel::delete_forms( $form_ids );
						$message = _n( '%s form deleted.', '%s forms deleted.', $form_count, 'gravityforms' );
					} else {
						$message = __( "You don't have adequate permissions to delete forms.", 'gravityforms' );
					}
					break;
				case 'reset_views':
					foreach ( $form_ids as $form_id ) {
						GFFormsModel::delete_views( $form_id );
					}
					$message = _n( 'Views for %s form have been reset.', 'Views for %s forms have been reset.', $form_count, 'gravityforms' );
					break;
				case 'delete_entries':
					if ( GFCommon::current_user_can_any( 'gravityforms_delete_entries' ) ) {
						foreach ( $form_ids as $form_id ) {
							GFFormsModel::delete_leads_by_form( $form_id );
						}
						$message = _n( 'Entries for %s form have been deleted.', 'Entries for %s forms have been deleted.', $form_count, 'gravityforms' );
					} else {
						$message = __( "You don't have adequate permission to delete entries.", 'gravityforms' );
					}

					break;
				case 'activate':
					foreach ( $form_ids as $form_id ) {
						GFFormsModel::update_form_active( $form_id, 1 );
					}
					$message = _n( '%s form has been marked as active.', '%s forms have been marked as active.', $form_count, 'gravityforms' );
					break;
				case 'deactivate':
					foreach ( $form_ids as $form_id ) {
						GFFormsModel::update_form_active( $form_id, 0 );
					}
					$message = _n( '%s form has been marked as inactive.', '%s forms have been marked as inactive.', $form_count, 'gravityforms' );
					break;
			}

			if ( isset( $message ) )
				$message = sprintf( $message, $form_count );

		}
		$sort_column    = empty( $_GET['sort'] ) ? 'title' : $_GET['sort'];
		$sort_direction = empty( $_GET['dir'] ) ? 'ASC' : $_GET['dir'];
		$active         = RGForms::get( 'active' ) == '' ? null : RGForms::get( 'active' );
		$trash          = RGForms::get( 'trash' ) == '' ? false : RGForms::get( 'trash' );
		$trash          = esc_attr( $trash );
		$forms          = RGFormsModel::get_forms( $active, $sort_column, $sort_direction, $trash );

		$form_count = RGFormsModel::get_form_count();

		wp_print_styles( array( 'thickbox' ) );

		add_action( 'admin_print_footer_scripts', array( __class__, 'output_form_list_script_block' ), 20 );

		?>

		<script type="text/javascript">
			// checked by the ToggleActive method to prevent errors when form status icon is clicked before page has fully loaded
			var gfPageLoaded = false;
		</script>

		<style type="text/css">
			body div#TB_window[style] {
				width: 405px !important;
				height: 340px !important;
				margin-left: -202px !important;
			}

			body #TB_ajaxContent {
				height: 290px !important;
				overflow: hidden;
			}

			.gf_new_form_modal_container {
				padding: 30px;
			}

			.gf_new_form_modal_container .setting-row {
				margin: 0 0 10px;
			}

			.gf_new_form_modal_container .setting-row label {
				line-height: 24px;
			}

			.gf_new_form_modal_container .setting-row input,
			.gf_new_form_modal_container .setting-row textarea {
				display: block;
				width: 100%;
			}

			.gf_new_form_modal_container .setting-row textarea {
				height: 110px;
			}

			.gf_new_form_modal_container .submit-row {
				margin-top: 18px;
			}

			.gf_new_form_modal_container #gf_new_form_error_message {
				margin: 0 0 18px 5px !important;
				color: #BC0B0B;
			}

			.gf_new_form_modal_container img.gfspinner {
				position: relative;
				top: 5px;
				left: 5px;
			}

			.gf_not_ready { opacity: 0.25; }

		</style>

		<div id="gf_new_form_modal" style="display:none;">
			<div class="gf_new_form_modal_container">

				<div class="setting-row">
					<label for="new_form_title"><?php _e( 'Form Title', 'gravityforms' ); ?>
						<span class="gfield_required">*</span></label><br />
					<input type="text" class="regular-text" value="" id="new_form_title" tabindex="9000">
				</div>

				<div class="setting-row">
					<label for="new_form_description"><?php _e( 'Form Description', 'gravityforms' ); ?></label><br />
					<textarea class="regular-text" id="new_form_description" tabindex="9001"></textarea>
				</div>

				<div class="submit-row">
					<?php echo apply_filters( 'gform_new_form_button', '<input id="save_new_form" type="button" class="button button-large button-primary" value="' . __( 'Create Form', 'gravityforms' ) . '" onclick="saveNewForm();" tabindex="9002" />' ); ?>
					<div id="gf_new_form_error_message" style="display:inline-block;"></div>
				</div>

			</div>
		</div>

		<?php // - end of new form modal - // ?>

		<script text="text/javascript">
			function TrashForm(form_id) {
				jQuery("#action_argument").val(form_id);
				jQuery("#action").val("trash");
				jQuery("#forms_form")[0].submit();
			}

			function RestoreForm(form_id) {
				jQuery("#action_argument").val(form_id);
				jQuery("#action").val("restore");
				jQuery("#forms_form")[0].submit();
			}

			function DeleteForm(form_id) {
				jQuery("#action_argument").val(form_id);
				jQuery("#action").val("delete");
				jQuery("#forms_form")[0].submit();
			}

			function DuplicateForm(form_id) {
				jQuery("#action_argument").val(form_id);
				jQuery("#action").val("duplicate");
				jQuery("#forms_form")[0].submit();
			}

			function ToggleActive(img, form_id) {

				if( ! gfPageLoaded ) {
					return;
				}

				var is_active = img.src.indexOf("active1.png") >= 0
				if (is_active) {
					img.src = img.src.replace("active1.png", 'active0.png');
					jQuery(img).attr('title', '<?php _e( 'Inactive', 'gravityforms' ) ?>').attr('alt', '<?php _e( 'Inactive', 'gravityforms' ) ?>');
				}
				else {
					img.src = img.src.replace("active0.png", 'active1.png');
					jQuery(img).attr('title', '<?php _e( 'Active', 'gravityforms' ) ?>').attr('alt', '<?php _e( 'Active', 'gravityforms' ) ?>');
				}

				UpdateCount("active_count", is_active ? -1 : 1);
				UpdateCount("inactive_count", is_active ? 1 : -1);

				var mysack = new sack("<?php echo admin_url( 'admin-ajax.php' )?>");
				mysack.execute = 1;
				mysack.method = 'POST';
				mysack.setVar("action", "rg_update_form_active");
				mysack.setVar("rg_update_form_active", "<?php echo wp_create_nonce( 'rg_update_form_active' ) ?>");
				mysack.setVar("form_id", form_id);
				mysack.setVar("is_active", is_active ? 0 : 1);
				mysack.onError = function () {
					alert('<?php echo esc_js( __( 'Ajax error while updating form', 'gravityforms' ) ) ?>')
				};
				mysack.runAJAX();

				return true;
			}
			function UpdateCount(element_id, change) {
				var element = jQuery("#" + element_id);
				var count = parseInt(element.html()) + change
				element.html(count + "");
			}

			function gfConfirmBulkAction(element_id) {
				var element = "#" + element_id;
				if (jQuery(element).val() == 'delete')
					return confirm('<?php echo __( 'WARNING: You are about to delete these forms and ALL entries associated with them. ', 'gravityforms' ) . __( "\'Cancel\' to stop, \'OK\' to delete.", 'gravityforms' ) ?>');
				else if (jQuery(element).val() == 'reset_views')
					return confirm('<?php echo __( 'Are you sure you would like to reset the Views for the selected forms? ', 'gravityforms' ) . __( "\'Cancel\' to stop, \'OK\' to reset.", 'gravityforms' ) ?>');
				else if (jQuery(element).val() == 'delete_entries')
					return confirm('<?php echo __( 'WARNING: You are about to delete ALL entries associated with the selected forms. ', 'gravityforms' ) . __( "\'Cancel\' to stop, \'OK\' to delete.", 'gravityforms' ) ?>');

				return true;
			}
		</script>

		<link rel="stylesheet" href="<?php echo GFCommon::get_base_url() ?>/css/admin.css" />
		<div class="wrap <?php echo GFCommon::get_browser_class() ?>">

		<h2>
			<?php _e( 'Forms', 'gravityforms' ); ?>
			<a class="add-new-h2" href="" onclick="return loadNewFormModal();"><?php _e( 'Add New', 'gravityforms' ) ?></a>
		</h2>

		<?php if ( isset( $message ) ) { ?>
			<div class="updated below-h2" id="message"><p><?php echo $message; ?></p></div>
		<?php } ?>

		<form id="forms_form" method="post">
		<?php wp_nonce_field( 'gforms_update_forms', 'gforms_update_forms' ) ?>
		<input type="hidden" id="action" name="action" />
		<input type="hidden" id="action_argument" name="action_argument" />

		<ul class="subsubsub">
			<li>
				<a class="<?php echo ( $active === null ) ? 'current' : '' ?>" href="?page=gf_edit_forms"><?php _ex( 'All', 'Form List', 'gravityforms' ); ?>
					<span class="count">(<span id="all_count"><?php echo $form_count['total'] ?></span>)</span></a> |
			</li>
			<li>
				<a class="<?php echo $active == '1' ? 'current' : '' ?>" href="?page=gf_edit_forms&active=1"><?php _ex( 'Active', 'Form List', 'gravityforms' ); ?>
					<span class="count">(<span id="active_count"><?php echo $form_count['active'] ?></span>)</span></a> |
			</li>
			<li>
				<a class="<?php echo $active == '0' ? 'current' : '' ?>" href="?page=gf_edit_forms&active=0"><?php _ex( 'Inactive', 'Form List', 'gravityforms' ); ?>
					<span class="count">(<span id="inactive_count"><?php echo $form_count['inactive'] ?></span>)</span></a> |
			</li>
			<li>
				<a class="<?php echo $active == '0' ? 'current' : '' ?>" href="?page=gf_edit_forms&trash=1"><?php _e( 'Trash', 'gravityforms' ); ?>
					<span class="count">(<span id="trash_count"><?php echo $form_count['trash'] ?></span>)</span></a>
			</li>
		</ul>

		<?php
		if ( GFCommon::current_user_can_any( 'gravityforms_delete_forms' ) ) {
			?>
			<div class="tablenav">
				<div class="alignleft actions" style="padding:8px 0 7px 0;">

					<label class="hidden" for="bulk_action"><?php _e( 'Bulk action', 'gravityforms' ) ?></label>
					<select name="bulk_action" id="bulk_action">
						<option value=''> <?php _e( 'Bulk action', 'gravityforms' ) ?> </option>
						<?php if ( $trash ): ?>
							<option value='restore'><?php _e( 'Restore', 'gravityforms' ) ?></option>
							<option value='delete'><?php _e( 'Delete permanently', 'gravityforms' ) ?></option>
						<?php else : ?>
							<option value='activate'><?php _e( 'Mark as Active', 'gravityforms' ) ?></option>
							<option value='deactivate'><?php _e( 'Mark as Inactive', 'gravityforms' ) ?></option>
							<option value='reset_views'><?php _e( 'Reset Views', 'gravityforms' ) ?></option>
							<option value='delete_entries'><?php _e( 'Permanently Delete Entries', 'gravityforms' ) ?></option>
							<option value='trash'><?php _e( 'Move to trash', 'gravityforms' ) ?></option>
						<?php endif ?>
					</select>
					<?php
					$apply_button = '<input type="submit" class="button" value="' . __( 'Apply', 'gravityforms' ) . '" onclick="return gfConfirmBulkAction(\'bulk_action\');"/>';
					echo apply_filters( 'gform_form_apply_button', $apply_button );
					?>

					<br class="clear" />

				</div>
			</div>
		<?php
		}
		?>

		<table class="widefat fixed" cellspacing="0">
			<thead>
			<tr>
				<?php
				if ( GFCommon::current_user_can_any( 'gravityforms_delete_forms' ) ) {
					?>
					<th scope="col" id="cb" class="manage-column column-cb check-column" style="">
						<input type="checkbox" name="form_bulk_check_all" onclick="jQuery('.gform_list_checkbox').attr('checked', this.checked);" />
					</th>
				<?php
				}
				$dir = $sort_column == 'is_active' && $sort_direction == 'ASC' ? 'DESC' : 'ASC';
				$url_active = admin_url( "admin.php?page=gf_edit_forms&sort=is_active&dir=$dir&trash=$trash" );
				?>
				<th scope="col" id="active" class="manage-column column-cb check-column" style="width:50px;cursor:pointer;" onclick="document.location='<?php echo $url_active; ?>'"></th>
				<?php
				$dir = $sort_column == 'id' && $sort_direction == 'ASC' ? 'DESC' : 'ASC';
				$url_id = admin_url( "admin.php?page=gf_edit_forms&sort=id&dir=$dir&trash=$trash" );
				?>
				<th scope="col" id="id" class="manage-column" style="width:50px;cursor:pointer;" onclick="document.location='<?php echo $url_id; ?>'"><?php _e( 'Id', 'gravityforms' ); ?></th>
				<?php
				$dir = $sort_column == 'title' && $sort_direction == 'ASC' ? 'DESC' : 'ASC';
				$url_title = admin_url( "admin.php?page=gf_edit_forms&sort=title&dir=$dir&trash=$trash" );
				?>
				<th width="410" scope="col" id="title" class="manage-column column-title" style="cursor:pointer;" onclick="document.location='<?php echo $url_title; ?>'"><?php _e( 'Title', 'gravityforms' ); ?></th>
				<th scope="col" id="author" class="manage-column column-author" style=""><?php _e( 'Views', 'gravityforms' ) ?></th>
				<th scope="col" id="template" class="manage-column" style=""><?php _e( 'Entries', 'gravityforms' ) ?></th>
				<th scope="col" id="template" class="manage-column" style=""><?php _e( 'Conversion', 'gravityforms' ) ?> <?php gform_tooltip( 'entries_conversion', 'tooltip_left' ) ?> </th>
			</tr>
			</thead>

			<tfoot>
			<tr>
				<?php
				if ( GFCommon::current_user_can_any( 'gravityforms_delete_forms' ) ) {
					?>
					<th scope="col" id="cb" class="manage-column column-cb check-column" style="">
						<input type="checkbox" name="form_bulk_check_all" onclick="jQuery('.gform_list_checkbox').attr('checked', this.checked);" />
					</th>
				<?php
				}
				?>
				<th scope="col" id="active" class="manage-column column-cb check-column"></th>
				<th scope="col" id="id" class="manage-column" style="cursor:pointer;" onclick="document.location='<?php echo $url_id; ?>'"><?php _e( 'Id', 'gravityforms' ) ?></th>
				<th width="410" scope="col" id="title" style="cursor:pointer;" class="manage-column column-title" onclick="document.location='<?php echo $url_title; ?>'"><?php _e( 'Title', 'gravityforms' ) ?></th>
				<th scope="col" id="author" class="manage-column column-author" style=""><?php _e( 'Views', 'gravityforms' ) ?></th>
				<th scope="col" id="template" class="manage-column" style=""><?php _e( 'Entries', 'gravityforms' ) ?></th>
				<th scope="col" id="template" class="manage-column" style=""><?php _e( 'Conversion', 'gravityforms' ) ?></th>
			</tr>
			</tfoot>

			<tbody class="list:user user-list">
			<?php
			if ( sizeof( $forms ) > 0 ) {
				$alternate_row = false;
				foreach ( $forms as $form ) {
					$conversion = '0%';
					if ( $form->view_count > 0 ) {
						$conversion = ( number_format( $form->lead_count / $form->view_count, 3 ) * 100 ) . '%';
					}
					$gf_form_locking = new GFFormLocking();
					?>
					<tr class='author-self status-inherit <?php $gf_form_locking->list_row_class( $form->id ); ?> <?php echo ( $alternate_row = ! $alternate_row ) ? 'alternate' : '' ?>' valign="top" data-id="<?php echo esc_attr( $form->id ) ?>">
						<?php
						if ( GFCommon::current_user_can_any( 'gravityforms_delete_forms' ) ) {
							?>
							<th scope="row" class="check-column">
								<input type="checkbox" name="form[]" value="<?php echo $form->id ?>" class="gform_list_checkbox" /><?php $gf_form_locking->lock_indicator(); ?>
							</th>
						<?php
						}
						?>

						<td>
							<?php if ( ! $trash ) : ?>
								<img class="gform_active_icon gf_not_ready" src="<?php echo GFCommon::get_base_url() ?>/images/active<?php echo intval( $form->is_active ) ?>.png" style="cursor: pointer;" alt="<?php echo $form->is_active ? __( 'Active', 'gravityforms' ) : __( 'Inactive', 'gravityforms' ); ?>" title="<?php echo $form->is_active ? __( 'Active', 'gravityforms' ) : __( 'Inactive', 'gravityforms' ); ?>" onclick="ToggleActive(this, <?php echo $form->id ?>); " />
							<?php endif ?>
						</td>
						<td class="column-id"><?php echo $form->id ?></td>
						<td class="column-title">
							<?php
							if ( $trash ) :
								echo $form->title;
							else :
								?>
								<strong><a class="row-title" disabled="<?php disabled( true, $trash ); ?>"
										   href="admin.php?page=gf_edit_forms&id=<?php echo $form->id ?>"
										   title="<?php _e( 'Edit', 'gravityforms' ) ?>"><?php echo $form->title ?></a></strong>
								<?php $gf_form_locking->lock_info( $form->id );
							endif
							?>
							<div class="row-actions">

								<?php

								if ( $trash ) {
									$form_actions['restore'] = array(
										'label'        => __( 'Restore', 'gravityforms' ),
										'title'        => __( 'Restore', 'gravityforms' ),
										'url'          => 'javascript:RestoreForm(' . $form->id . ');',
										'capabilities' => 'gravityforms_delete_forms',
										'priority'     => 600,
									);
									$form_actions['delete']  = array(
										'label'        => __( 'Delete permanently', 'gravityforms' ),
										'title'        => __( 'Delete permanently', 'gravityforms' ),
										'menu_class'   => 'delete',
										'url'          => 'javascript: if(confirm("' . __( 'WARNING: You are about to delete this form and ALL entries associated with it. ', 'gravityforms' ) . __( '\"Cancel\" to stop, \"OK\" to delete.', 'gravityforms' ) . '")){ DeleteForm(' . $form->id . ');}',
										'capabilities' => 'gravityforms_delete_forms',
										'priority'     => 500,
									);

								} else {
									require_once( GFCommon::get_base_path() . '/form_settings.php' );

									$form_actions = GFForms::get_toolbar_menu_items( $form->id, true );

									$form_actions['duplicate'] = array(
										'label'        => __( 'Duplicate', 'gravityforms' ),
										'title'        => __( 'Duplicate this form', 'gravityforms' ),
										'url'          => 'javascript:DuplicateForm(' . $form->id . ');',
										'capabilities' => 'gravityforms_create_form',
										'priority'     => 600,
									);

									$form_actions['trash'] = array(
										'label'        => __( 'Trash', 'gravityforms' ),
										'title'        => __( 'Move this form to the trash', 'gravityforms' ),
										'url'          => 'javascript:TrashForm(' . $form->id . ');',
										'capabilities' => 'gravityforms_delete_forms',
										'menu_class'   => 'trash',
										'priority'     => 500,
									);

								}

								$form_actions = apply_filters( 'gform_form_actions', $form_actions, $form->id );

								echo GFForms::format_toolbar_menu_items( $form_actions, true );

								?>

							</div>
						</td>
						<td class="column-date"><strong><?php echo $form->view_count ?></strong></td>
						<td class="column-date">
							<strong>
								<?php if ( $form->lead_count > 0 && ! $trash ) { ?>
									<a href="<?php echo admin_url( "admin.php?page=gf_entries&view=entries&id={$form->id}" ); ?>"><?php echo $form->lead_count; ?></a>
								<?php
								} else {
									echo $form->lead_count;
								} ?>
							</strong>
						</td>
						<td class="column-date"><?php echo $conversion ?></td>
					</tr>
				<?php
				}
			} else {
				?>
				<tr>
					<td colspan="6" style="padding:20px;">
						<?php
						if ( $trash )
							echo __( 'There are no forms in the trash.', 'gravityforms' );
						else
							echo sprintf( __( "You don't have any forms. Let's go %screate one%s!", 'gravityforms' ), '<a href="admin.php?page=gf_new_form">', '</a>' );

						?>
					</td>
				</tr>
			<?php
			}
			?>
			</tbody>
		</table>
		<div class="tablenav">
			<div class="alignleft actions" style="padding:8px 0 7px 0;">
				<?php
				if ( GFCommon::current_user_can_any( 'gravityforms_delete_forms' ) ) {
					?>
					<label class="hidden" for="bulk_action2"><?php _e( 'Bulk action', 'gravityforms' ) ?></label>
					<select name="bulk_action2" id="bulk_action2">
						<option value=''> <?php _e( 'Bulk action', 'gravityforms' ) ?> </option>
						<?php if ( $trash ): ?>
							<option value='restore'><?php _e( 'Restore', 'gravityforms' ) ?></option>
							<option value='delete'><?php _e( 'Delete permanently', 'gravityforms' ) ?></option>
						<?php else : ?>
							<option value='activate'><?php _e( 'Mark as Active', 'gravityforms' ) ?></option>
							<option value='deactivate'><?php _e( 'Mark as Inactive', 'gravityforms' ) ?></option>
							<option value='reset_views'><?php _e( 'Reset Views', 'gravityforms' ) ?></option>
							<option value='delete_entries'><?php _e( 'Permanently Delete Entries', 'gravityforms' ) ?></option>
							<option value='trash'><?php _e( 'Move to trash', 'gravityforms' ) ?></option>
						<?php endif ?>
					</select>
					<?php
					$apply_button = '<input type="submit" class="button" value="' . __( 'Apply', 'gravityforms' ) . '" onclick="return gfConfirmBulkAction(\'bulk_action2\');"/>';
					echo apply_filters( 'gform_form_apply_button', $apply_button );
				}
				?>
				<br class="clear" />
			</div>
		</div>
		</form>
		</div>
	<?php
	}

	public static function save_new_form() {

		if ( ! check_admin_referer( 'gf_save_new_form', 'gf_save_new_form' ) ) {
			die( json_encode( array( 'error' => __( 'There was an issue creating your form.', 'gravityforms' ) ) ) );
		}

		GFFormsModel::ensure_tables_exist();

		require_once( GFCommon::get_base_path() . '/form_detail.php' );

		$form_json = rgpost( 'form' );

		$form = json_decode( $form_json, true );

		if ( empty( $form['title'] ) ) {
			$result = array( 'error' => __( 'Please enter a form title.', 'gravityforms' ) );
			die( json_encode( $result ) );
		}

		$result = GFFormDetail::save_form_info( 0, $form_json );

		switch ( rgar( $result, 'status' ) ) {
			case 'invalid_json':
				$result['error'] = __( 'There was an issue creating your form.', 'gravityforms' );
				die( json_encode( $result ) );

			case 'duplicate_title':
				$result['error'] = __( 'Please enter a unique form title.', 'gravityforms' );
				die( json_encode( $result ) );

			default:
				$form_id = abs( $result['status'] );
				die( json_encode( array( 'redirect' => admin_url( "admin.php?page=gf_edit_forms&id={$form_id}" ) ) ) );
		}
	}

	public static function output_form_list_script_block() {
		?>

		<script type="text/javascript">

			jQuery( document ).ready( function( $ ) {

				// load new form modal on New Form page
				<?php if(rgget('page') == 'gf_new_form'): ?>
				loadNewFormModal();
				<?php endif; ?>

				// form settings submenu support
				$('.gf_form_action_has_submenu').hover(function(){
					var l = jQuery(this).offset().left;
					jQuery(this).find('.gf_submenu')
						.toggle()
						.offset({ left: l });
				}, function(){
					jQuery(this).find('.gf_submenu').hide();
				});

				// enable form status icons
				gfPageLoaded = true;
				$( '.gform_active_icon' ).removeClass( 'gf_not_ready' );

			} );

			function loadNewFormModal() {
				resetNewFormModal();
				tb_show('<?php _e('Create a New Form', 'gravityforms'); ?>', '#TB_inline?width=375&amp;inlineId=gf_new_form_modal');
				jQuery('#new_form_title').focus();
				return false;
			}

			function saveNewForm() {

				var createButton = jQuery('#save_new_form');
				var spinner = new gfAjaxSpinner(createButton, gf_vars.baseUrl + '/images/spinner.gif');

				// clear error message
				jQuery('#gf_new_form_error_message').html('');

				var origVal = createButton.val();
				createButton.val('<?php _e('Creating Form...', 'gravityforms'); ?>');

				var form = {
					title: jQuery('#new_form_title').val(),
					description: jQuery('#new_form_description').val(),
					labelPlacement:'top_label',
					descriptionPlacement:'below',
					button: {
						type: 'text',
						text: '<?php _e("Submit", "gravityforms") ?>',
						imageUrl : ''
					},
					fields:[]
				}

				jQuery.post(ajaxurl, {
					form: jQuery.toJSON(form),
					action: 'gf_save_new_form',
					gf_save_new_form: '<?php echo wp_create_nonce('gf_save_new_form'); ?>'
				}, function(response){

					spinner.destroy();

					var respData = jQuery.parseJSON(response);

					if(respData['error']) {
						// adding class later otherwise WP moves box up to the top of the page
						jQuery('#gf_new_form_error_message').html( respData.error );
						addInputErrorIcon( '#new_form_title' );
						createButton.val(origVal);
					} else {
						location.href = respData.redirect;
						createButton.val('<?php _e('Saved! Redirecting...', 'gravityforms'); ?>');
					}

				});

			}

			function resetNewFormModal() {
				jQuery('#new_form_title').val('');
				jQuery('#new_form_description').val('');
				jQuery('#gf_new_form_error_message').html('');
				removeInputErrorIcons( '.gf_new_form_modal_container' );
			}

			function addInputErrorIcon( elem ) {
				var elem = jQuery(elem);
				elem.before( '<span class="gf_input_error_icon"></span>');
			}

			function removeInputErrorIcons( elem ) {
				var elem = jQuery(elem);
				elem.find('span.gf_input_error_icon').remove();
			}

		</script>

	<?php
	}

}
