﻿var MASTERPAGE_PREFIX = 'ctl00_main_';
var FIRST_SEP = '|';
var SECOND_SEP = '~';
var REALNAME_SEP = '-';
var TXTVALUE = 'txtValue';
var HDSTDEV = 'hdnStdev';
var HDMEAN = 'hdnMean';
var TXTTOTAL = 'txtTotal';
var HDNCATEGORYID = 'hdnCategoryIds';
var HDNCELLARDOORID = 'hdnCellarDoorId';
var HDNALWAYSACTIVE = 'hdnAlwaysActive';
var HDNDEPENDS = 'hdnDepends';
var HDNUSERID = 'hdnUserId';
var SUNDAY = 'Sunday';
var MONDAY = 'Monday';
var TUESDAY = 'Tuesday';
var WEDNESDAY = 'Wednesday';
var THURSDAY = 'Thursday';
var FRIDAY = 'Friday';
var SATURDAY = 'Saturday';
var STDEV_NUM = 4;
var NA = 'N/A';
var TXTWEEKBEGINNING = 'txtWeekBeginning';

var _errorShown = false;

var REPORT_MEAN;
var REPORT_VALUE;
var REPORT_STDEV;

Array.prototype.contains = function (element) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] == element) {
            return true;
        }
    }
    return false;
};

function isWithin(txtValue) {
    var idArr = txtValue.id.split(REALNAME_SEP);
    var categoryId = idArr[1];
    var dayName = idArr[2];
    var val = parseFloat(txtValue.value);
    var stdev = parseFloat(document.getElementById(MASTERPAGE_PREFIX + HDSTDEV + REALNAME_SEP + categoryId + REALNAME_SEP + dayName).value);
    var mean = parseFloat(document.getElementById(MASTERPAGE_PREFIX + HDMEAN + REALNAME_SEP + categoryId + REALNAME_SEP + dayName).value);
    if (!isNaN(val)) {
        if (!isNaN(stdev) && !isNaN(mean)) {
            if ( (val <= (mean + (STDEV_NUM * stdev))) && (val >= (mean - (STDEV_NUM * stdev)))) {
                return true;
            } else {
                REPORT_MEAN = mean;
                REPORT_STDEV = stdev;
                return false;
            }
        } else {
            return true;
        }
    } else {
        return true;
    }
}

function checkValue(txtValue) {
    try {
        var num = parseFloat(txtValue.value);
        if (isNaN(num)) {
            txtValue.value = NA;
        }
        return true;
    } catch (e) {
        alert("The following error occurred: " + e.name + " - " + e.message); 
    } 
}

function checkRange(txtValue, categoryId, dayName) {
    try {
        if (isWithin(txtValue)) {
            checkDepends(txtValue, categoryId, dayName)
            return true;
        } else {
            var result;
            REPORT_VALUE = txtValue.value;
            if(confirm("The number you have entered is more than " + STDEV_NUM + " Standard Deviations from the Mean (" + REPORT_MEAN + ")\r\nAre you sure your value of " + parseFloat(txtValue.value) + " is correct?")) {
                result = true;
            } else {
                txtValue.value = "";
                result = false;
            }
            var dataEntryDate = calculateDataEntryDate(dayName);
            var xmlHttpReq = getXMLHttpRequest();
            var msg = 'OutlierHandler.ashx?user=' + document.getElementById(MASTERPAGE_PREFIX+HDNUSERID).value
                + '&cellardoor=' + document.getElementById(MASTERPAGE_PREFIX+HDNCELLARDOORID).value
                + '&value=' + parseFloat(REPORT_VALUE) + '&mean=' + REPORT_MEAN + "&correct=" + result
                + "&categoryid=" + categoryId + "&stdev=" + REPORT_STDEV + "&date=" 
                + dataEntryDate.getFullYear() + "-" + (dataEntryDate.getMonth() +1)
                + "-" + dataEntryDate.getDate() + "";
            xmlHttpReq.open('GET', encodeURI(msg), true);
            xmlHttpReq.onreadystatechange = function() {
                if(xmlHttpReq.readyState == 4) {
                    if(xmlHttpReq.status == 200) {
                        if (xmlHttpReq.responseText != 'SAVED') {
                            alert(xmlHttpReq.responseText);
                        }
                    } else if (xmlHttpReq.status == 500) {
                        alert(xmlHttpReq.responseText);
                    }
                }
            };
            xmlHttpReq.send(null)
            checkDepends(txtValue, categoryId, dayName)
            return result;
        }
    } catch (e) {
        alert("The following error occurred: " + e.name + " - " + e.message); 
    } 
}

