﻿// ---------------------------------------------------------------------------------------------------------------
//  Routines to support segmentation in reporting.
//  This script requires framework.js to be added to the page prior to this script.
// ---------------------------------------------------------------------------------------------------------------

var Fields;
var Segments = new Array();
var SelectedSegment = 0;
var ReportNo = -1;
var SegmentationCategory = 0;
var SegmentationId = -1;
var UserAction = 'new';

//  Set up namespace and add all functions to namespace to prevent conflicts
NetApplications.Segmentation = {

    getFields: function () {
        if (!Fields) {
            Fields = eval("Fields = " + NetApplications.Ajax.getText('/services/filter.aspx?service=getfields&category=' + SegmentationCategory, false));
        }
    },

    getRegions: function (countryCode) {
        return eval("regions = " + NetApplications.Ajax.getText('/services/filter.aspx?service=getregions&countrycode=' + countryCode, false));
    },

    getCities: function (countryCode, regionCode) {
        return eval("cities = " + NetApplications.Ajax.getText('/services/filter.aspx?service=getcities&countrycode=' + countryCode + '&regioncode=' + regionCode, false));
    },

    getList: function (id) {
        return eval("list = " + NetApplications.Ajax.getText('/services/filter.aspx?service=getlist&id=' + id, false));
    },

    setDisplayHelp: function (html) {
        $("#displayHelp").html(html);
    },

    segmentSelected: function (segmentNo) {
        SelectedSegment = segmentNo;

        if (!Segments[segmentNo] && $('#segment' + segmentNo).val() != -1) {
            // create segment since user selected new field
            var seg = new Object();
            seg.numOpeningParenthesis = 0;
            seg.numClosingParenthesis = 0;
            seg.operator = '=';
            seg.conjunction = 'AND';
            seg.field = Fields[NetApplications.selectedValue('segment' + segmentNo)];
            seg.value = '';
            Segments.push(seg);
            SelectedSegment = 0;
            NetApplications.Segmentation.displaySegments();
            return;
        }

        Segments[segmentNo].value = '';
        Segments[segmentNo].field = Fields[NetApplications.selectedValue('segment' + segmentNo)];
        Segments[segmentNo].operator = NetApplications.selectedValue('operator' + segmentNo);
        NetApplications.Segmentation.setDisplayHelp(Segments[segmentNo].field.helptext);
        NetApplications.Segmentation.displaySegments();
    },

    getFieldSelect: function (segmentNo) {
        var fieldId;
        var ret = "<select onfocus=\"SelectedSegment = " + segmentNo + ";\" id=\"segment" + segmentNo + "\" onchange=\"NetApplications.Segmentation.segmentSelected(" + segmentNo + ")\">";

        if (segmentNo == null) {

            if (Segments.length == 0) {
                ret += "<option value=\"-1\">Select a criteria...</option>";
            }
            else {
                ret += "<option value=\"-1\">Add another criteria...</option>";
            }
        }
        else {
            fieldId = Segments[segmentNo].field.id;
        }

        for (var i = 0; i < Fields.length; i++) {
            ret += "<option value=\"" + i + "\"" + (fieldId == Fields[i].id ? " selected" : "") + ">" + Fields[i].name + "</option>";
        };
        return ret += "</select>";
    },

    setOperatorHelp: function (operator) {
        if (operator == 'LIKE') {
            NetApplications.Segmentation.setDisplayHelp('LIKE functions like EQUALS with wildcarding.  The supported wildcards are:<br>  *   - Any string of zero or more characters. <br>  ?   - Any single character. ');
        }

        if (operator == 'NOT LIKE') {
            NetApplications.Segmentation.setDisplayHelp('NOT LIKE functions like NOT EQUALS with wildcarding.  The supported wildcards are:<br>  *   - Any string of zero or more characters. <br>  ?   - Any single character. ');
        }
    },

    getOperatorSelect: function (segmentNo) {
        var fieldId = Segments[segmentNo].field.id;
        var ret = "<select onfocus=\"SelectedSegment = " + segmentNo + ";\" id=\"operator" + segmentNo + "\" " +
            "onchange=\"Segments[" + segmentNo + "].operator = NetApplications.selectedValue('operator" + segmentNo + "'); NetApplications.Segmentation.setOperatorHelp(Segments[" + segmentNo + "].operator); \">";
        var field = Segments[segmentNo].field;

        switch (Segments[segmentNo].field.type) {
            case FIELD_TYPE_STRING:
                ret += '<option value="="' + (Segments[segmentNo].operator == '=' ? " selected" : "") + ">Equal To</option>";
                ret += '<option value="<>"' + (Segments[segmentNo].operator == '<>' ? " selected" : "") + ">Not Equal To</option>";
                ret += '<option value="LIKE"' + (Segments[segmentNo].operator == 'LIKE' ? " selected" : "") + ">Like</option>";
                ret += '<option value="NOT LIKE"' + (Segments[segmentNo].operator == 'NOT LIKE' ? " selected" : "") + ">Not Like</option>";
                ret += '<option value=">"' + (Segments[segmentNo].operator == '>' ? " selected" : "") + ">&gt;</option>";
                ret += '<option value=">="' + (Segments[segmentNo].operator == '>=' ? " selected" : "") + ">&gt;=</option>";
                ret += '<option value="<"' + (Segments[segmentNo].operator == '<' ? " selected" : "") + ">&lt;</option>";
                ret += '<option value="<="' + (Segments[segmentNo].operator == '<=' ? " selected" : "") + ">&lt;=</option>";
                break;

            case FIELD_TYPE_DATE:
            case FIELD_TYPE_INT:
            case FIELD_TYPE_NUMERIC:
            case FIELD_TYPE_CURRENCY:
                ret += '<option value="="' + (Segments[segmentNo].operator == '=' ? " selected" : "") + ">Equal To</option>";
                ret += '<option value="<>"' + (Segments[segmentNo].operator == '<>' ? " selected" : "") + ">Not Equal To</option>";
                ret += '<option value=">"' + (Segments[segmentNo].operator == '>' ? " selected" : "") + ">&gt;</option>";
                ret += '<option value=">="' + (Segments[segmentNo].operator == '>=' ? " selected" : "") + ">&gt;=</option>";
                ret += '<option value="<"' + (Segments[segmentNo].operator == '<' ? " selected" : "") + ">&lt;</option>";
                ret += '<option value="<="' + (Segments[segmentNo].operator == '<=' ? " selected" : "") + ">&lt;=</option>";
                break;

            case FIELD_TYPE_CONTINENT:
            case FIELD_TYPE_CRC:
            case FIELD_TYPE_DMA:
            case FIELD_TYPE_LIST:
                ret += '<option value="="' + (Segments[segmentNo].operator == '=' ? " selected" : "") + ">Equal To</option>";
                ret += '<option value="<>"' + (Segments[segmentNo].operator == '<>' ? " selected" : "") + ">Not Equal To</option>";
                break;

            case FIELD_TYPE_BOOLEAN:
                ret += '<option value="="' + (Segments[segmentNo].operator == '=' ? " selected" : "") + ">Yes</option>";
                ret += '<option value="="' + (Segments[segmentNo].operator == '<>' ? " selected" : "") + ">No</option>";
                break;

            case FIELD_TYPE_TIME_OF_DAY:
                ret += '<option value="BETWEEN">Between</option>';
                break;

            default:
        }

        return ret += "</select>";
    },

    getConjunctionSelect: function (segmentNo) {
        if (segmentNo == 0) {
            return '';
        }
        return '<select onchange="Segments[' + segmentNo + '].conjunction = NetApplications.selectedValue(\'conjunction' + segmentNo + '\')" ' +
            'onfocus="SelectedSegment = ' + segmentNo + ';" id="conjunction' + segmentNo + '"><option value="AND">AND</option><option value="OR"' +
            (Segments[segmentNo].conjunction == 'OR' ? ' SELECTED' : '') + '>OR</option></select>';
    },

    getOperatorString: function (op) {
        var i;

        for (i = 0; i <= ALL_OPS.length - 1; i++) {
            if (op == ALL_OPS[i].id) {
                return ALL_OPS[i].data;
            }
        }
        return "=";
    },

    getListHtml: function (segmentNo, list, originalValue, tagName) {

        if (!tagName) {
            tagName = 'value';
        }

        if (!originalValue) {
            originalValue = Segments[segmentNo].value;
        }

        var ret = '<select onfocus="SelectedSegment = ' + segmentNo + ';" id="' + tagName + segmentNo +
            '" onchange="Segments[' + segmentNo + '].value = NetApplications.Segmentation.getValue(' + segmentNo + '); NetApplications.Segmentation.displaySegments()">';

        for (i = 0; i <= list.length - 1; i++) {
            ret += '<option value="' + list[i].data + '" ' + (originalValue == list[i].data ? ' selected' : '') + '>' + list[i].label + '</option>';
        }

        return ret + '</select>';
    },

    getValue: function (segmentNo) {
        var ret = '';

        switch (Segments[segmentNo].field.type) {

            case FIELD_TYPE_TIME_OF_DAY:
                var hour1 = $('#hour1-' + segmentNo).val();
                var hour2 = $('#hour2-' + segmentNo).val();

                if ($('#ampm1-' + segmentNo).val() == 'PM') {
                    hour1 = (parseInt(hour1) + 12).toString();
                }

                if ($('#ampm2-' + segmentNo).val() == 'PM') {
                    hour2 = (parseInt(hour2) + 12).toString();
                }

                return hour1 + $('#minute1-' + segmentNo).val() + hour2 + $('#minute2-' + segmentNo).val();

            case FIELD_TYPE_CRC:
                ret = $('#value' + segmentNo).val();

                if ($('#region' + segmentNo).val() != undefined && $('#region' + segmentNo).val() != '') {
                    ret += $('#region' + segmentNo).val();

                    if ($('#city' + segmentNo).val() != undefined && $('#city' + segmentNo).val() != '') {
                        ret += "!" + $('#city' + segmentNo).val();
                    }
                }
                return ret;

            default:
                return $('#value' + segmentNo).val();
        }
    },

    finish: function () {

        //  first validate form
        var s, openings = 0, closings = 0;

        if (Segments.length == 0) {
            alert("You have not defined a segment.  Press 'Cancel' to exit without defining a segment.");
            return;
        }

        //	Test that the proper parenthesis are set
        for (s = 0; s < Segments.length; s++) {

            openings += Segments[s].numOpeningParenthesis;
            closings += Segments[s].numClosingParenthesis;

            if (closings > openings) {
                alert("There are more closing parenthesis in the filter than opening parenthesis at segment " + (s + 1));
                return;
            }
        }

        if (closings != openings) {
            alert("The number of closing parenthesis in the filter does not match the number of opening parenthesis.");
            return;
        }

        //  check individual segments
        for (var i = 0; i < Segments.length; i++) {
            var segment = Segments[i];
            var field = segment.field;

            switch (segment.field.type) {
                case FIELD_TYPE_STRING:
                    if (segment.operator == "LIKE" || segment.operator == "NOT LIKE") {

                        if (segment.value.substr(0, 1) == "*" || segment.value.substr(0, 1) == "?" || segment.value.substr(0, 1) == "[") {
                            alert("A LIKE or NOT LIKE value cannot start with a wildcard character.");
                            return;
                        }
                    }

                    break;

                case FIELD_TYPE_INT:
                case FIELD_TYPE_NUMERIC:
                case FIELD_TYPE_CURRENCY:

                    //	Validate input is a number
                    if (isNaN(parseFloat(segment.value)) || !isFinite(segment.value)) {
                        alert("Input must be a number.");
                        return;
                    }
                    break;

                case FIELD_TYPE_CRC:
                    if ($('#value' + i).val() == "") {
                        alert("You must select a country for a country/region/city segment.");
                        return;
                    }
                    break;

                case FIELD_TYPE_DATE:

                    //	Validate input is a date
                    if ($('#value' + i).val() == '' || !NetApplications.validDate($('#value' + i).val())) {
                        alert("Please select a valid date in the form mm/dd/yyyy.");
                        return;
                    }
                    break;

                case FIELD_TYPE_TIME_OF_DAY:
                    if (parseInt(segment.value.substr(0, 4)) > parseInt(segment.value.substr(4, 4))) {
                        alert("The start time must be earlier than the end time.");
                        return;
                    }
                    break;

            }
        }

        //  if validation passes, refresh calling page with new filter
        var strReport = '';

        if (ReportNo > 1) {
            strReport = ReportNo;
        }

        url = window.location.pathname + window.location.search;

        if (UserAction == 'new') {
            url = NetApplications.setParam('qpafid' + strReport, '', url);
        }
        else {
            if (UserAction == 'update') {
                url = NetApplications.setParam('action', UserAction, url);
            }

            if (SegmentationId > -1) {
                url = NetApplications.setParam('qpafid' + strReport, SegmentationId, url);
            }
        }

        NetApplications.loadPage(NetApplications.setParam("qpaf" + strReport, NetApplications.Segmentation.getEncoding(), url, true));
    },

    getValueHtml: function (segmentNo) {
        var ret = '';

        switch (Segments[segmentNo].field.type) {
            case FIELD_TYPE_DATE:
                return '<input style=\"margin-top:-1px;\" onfocus="SelectedSegment = ' + segmentNo + ';" onchange="Segments[' + segmentNo + '].value = NetApplications.Segmentation.getValue(' + segmentNo + ');" ' +
                    'id="value' + segmentNo + '" value="' + Segments[segmentNo].value + '">' +
                    '<script>$("#value' + segmentNo + '").datepicker();</script>';

            case FIELD_TYPE_STRING:
            case FIELD_TYPE_INT:
            case FIELD_TYPE_NUMERIC:
            case FIELD_TYPE_CURRENCY:
                return '<input style=\"margin-top:-1px;\" onfocus="SelectedSegment = ' + segmentNo + ';" onchange="Segments[' + segmentNo + '].value = NetApplications.Segmentation.getValue(' + segmentNo + ');" ' +
                    'id="value' + segmentNo + '" value="' + Segments[segmentNo].value + '">';

            case FIELD_TYPE_CONTINENT:
                return NetApplications.Segmentation.getListHtml(segmentNo, CONTINENT_ARRAY);

            case FIELD_TYPE_DMA:
                return NetApplications.Segmentation.getListHtml(segmentNo, DMA_ARRAY);

            case FIELD_TYPE_CRC:
                ret = NetApplications.Segmentation.getListHtml(segmentNo, COUNTRY_ARRAY, Segments[segmentNo].value.substr(0, 2));

                if (Segments[segmentNo].value != '') {
                    ret += '<br>' + NetApplications.Segmentation.getListHtml(segmentNo, NetApplications.Segmentation.getRegions(Segments[segmentNo].value.substr(0, 2)), Segments[segmentNo].value.substr(2, 2), 'region');

                    if (Segments[segmentNo].value.length > 2) {

                        var city, regionCity = Segments[segmentNo].value.substr(4).split("!")

                        if (regionCity.length > 1) {
                            city = regionCity[1].replace('+', ' ');
                        }

                        ret += '<br>' + NetApplications.Segmentation.getListHtml(segmentNo,
                                NetApplications.Segmentation.getCities(Segments[segmentNo].value.substr(0, 2), Segments[segmentNo].value.substr(2, 2)), city, 'city');
                    }
                }
                return ret;

            case FIELD_TYPE_LIST:
                var array = NetApplications.Segmentation.getList(Segments[segmentNo].field.id);
                return NetApplications.Segmentation.getListHtml(segmentNo, array, Segments[segmentNo].value);

            case FIELD_TYPE_BOOLEAN:
                return '<input type="radio" id="value' + segmentNo + '" value="1" />Yes&nbsp; <input type="radio" id="value' + segmentNo + '" value="0" />No';
                break;

            case FIELD_TYPE_TIME_OF_DAY:
                var sHour = Segments[segmentNo].value.substr(0, 2);
                var eHour = Segments[segmentNo].value.substr(4, 2);
                var sMin = Segments[segmentNo].value.substr(2, 2);
                var eMin = Segments[segmentNo].value.substr(6, 2);
                var i2;

                //  start hour
                var ret = '<select onfocus="SelectedSegment = ' + segmentNo + ';" id="hour1-' + segmentNo +
                    '" onchange="Segments[' + segmentNo + '].value = NetApplications.Segmentation.getValue(' + segmentNo + ');">';

                for (i = 0; i < 12; i++) {
                    i2 = '0' + i.toString();

                    if (i2.length == 3) {
                        i2 = i2.substr(1);
                    }
                    ret += '<option value="' + i2 + '" ' + (sHour == i2 || parseInt(sHour) - 12 == i ? ' selected' : '') + '>' + (i == 0 ? "12" : i2) + '</option>';
                }
                ret += '</select>';

                //  start minute
                ret += ':<select onfocus="SelectedSegment = ' + segmentNo + ';" id="minute1-' + segmentNo +
                    '" onchange="Segments[' + segmentNo + '].value = NetApplications.Segmentation.getValue(' + segmentNo + ');">';

                for (i = 0; i < 60; i++) {
                    i2 = '0' + i.toString();

                    if (i2.length == 3) {
                        i2 = i2.substr(1, 2);
                    }
                    ret += '<option value="' + i2 + '" ' + (sMin == i2 ? ' selected' : '') + '>' + i2 + '</option>';
                }
                ret += '</select>';

                ret += '&nbsp; <select onfocus="SelectedSegment = ' + segmentNo + ';" id="ampm1-' + segmentNo +
                    '" onchange="Segments[' + segmentNo + '].value = NetApplications.Segmentation.getValue(' + segmentNo + ');">' +
                    '<option value="AM">AM</option><option value="PM" ' + (parseInt(sHour) >= 12 ? " selected" : "") + '>PM</option></select>';

                ret += '&nbsp; and&nbsp; ';

                //  end hour
                ret += '<select onfocus="SelectedSegment = ' + segmentNo + ';" id="hour2-' + segmentNo +
                    '" onchange="Segments[' + segmentNo + '].value = NetApplications.Segmentation.getValue(' + segmentNo + ');">';

                for (i = 0; i < 12; i++) {
                    i2 = '0' + i.toString();

                    if (i2.length == 3) {
                        i2 = i2.substr(1);
                    }
                    ret += '<option value="' + i2 + '" ' + (eHour == i2 || parseInt(eHour) - 12 == i ? ' selected' : '') + '>' + (i == 0 ? "12" : i2) + '</option>';
                }
                ret += '</select>';

                //  end minute
                ret += ':<select onfocus="SelectedSegment = ' + segmentNo + ';" id="minute2-' + segmentNo +
                    '" onchange="Segments[' + segmentNo + '].value = NetApplications.Segmentation.getValue(' + segmentNo + ');">';

                for (i = 0; i < 60; i++) {
                    i2 = '0' + i.toString();

                    if (i2.length == 3) {
                        i2 = i2.substr(1);
                    }

                    ret += '<option value="' + i2 + '" ' + (eMin == i2 ? ' selected' : '') + '>' + i2 + '</option>';
                }
                ret += '</select>';

                ret += '&nbsp; <select onfocus="SelectedSegment = ' + segmentNo + ';" id="ampm2-' + segmentNo +
                    '" onchange="Segments[' + segmentNo + '].value = NetApplications.Segmentation.getValue(' + segmentNo + ');">' +
                    '<option value="AM">AM</option><option value="PM"' + (parseInt(eHour) >= 12 ? " selected" : "") + '>PM</option></select>';

                return ret;

            default:
        }
    },

    getEncoding: function () {
        var ret = "", conj = "-";

        for (var i = 0; i < Segments.length; i++) {

            if (i > 0) {
                conj = Segments[i].conjunction.charAt(0);
            }

            ret += conj + Segments[i].numOpeningParenthesis.toString() +
    			Segments[i].numClosingParenthesis.toString() +
    			NetApplications.Segmentation.getOperatorId(Segments[i].operator).toString() + '%09' +
    			Segments[i].field.id + '%09' +
    			escape(NetApplications.Segmentation.getValue(i)) + '%0D';
        }
        return ret;
    },

    getOperatorId: function (op) {

        for (var i = 0; i < ALL_OPS.length; i++) {
            if (op == ALL_OPS[i].data) {
                return i;
            }
        }
        return 0;
    },

    displaySegments: function () {
        var segs = '', i = 0;

        NetApplications.Segmentation.getFields();

        //  display existing segment definitions
        if (Segments) {

            segs += '<table>';
            var style = 'padding:2px 2px 5px 2px;vertical-align:top;';

            for (i = 0; i < Segments.length; i++) {
                segs += '<tr>' +
                    '<td style="' + style + '"><a href="#" title="Delete this segment" onclick="NetApplications.Segmentation.deleteSegment(' + i + '); return false;"><img style="width:16px; height:16px" src="/images/delete.gif"></a></td>' +
                    '<td style="' + style + '"><span style="font-size:16px">' + NetApplications.Segmentation.repeat('(', Segments[i].numOpeningParenthesis) + '</span></td>' +
                    '<td style="' + style + '">' + NetApplications.Segmentation.getConjunctionSelect(i) + '</td>' +
                    '<td style="' + style + '">' + NetApplications.Segmentation.getFieldSelect(i) + '</td>' +
                    '<td style="' + style + '">' + NetApplications.Segmentation.getOperatorSelect(i) + '</td>' +
                    '<td style="' + style + '">' + NetApplications.Segmentation.getValueHtml(i) + '</td>' +
                    '<td style="' + style + '"><span style="font-size:16px">' + NetApplications.Segmentation.repeat(')', Segments[i].numClosingParenthesis) + '</span></td>' +
                    '</tr>';
            }
        }

        //  add new segment line
        segs += '<tr><td></td><td></td><td></td><td style="padding:2px" colspan="3">' + NetApplications.Segmentation.getFieldSelect() + '</td></tr>';

        segs += '</table>';

        $('#segments').html(segs);
    },

    populateSegments: function (filter) {
        var i, j, segs, vals, seg = new Object(), url;

        NetApplications.Segmentation.getFields();

        filter = unescape(filter);
        Segments = new Array();

        if (filter.length != 0) {
            segs = filter.split("\r");

            for (i = 0; i < segs.length; i++) {

                if (segs[i].length != 0) {

                    seg = new Object();

                    vals = segs[i].toString().substr(3).split("\t");

                    seg.conjunction = "";

                    if (segs[i].charAt(0) == "A") {
                        seg.conjunction = "AND";
                    }

                    if (segs[i].charAt(0) == "O") {
                        seg.conjunction = "OR";
                    }

                    seg.numOpeningParenthesis = parseInt(segs[i].charAt(1));
                    seg.numClosingParenthesis = parseInt(segs[i].charAt(2));
                    seg.operator = NetApplications.Segmentation.getOperatorString(vals[0]);

                    //  find the field
                    for (j = 0; j < Fields.length; j++) {
                        if (Fields[j].id == vals[1]) {
                            seg.field = Fields[j];
                            break;
                        }
                    }
                    seg.value = vals[2];
                    Segments.push(seg);
                }
            }
        }
    },

    deleteSegment: function (segmentNo) {
        Segments.splice(segmentNo, 1);
        NetApplications.Segmentation.displaySegments();
    },

    addOpeningParen: function () {
        Segments[SelectedSegment].numOpeningParenthesis += 1;
        NetApplications.Segmentation.displaySegments();
    },

    addClosingParen: function () {
        Segments[SelectedSegment].numClosingParenthesis += 1;
        NetApplications.Segmentation.displaySegments();
    },

    clearParens: function () {
        Segments[SelectedSegment].numOpeningParenthesis = 0;
        Segments[SelectedSegment].numClosingParenthesis = 0;
        NetApplications.Segmentation.displaySegments();
    },

    repeat: function (s, n) {
        var r = "";
        for (var a = 0; a < n; a++) r += s;
        return r;
    }
}

