private function getFractalEditForm($fractal, $sheet, $results) { $user = $this->getUser(); $out = $this->getOutput(); $request = $this->getRequest(); $form_url = $this->getPageTitle()->getSubPage('Edit')->getLinkURL(); $fractal_id = $fractal->fractal_id; $read_only = ''; if ($fractal->user_name) { $read_only = 'readonly'; } // TODO: if a character, display basic attributes some other non-form way $const = FateGameGlobals::getStatConsts(); $condition_categories = $this->getConditionCategoriesJS(); $game_modes = ''; $skills_array = ''; $mode_levels = ''; $mook_levels = $this->getMookLevelsJS(); if ($fractal->fate_game->skill_distribution == FateGameGlobals::SKILL_DISTRIBUTION_MODES) { $game_modes = $this->getGameModesJS($fractal); $mode_levels = $this->getModeLevelsJS(); } else { $game_skills = $this->getGameSkillsJS($fractal); } $form .= <<<EOT <script type='text/javascript'> var TYPE_CONDITION = {$const['condition']}; var TYPE_MODE = {$const['mode']}; var TYPE_SKILL = {$const['skill']}; var TYPE_MOOK = {$const['mook']}; {$condition_categories} {$game_modes} {$mode_levels} {$game_skills} {$mook_levels} var edit_data = new Array(); edit_data[{$const['aspect']}] = { fields: { label: { label: 'Label (Optional)', size: 35 }, field: { label: 'Aspect', size: 35 } }, required: [ 'field' ], unique: 0 }; edit_data[{$const['mode']}] = { fields: { field: { label: 'Mode', type: 'select' }, value: { label: 'Rating', size: 1 } }, required: [ 'field', 'value' ], unique: 0 }; edit_data[{$const['skill']}] = { fields: { label: { label: 'Skill', type: 'select' }, value: { label: 'Rating', size: 1 }, }, required: [ 'label', 'value' ], unique: 0 }; edit_data[{$const['mook']}] = { fields: { field: { label: 'Skill', size: 35 }, value: { label: 'Rating', type: 'select' } }, required: [ 'field', 'value' ], unique: 0 }; edit_data[{$const['stunt']}] = { fields: { field: { label: 'Title', size: 35 }, description: { label: 'Description', type: 'textarea', rows: 3, cols: 80 } }, required: [ 'field', 'description' ], unique: 0 }; edit_data[{$const['consequence']}] = { fields: { label: { label: 'Label', size: 35 }, display_value: { label: 'Modifier', size: 1 }, field: { label: 'Aspect (Optional)', size: 35 } }, required: [ 'label', 'display_value' ], unique: 0 }; edit_data[{$const['condition']}] = { fields: { label: { label: 'Label', size: 35 }, display_value: { label: 'Category', type: 'select' }, value: { label: 'Checked Boxes', size: 1 } }, required: [ 'label', 'display_value', 'value' ], unique: 0 }; edit_data[{$const['stress']}] = { fields: { label: { label: 'Track Name', size: 35 }, max_value: { label: 'Maximum Value', size: 1 }, value: { label: 'Checked Boxes', size: 1 } }, required: [ 'label', 'max_value', 'value' ], unique: 0 }; edit_data[{$const['fate']}] = { fields: { value: { label: 'Current Fate Points', size: 1 } }, required: [ 'value' ], unique: 1 }; edit_data[{$const['refresh']}] = { fields: { value: { label: 'Fate Refresh', size: 1 } }, required: [ 'value' ], unique: 1 }; function createLabelCell(field_info, name) { var cell = document.createElement('td'); cell.className = 'mw-label'; var label = document.createElement('label'); label.setAttribute('for', 'ef' + name); label.appendChild(document.createTextNode(field_info.label + ':')); cell.appendChild(label); return cell; } function createInputSelect(field_info, name, stat_type, new_id, list, mode_skill_label = '', mode_value = 0) { var select = document.createElement('select'); var optionArray = new Array(); select.setAttribute('id', 'ef' + name); select.setAttribute('name', name); if (mode_value) { select.setAttribute('onchange', 'addNewRow(' + stat_type + ',' + new_id + ',"' + mode_skill_label + '",' + mode_value + ');'); } else { select.setAttribute('onchange', 'addNewRow(' + stat_type + ',' + new_id + ');'); } for (var i in list) { var option = document.createElement('option'); option.setAttribute('value', i); option.appendChild(document.createTextNode(list[i])); if (mode_value) { optionArray.push(option); } else { select.appendChild(option); } } // Push-and-pop off a stack to get options for mode skills in the proper order if (mode_value) { optionArray.reverse(); for (var i in optionArray) { select.appendChild(optionArray[i]); } } return select; } function getModeLevelList(mode_value) { var newList = new Array(); for (var i in modeLevels) { newList[parseInt(i) + mode_value] = modeLevels[i] + ' (+' + i + ')'; } return newList; } function createInputCell(field_info, name, stat_type, new_id, field, mode_skill_label, mode_value) { var cell = document.createElement('td'); cell.className = 'mw-input'; if (stat_type == TYPE_CONDITION && field_info.type == 'select') { cell.appendChild(createInputSelect(field_info, name, stat_type, new_id, conditions)); } else if (stat_type == TYPE_MODE && field_info.type == 'select') { cell.appendChild(createInputSelect(field_info, name, stat_type, new_id, modeList)); } else if (stat_type == TYPE_SKILL && field_info.type == 'select') { cell.appendChild(createInputSelect(field_info, name, stat_type, new_id, skillList)); } else if (stat_type == TYPE_MOOK && field_info.type == 'select') { cell.appendChild(createInputSelect(field_info, name, stat_type, new_id, mookLevels)); } else if (stat_type == TYPE_SKILL && field_info.type == 'rankselect') { modeLevelList = getModeLevelList(mode_value); cell.appendChild(createInputSelect(field_info, name, stat_type, new_id, modeLevelList, mode_skill_label, mode_value)); } else if (field_info.type == 'textarea') { var textbox = document.createElement('textarea'); textbox.setAttribute('id', 'ef' + name); textbox.setAttribute('name', name); textbox.setAttribute('oninput', 'addNewRow(' + stat_type + ',' + new_id + ');'); textbox.setAttribute('rows', field_info.rows); textbox.setAttribute('cols', field_info.cols); cell.appendChild(textbox); } else { var input = document.createElement('input'); input.setAttribute('id', 'ef' + name); input.setAttribute('name', name); input.setAttribute('type', 'text'); input.setAttribute('size', field_info.size); if (mode_value) { input.setAttribute('oninput', 'addNewRow(' + stat_type + ',' + new_id + ',"' + mode_skill_label + '",' + mode_value + ');'); } else { input.setAttribute('oninput', 'addNewRow(' + stat_type + ',' + new_id + ');'); } cell.appendChild(input); } return cell; } // Creates extra spaces, to match with delete functionality function emptyCell() { var cell = document.createElement('td'); cell.appendChild(document.createTextNode('\\u00A0')); return cell; } function addNewRow(stat_type, id, mode_skill_label = '', mode_value = 0) { var check = document.getElementById('ef' + stat_type + '_new_' + edit_data[stat_type].required[0] + '_' + (parseInt(id) + 1)); if (!check) { var fields; if (mode_value) { fields = { label: { label: mode_skill_label, size: 35 }, value: { label: 'Ranking', type: 'rankselect', mode_value: mode_value } }; } else { fields = edit_data[stat_type].fields; } var new_id = parseInt(id) + 1; var new_body = document.getElementById('newstat_' + stat_type); var body = document.getElementById('stat_' + stat_type); var row = document.createElement('tr'); for (var field in fields) { var input_name = stat_type + '_new_' + field + '_' + new_id; row.appendChild(createLabelCell(fields[field], input_name)); row.appendChild(createInputCell(fields[field], input_name, stat_type, new_id, field, mode_skill_label, mode_value)); } row.appendChild(emptyCell()); row.appendChild(emptyCell()); new_body.appendChild(row); } } </script> <style type='text/css'> .formerror { border: 2px solid #cc0000; } </style> <form action='{$form_url}' method='post'> <input type='hidden' name='fractal_id' value='{$fractal_id}'/> <input type='hidden' name='sheet' value='{$sheet}'/> <input type='hidden' name='action' value='edit'/> <h2>Edit Fractal</h2> EOT; // Did we have errors? If show, display a big warning here if (count($results) > 0) { if (count($results['error']) > 0) { $form .= "<div class='errorbox'><strong>Editing error.</strong><br/>One or more required fields seem to have been cleared in existing stats. Please correct them below, and resubmit to save edits.</div>"; } else { $form .= "<div class='successbox'><strong>Stat updates saved.</strong></div>"; } } $form .= <<<EOT <fieldset> <legend>Basic Attributes</legend> <table> <tbody> <tr> <td class='mw-label'><label for='efname'>Fractal Name:</label></td> <td class='mw-input'><input id='efname' {$read_only} name='fractal_name' value='{$fractal->name}' type='text' size='35'/></td> </tr> <tr> <td class='mw-label'><label form='eftype'>Fractal Type:</label></td> <td class='mw-input'><input id='eftype' {$read_only} name='fractal_type' value='{$fractal->fractal_type}' type='text' size='35'/></td> </tr> </tbody> </table> </fieldset> EOT; // Dynamically create the rest of this mess $stat_labels = FateGameGlobals::getStatLabels(); foreach ($this->edit_data as $stat_id => $stat_data) { if ($stat_id == FateGameGlobals::STAT_CONDITION && $fractal->fate_game->use_consequences) { continue; } elseif ($stat_id == FateGameGlobals::STAT_CONSEQUENCE && !$fractal->fate_game->use_consequences) { continue; } elseif ($stat_id == FateGameGlobals::STAT_MODE && $fractal->fate_game->skill_distribution != FateGameGlobals::SKILL_DISTRIBUTION_MODES) { continue; } $form .= "<fieldset><legend>" . $stat_labels[$stat_id] . "</legend>"; if ($stat_id == FateGameGlobals::STAT_SKILL && $fractal->fate_game->skill_distribution == FateGameGlobals::SKILL_DISTRIBUTION_MODES) { $form .= $this->getModeSkillSection($stat_id, $fractal, $results); } else { $form .= "<table><tbody id='stat_" . $stat_id . "'>"; $rows = array(); if (array_key_exists($stat_id, $fractal->stats)) { foreach ($fractal->stats[$stat_id] as $stat) { $row = $this->getEditStatRow($stat_id, $stat_data, $stat, $fractal->fate_game, $results); $rows[] = $row; } } foreach ($rows as $r) { $form .= $r; } if (!$stat_data['unique'] || $stat_data['unique'] && count($fractal->stats[$stat_id]) == 0) { $form .= "</tbody></table><h4>Add New " . $stat_labels[$stat_id] . "</h4><table><tbody id='newstat_" . $stat_id . "'>"; $count = count($results) > 0 ? $results['new'][$stat_id]['max'] : 1; for ($i = 1; $i <= $count; $i++) { $form .= $this->getEditStatRow($stat_id, $stat_data, array(), $fractal->fate_game, $results, $i); } } $form .= "</tbody></table>"; } $form .= "</fieldset>"; } $form .= <<<EOT <span class='mw-htmlform-submit-buttons'> <input class='mw-htmlform-submit' type='submit' value='Update'/> </span> </form> EOT; return $form; }
private function getEditGameForm($game, $results) { $user = $this->getUser(); $output = $this->getOutput(); $request = $this->getRequest(); $form_url = $this->getPageTitle()->getSubPage('Edit')->getLinkURL(); $game_id = $game->game_id; $skill_list = $this->getGameSkillsJS($game); $const = FateGameGlobals::getStatConsts(); $form .= <<<EOT <script type='text/javascript'> {$skill_list} var TYPE_MODE = {$const['mode']}; function addNewModeSection( id ) { var check = document.getElementById('eg' + TYPE_MODE + '_label_new_' + (parseInt(id) + 1)); if (!check) { var new_id = parseInt(id) + 1; var body = document.getElementById('config_modes'); var row = document.createElement('tr'); var cell = document.createElement('td'); cell.className = 'mw-label'; var name = TYPE_MODE + '_label_new_' + new_id; var label = document.createElement('label'); label.setAttribute('for', 'eg' + name); label.appendChild(document.createTextNode('New Mode Name:')); cell.appendChild(label); row.appendChild(cell); cell = document.createElement('td'); cell.className = 'mw-input'; var input = document.createElement('input'); input.setAttribute('name', name); input.setAttribute('id', 'eg' + name); input.setAttribute('type', 'text'); input.setAttribute('size', 35); input.setAttribute('oninput', 'addNewModeSection(' + new_id + ');'); cell.appendChild(input); row.appendChild(cell); cell = document.createElement('td'); cell.className = 'mw-label'; name = TYPE_MODE + '_weird_new_' + new_id; label = document.createElement('label'); label.setAttribute('for', 'eg' + name); label.appendChild(document.createTextNode('Is Weird?')); cell.appendChild(label); row.appendChild(cell); cell = document.createElement('td'); cell.className = 'mw-input'; input = document.createElement('input'); input.setAttribute('name', name); input.setAttribute('id', 'eg' + name); input.setAttribute('type', 'checkbox'); input.setAttribute('value', 1); input.setAttribute('onchange', 'addNewModeSection(' + new_id + ');'); cell.appendChild(input); row.appendChild(cell); cell = document.createElement('td'); row.appendChild(cell); cell = document.createElement('td'); row.appendChild(cell); body.appendChild(row); row = document.createElement('tr'); cell = document.createElement('td'); cell.colSpan = 6; var skillTable = document.createElement('table'); var skillBody = document.createElement('tbody'); var skillRow; var append; for (var i = 0; i < skill_list.length; i++) { if (i % 5 == 0) { skillRow = document.createElement('tr'); append = 1; } var skillCell = document.createElement('td'); skillCell.className = 'mw-label'; var skillName = TYPE_MODE + '_skill_' + skill_list[i].id + '_new_ ' + new_id; var skillLabel = document.createElement('label'); skillLabel.setAttribute('for', 'eg' + skillName); skillLabel.appendChild(document.createTextNode(skill_list[i].label + ' (' + skill_list[i].mode_cost + ')')); skillCell.appendChild(skillLabel); skillRow.appendChild(skillCell); skillCell = document.createElement('td'); skillCell.className = 'mw-input'; var skillInput = document.createElement('input'); skillInput.setAttribute('name', skillName); skillInput.setAttribute('id', 'eg' + skillName); skillInput.setAttribute('type', 'checkbox'); skillInput.setAttribute('value', 1); skillInput.setAttribute('onchange', 'addNewModeSection(' + new_id + ');'); skillCell.appendChild(skillInput); skillRow.appendChild(skillCell); if (i % 5 == 4) { skillBody.appendChild(skillRow); append = 0; } } if (append) { skillBody.appendChild(skillRow); } skillTable.appendChild(skillBody); cell.appendChild(skillTable); row.appendChild(cell); body.appendChild(row); } } </script> <form action='{$form_url}' method='post'> <input type='hidden' name='game_id' value='{$game_id}'/> <input type='hidden' name='action' value='edit'/> <h2>Edit Game</h2> EOT; // If we have results, either we have errors to show, or a success if (count($results) > 0) { if (count($results['error']) > 0) { $form .= "<div class='errorbox'><strong>Editing error.</strong><br/>One or more error was found. Please correct them below, and resubmit to save edits.</div>"; } else { $form .= "<div class='successbox'><strong>Game configuration updated.</strong></div>"; } } $form .= <<<EOT <fieldset> <legend>Basic Attributes</legend> <table> <tbody> <tr> <td class='mw-label'><label for='egname'>Game Name:</label></td> <td class='mw-input'><input id='egname' name='game_name' value='{$game->game_name}' type='text' size='35'/></td> </tr> </tbody> </table> </fieldset> EOT; if ($game->skill_distribution == FateGameGlobals::SKILL_DISTRIBUTION_MODES) { $form .= "<fieldset><legend>Configure Modes</legend><table><tbody id='config_modes'>"; foreach ($game->modes as $mode) { $form .= $this->getEditModeSection($game, $mode, $results); } // TODO: Add counting! $form .= $this->getEditModeSection($game, array('newrow' => 1), $results); $form .= "</tbody></table></fieldset>"; } $form .= "<span class='mw-htmlform-submit-buttons'><input class='mw-htmlform-submit' type='submit' value='Update'/></span></form>"; return $form; }