function calculateDataEntryDate(dayName) {
    var txtWeekBeginning = document.getElementById(MASTERPAGE_PREFIX + TXTWEEKBEGINNING);
    if (txtWeekBeginning != null) {
        var weekBeginning = new Date(txtWeekBeginning.value);
        if (weekBeginning != null) {
            var daysToAdd = 0;
            switch(dayName) {
                case TUESDAY:
                    daysToAdd++;
                    break;
                case WEDNESDAY:
                    daysToAdd += 2;
                    break;
                case THURSDAY:
                    daysToAdd += 3;
                    break;
                case FRIDAY:
                    daysToAdd += 4;
                    break;
                case SATURDAY:
                    daysToAdd += 5;
                    break;
                case SUNDAY:
                    daysToAdd += 6;
                    break;
                default:
                    break;
            }
            return new Date(weekBeginning.getFullYear(), weekBeginning.getMonth(), weekBeginning.getDate() + daysToAdd);
        }
    }
    return null;
}

function validate() {
    try {
        var isValid = true;
        if (!validateDay(SUNDAY)) {
            isValid = false;
        }
        if (!validateDay(MONDAY)) {
            isValid = false;
        }
        if (!validateDay(TUESDAY)) {
            isValid = false;
        }
        if (!validateDay(WEDNESDAY)) {
            isValid = false;
        }
        if (!validateDay(THURSDAY)) {
            isValid = false;
        }
        if (!validateDay(FRIDAY)) {
            isValid = false;
        }
        if (!validateDay(SATURDAY)) {
            isValid = false;
        }
        if (isValid) {
            document.getElementById(MASTERPAGE_PREFIX+'lblError').innerHTML = '';
        } else {
            document.getElementById(MASTERPAGE_PREFIX+'lblError').innerHTML = "Your data could not be saved. Please complete the rest of the weekly data entry form by entering 'N/A'."
            if (!_errorShown) {
                toggleError(false);
                _errorShown = true;
            }
        }
        return isValid;
    } catch (e) {
        alert("The following error occurred: " + e.name + " - " + e.message); 
    } 
}

function toggleError(hide) {
    var pnl = document.getElementById('pnlError');
    if (pnl && hide) {
        pnl.style.visibility = 'hidden';
    } else if (pnl) {
        pnl.style.visibility = 'visible';
    }
    return false;
}

function validateDay(dayName) {
    var txt;
    var catArr = document.getElementById(MASTERPAGE_PREFIX+HDNCATEGORYID).value.split(FIRST_SEP);
    for (var i=0; i<catArr.length; i++) {
        if (catArr[i] != '') {
            var txt = document.getElementById(MASTERPAGE_PREFIX + TXTVALUE + REALNAME_SEP + catArr[i] + REALNAME_SEP + dayName);
            if (!txt.disabled && txt.value == '') {
                return false;
            }
        }
    }
    return true;
}