var FIELD_TYPE_STRING = '0';
var FIELD_TYPE_INT = '1';
var FIELD_TYPE_NUMERIC = '2';
var FIELD_TYPE_CURRENCY = '3';
var FIELD_TYPE_DATE = '4';
var FIELD_TYPE_CONTINENT = '5';
var FIELD_TYPE_CRC = '6';
var FIELD_TYPE_DMA = '7';
var FIELD_TYPE_TIME_OF_DAY = '8';
var FIELD_TYPE_LIST = '9';
var FIELD_TYPE_BOOLEAN = '10';

var EQUALITY_OPS = 0;
var STRING_OPS = 1;
var ARITHMETIC_OPS = 2;
var TIME_OPS = 3;
var BOOLEAN_OPS = 4;

var ALL_OPS = [{ label: "Equals", data: "=", id: 0 },
{ label: "Does Not Equal", data: "<>", id: 1 },
{ label: "Like", data: "LIKE", id: 2 },
{ label: "Not Like", data: "NOT LIKE", id: 3 },
{ label: "Is Greater Than", data: ">", id: 4 },
{ label: "Is Greater Than or Equals", data: ">=", id: 5 },
{ label: "Is Less Than", data: "<", id: 6 },
{ label: "Is Less Than or Equals", data: "<=", id: 7 },
{ label: "Between", data: "BETWEEN", id: 8}];

