﻿var CommonFunction = {

    IsNullOrEmpty: function(input) {
        if (input) {
            if (input == null || input.length == 0) {
                return true;
            } else {
                return false;
            }
        } else {
            return true;
        }
    },

    TrimString: function(input) {
        if (CommonFunction.IsNullOrEmpty(input)) {
            return input;
        } else {
            if (typeof input === 'string') {
                var str = new String(input);
                return str.replace(/^\s+|\s+$/g, '');
            } else {
                // well nothing much we can do if it is not string :-)
                return input;
            }
        }
    },

    SetElementVisibilityByID: function(elementID, visible) {
        if (!CommonFunction.IsNullOrEmpty(elementID)) {
            var element = document.getElementById(elementID);
            if (element) {
                if (visible === true) {
                    element.style.display = 'block';
                } else {
                    element.style.display = 'none';
                }
            } else {
                // no such element, nothing we can do
            }
        } else {
            // nothing we can do here
        }
    },

    IsElementVisibleByID: function(elementID) {
        if (!CommonFunction.IsNullOrEmpty(elementID)) {
            var element = document.getElementById(elementID);
            if (element) {
                if (element.style.display == 'none') {
                    return false;
                } else if (element.style.display == 'block') {
                    return true;
                } else {
                    // ????
                    return false;
                }
            } else {
                // no such element, nothing we can do
                return false;
            }
        } else {
            // nothing we could do, just return false;
            return false;
        }
    },

    RemoveElementById: function(elementID) {
        var element = document.getElementById(elementID);

        if (element != null) {
            var parentNode = element.parentNode;
            parentNode.removeChild(element);
            return true;
        }
        else {
            return false;
        }
    },

    FindPositionXById: function(elementID) {
        var curleft = 0;
        var element = document.getElementById(elementID);
        if (element != null) {
            if (element.offsetParent) {
                while (1) {
                    curleft += element.offsetLeft;
                    if (!element.offsetParent)
                        break;
                    element = element.offsetParent;
                }
            } else if (element.x) {
                curleft += element.x;
            }
        }
        return curleft;
    },

    FindPositionYById: function(elementID) {
        var curtop = 0;
        var element = document.getElementById(elementID);
        if (element != null) {
            if (element.offsetParent) {
                while (1) {
                    curtop += element.offsetTop;
                    if (!element.offsetParent)
                        break;
                    element = element.offsetParent;
                }
            } else if (element.y) {
                curtop += element.y;
            }

            return curtop;
        }
    },

    FindPositionById: function(elementID) {
        var left = this.FindPositionXById(elementID);
        var top = this.FindPositionYById(elementID);
        return [left, top];
    },

    ParsePXValues: function(value) {
        if (value.indexOf("px") >= 0)
            return value.replace("px", "");
        else
            return value;
    },

    defaultTextOnFocus: function(element, defaultValue) {
        if (element.value == defaultValue) {
            element.value = '';
        }
    },

    defaultTextOffFocus: function(element, defaultValue) {
        if (element.value == '') {
            element.value = defaultValue;
        }
    }
}

var Formatting = {
    FormatCurrency: function(amount, decimalPlaces) {
        var amount = isNaN(amount) ? 0 : amount;
        var decimalPlaces = isNaN(decimalPlaces = Math.abs(decimalPlaces)) ? 2 : decimalPlaces;
        var d = ".";
        var t = ",";
        var s = amount < 0 ? "-" : "";
        var i = parseInt(amount = Math.abs(+amount || 0).toFixed(decimalPlaces)) + "";
        var j = (j = i.length) > 3 ? j % 3 : 0;
        return "$" + s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (decimalPlaces ? d + Math.abs(amount - i).toFixed(decimalPlaces).slice(2) : "");
    }
}

