﻿/*************************************************/
// Document Status Management
/*************************************************/

var DS_EMPTY    = "EMPTY";                       // screen has just been loaded
var DS_INIT     = "INIT";                        // screen has been cleared
var DS_NEW      = "NEW";                         // new button has been clicked and screen is initialized for new data entry
var DS_NORMAL   = "NORMAL";                      // existing data has been retrieved/searched and displayed on screen 
                                                 //   (by default this mode will be bypassed for CRUD programs unless
                                                 //    otherwise set in configuration)
var DS_EDIT     = "EDIT";                        // edit button has been clicked and screen is in edit mode
var DS_BUSY     = "PROCESSING";                  // intermediate state set during server and client communication
                                                 
var gCurState  = '';
var gPrevState = '';                             // currently unused
var gNextState = '';
var gDocModified = false;
var gUseEditMode = false;                        // for future use, if this value is set to true, users must click "Edit" button
                                                 // to start modifying the data on the screen
var gUseStateNew = false;                        // use "NEW" as a valid state. false: ignores DS_NEW as a state
                                                

function SetPostState(fname) {
    switch (fname.toUpperCase()) {
        case 'CLEAR':
            gCurState = DS_INIT;
            gNextState = '';
            break;
        case 'NEW':
            gPrevState = gCurState;
            gCurState = DS_BUSY;
            gNextState = DS_NEW;
            break;
        case 'RETRIEVE':
            gPrevState = gCurState;
            gCurState = DS_BUSY;
            if (gUseEditMode) {
                gNextState = DS_NORMAL;
            } else {
                gNextState = DS_EDIT;
            }
            break;
        case 'EDIT':
            gPrevState = gCurState;
            gCurState = DS_BUSY;
            gNextState = DS_EDIT;
            break;
        case 'SAVE':
            gPrevState = gCurState;
            gCurState = DS_BUSY;
            if (gUseEditMode) {
                gNextState = DS_NORMAL;
            } else {
                gNextState = DS_EDIT;
            }
            break;
        case 'DELETE':
            gPrevState = gCurState;
            gCurState = DS_BUSY;
            gNextState = DS_INIT;
            break;
        case 'SEARCH':
            gPrevState = gCurState;
            gCurState = DS_BUSY;
            gNextState = DS_NORMAL;
            break;
        case 'GENERAL':
            gPrevState = gCurState;
            gCurState = DS_BUSY;
            gNextState = DS_NORMAL;
            break;
        case 'PRINT':
            break;
        default:
            alert('Cannot set state for function ' + fname);
            break;
    }
    
    setStatus('Next State will be '+gNextState);
}

function UpdatePostState() {
    // gPrevState = gCurState;
    // modified for other ajax transactions which don't use state
    gPrevState = '';
    gCurState = gNextState;
    gNextState = '';
    gDocModified = false;
    setStatus('State set to '+gCurState);
}

function RestorePrevState() {
    if (gPrevState=='') {return;}
    gCurState = gPrevState;
    gNextState = '';
    setStatus('State restored to '+gCurState);
}

function SetDocState(fname) {
    switch (fname.toUpperCase()) {
        case 'CLEAR':
            gPrevState = gCurState;
            gCurState = DS_INIT;
            gNextState = '';
            break;
        case 'NEW':
            gPrevState = gCurState;
            gCurState = DS_NEW;
            gNextState = '';
            break;
        case 'RETRIEVE':
            gPrevState = gCurState;
            if (gUseEditMode) {
                gCurState = DS_NORMAL;
            } else {
                gCurState = DS_EDIT;
            }
            gNextState = '';
            break;
        case 'EDIT':
            gPrevState = gCurState;
            gCurState = DS_EDIT;
            gNextState = '';
            break;
        case 'SAVE':
            gPrevState = gCurState;
            if (gUseEditMode) {
                gCurState = DS_NORMAL;
            } else {
                gCurState = DS_EDIT;
            }
            gNextState = '';
            break;
        case 'DELETE':
            gPrevState = gCurState;
            gCurState = DS_INIT;
            gNextState = '';
            break;
        case 'SEARCH':
            gPrevState = gCurState;
            gCurState = DS_NORMAL;
            gNextState = '';
            break;
        case 'PRINT':
            break;
        default:
            alert('Cannot set state for function ' + fname);
            break;
    }
    
    setStatus('State set to '+gNextState);
}

function IsValidStateFor(fname) {
    var isValid = true;

    // status is valid by default
    // only exceptional cases are coded
    if (gCurState==DS_BUSY) {
        alert('There is another process in progress. Please wait');
        isValid = false;
    }

    switch (fname.toUpperCase()) {
        case 'CLEAR':
        case 'NEW':
            if (gCurState == DS_NEW || gCurState == DS_NORMAL || gCurState == DS_EDIT) {
                if (gDocModified) {
                    isValid = confirm('You will lose any unsaved data. Do you wish to continue?')
                }
            }
            break;

        case 'RETRIEVE':
            if (gCurState == DS_NEW || gCurState == DS_NORMAL || gCurState == DS_EDIT) {
                if (gDocModified) {
                    isValid = confirm('You will lose any unsaved data. Do you wish to continue?')
                }
            }
//            if (gCurState == DS_EMPTY || gCurState == DS_INIT) {
//                alert('Please clear screen first!');
//                isValid = false;
//            }
            break;
        case 'EDIT':
            if (gCurState != DS_NORMAL) {
                alert('Nothing to edit. Please load data first.'+'\nInvalid State. Current state: '+gCurState);
                isValid = false;
            }
            break;
        case 'SAVE':
            if (gUseStateNew == true) {
                if (gCurState == DS_NEW || gCurState == DS_EDIT) {
                    if (!gDocModified) {
                        alert('Nothing to save. No data has been changed.');
                        isValid = false;
                    }
                } else {
                    alert('Nothing to save. Please load data first or click New to start new input.'+'\nInvalid State. Current state: '+gCurState);
                    isValid = false;
                }
            } else {
                if (!gDocModified) {
                    alert('Nothing to save. No data has been changed.');
                    isValid = false;
                }
            }
            break;
        case 'DELETE':
            if (!(gCurState == DS_NORMAL || gCurState == DS_EDIT)) {
                alert('Nothing to delete. Please load data first.'+'\nInvalid State. Current state: '+gCurState);
                isValid = false;
            }
            break;
        case 'PRINT':
            if (!(gCurState == DS_NORMAL || gCurState == DS_EDIT)) {
                alert('Nothing to print. Please load data first.'+'\nInvalid State. Current state: '+gCurState);
                isValid = false;
            }
            break;
        case 'SEARCH':
            break;
        default:
            alert('Document state is unmanaged for function ' + fname);
            break;
    }
    
    return isValid;
    
}