var DMA_ARRAY = [{ label: "Abilene-Sweetwater, TX", data: 662 },
{ label: "Albany, GA", data: 525 },
{ label: "Albany-Schenectady-Troy, NY", data: 532 },
{ label: "Albuquerque, NM", data: 790 },
{ label: "Alexandria, LA", data: 644 },
{ label: "Alpena, MI", data: 583 },
{ label: "Amarillo, TX", data: 634 },
{ label: "Anchorage, AK", data: 743 },
{ label: "Anniston, AL", data: 646 },
{ label: "Atlanta, GA", data: 524 },
{ label: "Augusta, GA", data: 520 },
{ label: "Austin, TX", data: 635 },
{ label: "Bakersfield, CA", data: 800 },
{ label: "Baltimore, MD", data: 512 },
{ label: "Bangor, ME", data: 537 },
{ label: "Baton Rouge, LA", data: 716 },
{ label: "Beaumont-Port Author, TX", data: 692 },
{ label: "Bend, OR", data: 821 },
{ label: "Billings, MT", data: 756 },
{ label: "Biloxi-Gulfport, MS", data: 746 },
{ label: "Binghamton, NY", data: 502 },
{ label: "Birmingham, AL", data: 630 },
{ label: "Bluefield-Beckley-Oak Hill, WV", data: 559 },
{ label: "Boise, ID", data: 757 },
{ label: "Boston, MA", data: 506 },
{ label: "Bowling Green, KY", data: 736 },
{ label: "Buffalo, NY", data: 514 },
{ label: "Burlington, VT", data: 523 },
{ label: "Butte-Bozeman, MT", data: 754 },
{ label: "Casper-Riverton, WY", data: 767 },
{ label: "Cedar Rapids-Waterloo, IA", data: 637 },
{ label: "Champaign-Springfield-Decatur, IL", data: 648 },
{ label: "Charleston, SC", data: 519 },
{ label: "Charleston-Huntington, WV", data: 564 },
{ label: "Charlotte, NC", data: 517 },
{ label: "Charlottesville, VA", data: 584 },
{ label: "Chattanooga, TN", data: 575 },
{ label: "Cheyenne, WY", data: 759 },
{ label: "Chicago, IL", data: 602 },
{ label: "Chico-Redding, CA", data: 868 },
{ label: "Cincinnati, OH", data: 515 },
{ label: "Clarksburg-Weston, WV", data: 598 },
{ label: "Cleveland, OH", data: 510 },
{ label: "Colorado Springs, CO", data: 752 },
{ label: "Columbia, SC", data: 546 },
{ label: "Columbia-Jefferson City, MO", data: 604 },
{ label: "Columbus, GA", data: 522 },
{ label: "Columbus, OH", data: 535 },
{ label: "Columbus-Tupelo-West Point, MS", data: 673 },
{ label: "Corpus Christi, TX", data: 600 },
{ label: "Dallas-Fort Worth, TX", data: 623 },
{ label: "Davenport-Rock Island-Moline, IL", data: 682 },
{ label: "Dayton, OH", data: 542 },
{ label: "Denver, CO", data: 751 },
{ label: "Des Moines, IA", data: 679 },
{ label: "Detroit, MI", data: 505 },
{ label: "Dothan, AL", data: 606 },
{ label: "Duluth, MN", data: 676 },
{ label: "El Paso, TX", data: 765 },
{ label: "Elmira, NY", data: 565 },
{ label: "Erie, PA", data: 516 },
{ label: "Eugene, OR", data: 801 },
{ label: "Eureka, CA", data: 802 },
{ label: "Evansville, IN", data: 649 },
{ label: "Fairbanks, AK", data: 745 },
{ label: "Fargo-Valley City, ND", data: 724 },
{ label: "Flint, MI", data: 513 },
{ label: "Florence-Myrtle Beach, SC", data: 570 },
{ label: "Fresno, CA", data: 866 },
{ label: "Ft Myers, FL", data: 571 },
{ label: "Ft Smith-Fay-Springfield, AR", data: 670 },
{ label: "Ft Wayne, IN", data: 509 },
{ label: "Gainesville, FL", data: 592 },
{ label: "Glendive, MT", data: 798 },
{ label: "Grand Junction, CO", data: 773 },
{ label: "Grand Rapids, MI", data: 563 },
{ label: "Great Falls, MT", data: 755 },
{ label: "Green Bay-Appleton, WI", data: 658 },
{ label: "Greensboro, NC", data: 518 },
{ label: "Greenville-New Bern-Washington, NC", data: 545 },
{ label: "Greenville-Spartenburg, SC", data: 567 },
{ label: "Greenwood-Greenville, MS", data: 647 },
{ label: "Harlingen, TX", data: 636 },
{ label: "Harrisburg-Lancaster-Lebanon-York, PA", data: 566 },
{ label: "Harrisonburg, VA", data: 569 },
{ label: "Hartford, CT", data: 533 },
{ label: "Hattiesburg-Laurel, MS", data: 710 },
{ label: "Helena, MT", data: 766 },
{ label: "Honolulu, HI", data: 744 },
{ label: "Houston, TX", data: 618 },
{ label: "Huntsville, AL", data: 691 },
{ label: "Idaho Falls-Pocatello, ID", data: 758 },
{ label: "Indianapolis, IN", data: 527 },
{ label: "Jackson, MS", data: 718 },
{ label: "Jackson, TN", data: 639 },
{ label: "Jacksonville, FL", data: 561 },
{ label: "Johnstown-Altoona, PA", data: 574 },
{ label: "Jonesboro, AR", data: 734 },
{ label: "Joplin-Pittsburg, MO", data: 603 },
{ label: "Juneau, AK", data: 747 },
{ label: "Kansas City, MO", data: 616 },
{ label: "Knoxville, TN", data: 557 },
{ label: "La Crosse-Eau Claire, WI", data: 702 },
{ label: "Lafayette, IN", data: 582 },
{ label: "Lafayette, LA", data: 642 },
{ label: "Lake Charles, LA", data: 643 },
{ label: "Lansing, MI", data: 551 },
{ label: "Laredo, TX", data: 749 },
{ label: "Las Vegas, NV", data: 839 },
{ label: "Lexington, KY", data: 541 },
{ label: "Lima, OH", data: 558 },
{ label: "Lincoln-Hastings, NE", data: 722 },
{ label: "Little Rock-Pine Bluff, AR", data: 693 },
{ label: "Los Angeles, CA", data: 803 },
{ label: "Louisville, KY", data: 529 },
{ label: "Lubbock, TX", data: 651 },
{ label: "Macon, GA", data: 503 },
{ label: "Madison, WI", data: 669 },
{ label: "Mankato, MN", data: 737 },
{ label: "Marquette, MI", data: 553 },
{ label: "Medford-Klamath Falls, OR", data: 813 },
{ label: "Memphis, TN", data: 640 },
{ label: "Meridian, MS", data: 711 },
{ label: "Miami, FL", data: 528 },
{ label: "Milwaukee, WI", data: 617 },
{ label: "Minneapolis-St Paul, MN", data: 613 },
{ label: "Minot-Bismarck-Dickinson, ND", data: 687 },
{ label: "Missoula, MT", data: 762 },
{ label: "Mobile, AL", data: 686 },
{ label: "Monroe, LA", data: 628 },
{ label: "Monterey-Salinas, CA", data: 828 },
{ label: "Montgomery, AL", data: 698 },
{ label: "Nashville, TN", data: 659 },
{ label: "New Orleans, LA", data: 622 },
{ label: "New York, NY", data: 501 },
{ label: "Norfolk-Portsmouth, VA", data: 544 },
{ label: "North Platte, NE", data: 740 },
{ label: "Odessa-Midland, TX", data: 633 },
{ label: "Oklahoma City, OK", data: 650 },
{ label: "Omaha, NE", data: 652 },
{ label: "Orlando, FL", data: 534 },
{ label: "Ottumwa-Kirksville, IA", data: 631 },
{ label: "Paducah, KY", data: 632 },
{ label: "Palm Springs, CA", data: 804 },
{ label: "Panama City, FL", data: 656 },
{ label: "Parkersburg, WV", data: 597 },
{ label: "Peoria-Bloomington, IL", data: 675 },
{ label: "Philadelphia, PA", data: 504 },
{ label: "Phoenix, AZ", data: 753 },
{ label: "Pittsburgh, PA", data: 508 },
{ label: "Portland, OR", data: 820 },
{ label: "Portland-Auburn, ME", data: 500 },
{ label: "Presque Isle, ME", data: 552 },
{ label: "Providence, RI", data: 521 },
{ label: "Quincy, IL", data: 717 },
{ label: "Raleigh-Durham, NC", data: 560 },
{ label: "Rapid City, SD", data: 764 },
{ label: "Reno, NV", data: 811 },
{ label: "Richmond-Petersburg, VA", data: 556 },
{ label: "Roanoke-Lynchburg, VA", data: 573 },
{ label: "Rochester, NY", data: 538 },
{ label: "Rochester-Mason City-Austin, MN", data: 611 },
{ label: "Rockford, IL", data: 610 },
{ label: "Sacramento, CA", data: 862 },
{ label: "Salisbury, MD", data: 576 },
{ label: "Salt Lake City, UT", data: 770 },
{ label: "San Angelo, TX", data: 661 },
{ label: "San Antonio, TX", data: 641 },
{ label: "San Diego, CA", data: 825 },
{ label: "San Francisco, CA", data: 807 },
{ label: "Santa Barbara, CA", data: 855 },
{ label: "Savannah, GA", data: 507 },
{ label: "Seattle-Tacoma, WA", data: 819 },
{ label: "Sherman, TX", data: 657 },
{ label: "Shreveport, LA", data: 612 },
{ label: "Sioux City, IA", data: 624 },
{ label: "Sioux Falls, SD", data: 725 },
{ label: "South Bend, IN", data: 588 },
{ label: "Spokane, WA", data: 881 },
{ label: "Springfield, MO", data: 619 },
{ label: "Springfield-Holyoke, MA", data: 543 },
{ label: "St Joseph, MO", data: 638 },
{ label: "St Louis, MO", data: 609 },
{ label: "Syracuse, NY", data: 555 },
{ label: "Tallahassee, FL", data: 530 },
{ label: "Tampa, FL", data: 539 },
{ label: "Terre Haute, IN", data: 581 },
{ label: "Toledo, OH", data: 547 },
{ label: "Topeka, KS", data: 605 },
{ label: "Traverse City-Cadillac, MI", data: 540 },
{ label: "Tri-Cities, TN", data: 531 },
{ label: "Tucson, AZ", data: 789 },
{ label: "Tulsa, OK", data: 671 },
{ label: "Tuscaloosa, AL", data: 620 },
{ label: "Twin Falls, ID", data: 760 },
{ label: "Tyler-Longview, TX", data: 709 },
{ label: "Utica-Rome, NY", data: 526 },
{ label: "Victoria, TX", data: 626 },
{ label: "Waco-Temple-Bryan, TX", data: 625 },
{ label: "Washington, DC", data: 511 },
{ label: "Watertown, NY", data: 549 },
{ label: "Wausau-Rhinelander, WI", data: 705 },
{ label: "West Palm Beach, FL", data: 548 },
{ label: "Wheeling, WV", data: 554 },
{ label: "Wichita Falls, TX", data: 627 },
{ label: "Wichita, KS", data: 678 },
{ label: "Wilkes Barre-Scranton, PA", data: 577 },
{ label: "Wilmington, NC", data: 550 },
{ label: "Yakima-Pasco, WA", data: 810 },
{ label: "Youngstown-Warren, OH", data: 536 },
{ label: "Yuma, AZ", data: 771 },
{ label: "Zanesville, OH", data: 596}];

