// An object to keep track of event type metadata.
AnalyticsEvent.TYPES = {

    HEALTHWISE_LINK:    {
                            LABEL: 'healthwiseLink',
                            PARAMETERS: {
                                CONSUMER_TERM: 'consumerTerm'
                            }
                        },
    
    EXTERNAL_LINK:      {
                            LABEL: 'externalLink',
                            PARAMETERS: {
                                URL: 'url',
                                LABEL: 'label'
                            }
                        },

    APPLICATION_LOAD:   {
                            LABEL: 'sessionStart',
                            PARAMETERS: {
                                REFERRER: 'referrer',
                                IS_SECURE: 'isSecure',
                                CLIENT_REFERRER_CODE: 'clientReferrerCode'
                            }
                        },

    PROVIDER_SEARCH:    {
                            LABEL: 'providerSearch',
                            FILTER: ['maxRows', 'sortBy'],
                            PARAMETERS: {
                                // ProviderSearch parameters
                                PROVIDER      : 'providerType',
                                PLAN          : 'plan',
                                NETWORK       : 'network',
                                NAME          : 'name',
                                IS_ACCEPTING  : 'isAcceptingNewPatients',
                                GENDER        : 'gender',
                                LANGUAGE      : 'language',
                                ISSUE         : 'condProcSurgId',
                                SPECIALTY     : 'specialtyCategoriesType',
                                DISTANCE      : 'distance',
                                ADDRESS       : 'address',
                                CITY          : 'city',
                                COUNTY        : 'county',
                                STATE         : 'state',
                                ZIP           : 'zip',
                                HOSPITAL      : 'hospitalAffiliation',
                                IS_CERTIFIED  : 'isBoardCertified',
                                IS_PCP        : 'isPCP',
                                IS_EXCELLENT  : 'isBlueDistinctionCenterOfExcellence',
                                IS_IN_NETWORK : 'isInNetwork',
                                IS_ACCREDITED : 'isAccreditedFacility',
                                IS_SECURE     : 'isSecure',
                                PREFIX        : 'prefix',
                                PRODUCT       : 'product',

                                // Human-readable labels
                                PROVIDER_LABEL  : 'providerTypeLabel',
                                PLAN_LABEL      : 'planLabel',
                                NETWORK_LABEL   : 'networkLabel',
                                LANGUAGE_LABEL  : 'languageLabel',
                                ISSUE_LABEL     : 'condProcSurgIdLabel',
                                SPECIALTY_LABEL : 'specialtyCategoriesTypeLabel',
                                HOSPITAL_LABEL  : 'hospitalAffiliationLabel',
                                PRODUCT_LABEL   : 'productLabel'
                            }
                        },

    APPLICATION_UNLOAD: {
                            LABEL: 'sessionEnd'
                        }
};



/* An event for application load */
ApplicationLoadEvent.superclass = AnalyticsEvent;
function ApplicationLoadEvent() {

    // Parameter names for an ApplicationLoad event.
    var PARAMETER_NAMES = AnalyticsEvent.TYPES.APPLICATION_LOAD.PARAMETERS;

    var parameters = {};
    var referrer = '';
    try {
        referrer = document.referrer || opener.location.href;
    } catch (e) {}
    parameters[AnalyticsEvent.TYPES.APPLICATION_LOAD.PARAMETERS.REFERRER] = referrer;

    arguments.callee.superclass.call(this, AnalyticsEvent.TYPES.APPLICATION_LOAD.LABEL, parameters);


    /* Set the secure status */
    this.SetSecureStatus = function (isSecure) {
        parameters[PARAMETER_NAMES.IS_SECURE] = isSecure;
    };

    /* Set the referrer code from the client link */
    this.SetClientReferrerCode = function(referrerCode) {
        parameters[PARAMETER_NAMES.CLIENT_REFERRER_CODE] = referrerCode;
    }
}
ApplicationLoadEvent.prototype = (function () {return new ApplicationLoadEvent.superclass()})();
ApplicationLoadEvent.prototype.constructor = ApplicationLoadEvent.superclass;