function toggleDayControls(chk, dayName) {
    try {
        var catArr = document.getElementById(MASTERPAGE_PREFIX+HDNCATEGORYID).value.split(FIRST_SEP);
        for (var i=0; i<catArr.length; i++) {
            if (catArr[i] != '' && !isAlwaysActive(catArr[i])) {
                var txt = document.getElementById(MASTERPAGE_PREFIX + TXTVALUE + REALNAME_SEP + catArr[i] + REALNAME_SEP + dayName);
                if (txt != null) {
                    if (chk.checked) {
                        var txtMandatory = getDependantsMandatory(txt, catArr[i], dayName);
                        if (txtMandatory == null || txtMandatory.value == '' || txtMandatory.value == NA) {
                            txt.value = '';
                            txt.disabled = true;
                            txt.style.background = '#D4D0C8';
                        } else {
                            txt.disabled = false;
                            txt.style.background = 'White';
                        }
                    } else {
                        txt.value = '';
                        txt.disabled = true;
                        txt.style.background = '#D4D0C8';
                    }
                }
            }
        }
        var catArr = document.getElementById(MASTERPAGE_PREFIX+HDNCATEGORYID).value.split(FIRST_SEP);
        for (var i=0; i<catArr.length; i++) {
            sumTotal(catArr[0]);
        }
    } catch (e) {
        alert("The following error occurred: " + e.name + " - " + e.message); 
    } 
}

function isAlwaysActive(categoryId) {
    var catArr = document.getElementById(MASTERPAGE_PREFIX+HDNALWAYSACTIVE).value.split(FIRST_SEP);
    for (var i=0; i<catArr.length; i++) {
        if (catArr[i] == categoryId) {
            return true;
        }
    }
    return false;
}

function sumTotal(categoryId) {
    try {
        var isFound = false;   
        var catArr = document.getElementById(MASTERPAGE_PREFIX+HDNCATEGORYID).value.split(FIRST_SEP);
        for (var i=0; i<catArr.length; i++) {
            if (catArr[i] == categoryId) {
                isFound = true;
                break;
            }
        }
        if (isFound) {
            var total = 0;
            var txt = document.getElementById(MASTERPAGE_PREFIX + TXTVALUE + REALNAME_SEP + categoryId + REALNAME_SEP + SUNDAY);
            if (txt != null) {
                if (parseFloat(txt.value)) {
                    total += parseFloat(txt.value);
                }
            }
            txt = document.getElementById(MASTERPAGE_PREFIX + TXTVALUE + REALNAME_SEP + categoryId + REALNAME_SEP + MONDAY);
            if (txt != null) {
                if (parseFloat(txt.value)) {
                    total += parseFloat(txt.value);
                }
            }
            txt = document.getElementById(MASTERPAGE_PREFIX + TXTVALUE + REALNAME_SEP + categoryId + REALNAME_SEP + TUESDAY);
            if (txt != null) {
                if (parseFloat(txt.value)) {
                    total += parseFloat(txt.value);
                }
            }
            txt = document.getElementById(MASTERPAGE_PREFIX + TXTVALUE + REALNAME_SEP + categoryId + REALNAME_SEP + WEDNESDAY);
            if (txt != null) {
                if (parseFloat(txt.value)) {
                    total += parseFloat(txt.value);
                }
            }
            txt = document.getElementById(MASTERPAGE_PREFIX + TXTVALUE + REALNAME_SEP + categoryId + REALNAME_SEP + THURSDAY);
            if (txt != null) {
                if (parseFloat(txt.value)) {
                    total += parseFloat(txt.value);
                }
            }
            txt = document.getElementById(MASTERPAGE_PREFIX + TXTVALUE + REALNAME_SEP + categoryId + REALNAME_SEP + FRIDAY);
            if (txt != null) {
                if (parseFloat(txt.value)) {
                    total += parseFloat(txt.value);
                }
            }
            txt = document.getElementById(MASTERPAGE_PREFIX + TXTVALUE + REALNAME_SEP + categoryId + REALNAME_SEP + SATURDAY);
            if (txt != null) {
                if (parseFloat(txt.value)) {
                    total += parseFloat(txt.value);
                }
            }
            txt = document.getElementById(MASTERPAGE_PREFIX + TXTTOTAL + REALNAME_SEP + categoryId);
            if (txt != null) {
                txt.value = total;
            }
        }
    } catch (e) {
        alert("The following error occurred: " + e.name + " - " + e.message); 
    } 
}