var CONTINENT_ARRAY = [{ label: "North America", data: 0 },
{ label: "Europe", data: 1 },
{ label: "Australia", data: 5 },
{ label: "Asia", data: 2 },
{ label: "South America", data: 3 },
{ label: "Africa", data: 4}];

var COUNTRY_ARRAY = [{ label: "[ Select a Country]", data: "" },
{ label: "USA", data: "US" },
{ label: "Afghanistan", data: "AF" },
{ label: "Albania", data: "AL" },
{ label: "Algeria", data: "DZ" },
{ label: "American Samoa", data: "AS" },
{ label: "Andorra", data: "AD" },
{ label: "Angola", data: "AO" },
{ label: "Anguilla", data: "AI" },
{ label: "Anonymous Proxy", data: "A1" },
{ label: "Antarctica", data: "AQ" },
{ label: "Antigua and Barbuda", data: "AG" },
{ label: "Argentina", data: "AR" },
{ label: "Armenia", data: "AM" },
{ label: "Aruba", data: "AW" },
{ label: "Asia/Pacific Region", data: "AP" },
{ label: "Australia", data: "AU" },
{ label: "Austria", data: "AT" },
{ label: "Azerbaijan", data: "AZ" },
{ label: "Bahamas", data: "BS" },
{ label: "Bahrain", data: "BH" },
{ label: "Bangladesh", data: "BD" },
{ label: "Barbados", data: "BB" },
{ label: "Belarus", data: "BY" },
{ label: "Belgium", data: "BE" },
{ label: "Belize", data: "BZ" },
{ label: "Benin", data: "BJ" },
{ label: "Bermuda", data: "BM" },
{ label: "Bhutan", data: "BT" },
{ label: "Bolivia", data: "BO" },
{ label: "Bosnia Herzogovina", data: "BA" },
{ label: "Botswana", data: "BW" },
{ label: "Bouvet Island", data: "BV" },
{ label: "Brazil", data: "BR" },
{ label: "British Indian Ocean Territory", data: "IO" },
{ label: "Brunei Darussalam", data: "BN" },
{ label: "Bulgaria", data: "BG" },
{ label: "Burkina Faso", data: "BF" },
{ label: "Burundi", data: "BI" },
{ label: "Cambodia", data: "KH" },
{ label: "Cameroon", data: "CM" },
{ label: "Canada", data: "CA" },
{ label: "Cape Verde", data: "CV" },
{ label: "Cayman Islands", data: "KY" },
{ label: "Central African Rep.", data: "CF" },
{ label: "Chad", data: "TD" },
{ label: "Chile", data: "CL" },
{ label: "China", data: "CN" },
{ label: "Christmas Island", data: "CX" },
{ label: "Cocos Islands", data: "CC" },
{ label: "Colombia", data: "CO" },
{ label: "Comoros", data: "KM" },
{ label: "Congo", data: "CG" },
{ label: "Cook Islands", data: "CK" },
{ label: "Costa Rica", data: "CR" },
{ label: "Cote D'Ivoire", data: "CI" },
{ label: "Croatia", data: "HR" },
{ label: "Cuba", data: "CU" },
{ label: "Cyprus", data: "CY" },
{ label: "Czech Republic", data: "CZ" },
{ label: "Dem. Rep. of Congo", data: "CD" },
{ label: "Denmark", data: "DK" },
{ label: "Djibouti", data: "DJ" },
{ label: "Dominica", data: "DM" },
{ label: "Dominican Republic", data: "DO" },
{ label: "East Timor", data: "TP" },
{ label: "Ecuador", data: "EC" },
{ label: "Egypt", data: "EG" },
{ label: "El Salvador", data: "SV" },
{ label: "Equatorial Guinea", data: "GQ" },
{ label: "Eritrea", data: "ER" },
{ label: "Estonia", data: "EE" },
{ label: "Ethiopia", data: "ET" },
{ label: "Europe", data: "EU" },
{ label: "Falkland Islands (Malvinas)", data: "FK" },
{ label: "Faroe Islands", data: "FO" },
{ label: "Fiji", data: "FJ" },
{ label: "Finland", data: "FI" },
{ label: "France", data: "FR" },
{ label: "France, Metropolitan", data: "FX" },
{ label: "French Guyana", data: "GF" },
{ label: "French Polynesia", data: "PF" },
{ label: "French Southern Territories", data: "TF" },
{ label: "Gabon", data: "GA" },
{ label: "Gambia", data: "GM" },
{ label: "Georgia", data: "GE" },
{ label: "Germany", data: "DE" },
{ label: "Ghana", data: "GH" },
{ label: "Gibraltar", data: "GI" },
{ label: "Greece", data: "GR" },
{ label: "Greenland", data: "GL" },
{ label: "Grenada", data: "GD" },
{ label: "Guadeloupe", data: "GP" },
{ label: "Guam", data: "GU" },
{ label: "Guatemala", data: "GT" },
{ label: "Guinea", data: "GN" },
{ label: "Guinea-Bissau", data: "GW" },
{ label: "Guyana", data: "GY" },
{ label: "Haiti", data: "HT" },
{ label: "Heard Island and McDonald Islands", data: "HM" },
{ label: "Holy See (Vatican City State)", data: "VA" },
{ label: "Honduras", data: "HN" },
{ label: "Hong Kong", data: "HK" },
{ label: "Hungary", data: "HU" },
{ label: "Iceland", data: "IS" },
{ label: "India", data: "IN" },
{ label: "Indonesia", data: "ID" },
{ label: "Iran", data: "IR" },
{ label: "Iraq", data: "IG" },
{ label: "Ireland", data: "IE" },
{ label: "Israel", data: "IL" },
{ label: "Italy", data: "IT" },
{ label: "Jamaica", data: "JM" },
{ label: "Japan", data: "JP" },
{ label: "Jordan", data: "JO" },
{ label: "Kazakhstan", data: "KZ" },
{ label: "Kenya", data: "KE" },
{ label: "Kiribati", data: "KI" },
{ label: "Kuwait", data: "KW" },
{ label: "Kyrgyzstan", data: "KG" },
{ label: "Lao People's Democratic Republic", data: "LA" },
{ label: "Latvia", data: "LV" },
{ label: "Lebanon", data: "LB" },
{ label: "Lesotho", data: "LS" },
{ label: "Liberia", data: "LR" },
{ label: "Libya", data: "LY" },
{ label: "Liechtenstein", data: "LI" },
{ label: "Lithuania", data: "LT" },
{ label: "Luxembourg", data: "LU" },
{ label: "Macau", data: "MO" },
{ label: "Macedonia", data: "MK" },
{ label: "Madagascar", data: "MG" },
{ label: "Malawi", data: "MW" },
{ label: "Malaysia", data: "MY" },
{ label: "Maldives", data: "MV" },
{ label: "Mali", data: "ML" },
{ label: "Malta", data: "MT" },
{ label: "Marshall Islands", data: "MH" },
{ label: "Martinique", data: "MQ" },
{ label: "Mauritania", data: "MR" },
{ label: "Mauritius", data: "MU" },
{ label: "Mayotte", data: "YT" },
{ label: "Mexico", data: "MX" },
{ label: "Micronesia", data: "FM" },
{ label: "Moldova", data: "MD" },
{ label: "Monaco", data: "MC" },
{ label: "Mongolia", data: "MN" },
{ label: "Montserrat", data: "MS" },
{ label: "Morocco", data: "MA" },
{ label: "Mozambique", data: "MZ" },
{ label: "Myanmar", data: "MM" },
{ label: "Namibia", data: "NA" },
{ label: "Nauru", data: "NR" },
{ label: "Nepal", data: "NP" },
{ label: "Netherlands", data: "NL" },
{ label: "Netherlands Antilles", data: "AN" },
{ label: "New Caledonia", data: "NC" },
{ label: "New Zealand", data: "NZ" },
{ label: "Nicaragua", data: "NI" },
{ label: "Niger", data: "NE" },
{ label: "Nigeria", data: "NG" },
{ label: "Niue", data: "NU" },
{ label: "Norfolk Island", data: "NF" },
{ label: "North Korea", data: "KP" },
{ label: "Northern Mariana Islands", data: "MP" },
{ label: "Norway", data: "NO" },
{ label: "Oman", data: "OM" },
{ label: "Other", data: "O1" },
{ label: "Pakistan", data: "PK" },
{ label: "Palau", data: "PW" },
{ label: "Palestinian Territory", data: "PS" },
{ label: "Panama", data: "PA" },
{ label: "Papua New Guinea", data: "PG" },
{ label: "Paraguay", data: "PY" },
{ label: "Peru", data: "PE" },
{ label: "Philippines", data: "PH" },
{ label: "Pitcairn", data: "PN" },
{ label: "Poland", data: "PL" },
{ label: "Portugal", data: "PT" },
{ label: "Puerto Rico", data: "PR" },
{ label: "Qatar", data: "QA" },
{ label: "Reunion", data: "RE" },
{ label: "Romania", data: "RO" },
{ label: "Russia", data: "RU" },
{ label: "Rwanda", data: "RW" },
{ label: "Saint Helena", data: "SH" },
{ label: "Saint Kitts and Nevis", data: "KN" },
{ label: "Saint Lucia", data: "LC" },
{ label: "Saint Pierre and Miquelon", data: "PM" },
{ label: "Saint Vincent and the Grenadines", data: "VC" },
{ label: "Samoa", data: "WS" },
{ label: "San Marino", data: "SM" },
{ label: "Sao Tome and Principe", data: "ST" },
{ label: "Satellite Provider", data: "A2" },
{ label: "Saudi Arabia", data: "SA" },
{ label: "Senegal", data: "SN" },
{ label: "Seychelles", data: "SC" },
{ label: "Sierra Leone", data: "SL" },
{ label: "Singapore", data: "SG" },
{ label: "Slovakia", data: "SK" },
{ label: "Slovenia", data: "SI" },
{ label: "Solomon Islands", data: "SB" },
{ label: "Somalia", data: "SO" },
{ label: "South Africa", data: "ZA" },
{ label: "South Georgia and the South Sandwich Islands", data: "GS" },
{ label: "South Korea", data: "KR" },
{ label: "Spain", data: "ES" },
{ label: "Sri Lanka", data: "LK" },
{ label: "Sudan", data: "SD" },
{ label: "Suriname", data: "SR" },
{ label: "Svalbard and Jan Mayen", data: "SJ" },
{ label: "Swaziland", data: "SZ" },
{ label: "Sweden", data: "SE" },
{ label: "Switzerland", data: "CH" },
{ label: "Syria", data: "SY" },
{ label: "Taiwan", data: "TW" },
{ label: "Tajikistan", data: "TJ" },
{ label: "Tanzania", data: "TZ" },
{ label: "Thailand", data: "TH" },
{ label: "Togo", data: "TG" },
{ label: "Tokelau", data: "TK" },
{ label: "Tonga", data: "TO" },
{ label: "Trinidad & Tobago", data: "TT" },
{ label: "Tunisia", data: "TN" },
{ label: "Turkey", data: "TR" },
{ label: "Turkmenistan", data: "TM" },
{ label: "Turks and Caicos Islands", data: "TC" },
{ label: "Tuvalu", data: "TV" },
{ label: "Uganda", data: "UG" },
{ label: "Ukraine", data: "UA" },
{ label: "United Arab Emirates", data: "AE" },
{ label: "United Kingdom", data: "UK" },
{ label: "United States Minor Outlying Islands", data: "UM" },
{ label: "Uruguay", data: "UY" },
{ label: "USA", data: "US" },
{ label: "Uzbekistan", data: "UZ" },
{ label: "Vanuatu", data: "VU" },
{ label: "Venezuela", data: "VE" },
{ label: "Vietnam", data: "VN" },
{ label: "Virgin Islands (Br.)", data: "VG" },
{ label: "Virgin Islands, U.S.", data: "VI" },
{ label: "Wallis and Futuna", data: "WF" },
{ label: "Western Sahara", data: "EH" },
{ label: "Yemen", data: "YE" },
{ label: "Yugoslavia", data: "YU" },
{ label: "Zaire", data: "ZR" },
{ label: "Zambia", data: "ZM" },
{ label: "Zimbabwe", data: "ZW" }
];