/* An event for a provider search */
ProviderSearchEvent.superclass = AnalyticsEvent;
function ProviderSearchEvent(parameters) {

    // Parameter names for a ProviderSearch event.
    var PARAMETER_NAMES = AnalyticsEvent.TYPES.PROVIDER_SEARCH.PARAMETERS;
    var PARAMETER_FILTER = AnalyticsEvent.TYPES.PROVIDER_SEARCH.FILTER;

    for (var i = 0, j = PARAMETER_FILTER.length; i < j; i++) {
        if (typeof parameters[PARAMETER_FILTER[i]] != "undefined") {
            delete parameters[PARAMETER_FILTER[i]];
        }
    }

    arguments.callee.superclass.call(this, AnalyticsEvent.TYPES.PROVIDER_SEARCH.LABEL, parameters);


    /* Set the secure status */
    this.SetSecureStatus = function (isSecure) {
        parameters[PARAMETER_NAMES.IS_SECURE] = isSecure;
    };


    /* Set the human-readable plan label. */
    this.SetPlanLabel = function (label) {
        parameters[PARAMETER_NAMES.PLAN_LABEL] = label;
    };


    /* Set the human-readable provider type label */
    this.SetProviderTypeLabel = function (label) {
        parameters[PARAMETER_NAMES.PROVIDER_LABEL] = label;
    };


    /* Set the human-readable health issue label */
    this.SetHealthIssueLabel = function (label) {
        parameters[PARAMETER_NAMES.ISSUE_LABEL] = label;
    };

    /* Set the human-readable search configuration labels 
       (decorator returned from GetSearchConfigurationDecorator webservice) */
    this.SetSearchConfigurationLabels = function (decorator) {

        // Iterate through the list of networks.
        var networkCode = parameters[PARAMETER_NAMES.NETWORK];
        var networkList = decorator.NetworkList;
        parameters[PARAMETER_NAMES.NETWORK_LABEL] = null;
        if (networkCode && networkList) {
            for (var i = 0, l = networkList.length; i < l; i++) {
                var networkData = networkList[i];
                if (networkData.Code === networkCode) {
                    parameters[PARAMETER_NAMES.NETWORK_LABEL] = networkData.Name;
                    break;
                }
            }
        }

        // Iterate through the list of languages.
        var languageCode = parameters[PARAMETER_NAMES.LANGUAGE];
        var languageList = decorator.LanguageList;
        parameters[PARAMETER_NAMES.LANGUAGE_LABEL] = null;
        if (languageCode && languageList) {
            for (var i = 0, l = languageList.length; i < l; i++) {
                var languageData = languageList[i];
                if (languageData.Code === languageCode) {
                    parameters[PARAMETER_NAMES.LANGUAGE_LABEL] = languageData.Name;
                    break;
                }
            }
        }

        // Iterate through the list of specialities.
        var specialityCode = parameters[PARAMETER_NAMES.SPECIALTY];
        var specialityList = decorator.SpecialtyCategoryList;
        parameters[PARAMETER_NAMES.SPECIALTY_LABEL] = null;
        if (specialityCode && specialityList) {
            for (var i = 0, l = specialityList.length; i < l; i++) {
                var specialityData = specialityList[i];
                if (specialityData.Code === specialityCode) {
                    parameters[PARAMETER_NAMES.SPECIALTY_LABEL] = specialityData.Name;
                    break;
                }
            }
        }

        // Iterate through the list of affiliated hospitals.
        var hospitalCode = parameters[PARAMETER_NAMES.HOSPITAL];
        var hospitalList = decorator.HosptialFacilityAffliations;
        parameters[PARAMETER_NAMES.HOSPITAL_LABEL] = null;
        if (hospitalCode && hospitalList) {
            for (var i = 0, l = hospitalList.length; i < l; i++) {
                var hospitalData = hospitalList[i];
                if (hospitalData.Code === hospitalCode) {
                    parameters[PARAMETER_NAMES.HOSPITAL_LABEL] = hospitalData.Name;
                    break;
                }
            }
        }

        // Iterate through the list of products (for national searches).
        var productCode = parameters[PARAMETER_NAMES.PRODUCT];
        parameters[PARAMETER_NAMES.PRODUCT_LABEL] = null;
        if (productCode) {
            var productList = decorator.ProductList;
            if (productCode && productList) {
                for (var i = 0, l = productList.length; i < l; i++) {
                    var productData = productList[i];
                    if (productData.Code === productCode) {
                        parameters[PARAMETER_NAMES.PRODUCT_LABEL] = productData.Name;
                        break;
                    }
                }
            }
        }
    };
}
ProviderSearchEvent.prototype = (function () {return new ProviderSearchEvent.superclass()})();
ProviderSearchEvent.prototype.constructor = ProviderSearchEvent.superclass;


/* An event for the end of the session. */
ApplicationUnloadEvent.superclass = AnalyticsEvent;
function ApplicationUnloadEvent() {
    arguments.callee.superclass.call(this, AnalyticsEvent.TYPES.APPLICATION_UNLOAD.LABEL);
}
ApplicationUnloadEvent.prototype = (function () {return new ApplicationUnloadEvent.superclass()})();
ApplicationUnloadEvent.prototype.constructor = ApplicationUnloadEvent.superclass;


/* An event for external link access */
ExternalLinkEvent.superclass = AnalyticsEvent;
function ExternalLinkEvent() {

    // Parameter names for an ApplicationLoad event.
    var PARAMETER_NAMES = AnalyticsEvent.TYPES.EXTERNAL_LINK.PARAMETERS;

    var parameters = {};

    arguments.callee.superclass.call(this, AnalyticsEvent.TYPES.EXTERNAL_LINK.LABEL, parameters);


    /* Set the secure status */
    this.SetUrl = function(url) {
        parameters[PARAMETER_NAMES.URL] = url;
    };
    this.SetLabel = function(label) {
        parameters[PARAMETER_NAMES.LABEL] = label;
    };
}
ExternalLinkEvent.prototype = (function() { return new ExternalLinkEvent.superclass() })();
ExternalLinkEvent.prototype.constructor = ExternalLinkEvent.superclass;


/* An event for healthwise link access */
HealthwiseLinkEvent.superclass = AnalyticsEvent;
function HealthwiseLinkEvent() {

    // Parameter names for an ApplicationLoad event.
    var PARAMETER_NAMES = AnalyticsEvent.TYPES.HEALTHWISE_LINK.PARAMETERS;

    var parameters = {};

    arguments.callee.superclass.call(this, AnalyticsEvent.TYPES.HEALTHWISE_LINK.LABEL, parameters);

    /* Set the consumer term */
    this.SetConsumerTerm = function(term) {
        parameters[PARAMETER_NAMES.CONSUMER_TERM] = term;
    };
    
    
}
HealthwiseLinkEvent.prototype = (function() { return new HealthwiseLinkEvent.superclass() })();
HealthwiseLinkEvent.prototype.constructor = HealthwiseLinkEvent.superclass;