function checkDepends(txt, categoryId, dayName) {
    try {
        var txtOther;
        var dependsArr;
        var alreadyDsiabled = new Array();
        var dependsGroupArr = document.getElementById(MASTERPAGE_PREFIX+HDNDEPENDS).value.split(FIRST_SEP);
        for (var i=0; i<dependsGroupArr.length; i++) {
            dependsArr = dependsGroupArr[i].split(SECOND_SEP);
            if (dependsArr.length > 1 && dependsArr[1] != '' && dependsArr[0] == categoryId) {
                for (var j=1; j<dependsArr.length; j++) {
                    txtOther = document.getElementById(MASTERPAGE_PREFIX + TXTVALUE + REALNAME_SEP + dependsArr[j] + REALNAME_SEP + dayName);
                    if ((txtOther != null) && (txtOther.disabled = (txt.value == NA || txt.value == '' || isNaN(txt.value) || parseFloat(txt.value) < 0.01 || alreadyDsiabled.contains(txtOther)))) {
                        alreadyDsiabled.push(txtOther);
                        if (parseFloat(txt.value) < 0.01) {
                            txtOther.value = 0;
                        } else {
                            txtOther.value = '';
                        }
                        txtOther.style.background = '#D4D0C8';
                    } else if (txtOther != null) {
                        txtOther.style.background = 'White';
                    }
                }
            } else if (dependsArr.length > 1 && dependsArr[1] != '') {
                for (var j=1; j<dependsArr.length; j++) {
                    txtOther = document.getElementById(MASTERPAGE_PREFIX + TXTVALUE + REALNAME_SEP + dependsArr[j] + REALNAME_SEP + dayName);
                    txtSecondary = document.getElementById(MASTERPAGE_PREFIX + TXTVALUE + REALNAME_SEP + dependsArr[0] + REALNAME_SEP + dayName);
                    if ((txtOther != null) && (txtOther.disabled = (txtSecondary == null || txtSecondary.value == NA || txtSecondary.value == '' || isNaN(txtSecondary.value) || parseFloat(txtSecondary.value) < 0.01 || alreadyDsiabled.contains(txtOther)))) {
                        alreadyDsiabled.push(txtOther);
                        if (txtSecondary != null && parseFloat(txtSecondary.value) < 0.01) {
                            txtOther.value = 0;
                        } else {
                            txtOther.value = '';
                        }
                        txtOther.style.background = '#D4D0C8';
                    } else if (txtOther != null) {
                        txtOther.style.background = 'White';
                    }
                }
            }
        }
        var txtMandatory = getDependantsMandatory(txt, categoryId, dayName);
        if (txtMandatory == null || txtMandatory.value == '' || txtMandatory.value == NA) {
            txt.value = '';
            txt.disabled = true;
            txt.style.background = '#D4D0C8';
        } else {
            txt.disabled = false;
            txt.style.background = 'White';
        }
    } catch (e) {
        alert("The following error occurred: " + e.name + " - " + e.message); 
    } 
}

function getDependantsMandatory(txt, categoryId, dayName) {
    var dependsArr;
    var dependsGroupArr = document.getElementById(MASTERPAGE_PREFIX+HDNDEPENDS).value.split(FIRST_SEP);
    for (var i=0; i<dependsGroupArr.length; i++) {
        dependsArr = dependsGroupArr[i].split(SECOND_SEP);
        if (dependsArr.length > 1 && dependsArr[1] != '') {
            var txtMandatory;
            for (var j=1; j<dependsArr.length; j++) {
                if (dependsArr[j] == categoryId) {
                    return txtMandatory = document.getElementById(MASTERPAGE_PREFIX + TXTVALUE + REALNAME_SEP + dependsArr[0] + REALNAME_SEP + dayName);
                }
            }
        }
    }
    return false;
}

function getXMLHttpRequest() {
    if (window.XMLHttpRequest) {
        return new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        return new ActiveXObject("Microsoft.XMLHTTP");
    }
}