var CommonValidations = {
    ValidateNumber: function(number) {
        if (CommonFunction.IsNullOrEmpty(number)) {
            // well, if it is null, just return false by default.
            return false;
        } else {
            return !isNaN(number);
        }
    },


    // reference from 
    // http://www.breakingpar.com/bkp/home.nsf/0/75A5C758B9DF576087256AFB00140789
    ValidateDateString: function(dateStr) {
        if (CommonFunction.IsNullOrEmpty(dateStr)) {
            return false;
        }

        // dateStr must be of format day month year with either slashes
        // or dashes separating the parts. Some minor changes would have
        // to be made to use day month year or another format.
        // This function returns True if the date is valid.
        var slash1 = dateStr.indexOf("/");
        if (slash1 == -1) { slash1 = dateStr.indexOf("-"); }
        // if no slashes or dashes, invalid date
        if (slash1 == -1) { return false; }
        var dateDay = dateStr.substring(0, slash1)
        var dateMonthAndYear = dateStr.substring(slash1 + 1, dateStr.length);
        var slash2 = dateMonthAndYear.indexOf("/");
        if (slash2 == -1) { slash2 = dateMonthAndYear.indexOf("-"); }
        // if not a second slash or dash, invalid date
        if (slash2 == -1) { return false; }
        var dateMonth = dateMonthAndYear.substring(0, slash2);
        var dateYear = dateMonthAndYear.substring(slash2 + 1, dateMonthAndYear.length);
        if ((dateMonth == "") || (dateDay == "") || (dateYear == "")) { return false; }
        // if any non-digits in the month, invalid date
        for (var x = 0; x < dateMonth.length; x++) {
            var digit = dateMonth.substring(x, x + 1);
            if ((digit < "0") || (digit > "9")) { return false; }
        }
        // convert the text month to a number
        var numMonth = 0;
        for (var x = 0; x < dateMonth.length; x++) {
            digit = dateMonth.substring(x, x + 1);
            numMonth *= 10;
            numMonth += parseInt(digit);
        }
        if ((numMonth <= 0) || (numMonth > 12)) { return false; }
        // if any non-digits in the day, invalid date
        for (var x = 0; x < dateDay.length; x++) {
            digit = dateDay.substring(x, x + 1);
            if ((digit < "0") || (digit > "9")) { return false; }
        }
        // convert the text day to a number
        var numDay = 0;
        for (var x = 0; x < dateDay.length; x++) {
            digit = dateDay.substring(x, x + 1);
            numDay *= 10;
            numDay += parseInt(digit);
        }
        if ((numDay <= 0) || (numDay > 31)) { return false; }
        // February can't be greater than 29 (leap year calculation comes later)
        if ((numMonth == 2) && (numDay > 29)) { return false; }
        // check for months with only 30 days
        if ((numMonth == 4) || (numMonth == 6) || (numMonth == 9) || (numMonth == 11)) {
            if (numDay > 30) { return false; }
        }
        // if any non-digits in the year, invalid date
        for (var x = 0; x < dateYear.length; x++) {
            digit = dateYear.substring(x, x + 1);
            if ((digit < "0") || (digit > "9")) { return false; }
        }
        // convert the text year to a number
        var numYear = 0;
        for (var x = 0; x < dateYear.length; x++) {
            digit = dateYear.substring(x, x + 1);
            numYear *= 10;
            numYear += parseInt(digit);
        }
        // Year must be a 2-digit year or a 4-digit year
        if ((dateYear.length != 2) && (dateYear.length != 4)) { return false; }
        // if 2-digit year, use 50 as a pivot date
        if ((numYear < 50) && (dateYear.length == 2)) { numYear += 2000; }
        if ((numYear < 100) && (dateYear.length == 2)) { numYear += 1900; }
        if ((numYear <= 0) || (numYear > 9999)) { return false; }
        // check for leap year if the month and day is Feb 29
        if ((numMonth == 2) && (numDay == 29)) {
            var div4 = numYear % 4;
            var div100 = numYear % 100;
            var div400 = numYear % 400;
            // if not divisible by 4, then not a leap year so Feb 29 is invalid
            if (div4 != 0) { return false; }
            // at this point, year is divisible by 4. So if year is divisible by
            // 100 and not 400, then it's not a leap year so Feb 29 is invalid
            if ((div100 == 0) && (div400 != 0)) { return false; }
        }
        // date is valid
        return true;
    },

    // this function is to make sure the min number is less than the max
    // we don't check the number format here, please use another function to check that
    ValidateNumberRange: function(min, max) {
        if (CommonFunction.IsNullOrEmpty(min)) {
            return true;
        }
        if (CommonFunction.IsNullOrEmpty(max)) {
            return true;
        }
        if (!isNaN(min) && !isNaN(max)) {
            min = parseInt(min);
            max = parseInt(max);
        } else {
            return true;
        }
        if (min <= max) {
            return true;
        } else {
            return false;
        }
    },

    ValidateDateRange: function(min, max) {
        if (CommonFunction.IsNullOrEmpty(min)) {
            return true;
        }
        if (CommonFunction.IsNullOrEmpty(max)) {
            return true;
        }

        if (min <= max) {
            return true;
        } else {
            return false;
        }
    }
}

