// Native replacement for prototype's Position.cumulativeOffset (offset relative
// to the document). Returns [left, top].
function neCumulativeOffset(element) {
var valueT = 0, valueL = 0;
do {
valueT += element.offsetTop || 0;
valueL += element.offsetLeft || 0;
element = element.offsetParent;
} while (element);
return [valueL, valueT];
}
// Native replacement for prototype's Form.focusFirstElement/activate. Focuses
// the lowest positive tabIndex if the form uses them, otherwise the first
// enabled, non-hidden control. Never throws: this runs in the middle of
// makeEditable(), which still has to start the state/autosave/lock timers.
function neFocusFirstElement(form) {
try {
if (!form) return;
var candidates = [];
var controls = form.querySelectorAll('input, select, textarea');
for (var i = 0; i < controls.length; i++) {
if (controls[i].type == 'hidden' || controls[i].disabled) continue;
candidates.push(controls[i]);
}
if (candidates.length == 0) return;
var element = null;
for (var i = 0; i < candidates.length; i++) {
if (!candidates[i].hasAttribute('tabIndex')) continue;
if (candidates[i].tabIndex < 0) continue;
if (!element || candidates[i].tabIndex < element.tabIndex) element = candidates[i];
}
if (!element) element = candidates[0];
element.focus();
if (element.select) element.select();
} catch(e) {}
}
var doctype = "story";
var docsolo = "";
var appTitle = "";
var bgColor = "";
var bgColorCousin = "#000000";
var today = "10/23/2026";
var tomorrow = "10/24/2026";
var monday = "10/26/2026";
var tuesday = "10/27/2026";
var wednesday = "10/28/2026";
var thursday = "10/29/2026";
var friday = "10/30/2026";
var saturday = "10/24/2026";
var sunday = "10/25/2026";
var docChanged = false;
var assignmentChanged = false;
var storyChanged = false;
var disableSave = false;
var UIstatus = "";
var hasAutoSave = false;
var autosaveRecovery = false;
var formEnabled = false;
var activeTab = "assignment";
var activeVersionTab = "assignment";
var activeEditor = "";
var timerShowButtons;
var timerClearBanner;
var timerSetBanner;
var timerRestoreBanner;
var timerDetectChanges;
var timerCheck;
var originalAssignmentValues = {};
var originalEditorContents = {};
var virginElements = {};
var lastAutoSaveContents = {};
var tempDiv;
var currentBannerStyle = {};
var currentBannerText = "";
var changedFields = {};
var locks = {};
var requestedLocks = {};
var activeLocks = [];
var multiSelectButtonName = "";
var displayedPriorVersion = 0;
var accessKeyHelp = "";
var suppressMessage = false;
var needToFix = {slug: false, pubdate: false, length: false};
var assignmentElementActive = {};
var missingFields = {};
var missingRequiredDenseUserTally = {};
function checkCalKeys(e, elem) {
var keyval = e.keyCode;
if (keyval != 32 && (keyval < 65 || keyval > 90)) {
return true;
}
var char = String.fromCharCode(keyval).toLowerCase();
var val = elem.value.toLowerCase();
if (keyval == 32) {
document.getElementById(elem.id + "Cal").onclick();
return false;
} else if (char == "d") {
elem.value = today;
} else if (char == "t") {
elem.value = tomorrow;
} else if (char == "m") {
elem.value = monday;
} else if (val == tomorrow && char == "u") {
elem.value = tuesday;
} else if (char == "w") {
elem.value = wednesday;
} else if (char == "h") {
elem.value = thursday;
} else if (char == "f") {
elem.value = friday;
} else if (char == "a") {
elem.value = saturday;
} else if (char == "u") {
elem.value = sunday;
} else {
return true;
}
if (e.preventDefault) {
e.preventDefault();
e.stopPropagation();
} else {
e.returnValue = false;
e.cancelBubble = true;
}
return false;
}
function setCloseBlocker(on) {
if (on) {
window.onbeforeunload = ConfirmClose;
} else {
window.onbeforeunload = null;
}
}
function ConfirmClose() {
return "CLICK THE 'CANCEL' BUTTON or you'll lose any unsaved changes that you've made.";
}
function initx() {
if (document.getElementById("formLoaded")) {
formInit();
}
}
function reInitForm() {
formInit();
handleChanges();
}
function formInit() {
initForm();
tempDiv = document.getElementById("tempDiv");
setDefaults();
showRequired();
showAllChosen();
}
function setDefaults() {
if (document.getElementById("pubdate")) {
getDOW(document.getElementById("pubdate").value, "pubdateDOW")
}
if (BrowserDetect.OS == "Mac") {
multiSelectButtonName = "Command/Apple";
accessKeyHelp = "Ctrl";
} else {
multiSelectButtonName = "Ctrl";
accessKeyHelp = "Alt";
}
for (var entry in requiredFields) {
missingFields[entry] = false;
}
for (var entry in requiredFields) {
missingRequiredDenseUserTally[entry] = 0;
}
//var tmpArray = document.querySelectorAll(".panelButton");
//tmpArray.forEach(function(elem) {
// elem.title = accessKeyHelp + elem.title;
//});
buildInstructions();
hideAllEditors();
}
function showRequired() {
for (var entry in requiredFields) {
if (missingRequired(entry, false)) {
if (document.getElementById(entry).classList.contains('textarea') || document.getElementById(entry).classList.contains('text')) {
document.getElementById(entry).value = "(required)";
}
}
}
}
function showAllChosen() {
showChosen("creators", "showCreators", true, ", ", false);
showChosen("editors","showEditors", true, ", ", false);
showChosen("cats","showCats", true, ", ", false);
showChosen("topics","showTopics", true, ", ", false);
}
function showChosen(sourceID, displayID, useOption, delimiter, showHelp) {
var useOption = (useOption == null) ? false : useOption;
var delimiter = (delimiter == null) ? ", " : delimiter;
var showHelp = (showHelp == null) ? true : showHelp;
if (document.getElementById(sourceID)) {
var listitem = document.getElementById(sourceID);
var textForDisplay = "";
var moreText = "";
for(i=0; i < listitem.options.length; i++){
var listentry = listitem.options[i];
if (listentry.selected){
if (useOption) {
moreText = listentry.text.replace( /[<>]/g, "");
} else {
moreText = listentry.value;
}
if (textForDisplay == ""){
textForDisplay = moreText;
}else{
textForDisplay = textForDisplay + delimiter + moreText;
}
}
}
if (textForDisplay == "") {
textForDisplay = "none chosen";
} else if (showHelp) {
showInstruct(listitem, multiSelectInstruct);
showHelp = false;
}
if (document.getElementById(displayID).innerHTML != textForDisplay) {
document.getElementById(displayID).innerHTML = textForDisplay;
}
edit(listitem, showHelp, false);
}
}
function adjustWidth() {
if (document.all) {
if (docsolo != "yes") {
if (BrowserDetect.browser == "Explorer") {
if (BrowserDetect.version < 7) {
document.body.style.marginRight = "20px";
}
}
}
}
}
function nav(dir) {
if (dir == "newer") {
try {
top.storylist.moveFocus("up", 10);
} catch(e) {
// do nothing
}
} else if (dir == "older") {
try {
top.storylist.moveFocus("down", 10);
} catch(e) {
// do nothing
}
}
return false;
}
function showSent(mode) {
var sentText = document.getElementById("sendHistory");
if (mode == "show") {
sentText.style.display = "";
} else {
sentText.style.display = "none";
}
}
function refreshGrid() {
for (var j = 0; j < topwin.gridWindows.length; j++) {
if (topwin.gridWindows[j].document) {
topwin.gridWindows[j].manualRefresh(true);
}
}
}
function showTab(elem) {
if (elem) {
dataHaveChanged(true);
var id = elem.id;
if (id == "showAssignmentInfo") {
activeTab = "assignment";
hideEverything();
$j("#assignmentBlock").show();
$j("#stateColumn").show();
document.getElementById("popupZone").ondblclick = function(){tryToMakeEditable();};
} else if (id == "showStoryBody") {
if (document.getElementById("HistoryID").value == 0) {
alert("You can't start writing a story until you've saved the required assignment info.");
return;
} else {
activeTab = "body";
hideEverything();
$j("#storyBodyBlock").show();
}
} else if (id == "showStoryElements") {
if (document.getElementById("HistoryID").value == 0) {
alert("You can't create story elements until you've saved the required assignment info.");
return;
} else {
activeTab = "elements";
hideEverything();
$j("#topBar").show();
$j("#storyElementBlock").show();
$j("#topElementPicker").show();
}
} else if (id == "showFiles") {
if (document.getElementById("HistoryID").value == 0) {
alert("You can't upload files until you've saved the required assignment info.");
return;
} else {
activeTab = "files";
hideEverything();
$j("#fileBlock").show();
}
} else if (id == "showPackage") {
activeTab = "package";
hideEverything();
$j("#packageBlock").show();
} else if (id == "showVersions") {
activeTab = "versions";
getVersionList();
hideEverything();
$j("#topBar").show();
if (document.getElementById("versionData").innerHTML != "") {
$j("#versionTabBar").show();
}
$j("#versionBlock").show();
$j("#versionPicker").show();
} else if (id == "showVersionAssignmentInfo") {
activeVersionTab = "assignment";
hideEverythingVersion();
$j("#versionAssignmentBlock").show();
} else if (id == "showVersionStoryBody") {
activeVersionTab = "body";
hideEverythingVersion();
$j("#versionStoryBodyBlock").show();
} else if (id == "showVersionStoryElements") {
activeVersionTab = "elements";
hideEverythingVersion();
$j("#versionStoryElementBlock").show();
} else if (id == "showVersionChanges") {
activeVersionTab = "changes";
hideEverythingVersion();
$j("#versionChangesBlock").show();
}
var tmpArray = elem.parentNode.querySelectorAll('.tab');
tmpArray.forEach(function(element) {
element.classList.remove("tabSelected");
});
elem.classList.add("tabSelected");
setUI(true);
}
}
function MCEinit_full() {
tinyMCE.init({
mode: "exact",
elements: "",
theme: "advanced",
content_css: "/tpext/stylesheets/editorFull_css.php",
plugins: "print,searchreplace,table",
nonbreaking_force_tab: true,
gecko_spellcheck: true,
theme_advanced_toolbar_location: "top",
theme_advanced_toolbar_align: "left",
theme_advanced_buttons1: "bold,italic,strikethrough,separator,undo,redo,separator,search,replace,separator,bullist,numlist,separator,print",
theme_advanced_buttons2: "tablecontrols",
theme_advanced_buttons3: "",
handle_event_callback : "handleEventsMCE",
cleanup: true,
cleanup_on_startup: true,
button_tile_map: true,
debug: false
});
}
function MCEinit_basic() {
tinyMCE.init({
mode: "exact",
elements: "",
theme: "advanced",
content_css: "/tpext/stylesheets/editorBasic_css.php",
plugins: "print,searchreplace,table",
nonbreaking_force_tab: true,
gecko_spellcheck: true,
theme_advanced_toolbar_location: "top",
theme_advanced_toolbar_align: "left",
theme_advanced_buttons1: "bold,italic,strikethrough,separator,undo,redo,separator,search,replace,separator,bullist,numlist,separator,print",
theme_advanced_buttons2: "",
theme_advanced_buttons3: "",
handle_event_callback : "handleEventsMCE",
cleanup: true,
cleanup_on_startup: true,
button_tile_map: true,
debug: false
});
}
function getAllAssignmentValues() {
var values = {};
var formData = neSerializeHash("#itemform");
for (var entry in formData){
if (entry.indexOf("Assignment") == 0) {
if (formData[entry] == "(required)") {
values[entry] = "";
} else {
values[entry] = formData[entry];
}
}
}
return values;
}
function getAllEditorContents() {
var contents = {};
var tmpArray = document.querySelectorAll(".rtEditor");
tmpArray.forEach(function(elem) {
if (!virginElements[elem.id]) {
contents[elem.id] = getEditorContents(elem.id);
}
});
return contents;
}
function createAssignmentElement(elem) {
var elementType = elem.value;
if (elementType != "-1") {
hideAllMCEeditors();
elem.selectedIndex=0;
assignmentElementsUsed[elementType]++;
var blockName = "elementBlock_" + elementType;
var block = document.getElementById(blockName);
$j(block).show();
var elementName = "element_" + elementType + assignmentElementsUsed[elementType];
var elementLabel = "";
var elementSpacer = "";
if (assignmentElementsUsed[elementType] > 1) {
elementSpacer = "
";
}
var elementButtons = elementSpacer + "delete elementstop editinglose changes";
var elementHTML = "
";
var elementAll = "" + elementButtons + elementLabel + elementHTML + "
";
block.insertAdjacentHTML('beforeend', elementAll);
originalEditorContents[elementName] = "";
virginElements[elementName] = true;
adjustEditors(false);
// scroll to editor and show
var editor = document.getElementById(elementName);
var editorPos = neCumulativeOffset(editor);
var editorTop = editorPos[1];
window.scrollTo(0, editorTop - 120);
tryToShowEditor(elementName,'basic');
}
}
function removeAssignmentElement(elementID, elementType) {
hideEditor(elementID);
assignmentElementsUsed[elementType]--;
if (assignmentElementsUsed[elementType] == 0) {
$j(document.getElementById(elementID).parentNode.parentNode).hide();
}
document.getElementById(elementID).parentNode.innerHTML = "";
locks[elementID] = false;
if (document.getElementById("IDstory").value > 0) {
URL = "assignment.php";
$j.ajax(URL, {
type: "get",
data: {action: "removeElement",
HistoryID: document.getElementById("HistoryID").value,
elementID: elementID},
dataType: "xml", complete: processProtoReqSuccess,
error: processProtoReqFailure });
}
}
function getVersionList() {
if (document.getElementById("HistoryID").value > 0) {
displayedPriorVersion = document.getElementById("versionPicker").value;
$j("#versionPicker").html("");
document.getElementById("versionPicker").disabled = true;
URL = "assignment.php";
$j.ajax(URL, {
type: "get",
data: {action: "sendVersionList",
HistoryID: document.getElementById("HistoryID").value},
dataType: "xml", complete: processProtoReqSuccess,
error: processProtoReqFailure });
}
}
function resetVersionList() {
var versions = document.getElementById("versionPicker").options;
for (i=0; i < versions.length; i++) {
if (versions[i].value == displayedPriorVersion) {
document.getElementById("versionPicker").selectedIndex = i;
break;
}
}
}
function showVersion(elem) {
var vassignmentID = elem.value;
if (vassignmentID > 0) {
URL = "assignment.php";
$j.ajax(URL, {
type: "get",
data: {action: "showPriorVersion",
vAssignmentID: vassignmentID},
dataType: "xml", complete: processProtoReqSuccess,
error: processProtoReqFailure });
}
}
function hideAllMCEeditors(trackState, hideDiv) {
var trackState = (trackState == null) ? true : trackState;
var hideDiv = (hideDiv == null) ? false : hideDiv;
var fieldname;
for (var n in tinyMCE.instances){
var instance=tinyMCE.instances[n];
if (tinyMCE.isInstance(instance)) {
fieldname = instance.formTargetElementId;
hideEditor(fieldname, trackState);
if (hideDiv) {
$j("#" + fieldname).hide();
}
}
}
}
function hideAllEditors(trackState) {
var trackState = (trackState == null) ? true : trackState;
var tmpArray = document.querySelectorAll(".rtEditor");
tmpArray.forEach(function(elem) {
hideEditor(elem.id, trackState);
});
}
function restoreAllEditors(restoreEditable) {
var restoreEditable = (restoreEditable == null) ? true : restoreEditable;
for (var entry in assignmentElementActive){
if (assignmentElementActive[entry] && restoreEditable) {
showEditor(entry, assignmentElementInitMode[entry]);
} else {
if (document.getElementById(entry)) {
$j("#" + entry).show();
}
}
}
focusActiveEditor();
}
function focusActiveEditor() {
if (activeEditor != "") {
window.focus();
tinyMCE.execCommand("mceFocus", false, activeEditor);
}
}
function initActionsAllEditors() {
for (var n in tinyMCE.instances){
var instance=tinyMCE.instances[n];
if (tinyMCE.isInstance(instance)) {
fieldname = instance.formTargetElementId;
initEditorActions(fieldname);
}
}
}
function initEditorActions(fieldname) {
$j("#" + fieldname + "_" + "action2").hide();
$j("#" + fieldname + "_" + "action1").show();
if (document.getElementById(fieldname + "_" + "action3")) {
if (getEditorContents(fieldname) == "") {
$j("#" + fieldname + "_" + "action3").show();
}
}
}
function editmodeEditorActions(fieldname) {
$j("#" + fieldname + "_" + "action1").hide();
if (document.getElementById(fieldname + "_" + "action3")) {
$j("#" + fieldname + "_" + "action3").hide();
}
$j("#" + fieldname + "_" + "action2").show();
}
function setEditorActions(fieldname) {
if (dataHaveChanged(false, fieldname)) {
editmodeEditorActions(fieldname);
} else {
initEditorActions(fieldname);
}
}
function tryToShowEditor(fieldname, mode) {
var mode = (mode == null) ? "basic" : mode;
assignmentElementInitMode[fieldname] = mode;
requestLock(fieldname);
}
function showEditor(fieldname, mode, trackState) {
var mode = (mode == null) ? "basic" : mode;
var trackState = (trackState == null) ? true : trackState;
// abort if editor already exists
var editor = tinyMCE.getInstanceById(fieldname);
if (editor) {
return;
}
if (document.getElementById(fieldname)) {
if (document.getElementById(fieldname).innerHTML == "(double-click to edit)") {
$j("#" + fieldname).html("");
}
eval("MCEinit_" + mode + "()");
tinyMCE.execCommand("mceAddControl",false,fieldname);
setEditorActions(fieldname);
if (trackState) {
assignmentElementActive[fieldname] = true;
}
}
}
function debug(prefix){
alert(prefix + ":\n" + Object.keys(originalEditorContents) + "\n" + Object.values(originalEditorContents));
}
function hideEditor(fieldname, trackState, unlock) {
var trackState = (trackState == null) ? true : trackState;
var unlock = (unlock == null) ? true : unlock;
var editor = tinyMCE.getInstanceById(fieldname);
if (editor) {
tinyMCE.execCommand("mceRemoveControl",false,fieldname);
$j("#" + fieldname + "_" + "action1").hide();
$j("#" + fieldname + "_" + "action2").hide();
if (document.getElementById(fieldname + "_" + "action3")) {
$j("#" + fieldname + "_" + "action3").hide();
}
if (trackState) {
assignmentElementActive[fieldname] = false;
}
if (unlock) {
removeLocks(fieldname);
}
}
if (document.getElementById(fieldname)) {
if (document.getElementById(fieldname).innerHTML == "") {
$j("#" + fieldname).html("(double-click to edit)");
}
}
}
function setEditorContents(fieldname, text) {
var editor = tinyMCE.getInstanceById(fieldname);
if (editor) {
editor.execCommand("mceSetContent",false,text);
}
}
function getEditorContents(fieldname) {
var editorText = "";
var editor = tinyMCE.getInstanceById(fieldname);
if (editor) {
//editor.execCommand("mceCleanup", false);
tempDiv.innerHTML = tinyMCE.getContent(editor.editorId);
editorText = tempDiv.innerHTML;
} else {
editorText = document.getElementById(fieldname).innerHTML;
}
if (editorText == "(double-click to edit)") {
editorText = "";
}
return editorText;
}
function adjustEditors(restore) {
var restore = (restore == null) ? true : restore;
hideAllMCEeditors(false, true);
var dataStart = neCumulativeOffset(document.getElementById("assignmentBody"));
var dataTop = dataStart[1];
var windowSize = getWindowSize();
var newWidthStoryDiv = (windowSize[0] - 17) + "px";
var newWidthStoryMCE = (windowSize[0] - 27) + "px";
var newWidthElementDiv = (windowSize[0] - 45) + "px";
var newWidthElementMCE = (windowSize[0] - 55) + "px";
var newStoryHeight = (windowSize[1] - (dataTop*2.6)) + "px";
var newElementHeight = "70px";
var editor = document.getElementById("StoryBody");
if (editor) {
editor.style.height = newStoryHeight;
editor.style.width = newWidthStoryDiv;
}
var editor = tinyMCE.getInstanceById("StoryBody");
if (editor) {
var editorFrame = document.getElementById(editor.editorId);
editorFrame.style.height = newHeight;
editorFrame.style.width = newWidthStoryMCE;
}
if (document.getElementById("storyElementBlock")) {
var tmpArray = document.getElementById("storyElementBlock").querySelectorAll('.elementEditor');
tmpArray.forEach(function(elem) {
elem.style.height = newElementHeight;
elem.style.width = newWidthElementDiv;
var editor = tinyMCE.getInstanceById(elem.id);
if (editor) {
var editorFrame = document.getElementById(editor.editorId);
editorFrame.style.height = newElementHeight;
editorFrame.style.width = newWidthElementMCE;
}
});
}
setTimeout("restoreAllEditors(" + restore.toString() + ");", 100);
}
function getWindowSize() {
var tmpArray = new Array();
tmpArray[0] = innerWidth || document.documentElement.offsetWidth;
tmpArray[1] = innerHeight || document.documentElement.offsetHeight;
return tmpArray;
}
function enableContextMenu() {
//document.getElementById("popupZone").oncontextmenu = popupMenu;
}
function disableContextMenu() {
//document.getElementById("popupZone").oncontextmenu = null;
//hideContextMenu();
}
function registerFieldEdit(fieldID) {
if (changedFields[fieldID]) {
changedFields[fieldID]++;
} else {
changedFields[fieldID] = 1;
}
}
function showReadOnlyBanner() {
//clearStateIndicator();
//$j("#stateBanner").css({fontSize: "large", fontWeight: "bold", color: "#000000"}).html("Read Only").show();
//$j("#stateColumn").css({backgroundColor: "#000000"});
}
function doubleClickForm() {
if (pageEditable) {
if (!formEnabled) {
if (reloadOnEdit) {
reloadForm();
} else {
switchMode(true);
}
}
}
}
function reloadForm() {
// forces reload of any altered data before entering edit mode
setCloseBlocker(false);
var url = window.location.href;
url = url.replace(/action=read/g, "action=edit");
if (url == window.location.href) {
window.location.reload(true);
} else {
window.location.assign(url);
}
}
function switchMode(editMode) {
if (editMode) {
tryToMakeEditable();
} else {
makeReadOnly();
}
}
function tryToMakeEditable() {
if (!formEnabled) {
requestLock();
}
}
function makeEditable() {
var form = document.getElementById("itemform");
if (document.getElementById("approvalButtons"))
$j("#approvalButtons").show();
if (document.getElementById("editLink"))
$j("#editLink").hide();
if (document.getElementById("mainLink"))
$j("#mainLink").hide();
if (document.getElementById("cancelLink"))
$j("#cancelLink").hide();
if (document.getElementById("saveLink"))
$j("#saveLink").show();
if (document.getElementById("justSaveLink"))
$j("#justSaveLink").show();
if (document.getElementById("cancelLink2"))
$j("#cancelLink2").hide();
if (document.getElementById("saveMoreLink"))
$j("#saveMoreLink").show();
if (document.getElementById("DocElem").value != "gamestat") {
$j(form).find(":input").prop("disabled", false);
}
formEnabled = true;
stateCheckPriorSerializedData = $j("#itemform").serialize();
if (document.getElementById("WasAutoSave")) {
if (document.getElementById("WasAutoSave").value == "yes") {
stateCheckPriorSerializedData = "";
}
}
autoSavePriorSerializedData = stateCheckPriorSerializedData;
neFocusFirstElement(form);
checkState();
initStateCheckTimer();
if (doAutoSave) {
initAutoSaveTimer();
}
if (doLockChecks) {
initLockCheckTimer();
}
}
function makeReadOnly(unlock) {
var unlock = (unlock == null) ? false : unlock;
var form = document.getElementById("itemform");
if (document.getElementById("approvalButtons"))
$j("#approvalButtons").hide();
if (document.getElementById("editLink"))
$j("#editLink").show();
if (document.getElementById("mainLink"))
$j("#mainLink").show();
if (document.getElementById("cancelLink"))
$j("#cancelLink").hide();
if (document.getElementById("saveLink"))
$j("#saveLink").hide();
if (document.getElementById("justSaveLink"))
$j("#justSaveLink").hide();
if (document.getElementById("cancelLink2"))
$j("#cancelLink2").hide();
if (document.getElementById("saveMoreLink"))
$j("#saveMoreLink").hide();
formEnabled = false;
$j(form).find(":input").prop("disabled", true);
setCloseBlocker(false);
if (unlock) {
removeLock();
removeAutoSave();
}
}
function tryToResetEditor(id) {
if (confirm("Are you sure you want to lose all of your unsaved changes to this item?")) {
resetEditor(id);
removeLocks(id);
handleChanges();
}
}
function resetEditor(id, unlock) {
var unlock = (unlock == null) ? true : unlock;
hideEditor(id, true, unlock);
$j("#" + id).html(originalEditorContents[id]);
hideEditor(id, true, unlock);
}
function resetForm(verify, everything) {
var verify = (verify == null) ? false : verify;
var everything = (everything == null) ? false : everything;
if (verify) {
if (autosaveRecovery) {
clearChangeTracking();
window.close();
} else {
dataHaveChanged(true);
if (docChanged) {
var msg = "Are you sure you want to do this?\n\n";
if (everything && assignmentChanged && storyChanged) {
msg += "You will lose ALL of the changes you've made on the assignment form and in the text editors.";
} else if (assignmentChanged) {
msg += "You will lose all of the changes you've made on the assignment form.";
} else if (everything && storyChanged) {
msg += "You will lose all of the changes you've made in the text editors.";
}
if (!confirm(msg)) {
return;
}
}
}
}
if (everything) {
for (var entry in originalEditorContents) {
resetEditor(entry, false);
}
removeLocks(getLockNames());
}
if (document.getElementById("ID").value == 0) {
document.getElementById("itemform").reset();
clearChangeTracking();
showRequired();
setUI();
} else {
URL = "assignment.php";
$j.ajax(URL, {
type: "get",
data: {action: "loadAssignment",
HistoryID: document.getElementById("HistoryID").value},
dataType: "xml", complete: processProtoReqSuccess,
error: processProtoReqFailure });
}
}
function clearChangeTracking(resetEditorTracking) {
var resetEditorTracking = (resetEditorTracking == null) ? true : resetEditorTracking;
docChanged = false;
assignmentChanged = false;
storyChanged = false;
setCloseBlocker(false);
changedFields = {};
if (resetEditorTracking) {
originalEditorContents = getAllEditorContents();
}
}
function clearStateIndicator() {
//clearTimeout(timerClearBanner);
//$j("#stateBanner").html("").hide();
//$j("#stateColumn").css({backgroundColor: "transparent", borderLeft: "2px solid transparent"});
}
function setUI(force) {
return;
var force = (force == null) ? false : force;
var tempUIstatus = activeTab.toString() + assignmentChanged.toString() + storyChanged.toString() + formEnabled.toString() + autosaveRecovery.toString();
if (tempUIstatus != UIstatus || force) {
UIstatus = tempUIstatus;
if (docChanged) {
setCloseBlocker(true);
} else {
clearStateIndicator();
clearChangeTracking(false);
}
if (docChanged || autosaveRecovery) {
setUIForEdit();
} else if (activeTab == "assignment" && !formEnabled) {
setUIForReadOnly();
} else {
setUIForStart();
}
$j("#buttonPanelSet1").show();
$j("#buttonPanelSet2").show();
}
}
function hideAllButtons() {
return;
$j("#buttonSubmit").hide();
$j("#rcSubmit").hide();
$j("#buttonResetForm").hide();
$j("#rcResetForm").hide();
$j("#buttonMakeReadOnly").hide();
$j("#rcMakeReadOnly").hide();
$j("#buttonMakeEditable").hide();
$j("#rcMakeEditable").hide();
}
function showSubmitButtons() {
$j("#buttonSubmit").show();
$j("#rcSubmit").show();
}
function showMakeEditableButtons() {
return;
$j("#buttonMakeEditable").show();
$j("#rcMakeEditable").show();
}
function showMakeReadOnlyButtons() {
$j("#buttonMakeReadOnly").show();
$j("#rcMakeReadOnly").show();
}
function enableButtons() {
//document.getElementById("buttonMakeEditable").disabled = false;
//document.getElementById("buttonMakeReadOnly").disabled = false;
//document.getElementById("popupZone").ondblclick = function(){tryToMakeEditable();};
}
function setUIForStart() {
if (!docChanged) {
$j("#buttonSubmitClose").html("Close");
$j("#rcSubmitClose").html("Close");
}
hideAllButtons();
if (activeTab == "assignment") {
showMakeReadOnlyButtons();
setTimeout("enableButtons();", 500);
} else {
if (docChanged) {
showSubmitButtons();
}
}
}
function setUIForEdit() {
$j("#buttonSubmitClose").html("Save and Close");
$j("#rcSubmitClose").html("Save and Close");
hideAllButtons();
showChangeBanner();
if (activeTab == "assignment") {
if (assignmentChanged || autosaveRecovery) {
showSubmitButtons();
$j("#buttonResetForm").show();
$j("#rcResetForm").show();
} else {
showMakeReadOnlyButtons();
setTimeout("enableButtons();", 100);
}
} else if (activeTab == "body" || activeTab == "elements") {
if (storyChanged || autosaveRecovery) {
showSubmitButtons();
}
}
}
function setUIForReadOnly() {
hideAllButtons();
if (activeTab == "assignment") {
showMakeEditableButtons();
setTimeout("enableButtons();", 500);
showReadOnlyBanner();
}
}
function dimButtonPanel(elem) {
// hides but doesn't disable buttons if behind instructions
clearTimeout(timerShowButtons);
if ($j(elem).is(':visible')) {
var scrollAmount = window.pageYOffset
|| document.documentElement.scrollTop
|| document.body.scrollTop
|| 0;
var panelPos = neCumulativeOffset(document.getElementById("buttonPanelSet2"));
var panelBottom = document.getElementById("buttonPanelSet2").offsetHeight + panelPos[1];
var instructPos = neCumulativeOffset(elem);
var instructTop = instructPos[1] - scrollAmount;
if (instructTop < panelBottom) {
//$j("#buttonPanelSet2").css({zIndex: "-100"});
} else {
restoreButtonPanel();
}
}
}
function restoreButtonPanel() {
// restores buttons if previously behind instructions
// (on timer to avoid flickering of buttons between fields)
clearTimeout(timerShowButtons);
timerShowButtons = setTimeout("displayButtonPanel();", 100);
}
function displayButtonPanel() {
if (document.getElementById("buttonPanelSet2"))
$j("#buttonPanelSet2").css({zIndex: "2500"});
}
function getInstructBlock(elem) {
try {
elemNode = elem.parentNode.parentNode;
while (elemNode.nodeName != "LI") {
elemNode = elemNode.parentNode;
}
var tmpArray = elemNode.querySelectorAll('.instruct');
return tmpArray[0];
} catch(e) {
if (document.getElementById("statEntryHelp")) {
return document.getElementById("statEntryHelp");
}
}
}
function getInstructText(elemID) {
try {
text = eval(elemID + "Instruct");
} catch(e) {
text = "";
}
return text;
}
function scrollToBlock(elem) {
// scroll to block if not visible
var fieldDivPos = neCumulativeOffset(elem.parentNode);
//var titleTop = neCumulativeOffset(document.getElementById("assignmentBody"));
//window.scrollTo(fieldDivPos[0], fieldDivPos[1] - (titleTop[1] + 10));
}
function showInstruct(elem, msgText, display) {
var msgText = (msgText == null) ? getInstructText(elem.id) : msgText;
var display = (display == null) ? 0: display;
var msgBlock = getInstructBlock(elem);
if (msgBlock) {
if (missingFields[elem.id]) {
// recheck whether field is still missing
if (missingRequired(elem.id, false)) {
scrollToBlock(elem);
dimButtonPanel(msgBlock);
return;
}
}
if (display == 1) {
msgBlock.classList.add("warning");
elem.parentNode.classList.add("error");
scrollToBlock(elem);
} else {
msgBlock.classList.remove("warning");
elem.parentNode.classList.remove("error");
}
if (msgText == "" || display == -1) {
$j(msgBlock).html("").hide();
restoreButtonPanel();
} else {
$j(msgBlock).html(msgText).show();
dimButtonPanel(msgBlock);
}
}
}
function showInstructMCE(elemID, msgText, display) {
var msgText = (msgText == null) ? getInstructText(elemID) : msgText;
var display = (display == null) ? 0: display;
var msgBlock = document.getElementById("topMsgBar");
if (display == 1) {
msgBlock.classList.add("warning");
} else {
msgBlock.classList.remove("warning");
}
if (msgText == "" || display == -1) {
$j("#topBar").hide();
$j(msgBlock).html("").hide();
} else {
$j("#topBar").show();
$j(msgBlock).html(msgText).show();
}
}
function handleEventsMCE(e) {
if (e.type == "keyup") {
var editor = tinyMCE.selectedInstance;
registerFieldEdit(editor.formTargetElementId);
editMCE(editor);
} else if (e.type == "focus") {
var editor = tinyMCE.selectedInstance;
activeEditor = editor.formTargetElementId;
}
return true;
}
function editMCE(inst, displayInstruct) {
var displayInstruct = (displayInstruct == null) ? true : displayInstruct;
var elemID = inst.formTargetElementId;
checkForChanges(elemID);
if (activeEditor != elemID) {
activeEditor = elemID;
setEditorActions(elemID);
if (displayInstruct) {
var contents = tinyMCE.getContent(inst.editorId);
if (contents.trim() == "" || true) {
showInstructMCE(elemID);
} else {
showInstructMCE(elemID, "", -1);
}
}
}
}
function edit(elem, displayInstruct, checkChanges) {
var displayInstruct = (displayInstruct == null) ? true : displayInstruct;
var checkChanges = (checkChanges == null) ? true : checkChanges;
activeEditor = "";
if (checkChanges) {
checkForChanges();
}
if (elem.value == "(required)") {
elem.value = "";
}
if (elem.id == "slug") {
if (checkSlug()) {
return;
}
} else if (elem.id == "pubdate") {
checkPubDate();
return;
} else if (elem.id == "length") {
if (checkLength()) {
return;
}
}
if (displayInstruct) {
if (elem.value.trim() == "") {
showInstruct(elem);
} else {
showInstruct(elem, "", -1);
}
}
}
function stripMe(elem, illegalChars) {
var illegalChars = (illegalChars == null) ? false: illegalChars;
elem.value = elem.value.trim();
if (illegalChars) {
elem.value = elem.value.replace( /[^-a-zA-Z0-9_.]/g, "");
}
}
function checkSlug() {
stripMe(document.getElementById("slug"), true);
var slug = document.getElementById("slug").value;
if (slug.length > 0) {
URL = "assignment.php";
$j.ajax(URL, {
type: "get",
data: {action: "checkSlug",
slug: slug,
TypeID: document.getElementById("TypeID").value,
ID: document.getElementById("ID").value},
dataType: "xml", complete: processProtoReqSuccess,
error: processProtoReqFailure });
return true;
}
return false;
}
function checkPubDate() {
var pubdate = document.getElementById("pubdate").value;
var testDate = new Date(pubdate);
if (testDate) {
if (testDate.getFullYear() >= 2000) {
if (document.getElementById("ID").value == 0) {
URL = "assignment.php";
$j.ajax(URL, {
type: "get",
data: {action: "checkPubDate",
pubdate: pubdate},
dataType: "xml", complete: processProtoReqSuccess,
error: processProtoReqFailure });
} else {
needToFix["pubdate"] = false;
}
showInstruct(document.getElementById("pubdate"), "", -1);
return;
}
}
needToFix["pubdate"] = true;
showInstruct(document.getElementById("pubdate"));
return false;
}
function checkLength() {
var lengthval = document.getElementById("length").value;
if (lengthval.length > 0) {
URL = "assignment.php";
$j.ajax(URL, {
type: "get",
data: {action: "checkLength",
length: lengthval,
TypeID: document.getElementById("TypeID").value,
ID: document.getElementById("ID").value},
dataType: "xml", complete: processProtoReqSuccess,
error: processProtoReqFailure });
return true;
}
return false;
}
function missingRequired(id, showMsg) {
var showMsg = (showMsg == null) ? true : showMsg;
if (document.getElementById(id).value.trim() == "" || document.getElementById(id).value.trim() == "(required)") {
if (showMsg) {
document.getElementById(id).focus();
showInstruct(document.getElementById(id), "You are required to enter " + requiredFields[id] + ".", 1);
missingFields[id] = true;
missingRequiredDenseUserTally[id]++;
if (missingRequiredDenseUserTally[id] > 1) {
alert("You can't save this item until you enter " + requiredFields[id] + ".");
}
}
return true;
} else {
missingFields[id] = false;
return false;
}
}
function basicClose() {
cancelAllTimers();
if (formEnabled) {
if (document.getElementById("DocID")) {
// Unlock straight from this window: sendBeacon is same-origin to this
// popup (like the getLock request) and survives the window closing, so
// we no longer relay through opener.top.header -- that cross-frame hop
// threw a SecurityError when the popup and frameset were on different
// origins, leaving the lock behind for every item type.
beaconPost("ajax/lock.php", {action: "unlock", DocID: document.getElementById("DocID").value, DocElem: document.getElementById("DocElem").value});
}
}
}
function requestLock(options) {
var options = (options == null) ? "" : options;
var msg = "";
if (document.getElementById("DocID")) {
$j.ajax("ajax/lock.php", {
type: "get",
data: {action: "getLock",
options: options,
DocID: document.getElementById("DocID").value,
DocElem: document.getElementById("DocElem").value},
dataType: "html", success: function(data, textStatus, transport){
var response = transport.responseText || "";
if (response != "") {
if (response == "granted") {
makeEditable();
} else {
if (response.indexOf("?") == 0) {
response = response.substring(1);
}
alert(response);
}
}
},
error: function(){ alert('Error requesting edit lock.'); }
});
} else {
makeEditable();
}
}
function removeLock() {
if (document.getElementById("DocID")) {
noresponseAjax("ajax/lock.php",
{action: "unlock",
DocID: document.getElementById("DocID").value,
DocElem: document.getElementById("DocElem").value});
}
}
function removeAutoSave() {
if (doAutoSave) {
noresponseAjax("ajax/clearDraft.php",
{GameID: document.getElementById("GameID").value,
TeamID: document.getElementById("TeamID").value});
}
}
function removeLocks() {
}
function getLockNames() {
var lockList = new Array();
for (var entry in locks) {
if (locks[entry]) {
lockList[lockList.length] = entry;
}
}
return lockList.join(",");
}
function banner(text, displaySeconds, size, weight, color) {
var displaySeconds = (displaySeconds == null) ? 0 : displaySeconds;
var size = (size == null) ? "large" : size;
var weight = (weight == null) ? "normal" : weight;
var color = (color == null) ? "" : color;
currentBannerStyle = {fontSize: $j("#stateBanner").css("fontSize"), fontWeight: $j("#stateBanner").css("fontWeight"), color: $j("#stateBanner").css("color")};
currentBannerText = document.getElementById("stateBanner").innerHTML;
clearTimeout(timerClearBanner);
clearTimeout(timerSetBanner);
$j("#stateBanner").css({fontSize: size, fontWeight: weight, color: color}).html(text).show();
if (displaySeconds > 0) {
clearTimeout(timerRestoreBanner);
timerRestoreBanner = setTimeout("restoreBanner();", displaySeconds*1000);
}
}
function setBanner(text, displaySeconds, size, weight, color) {
// displays banner after brief pause to allow other stuff to wrap up
var size = (size == null) ? "large" : size;
var weight = (weight == null) ? "normal" : weight;
var color = (color == null) ? "" : color;
clearTimeout(timerClearBanner);
clearTimeout(timerSetBanner);
timerSetTimer = setTimeout("banner(\"" + text + "\"," + displaySeconds + ",'" + size + "','" + weight + "','" + color + "');", 200);
}
function restoreBanner() {
clearTimeout(timerRestoreBanner);
$j("#stateBanner").css(currentBannerStyle).html(currentBannerText).show();
}
function showChangeBanner() {
if (docChanged) {
clearStateIndicator();
$j("#stateBanner").css({fontSize: "large", fontWeight: "lighter", color: "#000000"}).html("unsaved changes").show();
$j("#stateColumn").css({borderLeft: "2px dotted #000000"});
}
}
function checkForChanges(elementID) {
var elementID = (elementID == null) ? "" : elementID;
clearTimeout(timerDetectChanges);
if (storyChanged && (activeTab == "body" || activeTab == "elements")) {
delay = 1000;
} else {
delay = 200;
}
timerDetectChanges = setTimeout("handleChanges('" + elementID + "');", delay);
}
function handleChanges(elementID) {
var elementID = (elementID == null) ? "" : elementID;
clearTimeout(timerDetectChanges);
dataHaveChanged(true, elementID);
setUI();
}
function dataHaveChanged(fullcheck, elementID) {
var fullcheck = (fullcheck == null) ? false : fullcheck;
var elementID = (elementID == null) ? "" : elementID;
if (elementID != "") {
var elementChanged = false;
var elementText = getEditorContents(elementID).toString();
if (originalEditorContents[elementID]) {
if (originalEditorContents[elementID].toString() != elementText) {
elementChanged = true;
}
} else {
if (elementText != "") {
elementChanged = true;
}
}
if (fullcheck) {
if (elementChanged) {
storyChanged = true;
editmodeEditorActions(elementID);
} else {
initEditorActions(elementID);
if (storyChanged) {
handleChanges();
}
}
} else {
return elementChanged;
}
} else {
var tempAssignmentChanged = false;
var tempStoryChanged = false;
var assignmentValues = getAllAssignmentValues();
for (var entry in assignmentValues) {
if (originalAssignmentValues[entry]) {
if (originalAssignmentValues[entry].toString() != assignmentValues[entry].toString()) {
if (fullcheck) {
tempAssignmentChanged = true;
break;
} else {
return true;
}
}
} else {
if (assignmentValues[entry].toString() != "") {
if (fullcheck) {
tempAssignmentChanged = true;
break;
} else {
return true;
}
}
}
}
var editorContents = getAllEditorContents();
for (var entry in editorContents) {
if (originalEditorContents[entry]) {
if (originalEditorContents[entry] != editorContents[entry]) {
if (fullcheck) {
tempStoryChanged = true;
break;
} else {
return true;
}
}
} else {
if (editorContents[entry] != "") {
if (fullcheck) {
tempStoryChanged = true;
break;
} else {
return true;
}
}
}
}
assignmentChanged = tempAssignmentChanged;
storyChanged = tempStoryChanged;
}
docChanged = (assignmentChanged || storyChanged);
return false;
}
function submitItem() {
for (var entry in requiredFields) {
if (missingRequired(entry)) {
return;
}
}
for (var entry in needToFix) {
if (needToFix[entry]) {
var tmpText = "";
if (requiredFields[entry]) {
tmpText = requiredFields[entry];
} else {
tmpText = "the " + entry;
}
resetChecker(false);
alert("You can't save this item until you fix the problem with " + tmpText + ".");
resetChecker(true);
document.getElementById(entry).focus();
return;
}
}
setCloseBlocker(false);
document.itemform.submit();
}
function submitForm(close) {
var close = (close == null) ? false : close;
if (disableSave) {
alert("You cannot save this version because the assignment has changed since you were editing it.\n\nYou can only examine the data and copy it elsewhere.");
return;
}
var hasAssignmentData = false;
var hasStoryData = false;
resetChecker(true);
topwin.logoutRequested = false;
if (docChanged || autosaveRecovery) {
for (var entry in requiredFields) {
if (missingRequired(entry)) {
return;
}
}
for (var entry in needToFix) {
if (needToFix[entry]) {
showTab(document.getElementById("showAssignmentInfo"));
var tmpText = "";
if (requiredFields[entry]) {
tmpText = requiredFields[entry];
} else {
tmpText = "the " + entry;
}
resetChecker(false);
alert("You can't save this assignment until you fix the problem with " + tmpText + ".");
resetChecker(true);
document.getElementById(entry).focus();
return;
}
}
resetChecker(false);
var formData = {};
if (autosaveRecovery) {
originalAssignmentValues = {};
originalEditorContents = {};
}
// find assignment fields that have changed
var assignmentValues = getAllAssignmentValues();
for (var entry in assignmentValues) {
if (originalAssignmentValues[entry]) {
if (originalAssignmentValues[entry].toString() != assignmentValues[entry].toString()) {
formData[entry] = assignmentValues[entry];
hasAssignmentData = true;
}
} else {
if (assignmentValues[entry].toString() != "") {
formData[entry] = assignmentValues[entry];
hasAssignmentData = true;
}
}
}
// find text-editor fields that have changed
var editorContents = getAllEditorContents();
for (var entry in editorContents) {
if (originalEditorContents[entry]) {
if (originalEditorContents[entry] != editorContents[entry] || editorContents[entry] == "") {
formData[entry] = editorContents[entry];
hasStoryData = true;
}
} else {
formData[entry] = editorContents[entry];
hasStoryData = true;
}
}
if (hasStoryData && hasAssignmentData) {
formData["scope"] = "all";
} else if (hasStoryData) {
formData["scope"] = "story";
} else if (hasAssignmentData) {
formData["scope"] = "assignment";
} else {
abortSubmit();
focusActiveEditor();
return;
}
var tmpArray = new Array();
for (var entry in changedFields) {
tmpArray[tmpArray.length] = entry + ":" + changedFields[entry];
}
changedFieldText = tmpArray.join(",");
if (changedFieldText != "") {
formData["AssignmentModifications"] = formData["scope"] + ":-1," + changedFieldText;
}
formData["action"] = "save";
formData["ID"] = document.getElementById("ID").value;
formData["HistoryID"] = document.getElementById("HistoryID").value;
formData["IDstory"] = document.getElementById("IDstory").value;
formData["MicroTimeStamp"] = document.getElementById("MicroTimeStamp").value;
formData["TypeID"] = document.getElementById("TypeID").value;
formData["windowClose"] = close.toString();
$j("#buttonPanel").hide();
document.getElementById("popupZone").ondblclick = null;
formEnabled = false;
$j("#itemform").find(":input").prop("disabled", true);
clearTimeout(timerClearBanner);
$j("#stateBanner").css({fontSize: "large", fontWeight: "bold", color: ""}).html("saving...").show();
URL = "assignment.php";
$j.ajax(URL, {
type: "post",
data: formData,
dataType: "xml", complete: processProtoReqSuccess,
error: processProtoReqFailure });
resetChecker(true);
} else {
if (close) {
closeMe();
} else {
abortSubmit();
}
}
}
function abortSubmit() {
resetChecker(true);
clearTimeout(timerClearBanner);
$j("#stateBanner").css({fontSize: "large", fontWeight: "bold", color: "#000000"}).html("(no changes)").show();
timerClearBanner = setTimeout("clearStateIndicator();", 3000);
}
function closeMe(msg) {
var msg = (msg == null || msg == "") ? "You must either save or undo your changes before you can close this assignment." : msg;
dataHaveChanged(true);
if (docChanged) {
alert(msg);
return false;
} else {
setCloseBlocker(false);
}
clearTimeout(timerCheck);
if (docsolo == "yes") {
window.close();
} else {
$j("#enchilada").hide();
document.getElementById("HistoryID").value = 0;
document.getElementById("ID").value = 0;
document.getElementById("IDstory").value = 0;
return true;
}
}
function resetChecker(restart) {
var restart = (restart == null) ? true : restart;
clearTimeout(timerCheck);
if (restart) {
timerCheck = setTimeout('checker();', topwin.refreshInterval*1000);
}
}
function checker(){
resetChecker(false);
if (docChanged) {
var formData = {};
if (formEnabled) {
var assignmentValues = getAllAssignmentValues();
} else {
var assignmentValues = originalAssignmentValues;
}
for (var entry in assignmentValues) {
formData[entry] = assignmentValues[entry];
}
var editorContents = getAllEditorContents();
for (var entry in editorContents) {
formData[entry] = editorContents[entry];
}
formData["action"] = "autosave";
formData["MicroTimeStamp"] = document.getElementById("MicroTimeStamp").value;
formData["ID"] = document.getElementById("ID").value;
formData["HistoryID"] = document.getElementById("HistoryID").value;
formData["IDstory"] = document.getElementById("IDstory").value;
formData["TypeID"] = document.getElementById("TypeID").value;
var tmpLocks = new Array();
for (var entry in locks) {
if (locks[entry]) {
tmpLocks[tmpLocks.length] = entry;
}
}
formData["ActiveLocks"] = tmpLocks.join(",");
var sendAutoUpdate = false;
for (var entry in formData) {
if (lastAutoSaveContents[entry]) {
if (lastAutoSaveContents[entry].toString() != formData[entry].toString()) {
sendAutoUpdate = true;
break;
}
} else {
if (formData[entry].toString() != "") {
sendAutoUpdate = true;
break;
}
}
}
if (sendAutoUpdate) {
lastAutoSaveContents = formData;
URL = "assignment.php";
$j.ajax(URL, {
type: "post",
data: formData,
dataType: "xml", complete: processProtoReqSuccess,
error: processProtoReqFailure });
hasAutoSave = true;
}
}
if (document.getElementById("HistoryID").value > 0) {
var tmpArrayLocks = new Array();
for (var entry in requestedLocks) {
if (requestedLocks[entry]) {
tmpArrayLocks[tmpArrayLocks.length] = entry;
}
}
URL = "assignment.php";
$j.ajax(URL, {
type: "get",
data: {action: "checkForUpdates",
ID: document.getElementById("ID").value,
HistoryID: document.getElementById("HistoryID").value,
IDstory: document.getElementById("IDstory").value,
locksToCheck: tmpArrayLocks.join(",")},
dataType: "xml", complete: processProtoReqSuccess,
error: processProtoReqFailure });
}
resetChecker(true);
}
function processReqFailure(statusText, status) {
alert("Unable to retrieve data from server: " + statusText + " (" + status + ")");
}
function processProtoReqFailure(statusText, status) {
alert("Unable to retrieve data from server: " + statusText + " (" + status + ")");
}
function processProtoReqSuccess(protoreq) {
processReq(protoreq.responseXML);
}
function processReq(responseXML) {
resetChecker(false);
var items = responseXML.getElementsByTagName("item");
var itemid = 0;
var itemdata = "";
var itemflag = 0;
for (var i = 0; i < items.length; i++) {
itemid = getElementTextNS("", "itemid", items[i], 0);
itemdata = getElementTextNS("", "itemdata", items[i], 0);
itemflag = getElementTextNS("", "itemflag", items[i], 0);
}
resetChecker(true);
}
function updateAllStats() {
var sumSection = summaryRules["Section"];
var itemNodes = document.getElementsByClassName("EntrySection"+sumSection+" playerEntryText");
var found=false;
awayTeamScore=0;
homeTeamScore=0;
for(j=0; j < itemNodes.length; j++) {
if(itemNodes[j].value != "") {
//alert(itemNodes[j].value);
//alert('Please click the "Just Save" button to create the player record for '+itemNodes[j].value+'.\n\nThen click the "Update row" button again to update the stats.');
validateAndSubmit(false,true);
//break;
return;
}
}
var itemNodes = document.getElementsByClassName('EntrySection'+sumSection+' updateButton');
clearStats();
for(var i = 1; i < sectionRowCount[sumSection]; i++) {
if(window.updatePlayLength)
updatePlayLength(i);
updateRowPlayerStats(i,false);
updateComputedStats('Player');
updateRowTeamStats(i,false);
updateComputedStats('Team');
}
validateAndSubmit(false);
// Put the focus back up in the summary section on the next entry
nextField = 'Sec'+sumSection+'_Team_'+ sectionRowCount[sumSection];
setTimeout("document.getElementById(nextField).focus();",2000);
}
function updateRowStats(node) {
updateRowPlayerStats(node,true);
updateRowTeamStats(node,true);
// Put the focus back up in the summary section on the next entry
var sumSection = summaryRules["Section"];
nextField = 'Sec'+sumSection+'_Team_'+ sectionRowCount[sumSection];
setTimeout("document.getElementById(nextField).focus();",500);
}
function updateRowPlayerStats(row,compute) {
//var row = node.id.substr(Math.abs(node.id.lastIndexOf("_"))+1);
var sumSection = summaryRules["Section"];
var sumTeamField = 'Sec'+sumSection+'_Team_' + row;
var sumTeamID = document.getElementById(sumTeamField).value;
var sumPlayType = document.getElementById('Sec'+sumSection+'_SummaryPlayType_'+row).value;
if(document.getElementById('Sec'+sumSection+'_SummaryPAT_'+row))
var sumPAT = document.getElementById('Sec'+sumSection+'_SummaryPAT_'+row).value;
var rowCount;
for(ruleType in summaryRules) {
if(ruleType == 'Section')
continue;
var sumFieldName = 'Sec'+sumSection+'_'+ruleType+'_'+row;
var sumFieldVal = document.getElementById(sumFieldName).value;
var playTypes = summaryRules[ruleType];
for(var playType in playTypes) {
if(sumFieldVal == playType) {
var statTypes = playTypes[playType];
for (statType in statTypes) {
var sumFields = statTypes[statType];
for (var sumField in sumFields) {
sourceField = sumFields[sumField];
sec = sourceField.Section;
if(statType == 'Player') {
rowCount = sectionRowCount[sec];
var playerField = 'Sec'+sumSection+'_'+sumField+'_' + row;
var playerID = document.getElementById(playerField).value;
if(playerID) {
var itemNodes = document.getElementsByClassName("EntrySection"+sec+" playerSelect");
var found=false;
for(j=0; j < itemNodes.length; j++) {
if(itemNodes[j].value == playerID) {
for(var targetField in sourceField.Fields) {
if (sourceField.Fields.hasOwnProperty(targetField)) {
//myTargetField = indField.Fields[targetField];
targetFields = sourceField.Fields[targetField];
if(isNaN(targetFields.Increment)) {
myField = 'Sec'+sumSection+'_'+targetFields.Increment+'_'+row;
if(document.getElementById(myField).type == 'checkbox' && !document.getElementById(myField).checked)
increment = 0;
else
increment = document.getElementById(myField).value;
} else
increment = targetFields.Increment;
if(increment == '')
increment=0;
myField = "Sec"+sec+"_"+targetFields.TargetField+"_"+j;
myObj = document.getElementById(myField);
if(myObj) {
if(myObj.value == '')
myObj.value=0;
myObj.value = parseInt(myObj.value) + parseInt(increment);
// if there is an onchange event and compute flag is true, recalculate the computed fields
if (myObj.onchange && compute)
myObj.onchange();
//reCalcFields(myObj,'Team',targetFields.TargetField,'Team--Total'+targetFields.TargetField,'0');
found = true;
}
}
}
}
}
if(!found) {
playerNum = 'Sec'+sec+'_Team_' + rowCount;
objTeam = document.getElementById(playerNum);
//Loop thru the options
for(k=0; k < objTeam.options.length; k++) {
if(sumTeamID == objTeam.options[k].value) {
objTeam.options[k].selected = true;
break;
}
}
playerNum = 'Sec'+sec+'_Player_' + rowCount;
objPlayer = document.getElementById(playerNum);
updatePlayerRow(objTeam,sec,'player',false);
for(k=0; k < objPlayer.options.length; k++) {
if(playerID == objPlayer.options[k].value) {
objPlayer.options[k].selected = true;
break;
}
}
for (var targetField in sourceField.Fields) {
if (sourceField.Fields.hasOwnProperty(targetField)) {
//myTargetField = indField.Fields[targetField];
targetFields = sourceField.Fields[targetField];
if(isNaN(targetFields.Increment)) {
myField = 'Sec'+sumSection+'_'+targetFields.Increment+'_'+row;
if(document.getElementById(myField).type == 'checkbox' && !document.getElementById(myField).checked)
increment = 0;
else
increment = document.getElementById(myField).value;
} else
increment = targetFields.Increment;
if(increment == '')
increment=0;
var myField = 'Sec'+sec+'_'+targetFields.TargetField+'_'+rowCount;
myObj = document.getElementById(myField);
if(myObj) {
if(myObj.value == '')
myObj.value=0;
myObj.value = parseInt(increment);
// if there is an onchange event and compute flag is true, recalculate the computed fields
if (myObj.onchange && compute)
myObj.onchange();
}
}
}
}
} // end if(playerID)
} // end if(type == 'Player')
} // end for(sumField in sumFields)
} //end for(statType in statTypes)
} // end if(playType)
} // end for(playType in playTypes)
} //end for(ruleType in summaryRules)
}
function updateRowTeamStats(row,compute) {
var sumSection = summaryRules["Section"];
var sumTeamField = 'Sec'+sumSection+'_Team_' + row;
var sumTeamID = document.getElementById(sumTeamField).value;
var sumPlayType = document.getElementById('Sec'+sumSection+'_SummaryPlayType_'+row).value;
if(document.getElementById('Sec'+sumSection+'_SummaryQuarter_'+row)) {
var sumQtr = document.getElementById('Sec'+sumSection+'_SummaryQuarter_'+row).value;
sumQtr = jQuery.trim(sumQtr);
sumQtr = sumQtr.toUpperCase();
}
if(document.getElementById('Sec'+sumSection+'_SummaryResultInScore_'+row))
var sumScore = document.getElementById('Sec'+sumSection+'_SummaryResultInScore_'+row);
if(document.getElementById('Sec'+sumSection+'_SummaryPAT_'+row))
var sumPAT = document.getElementById('Sec'+sumSection+'_SummaryPAT_'+row).value;
if(sumScore && sumScore.checked)
var scored = true;
var rowCount;
for(ruleType in summaryRules) {
if(ruleType == 'Section')
continue;
var playTypes = summaryRules[ruleType];
var sumFieldName = 'Sec'+sumSection+'_'+ruleType+'_'+row;
var sumFieldVal = document.getElementById(sumFieldName).value;
for(var playType in playTypes) {
if(sumFieldVal == playType) {
var statTypes = playTypes[playType];
for (statType in statTypes) {
var sumFields = statTypes[statType];
for (var sumField in sumFields) {
sourceField = sumFields[sumField];
sec = sourceField.Section;
if(statType == 'Team' || statType == 'Opponent' || statType == 'Summary') {
rowCount = sectionRowCount[sec];
for(var targetField in sourceField.Fields) {
if (sourceField.Fields.hasOwnProperty(targetField)) {
targetFields = sourceField.Fields[targetField];
//// start here
increment = targetFields.Increment;
if(isNaN(targetFields.Increment)) {
myField = 'Sec'+sumSection+'_'+targetFields.Increment+'_'+row;
if(document.getElementById(myField) != null) { // it's a form element
if(document.getElementById(myField).type == 'checkbox' && !document.getElementById(myField).checked)
increment = 0;
else
increment = document.getElementById(myField).value;
}
else {
//if(sumTeamID == awayTeamID)
// teamScore = awayTeamScore;
//else
// teamScore = homeTeamScore;
if(typeof(eval(targetFields.Increment)) !== "undefined") { // it's a variable
increment = eval(targetFields.Increment);
//alert('increment='+increment);
}
}
} else
increment = targetFields.Increment;
if(increment == '')
increment=0;
if(targetFields.TargetField == 'Points' && scored) {
if(sumQtr == '1')
targetFld = 'FirstQuarterPoints';
else if(sumQtr == '2')
targetFld = 'SecondQuarterPoints';
else if(sumQtr == '3')
targetFld = 'ThirdQuarterPoints';
else if(sumQtr == '4')
targetFld = 'FourthQuarterPoints';
else if(sumQtr == 'OT1')
targetFld = 'OvertimePoints';
else if(sumQtr == 'OT2')
targetFld = 'Overtime2Points';
else if(sumQtr == 'OT3')
targetFld = 'Overtime3Points';
else if(sumQtr == 'OT4')
targetFld = 'Overtime4Points';
else
targetFld = 'Points';
if(statType == 'Team') {
if(sumTeamID == awayTeamID) {
target = 'Team-Away-'+targetFld;
awayTeamScore = awayTeamScore + increment;
//alert(awayTeamScore);
}
else {
target = 'Team-Home-'+targetFld;
homeTeamScore = homeTeamScore + increment;
}
} else { // Add to Opponent's stats
if(sumTeamID == homeTeamID)
target = 'Team-Away-'+targetFld;
else
target = 'Team-Home-'+targetFld;
}
} else {
if(statType == 'Summary') {
// Add to summary stats
//if(sumTeamID == awayTeamID) {
target = 'Sec'+sumSection+'_'+targetFields.TargetField + '_' + row;
//alert(myField);
//}
//else {
//myField = 'Sec'+sumSection+'_'+targetFields.TargetField + row;
//}
} else {
if(statType == 'Team') {
if(sumTeamID == awayTeamID)
target = 'Team-Away-'+targetFields.TargetField;
else
target = 'Team-Home-'+targetFields.TargetField;
} else if(statType == 'Opponent') {
// Add to Opponent's stats
if(sumTeamID == homeTeamID)
target = 'Team-Away-'+targetFields.TargetField;
else
target = 'Team-Home-'+targetFields.TargetField;
}
}
}
if(!targetFields.SourceField) {
source = target;
} else {
source = 'Sec'+sumSection+'_'+targetFields.SourceField +'_'+row;
}
var origVal;
if(document.getElementById(source) != null) { // it's a form element
origVal = document.getElementById(source).value;
}
else {
if(typeof(eval(targetFields.SourceField)) !== "undefined") { // it's a variable
origVal = eval(targetFields.SourceField);
}
}
//alert('source='+source+' origVal='+origVal);
myObj = document.getElementById(target);
if(myObj) {
if(origVal == '' || isNaN(origVal))
origVal=0;
myObj.value = parseInt(origVal) + parseInt(increment);
// if there is an onchange event and compute flag is true, recalculate the computed fields
if (myObj.onchange && compute)
myObj.onchange();
}
} // end if sourcefield.Fields.hasOwnProperty
} // end for targetfield in sourcefield.field
} // end if(type == 'Team')
} // end for(sumField in sumFields)
} //end for(statType in statTypes)
} // end if(playType)
} // end for(playType in playTypes)
} // end for(ruletype in summaryRules)
}
function clearStats() {
//var tables = ["Section4","Section6","Section9"];
var tables = updatedSections;
for(t in tables) {
table = tables[t];
var tableNode = document.getElementById(table);
if(tableNode) {
var itemNodes = tableNode.getElementsByTagName("input");
for(var node in itemNodes) {
item = itemNodes[node];
if(item.type == 'text'){
item.value = '';
}
}
var itemNodes = tableNode.getElementsByTagName("div");
for(var node in itemNodes) {
item = itemNodes[node];
item.innerHtml='';
}
}
}
}
function updateComputedStats(sectionType) {
setTimeout(function () {
$j.ajax("ajax/getComputedStats.php", {type: "POST", data: { sectionType: sectionType,
sportID: document.getElementById('SportID').value, gameID: document.getElementById('GameID').value},
dataType: "html", success: function(data, textStatus, transport){
var response = transport.responseText || "";
if (response != "") {
if (response.substring(0,2) == "[{") {
var items = JSON.parse(response);
for(var item in items) {
var fieldsToChange = items[item];
//alert(row.TeamID);
//var fieldsToChange = row[team];
if(sectionType == 'Team') {
if (fieldsToChange["TeamID"] == awayTeamID) {
teamID = "Away";
} else if (fieldsToChange["TeamID"] == homeTeamID) {
teamID = "Home";
}
}
for (var field in fieldsToChange) {
compFieldName = 'Team-'+teamID+'-'+field;
//if(field == 'TotalYards')
// alert(compFieldName+'='+fieldsToChange[field]);
if (document.getElementById(compFieldName)) {
document.getElementById(compFieldName).innerHTML = fieldsToChange[field];
}
}
} // end items
}
} else {
}
},
error: function(){ }
});
},2000);
}
// This is a Dallas specific function to be included in their own .js file
function updatePlayLength(row) {
var sumSection = summaryRules["Section"];
var sumPlayType = document.getElementById('Sec'+sumSection+'_SummaryPlayType_'+row);
var sumPlayLength = document.getElementById('Sec'+sumSection+'_SummaryPlayLength_'+row);
var sumBallSpot = document.getElementById('Sec'+sumSection+'_SummaryBallSpot_'+row);
var sumYardLine = document.getElementById('Sec'+sumSection+'_SummaryYardLine_'+row);
var sumTeamField = 'Sec'+sumSection+'_Team_' + row;
var sumTeamID = document.getElementById(sumTeamField).value;
if(sumPlayLength && (sumPlayLength.value == '' || sumPlayLength.value == '0')) {
if(sumBallSpot && sumBallSpot.value != '') {
var strBallSpot = jQuery.trim(sumBallSpot.value);
var bsTeamCode = strBallSpot.toUpperCase().replace(/[\d\.]/g,'');
var ballSpot = strBallSpot.replace(/[^\d\.]/g,'');
if(sumYardLine && sumYardLine.value != '') {
var strYardLine = jQuery.trim(sumYardLine.value);
var ylTeamCode = strYardLine.toUpperCase().replace(/[\d\.]/g,'');
var yardLine = strYardLine.replace(/[^\d\.]/g,'');
playType = jQuery.trim(sumPlayType.value);
if(playType == 'field goal') {
// This is hardcoded for Dallas - FG length is always line of scrimmage + 17
sumPlayLength.value = parseInt(yardLine) + 17;
}
else {
if(sumTeamID == homeTeamID)
teamCode = homeTeamCode;
else
teamCode = awayTeamCode;
if(bsTeamCode == ylTeamCode)
sumPlayLength.value = ballSpot - yardLine;
else
sumPlayLength.value = (50-ballSpot) + (50-yardLine);
if(playType.substr(0,7) == 'penalty')
sumPlayLength.value = Math.abs(sumPlayLength.value);
else if(ylTeamCode == "" && bsTeamCode == teamCode)
sumPlayLength.value = (sumPlayLength.value)*(-1);
else if(bsTeamCode == "" && ylTeamCode != teamCode)
sumPlayLength.value = (sumPlayLength.value)*(-1);
else if(bsTeamCode == ylTeamCode && bsTeamCode != teamCode)
sumPlayLength.value = (sumPlayLength.value)*(-1);
else if(bsTeamCode != ylTeamCode && bsTeamCode == teamCode)
sumPlayLength.value = (sumPlayLength.value)*(-1);
}
}
}
}
}