﻿/*============to to Test Run=======================
var oh = new dk_dsg_msd_sp_companyinformation();
oh.storeid = 82;
oh.deptids = 150365;
oh.StartDate = '2010-12-31';
oh.endDate = '2011-01-06';
oh.GetFullWeekOpeningHours();
oh.GetBusinessHoursCounter();
================================================*/

function dk_dsg_msd_sp_companyinformation() {
    window.IsBusinessDayCounterDone = false;
    window.timerIntervalID = null;
    window.TimeLeftToOpen = '';
    window.TimeLeftToColse = '';
    window.OpenOnNextDayTime = ''
    window.NextDateDayDate = null;
    window.weekDaysen = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat")
    window.WeekDaywithGrouping = new Array();

    /*=========region Local Variables===========*/
    var TimeLefttoOpenText = 'Vi åbner om <b>{0}</b> timer';
    var TimeLeftToCloseText = 'Vi lukker kl <b>{0}</b> timer';
    var OpenOnNextDayTimeText = 'føtex åbner {0} kl {1}'
    var NOBusinessCounterFoundText = 'ikke i stand til at finde butiks åbningstider';
    var today = new Date();
    var async = true;
    var Type = "GET";
    var Data;
    var ContentType = "application/json; charset=utf-8";
    var DataType = "json";
    var ProcessData = false;
    /*=========end region local variables========*/

    function weekCompanyInformationEntity() {
        this.BusinessHour = '';
        this.OpeningDateFrom = null;
        this.OpeningDateTo = null;
        this.GroupID = 0;
    };


    /*=========End Region Local Variables========*/
    this.ServiceBaseUrl = window.Environment.CompanyInformationServiceUrl + '/GetStoreDetail';
    this.StoreId = 82;
    this.DeptId = 15382;
    this.startDate = GetFormatedDate('today'); //'12-31-2010'; //Today date
    this.endDate = GetFormatedDate('6'); //'01-06-2011'; 6 days plus in today

    this.GetBusinessHoursCounter = function () {
        if (!window.IsBusinessDayCounterDone) {
            var SetviceGetURL = '';
            SetviceGetURL = GetFormatedServiceUrl(this.ServiceBaseUrl, this.storeid, this.DeptId, this.startDate, this.endDate);
            CallRestService(SetviceGetURL, ProcessBusinessHoursCounterResult, ServiceFailed);
        }
    }

    this.GetFullWeekOpeningHours = function () {
        var SetviceGetURL = '';
        SetviceGetURL = GetFormatedServiceUrl(this.ServiceBaseUrl, this.storeid, this.DeptId, this.startDate, this.endDate);
        CallRestService(SetviceGetURL, ProcessWeekBusinessHoursResult, ServiceFailed);
    }

    function ProcessBusinessHoursCounterResult(response) {
        //debugger;
        var results = null;
        if (response != null && response != '') {
            var results = $.parseJSON(response);

            if (results.OpeningHour != null) {
                var currentDate = new Date(); // Date.parse('2010-12-31'); //Date.today();
                $(results.OpeningHour).each(function (index) {

                    if (window.IsBusinessDayCounterDone == false) {

                        var openingDate = Date.parse(this.OpeningDate.toString().substring(0, 10));
                        /*------For Test Run------*/
                        //this.OpeningFrom = '0900';
                        //this.OpeningTo = '1259';
                        //openingDate = '08-23-2011';
                        /*--------end for Test Run-----*/
                        if (openingDate.toString() == currentDate.toString('MM-dd-yyyy')) {

                            var formatedCurrentTime = CustomFormatedTime(currentDate.toTimeString(), false);
                            var formatedOpeningTime = CustomFormatedTime(this.OpeningFrom, true);
                            var formatedClosingTime = CustomFormatedTime(this.OpeningTo, true);

                            if (this.OpeningFrom != null && $.trim(this.OpeningFrom) != '') {
                                if (FormatTime(currentDate.getHours(), currentDate.getMinutes()) < this.OpeningFrom) {
                                    window.TimeLeftToOpen = CalculateTimeDifference(formatedCurrentTime, formatedOpeningTime);  //this.OpeningFrom - FormatTime(currentDate.getHours(), currentDate.getMinutes());
                                    window.OpenOnNextDayTime = '';
                                    window.TimeLeftToColse = '';
                                    window.IsBusinessDayCounterDone = true;
                                }
                                if (this.OpeningTo != null && $.trim(this.OpeningTo) != '') {
                                    if (FormatTime(currentDate.getHours(), currentDate.getMinutes()) > this.OpeningFrom && FormatTime(currentDate.getHours(), currentDate.getMinutes()) < this.OpeningTo) {
                                        window.TimeLeftToColse = CalculateTimeDifference(formatedCurrentTime, formatedClosingTime);  //this.OpeningTo - FormatTime(currentDate.getHours(), currentDate.getMinutes());
                                        window.OpenOnNextDayTime = '';
                                        window.TimeLeftToOpen = '';
                                        window.IsBusinessDayCounterDone = true;
                                    }
                                }

                            }

                        }
                        else if (openingDate.toString() > currentDate.toString() && window.IsBusinessDayCounterDone == false) {
                            if (this.OpeningFrom != null && $.trim(this.OpeningFrom) != '') {
                                window.OpenOnNextDayTime = this.OpeningFrom;
                                window.NextDateDayDate = openingDate;
                                window.TimeLeftToOpen = '';
                                window.TimeLeftToColse = '';
                                window.IsBusinessDayCounterDone = true;
                            }
                        }
                    }
                });
            }
        }

        renderBusinessHoursCounter();
    }

    function renderBusinessHoursCounter() {
        var renderText = '';
        var divbusinessHoursCounter = document.createElement('div');
        divbusinessHoursCounter.className = 'dsg_sp_BlueHeadingContainer';
        var spanBusinessHoursText = document.createElement('span');
        $(spanBusinessHoursText).attr('id', 'BHCounterText');
        if (window.TimeLeftToOpen != '' || window.TimeLeftToColse != '' || window.OpenOnNextDayTime != '') {

            if (window.TimeLeftToOpen != '') {

                $(spanBusinessHoursText).append(formatString(TimeLefttoOpenText, GetFormatedDisplayHours(window.TimeLeftToOpen.toString())));
            }
            else if (window.TimeLeftToColse != '') {

                $(spanBusinessHoursText).append(formatString(TimeLeftToCloseText, GetFormatedDisplayHours(window.TimeLeftToColse.toString())));

            }
            else if (window.OpenOnNextDayTime != '') {

                var date1 = Date.parse(window.NextDateDayDate.toString().substring(0, 10));
                var day = window.weekDaysen[date1.getDay()];
                var dayString = day + ' ' + date1.toString("dd.MM.yy");
                $(spanBusinessHoursText).append(formatString(OpenOnNextDayTimeText, dayString, GetFormatedDisplayHours(window.OpenOnNextDayTime.toString())));
            }
        }
        else {
            $(spanBusinessHoursText).text(NOBusinessCounterFoundText);
        }

        $(spanBusinessHoursText).appendTo(divbusinessHoursCounter);
        $('#dsg_sp_BusinessHoursCounterContainer').append(divbusinessHoursCounter);
    }

    function ServiceFailed(e) {
        alert('Failed to make Company Information Service request.');
        return false;
    }

    function ProcessWeekBusinessHoursResult(response) {

        var results = null;
        if (response != null && response != '') {
            var results = $.parseJSON(response);
            if (results.OpeningHour != null) {
                var closedText = 'Lukket';
                var currentDate = new Date(); // Date.parse('2010-12-31'); //Date.today();
                var lastDayOpenBusinessHours = '';
                var lastDayCloseBusinessHours = '';
                var groupid = 0;
                var weekBusinessHours = null;
                var isFirstgroup = true;

                $(results.OpeningHour).each(function (index) {

                    var newgroupdid = 1;
                    if (isFirstgroup) {

                        weekBusinessHours = new weekCompanyInformationEntity();
                        weekBusinessHours.BusinessHour = ($.trim(this.OpeningFrom) != '' && $.trim(this.OpeningTo) != '') ? GetFormatedDisplayHours(this.OpeningFrom) + '- ' + GetFormatedDisplayHours(this.OpeningTo) : closedText;
                        weekBusinessHours.OpeningDateFrom = this.OpeningDate
                        weekBusinessHours.OpeningDateTo = this.OpeningDate
                        weekBusinessHours.GroupID = groupid;

                        lastDayOpenBusinessHours = this.OpeningFrom;
                        lastDayCloseBusinessHours = this.OpeningTo;
                        window.WeekDaywithGrouping[groupid] = weekBusinessHours;
                    }

                    if (!isFirstgroup) {
                        if (lastDayOpenBusinessHours != this.OpeningFrom && lastDayCloseBusinessHours != this.OpeningTo) {

                            groupid += 1;
                            weekBusinessHours = new weekCompanyInformationEntity();
                            weekBusinessHours.BusinessHour = ($.trim(this.OpeningFrom) != '' && $.trim(this.OpeningTo) != '') ? GetFormatedDisplayHours(this.OpeningFrom) + '- ' + GetFormatedDisplayHours(this.OpeningTo) : closedText;
                            weekBusinessHours.OpeningDateFrom = this.OpeningDate
                            weekBusinessHours.OpeningDateTo = this.OpeningDate
                            weekBusinessHours.GroupID = groupid;
                            window.WeekDaywithGrouping[groupid] = weekBusinessHours;
                        }
                        else {
                            window.WeekDaywithGrouping[groupid].OpeningDateTo = this.OpeningDate;
                        }
                    }

                    lastDayOpenBusinessHours = this.OpeningFrom;
                    lastDayCloseBusinessHours = this.OpeningTo;
                    isFirstgroup = false;

                });
            }

            renderCurrentWeekBusinessHours();
        }
    }

    function renderCurrentWeekBusinessHours() {
        var divMainContainer = document.createElement('div');
        divMainContainer.className = 'mainContainer';
        if (window.WeekDaywithGrouping != null) {
            $(window.WeekDaywithGrouping).each(function (index) {
                var currGroup = window.WeekDaywithGrouping[index];
                var divStoreHourContainer = document.createElement('div');
                var divDayName = document.createElement('div');
                var divStoreHours = document.createElement('div');

                if ((index + 1) < window.WeekDaywithGrouping.length) {
                    divStoreHourContainer.className = 'storeHourContainer separator';
                }
                else {
                    divStoreHourContainer.className = 'storeHourContainer';
                }

                divDayName.className = 'dayName';
                divStoreHours.className = 'storeHour';

                var OpenDayFrom = window.weekDaysen[Date.parse(currGroup.OpeningDateFrom.toString().substring(0, 10)).getDay()];
                var OpenDayTo = window.weekDaysen[Date.parse(currGroup.OpeningDateTo.toString().substring(0, 10)).getDay()];
                var OpeningDay = '';
                if (OpenDayFrom != OpenDayTo) {
                    OpeningDay = OpenDayFrom + ' - ' + OpenDayTo;
                }
                else {
                    OpeningDay = OpenDayFrom;
                }

                $(divDayName).append(OpeningDay);
                $(divStoreHours).append('<b>' + currGroup.BusinessHour + '</b>');

                $(divDayName).appendTo(divStoreHourContainer);
                $(divStoreHours).appendTo(divStoreHourContainer);

                $(divStoreHourContainer).appendTo(divMainContainer);

            });

            $('.dsg_sp_TimeContainer').append(divMainContainer);
        }
    }

    function CalculateTimeDifference(startTime, EndTime) {

        var returnVal = '';
        var arrStartTime = startTime.split(':');
        var arrEndTime = EndTime.split(':');
        var startTimeSeconds = Math.round(trimLeadingZero(arrStartTime[0]) * 3600) + (trimLeadingZero(arrStartTime[1]) > 0 ? Math.round(trimLeadingZero(arrStartTime[1]) * 60) : 0);
        var endTimeSeconds = Math.round(trimLeadingZero(arrEndTime[0]) * 3600) + (trimLeadingZero(arrEndTime[1]) > 0 ? Math.round(trimLeadingZero(arrEndTime[1]) * 60) : 0);
        var returnTimeMinutes = ((endTimeSeconds - startTimeSeconds) > 0 ? (endTimeSeconds - startTimeSeconds) / 60 : 0);

        var hours = 0;
        var minutes = 0;
        if (returnTimeMinutes > 60) {
            hours = Math.floor(returnTimeMinutes / 60);
            minutes = (returnTimeMinutes % 60);
            returnVal = FormatTime(hours, minutes.toString());
        }
        else {
            returnVal = FormatTime('00', returnTimeMinutes.toString());
        }

        return returnVal;
    }

    function trimLeadingZero(value) {
        var retValue = 0;
        var counter = '';

        if (value.toString().charAt(0) == '0') {
            retValue = value.toString().substr(1, 1);
        }
        else {
            retValue = value;
        }

        return retValue;
    }

    function CustomFormatedTime(time, isDbTime) {
        var returnValue = '';
        if (isDbTime) {
            returnValue = GetFormatedDisplayHours(time.toString());
        }
        else {

            returnValue = time.toString('hh:mm').substr(0, 5);
        }

        return returnValue;

    }

    function FormatTime(hours, minutes) {

        if (hours < 10 && hours != 00) {
            hours = "0" + hours;
        }
        if (minutes < 10 && minutes != 00) {
            minutes = "0" + minutes;
        }
        hours += minutes.toString();
        return hours;
    }

    function formatString() {

        var s = arguments[0];
        for (var i = 0; i < arguments.length - 1; i++) {
            var reg = new RegExp("\\{" + i + "\\}", "gm");
            s = s.replace(reg, arguments[i + 1]);
        }

        return s;
    }

    function GetFormatedDate(GetDateFor) {
        var returnVal = '';
        if (GetDateFor == 'today') {
            returnVal = Date.today().toString('yyyy-MM-dd')
        }
        else if (parseInt(GetDateFor) != NaN && parseInt(GetDateFor) > 0) {
            returnVal = Date.today().add(parseInt(GetDateFor)).days().toString('yyyy-MM-dd');
        }

        return returnVal;
    }

    function GetFormatedDisplayHours(strhours) {
        var returnVal = '';
        if ($.trim(strhours) != '') {
            var strdispHours = new String(strhours);
            var strloopcounter = 0;
            while (strloopcounter <= strdispHours.length) {
                if (strloopcounter == 1) {
                    returnVal += strdispHours.charAt(strloopcounter) + ':';
                }
                else {
                    returnVal += strdispHours.charAt(strloopcounter);
                }
                strloopcounter += 1;
            }
        }

        return returnVal;
    }

    function GetFormatedServiceUrl(baseServiceUrl, storeId, deptId, startDate, endDate) {

        var returnVal = baseServiceUrl;
        if (baseServiceUrl != null && baseServiceUrl != '') {
            returnVal += '?' + BuildQueryString(storeId, deptId, startDate, endDate);
        }

        return returnVal;

    }

    function BuildQueryString(storeId, deptId, startDate, endDate) {

        var returnVal = '';
        var jsonPparm = '&method=?';

        if (storeId != null) {
            returnVal += 'storeid=' + storeId.toString();
        }

        if (deptId != null && deptId != '' && returnVal != '') {
            returnVal += '&deptId=' + deptId.toString();
        }
        else if (deptId != null && deptId != '') {
            returnVal += 'deptId=' + deptId.toString();
        }

        if (startDate != null && startDate != '' && returnVal != '') {
            returnVal += '&startDate=' + startDate.toString();
        }
        else if (startDate != null && startDate != '') {
            returnVal += 'startDate=' + startDate.toString();
        }

        if (endDate != null && endDate != '' && returnVal != '') {
            returnVal += '&endDate=' + endDate.toString();
        }
        else if (endDate != null && endDate != '') {
            returnVal += 'endDate=' + endDate.toString();
        }

        if (returnVal != '') {
            returnVal += jsonPparm; // '&jsonPparm=?';
        }
        return returnVal;
    }

    window.timerID = window.setInterval(BusinessHourCounterFlasher, 60000);

    function BusinessHourCounterFlasher() {
        var currentdisplayTimer = $('#BHCounterText').children('b:lt(1)').text();
        if (window.IsBusinessDayCounterDone && currentdisplayTimer != '') {
            if (window.TimeLeftToOpen != '') {
                //var currentDisplayTime = window.TimeLeftToOpen;
                window.TimeLeftToOpen = reCalculareFlasherTime(currentdisplayTimer, 60);
                $('#BHCounterText').children('b:lt(1)').text(GetFormatedDisplayHours(window.TimeLeftToOpen))
            }
            else if (window.TimeLeftToColse != '') {
                window.TimeLeftToColse = reCalculareFlasherTime(currentdisplayTimer, 60);
                $('#BHCounterText').children('b:lt(1)').text(GetFormatedDisplayHours(window.TimeLeftToColse))
            }
        }
    }

    function ClearusinessHourCounterFlasher() {
        if (window.timerID != '') {
            window.clearInterval(window.timerID);
            window.timerID = '';
            window.IsBusinessDayCounterDone = false;
        }
    }

    function reCalculareFlasherTime(currentDisplayTime, flasherInterval) {

        var returnVal = '';
        var arrStartTime = currentDisplayTime.split(':');
        var arrEndTime = flasherInterval;
        var currentTimeSeconds = (trimLeadingZero(arrStartTime[0]) > 0 ? Math.round(trimLeadingZero(arrStartTime[0]) * 3600) : 0) + (trimLeadingZero(arrStartTime[1]) > 0 ? Math.round(trimLeadingZero(arrStartTime[1]) * 60) : 0);

        var returnTimeMinutes = ((currentTimeSeconds - flasherInterval) > 0 ? (currentTimeSeconds - flasherInterval) / 60 : 0);

        var hours = 0;
        var minutes = 0;
        if (returnTimeMinutes > 60) {
            hours = Math.floor(returnTimeMinutes / 60);
            minutes = (returnTimeMinutes % 60);
            returnVal = FormatTime(hours, minutes.toString());
        }
        else {
            returnVal = FormatTime('00', returnTimeMinutes.toString());
        }

        if (returnVal == '00' || returnVal == '000' || returnVal == '000') {
            returnVal = '0000';
            ClearusinessHourCounterFlasher();
        }

        return returnVal;
    }

    //Generic function to call AXMX/WCF  Service
    function CallRestService(serviceurl, SuccessMethod, ServiceFailed) {
        $.ajax({
            async: true,
            type: Type, //'GET', //GET or POST or PUT or DELETE verb
            url: serviceurl, // Location of the service
            data: Data, //Data sent to server
            contentType: ContentType, // 'application/json; charset=utf-8', // content type sent to server
            dataType: DataType, //Expected data format from server
            processdata: ProcessData, //True or False
            success: SuccessMethod,
            error: ServiceFailed// When Service call fails
        });
    }
};
