/*jslint browser:true*/
/*global document,appRoot,angular */
(function () {
    "use strict";

    appRoot.service('UtilService', ["$window", "$location", function ($window, $location) {

        return {
            getAge: function (dateOfBirth) {
                //Check whether the date is null or undefined then return the age as 0
                if (typeof (dateOfBirth) === 'undefined' || dateOfBirth === null) {
                    return 0;
                }
                //If date format is coming as MM/DD/YYYY, change the format to "YYYY-MM-DD"
                if (dateOfBirth.indexOf('/') > 0) {
                    var dateFields = dateOfBirth.split('/');
                    dateOfBirth = (dateFields[2] || '1900') + "-" + (dateFields[0] || '01') + "-" + (dateFields[1] || '01');
                }
                //Split the date from the format YYYY-MM-DDTHH:MM:SS to individual elements and create the new Date as direct formatting of the input date provide wrong date due to default Timezone
                var dt = dateOfBirth.split(/[: T-]/).map(parseFloat);
                // Create the new date with the individual elements of the date of birth
                var dob = new Date(dt[0], dt[1] - 1, dt[2], dt[3] || 0, dt[4] || 0, dt[5] || 0, 0);
                var now = new Date();

                var age = now.getFullYear() - dob.getFullYear();
                var curMonth = now.getMonth();
                var curDay = now.getDate();
                var birthMonth = dob.getMonth();
                var birthDay = dob.getDate();
                if (curMonth < birthMonth || (curMonth === birthMonth && curDay < birthDay)) {
                    age--;
                }
                return age;
            },
            getwebApiUrl: function () {
                return $window.baseApiUrl;
            },
            getLanguageCode: function () {
                return $window.languageCode;
            },
            getcurrentPageGuid: function () {
                var fullUrl = $location.absUrl();
                var queryString = fullUrl.slice(fullUrl.indexOf('?') + 1);

                if (queryString.indexOf('NavigatorID') >= 0) {
                    return queryString.split('NavigatorID=')[1];
                }
                return "Invalid URL";
            },
            startsWith: function (str, prefix) {
                return str.lastIndexOf(prefix, 0) === 0;
            },
            endsWith: function (str, suffix) {
                return str.indexOf(suffix, str.length - suffix.length) !== -1;
            },

            //Undefined or Null Check function
            isUndefinedOrNull: function (val) {
                return angular.isUndefined(val) || val === null;
            },

            //Check for Undefined or Null or Empty String
            isUndefinedOrNullOrEmpty: function (val) {
                return angular.isUndefined(val) || val === null || val == "";
            },

            //Check for Undefined or Null or Empty String
            isValidZipCode: function (input) {
                if (input === undefined || input === null || input === "") {
                    return true;
                }
                var regexp = /[0-9]{5}/;
                if (input.match(regexp)) { return true; }
                else {
                    return false;
                }
            },

            isValidSSN: function (input) {
                if (input === undefined || input === null || input == "") {
                    return true;
                }
                var inputVal = (input == "__-__-____" || input == "-____" || input == "____" || input == "-__-____" || input == "__-____" || input == "__" || input == "_" || input == "_-____");
                if (input != undefined) {
                    if (inputVal == false) {
                        var SSNval = input.match(/[0-9\.]/g).map(Number);
                        if (SSNval.length != 0) {
                            if (SSNval.length >= 9) {
                                var ssnFull = SSNval.join('').substring(0, 9);
                                return RegEx_SSN_Number.test(ssnFull);
                            }
                            else { return false; }
                        }
                    }
                    else { return true; }
                }
                else { return true; }
            },
            getQueryStringValue: function (key) {
                var fullUrl = $location.absUrl().toUpperCase();
                var queryString = fullUrl.slice(fullUrl.indexOf('?') + 1);

                if (queryString.indexOf(key.toUpperCase()) >= 0) {
                    return queryString.split('=')[1];
                }
                return "Invalid URL";
            },

            getUrlParameter: function (param, url) {
                var sPageURL = url || window.location.search.substring(1),
                    sURLVariables = sPageURL.split(/[&||?]/),
                    res;

                for (var i = 0; i < sURLVariables.length; i += 1) {
                    var paramName = sURLVariables[i],
                        sParameterName = (paramName || '').split('=');

                    if (sParameterName[0] === param) {
                        res = sParameterName[1];
                    }
                }

                return res;
            },

            validDate: function (input) {
                if (!angular.isUndefinedOrNullOrEmpty(input)) {
                    var date = input;
                    var currDate = new Date();
                    var filteredCurrDate = currDate.getMonth() + 1 + "/" + currDate.getDate() + "/" + currDate.getFullYear();
                    if (date !== filteredCurrDate) {
                        var rxDatePattern = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
                        var dtArray = input.match(rxDatePattern);
                        if (dtArray == null) {
                            return false;
                        } else {
                            var dtMonth = dtArray[1];
                            var dtDay = dtArray[3];
                            var dtYear = dtArray[5];
                            if (dtMonth < 1 || dtMonth > 12) {
                                return false;
                            } else if (dtDay < 1 || dtDay > 31) {
                                return false;
                            } else if ((dtMonth == 4 || dtMonth == 6 || dtMonth == 9 || dtMonth == 11) && dtDay == 31) {
                                return false;
                            } else if (dtYear < 1875) {
                                return false;
                            } else if (dtMonth == 2) {
                                var isLeap = (dtYear % 4 == 0 && (dtYear % 100 != 0 || dtYear % 400 == 0));
                                if (dtDay > 29 || (dtDay == 29 && !isLeap)) {
                                    return false;
                                }
                            }
                        }
                    }
                }

                return true;
            },

            intializeScroll: function () {
                setTimeout(function () {
                    if (typeof afsIndivScroller !== 'undefined' && !angular.isUndefined(afsIndivScroller)) {
                        afsIndivScroller.initialize();
                    }
                }, 100);
            },

            positionScroll: function (nextPrevious) {
                if (typeof afsIndivScroller !== 'undefined' && !angular.isUndefined(afsIndivScroller)) {
                    afsIndivScroller.positionScrollAtActiveElement(nextPrevious);
                }
            },

            validateMaxCharacters: function (input, length, valueType) {
                if (input === undefined || input === null || input == "") {
                    return true;
                }
                else {
                    var inputVal = input;
                    if (valueType == 'P') {
                        inputVal = input.replace("(", "").replace(")", "").replace(" ", "").replace("-", "").replace("__", "").replace("___", "").replace("____", "").replace("__", "").replace("_", "")
                    }
                    return (inputVal.toString().length <= length);
                }
            }
        };
    }]);
}());;
