HEX
Server: LiteSpeed
System: Linux cde2.duelhost.dk 4.18.0-553.34.1.lve.el8.x86_64 #1 SMP Thu Jan 9 16:30:32 UTC 2025 x86_64
User: dtptviut (1121)
PHP: 8.0.30
Disabled: exec,system,passthru,shell_exec,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Upload Files
File: /home/dtptviut/public_html/wp-content/plugins/comparisonfeed-wp/js/compare-admin.js
var filterAvailable = false;
var usingCustomOrder = false;
var usingIframe = false;
var feedOperators = [
    {
        operator: "lessThan",
        name: "less than or equal to"
    }, {
        operator: "greaterThan",
        name: "greater than or equal to"
    }, {
        operator: "equals",
        name: "equal to"
    }, {
        operator: "notEquals",
        name: "not equal to"
    }, {
        operator: "contains",
        name: "contains"
    }, {
        operator: "notContains",
        name: "not contains"
    }
];
var feedFields = [];
var feedFieldsCache = {};

jQuery(document).ready(function() {
    if (jQuery('#use-iframe').val() == 1) {
        usingIframe = true;
        jQuery('#use-iframe').prop('checked', true);
        jQuery('#as-iframe-options').show();
    } else {
        jQuery('#use-iframe').prop('checked', false);
    }

    if (jQuery('#show-filter').val() == 1) {
        jQuery('#show-filter').prop('checked', true);
    } else {
        jQuery('#show-filter').prop('checked', false);
    }

    if (jQuery('#include-new-campaigns').val() === 'true') {
        jQuery('#include-new-campaigns').prop('checked', true);
    } else {
        jQuery('#include-new-campaigns').prop('checked', false);
    }

    if (jQuery('#lazy-loading').val() === 'true') {
        jQuery('#lazy-loading').prop('checked', true);
    } else {
        jQuery('#lazy-loading').prop('checked', false);
    }

    initTpl();

    jQuery('#adservice-comparison-feed select#compare-account, #adservice-comparison-feed select#compare-template').change(function() {
        // Reset conditions when changing account/template.
        jQuery('#conditions').html('');
        jQuery('#adminTableHolder').attr('data-conditions', '');

        initTpl();
    });

    jQuery('.as-tab, .as-tab-link').click(function(){
        var anchor = jQuery(this).data('anchor');

        jQuery('.as-tab').removeClass('active');
        jQuery(anchor + '-tab').addClass('active');

        jQuery('.as-anchor').removeClass('active');
        jQuery(anchor).addClass('active');

        if (anchor === '#as-feed-builder') {
            // Hide the regular shortcode.
            jQuery('#adservice-comparison-feed .code-generated').hide();
            jQuery('#adservice-comparison-feed .legal-notice').hide();
        } else {
            // Show regular shortcode again if available.
            var account = jQuery('select#compare-account option:selected').data('country');
            var template = jQuery('select#compare-template option:selected').val();

            if ((account !== '' || account > 0) &&  template !== '0') {
                jQuery('#adservice-comparison-feed .code-generated').slideDown();
                jQuery('#adservice-comparison-feed .legal-notice').slideDown();
            }
        }
    });
});

function initTpl() {
    var publisher = jQuery('select#compare-account option:selected').val();
    var account = jQuery('select#compare-account option:selected').data('country');
    var accountName = jQuery('select#compare-account option:selected').data('accountname');
    var template = jQuery('select#compare-template option:selected').val();
    var country = jQuery('select#compare-account option:selected').data('country');
    var countryName = jQuery('select#compare-account option:selected').data('countryname');
    var creditcard = jQuery('select#compare-template option#creditcard');
    var quickloan = jQuery('select#compare-template option#quickloan');
    var socialsecurity = jQuery('select#compare-template option#socialSecurity');
    var loan = jQuery('select#compare-template option#loan');
    var allLoans = jQuery('select#compare-template option#allLoans');
    var dating = jQuery('select#compare-template option#dating');
    var hosting = jQuery('select#compare-template option#hosting');
    var broadband = jQuery('select#compare-template option#broadband');
    var casino = jQuery('select#compare-template option#casino');
    var magazine = jQuery('select#compare-template option#magazine');
    var mobilesubscription = jQuery('select#compare-template option#mobileSubscription');

    filterAvailable = false;

    if (template === '180,147' || template === '180' || template === '147' || template === '167' || template === '153') {
        // Show filter shortcode for feeds that have one. Don't show for iframe.
        filterAvailable = true;
        if (!usingIframe) {
            jQuery('#adservice-comparison-feed .categoryFilter').hide();
        }            
    } else {
        jQuery('#adservice-comparison-feed .categoryFilter').slideUp();
    }

    var feedID = jQuery('#adservice-comparison-feed #feed-id').val();

    if (account !== '' &&  template !== '0') {
        if (feedID !== undefined && feedID.length > 0) {
            jQuery('#export-feed-completed-section').find('span:eq(0)').text(feedID);
            jQuery('#export-feed-completed-section').find('span:eq(1)').text(accountName);
            jQuery('#export-feed-completed-section').find('span:eq(2)').text(countryName);
            jQuery('#export-feed-completed-section').find('code')
            .text('[adservice-comparison-feed feed=' + feedID + ']');
            jQuery('#adservice-comparison-feed #export-feed-completed-section').slideDown();
            jQuery('#adservice-comparison-feed .code-generated').slideUp();
            jQuery('#adservice-comparison-feed .legal-notice').slideUp();
        } else {
            jQuery('#adservice-comparison-feed #export-feed-section').slideDown();
            jQuery('#adservice-comparison-feed .code-generated').slideDown();
            jQuery('#adservice-comparison-feed .legal-notice').slideDown();
        }
        jQuery('#adservice-comparison-feed .change-order').prop('disabled', false);
        jQuery('#adservice-comparison-feed .change-order').removeClass('disabled');
        renderTpl(publisher, template);
        initConditions(publisher, template);
    } else if (account > 0 &&  template !== '0') {
        if (feedID !== undefined && feedID.length > 0) {
            jQuery('#export-feed-completed-section').find('span:eq(0)').text(feedID);
            jQuery('#export-feed-completed-section').find('span:eq(1)').text(accountName);
            jQuery('#export-feed-completed-section').find('span:eq(2)').text(countryName);
            jQuery('#export-feed-completed-section').find('code')
            .text('[adservice-comparison-feed feed=' + feedID + ']');
            jQuery('#adservice-comparison-feed #export-feed-completed-section').slideDown();
            jQuery('#adservice-comparison-feed .code-generated').slideUp();
            jQuery('#adservice-comparison-feed .legal-notice').slideUp();
        } else {
            jQuery('#adservice-comparison-feed #export-feed-section').slideDown();
            jQuery('#adservice-comparison-feed .code-generated').show();
            jQuery('#adservice-comparison-feed .legal-notice').show();
        }
        jQuery('#adservice-comparison-feed .change-order').prop('disabled', false);
        jQuery('#adservice-comparison-feed .change-order').removeClass('disabled');
        renderTpl(publisher, template);
        initConditions(publisher, template);
    } else {
        jQuery('#adservice-comparison-feed .code-generated').slideUp();
        jQuery('#adservice-comparison-feed .legal-notice').slideUp();
        jQuery('#adservice-comparison-feed #try-feed-builder-section').slideDown();
        jQuery('#adservice-comparison-feed .change-order').prop('disabled', true);
        jQuery('#adservice-comparison-feed .change-order').addClass('disabled');
    }    
    
    // Show/hide data categories for the corresponding countries.
    if (country === 'dk') {
        creditcard.show();
        loan.show();
        allLoans.show();
        quickloan.show();
        socialsecurity.show();
        hosting.show();
        dating.show();
        broadband.show();
        casino.show();
        magazine.show();
        mobilesubscription.show();
    } else if (country === 'fi') {
        creditcard.show();
        quickloan.show();
        loan.show();
        allLoans.show();
        socialsecurity.hide();
        hosting.hide();
        dating.hide();
        broadband.hide();
        casino.hide();
        magazine.show();
        mobilesubscription.show();
    } else if (country === 'no') {
        quickloan.hide();
        creditcard.show();
        loan.show();
        allLoans.hide();
        socialsecurity.hide();
        hosting.hide();
        dating.hide();
        broadband.hide();
        casino.hide();
        magazine.hide();
        mobilesubscription.show();
    } else if (country === 'se') {
        quickloan.show();
        creditcard.show();
        loan.show();
        allLoans.show();
        socialsecurity.hide();
        hosting.hide();
        dating.hide();
        broadband.hide();
        casino.hide();
        magazine.hide();
        mobilesubscription.show();
    } else if (country === 'pl') {
        quickloan.show();
        creditcard.hide();
        loan.hide();
        allLoans.hide();
        socialsecurity.hide();
        hosting.hide();
        dating.hide();
        broadband.hide();
        casino.hide();
        magazine.hide();
        mobilesubscription.hide();
    } else if (country === 'es') {
        quickloan.show();
        creditcard.hide();
        loan.hide();
        allLoans.hide();
        socialsecurity.hide();
        hosting.hide();
        dating.hide();
        broadband.hide();
        casino.hide();
        magazine.hide();
        mobilesubscription.hide();
    } else if (country === 'mx') {
        quickloan.show();
        creditcard.hide();
        loan.hide();
        allLoans.hide();
        socialsecurity.hide();
        hosting.hide();
        dating.hide();
        broadband.hide();
        casino.hide();
        magazine.hide();
        mobilesubscription.hide();
    } else if (country === 'de') {
        quickloan.hide();
        creditcard.hide();
        loan.show();
        allLoans.hide();
        socialsecurity.hide();
        hosting.hide();
        dating.hide();
        broadband.hide();
        casino.hide();
        magazine.hide();
        mobilesubscription.hide();
    } else {
        quickloan.hide();
        creditcard.hide();
        loan.hide();
        allLoans.hide();
        socialsecurity.hide();
        hosting.hide();
        dating.hide();
        broadband.hide();
        casino.hide();
        magazine.hide();
        mobilesubscription.hide();
    }
}

function renderTpl(pid, cid) {
    jQuery('#adminTableHolder').attr('data-publisherId', pid);
    jQuery('#adminTableHolder').attr('data-categoryId', cid);

    // Reload a new template if pid and cid are valid.
    if (Number(pid) > 0 && (Number(cid) > 0 || cid.toString().trim().length > 0)) {
        var disabledItems = getDisabledItems();
        var customOrder = getCustomOrder();

        // Check if a custom order is already defined.
        if (Object.keys(customOrder).length > 0) {
            usingCustomOrder = true;
            jQuery('#using-custom-order').removeClass('hidden');
        }

        jQuery('#adminTableHolder').adserviceFeed({reload:true});

        jQuery('#adminTableHolder').off().on("renderedTemplate", function() {
            // Mark removed items as disabled.
            markAsDisabled(disabledItems, customOrder);

            // Sortable
            jQuery( "#sortable" ).disableSelection();
            var total = jQuery('#sortable li').length;
            
            makeSortable(total);
            createRating(total);

            // Add reset button click handler.
            resetData('.bottom-bar .button.reset');

            // Add 'Save & Update' button click handler.
            jQuery('.bottom-bar .button.update').click(function(e) {
                e.preventDefault();
                if (jQuery('#publish').length > 0) {
                    jQuery('#publish').click();
                } else {
                    jQuery('.components-button.editor-post-publish-button').click();
                }
            });

            // Initialize star rating.
            jQuery('input[type="rating"]').rating({
                showClear: false,
                showCaption: false
            });

            // Add remove/add click handler.
            removeOrAddCampaign();

            // Mark low EPC campaigns.
            markAsLowEPC();
        });  // end of renderedTemplate
    }
}

/*
    Initializes feed conditions by fetching the fields for the specific
    publisher / category combination and saves results to a cache.

     * pid - Publisher ID
     * cid - Category ID
*/
function initConditions(pid, cid) {
    // Only make requests for fields if we don't have them cached.
    if (feedFieldsCache[pid] && feedFieldsCache[pid][cid] &&
        feedFieldsCache[pid][cid].length > 0) {
        renderConditions(feedFieldsCache[pid][cid]);
    } else {
        jQuery.getJSON("https://feedcontentcloud.com/cgi-bin/publisher/API/ComparisonFeed/Data.pl/fields?pid=" + pid + "&cid=" + cid, function(response) {
            if (response.status === 'OK') {
                if (feedFieldsCache[pid] === undefined) {
                    feedFieldsCache[pid] = {};
                }
                feedFieldsCache[pid][cid] = response.fields; // Cache response.
                renderConditions(response.fields);
            } else {
                // Failed to load data fields.
                jQuery('#as-conditions-error').removeClass('hidden');
                jQuery('#as-create-condition').attr('onclick', '');
            }
        }).fail(function() {
            // Failed to execute request.
            jQuery('#as-conditions-error').removeClass('hidden');
            jQuery('#as-create-condition').attr('onclick', '');
        });
    }
}

/*
    Renders the conditions table with the specified fields as selectable options.
    Previously saved conditions are also loaded.
*/
function renderConditions(fields) {
    feedFields = fields; // Update global fields reference.
    var conditions = getConditions();

    // Add field types and potential values to conditions
    // which are needed for showing only relevant operatos.
    for (var i = 0; i < conditions.length; i++) {
        for (var j = 0; j < fields.length; j++) {
            if (fields[j].name === conditions[i].name) {
                conditions[i]['fieldType'] = fields[j].fieldType;
                var values = fields[j].potentialValues;
                try {
                    values = JSON.parse(values);
                } catch (e) {
                    // Potential values is probably empty.
                }
                conditions[i]['potentialValues'] = values;
            }
        }
    }

    var data = [{
        conditions: conditions,
        fields: fields,
        operators: feedOperators
    }];

    var output = jQuery('#conditions-table-template').render(data);

    jQuery('#as-conditions-table').html(output);

    if (conditions.length > 0) {
        // Show that conditions are applied in campaign list.
        jQuery('#conditions-applied').removeClass('hidden');
    } else {
        // Conditions are empty. Hide label from campaign list.
        jQuery('#conditions-applied').addClass('hidden');
    }
}

/*
    Creates a new feed condition row and adds it to the table.
*/
function createCondition() {
    var data = {
        fields: feedFields,
        operators: feedOperators
    };

    var condition = jQuery('#condition-template').render(data);

    jQuery('#as-conditions-table').append(condition);
}

/*
    Deletes the feed condition row containing the element.
*/
function deleteCondition(element) {
    // Remove the condition table row.
    jQuery(element).closest('tr').remove();
}

/*
    Handles updating the operator and value inputs/selects
    whenever the selected field changes to only show relevant
    options and values.

     * element - The select element for the field

*/
function changeConditionField(element) {
    // Find the selected option and get its field type.
    var option = jQuery(element).find(":selected");
    var type = option.attr('data-type');

    // Parse potential values.
    var values = [];
    try {
        values = JSON.parse(option.attr('data-values'));
    } catch (e) {
        // Potential values is probably empty.
    }
    
    // Find and empty operator and value containers.
    var operatorContainer = jQuery(element).closest('tr').find(".as-condition-operator");
    operatorContainer.html('');
    var valueContainer = jQuery(element).closest('tr').find(".as-condition-value");
    valueContainer.html('');

    // Initialize operator select since we will always need one.
    var selectOperator = jQuery('<select>').attr('name', 'condition-operator')
        .appendTo(operatorContainer);

    if (type === 'ENUM') {
        // Update operator container. Only needs equals and notEquals for ENUM.
        selectOperator.append(jQuery('<option>').attr('value', 'equals').text('equal to'));
        selectOperator.append(jQuery('<option>').attr('value', 'notEquals').text('not equal to'));
        
        // Update value container.
        var selectValue = jQuery('<select>').attr('name', 'condition-value')
            .appendTo(valueContainer);
        values.forEach(function(element) {
            selectValue.append(jQuery('<option>').attr('value', element).text(element));
        });
    } else if (type === 'NUMBER') {
        // Update operator container. Doesn't need 'contains' and 'notContains' for NUMBER.
        feedOperators.forEach(function(element) {
            if (element.operator !== 'contains' && element.operator !== 'notContains') {
                selectOperator.append(jQuery('<option>').attr('value', element.operator)
                    .text(element.name));
            }
        });

        // Update value container.
        jQuery('<input>').attr('name', 'condition-value').attr('type', 'text')
            .attr('title', 'Please enter numbers like this: 1000, 75.50, 4.2').appendTo(valueContainer);
    } else if (type === 'BOOLEAN') {
        // Update operator container. Only needs equals and notEquals for BOOLEAN.
        selectOperator.append(jQuery('<option>').attr('value', 'equals').text('equal to'));
        selectOperator.append(jQuery('<option>').attr('value', 'notEquals').text('not equal to'));

        // Update value container.
        var select = jQuery('<select>').attr('name', 'condition-value')
            .appendTo(valueContainer);
        select.append(jQuery('<option>').attr('value', 0).text('No'));
        select.append(jQuery('<option>').attr('value', 1).text('Yes'));
    } else { // type = TEXT
        // Update operator container. Show all operators.
        feedOperators.forEach(function(element) {
            selectOperator.append(jQuery('<option>').attr('value', element.operator)
                .text(element.name));
        });

        // Update value container.
        jQuery('<input>').attr('name', 'condition-value').attr('type', 'text')
            .appendTo(valueContainer);
    }
}

/*
    Resets the feed conditions to the latest saved configuration.
*/
function resetConditions() {
    // Re-render conditions.
    var publisher = jQuery('select#compare-account option:selected').val();
    var template = jQuery('select#compare-template option:selected').val();
    initConditions(publisher, template);
}

/*
    Saves the configured conditions and updates the feed table to reflect the changes.
*/
function saveConditions(parent) {
    var conditions = [];
    var invalidNumber = false;

    // Generate conditions array based on input fields.
    jQuery('#as-conditions-table .as-condition-row').each(function() {
        var row = jQuery(this);
        var type = row.find("[name='condition-field'] option:selected").attr('data-type');
        var input = row.find("[name='condition-value']");
        // Get value and remove single quotes as they cause problems.
        var value = input.val().toString().replace("'", "").replace("\"", "");

        // Check if numbers are invalid.
        if (type === 'NUMBER') {
            var newValue = Number(value); // Convert to number.

            if (isNaN(newValue)) {
                invalidNumber = true;
                input.css('border', '1px solid red');
            } else {
                value = newValue;
                input.css('border', '');
            }
        }
        
        input.val(value); // Update input value in case we changed it.

        var condition = {
            name: row.find("[name='condition-field']").val(),
            operator: row.find("[name='condition-operator']").val(),
            value: value
        };

        conditions.push(condition);
    });

    if (invalidNumber) {
        alert('An invalid number was entered. Please enter numbers like this: 1000, 75.50, 4.2');
        return;
    }

    // Save to hidden textarea.
    jQuery('#conditions').html(JSON.stringify(conditions));

    // Add conditions to feed table holder and reload.
    jQuery('#adminTableHolder').attr('data-conditions', JSON.stringify(conditions));
    jQuery('#adminTableHolder').adserviceFeed({reload:true});

    if (conditions.length > 0) {
        // Show that conditions are applied in campaign list.
        jQuery('#conditions-applied').removeClass('hidden');
    } else {
        // Conditions are empty. Hide label from campaign list.
        jQuery('#conditions-applied').addClass('hidden');
    }

    parent.tb_remove(); // Close conditions modal.
}

function getDisabledItems() {
    var disabledItems = [];

    try {
        disabledItems = JSON.parse(jQuery('#removed-items').html());
    } catch (e) {
        // Try parsing using old format.
        try {
            disabledItems = JSON.parse('[' + jQuery('#removed-items').html() + ']');
        } catch (e) {
            // Default to empty array.
        }
    }

    return disabledItems;
}

function getCustomOrder() {
    var customOrder = {};

    try {
        customOrder = JSON.parse(jsonFix(jQuery('#custom-order').html()));
    } catch (e) {
        // Try parsing using old format.
        try {
            customOrder = JSON.parse(jsonFix('{' + jQuery('#custom-order').html() + '}'));
        } catch (e) {
            // Default to empty object.
        }
    }

    return customOrder;
}

function getCustomRating() {
    var customRating = {};

    try {
        customRating = JSON.parse(jsonFix(jQuery('#custom-rating').html()));
    } catch (e) {
        // Try parsing using old format.
        try {
            customRating = JSON.parse(jsonFix('{' + jQuery('#custom-rating').html() + '}'));
        } catch (e) {
            // Default to empty object.
        }
    }

    return customRating;
}

function getConditions() {
    var conditions = [];

    try {
        conditions = JSON.parse(jQuery('#conditions').html());
    } catch (e) {
        // Conditions is most likely empty.
    }

    return conditions;
}

function showLoadingIcon() {
    jQuery('#TB_ajaxContent #loading').removeClass('hide').addClass('show');
}

function hideLoadingIcon() {
    jQuery('#TB_ajaxContent #loading').removeClass('show').addClass('hide');
}

function resetData(clickElm){
    jQuery(clickElm).click(function(e) {
        e.preventDefault();
        usingCustomOrder = false;
        jQuery('#custom-rating').html('');
        jQuery('#custom-order').html('');
        jQuery('#removed-items').html('');
        jQuery('#include-new-campaigns').val('true');
        jQuery('#include-new-campaigns').prop('checked', true);
        jQuery('#new-campaign-available').addClass('hidden');
        jQuery('#using-custom-order').addClass('hidden');
        jQuery('#adminTableHolder').attr('data-customRating', '');
        jQuery('#adminTableHolder').attr('data-customOrder', '');
        jQuery('#adminTableHolder').adserviceFeed({reload:true});

        jQuery('#adminTableHolder').off().on("renderedTemplate", function() { 
            // Sortable
            jQuery( "#sortable" ).disableSelection();
            var total = jQuery('#sortable li').length;
            makeSortable(total);
            // Rating
            createRating(total);

            jQuery('input[type="rating"]').rating({
                showClear: false,
                showCaption: false
            });

            removeOrAddCampaign();

            markAsLowEPC();
        });
    });
}

function createRating(total) {
    jQuery('input[type="rating"]').on('rating.change', function(event, value, caption) {
        var new_value = value;
        var new_value_in_percentage = value/5*100;
        jQuery(this).attr('value', new_value);

        jQuery(this).parent().parent().parent().find('input.amount').attr('value', new_value_in_percentage);

        var customRating = '';
        jQuery( "#sortable li" ).each(function(index) {
            var campId = jQuery(this).data('id');
            var rating = jQuery(this).find('.three-up input.amount').val();
            customRating += campId + ':' + rating + ', ';
        });

        // Trim away final ','.
        customRating = customRating.substr(0, customRating.length - 2);
        jQuery('#custom-rating').html('{' + customRating + '}');

        // Using a custom rating means we should also use a custom order
        // Run updateOrder() once to save it.
        if (!usingCustomOrder) {
            updateOrder();
        }
    });
}

function makeSortable() {
    jQuery( "#sortable" ).sortable({
        items : '> li',
        handle: '.move',
        opacity: '.7',
        placeholder: "ui-state-highlight",
        update: function(event, ui) {
            updateOrder();
        } // end of update
    });
}

function updateOrder() {
    var total = jQuery('#sortable li').length;
    var customOrder = '';
    var removedItems = [];

    jQuery( "#sortable li" ).each(function(index) {
        var campId = jQuery(this).data('id');
        var reverseIndex = total - index;
        customOrder += campId + ':' + reverseIndex + ', ';

        // If item is disabled then add to removed items.
        if (jQuery(this).hasClass('disabled')) removedItems.push(campId);

        // Don't show 'new' tags after updating the order.
        jQuery(this).find('.new-tag').addClass('hidden');
    });

    // Trim away final ','.
    customOrder = customOrder.substr(0, customOrder.length - 2);
    jQuery('#custom-order').html('{' + customOrder + '}');

    // Update removed items.
    jQuery('#removed-items').html(JSON.stringify(removedItems));
    
    // Flag as using custom order.
    usingCustomOrder = true;
    jQuery('#using-custom-order').removeClass('hidden');

    // Updating the order means you recognized the potential 
    // new campaigns, so don't show the bottom tag anymore.
    jQuery('#new-campaign-available').addClass('hidden');
}

function removeOrAddCampaign() {
    jQuery('.ui-state-default .removeOrAddCampaign').click(function() {
        var removedItems = [];

        // Toggle classes to reflect change in UI.
        jQuery(this).parent().find('.three-up').toggleClass('removed');
        jQuery(this).find('i').toggleClass('fa-check');
        jQuery(this).find('i').toggleClass('fa-trash-o');
        jQuery(this).parent().toggleClass('disabled');

        // Loop through campaigns and find the disabled ones.
        jQuery( "#sortable li" ).each(function(index) {
            var campId = jQuery(this).data('id');
            
            if (jQuery(this).hasClass('disabled')) removedItems.push(campId);
        });
        
        jQuery('#removed-items').html(JSON.stringify(removedItems));
    });
};

function markAsDisabled(_disItems, customOrder) {
     var items = _disItems;
     var existingCampaigns = Object.keys(customOrder);
     var includeNewCampaigns = (jQuery('#include-new-campaigns').val() !== 'false');
     var newCampaignAvailable = false;

     jQuery( "#sortable li" ).each(function(index) {
         // Parse id as int since array only contains integers.
         var item = parseInt(jQuery(this).attr('data-id'));

        if (jQuery.inArray(item,items) !== -1) {
            jQuery(this).addClass('disabled');
            jQuery(this).find('.three-up').addClass('removed');
            jQuery(this).find('.removeOrAddCampaign i').addClass( 'fa-check' );
            jQuery(this).find('.removeOrAddCampaign i').removeClass( 'fa-trash-o' );
        } else if (existingCampaigns.length > 0 && 
            existingCampaigns.indexOf(item.toString()) === -1) {
            // We have defined a custom order and this item is not in it.
            // Show the item as new to make it easy to identify.
            jQuery(this).find('.new-tag').removeClass('hidden');
            newCampaignAvailable = true;
            if (!includeNewCampaigns) {
                // We have disabled inclusion of new campaigns so the item
                // should be marked as disabled.
                jQuery(this).addClass('disabled');
                jQuery(this).find('.three-up').addClass('removed');
                jQuery(this).find('.removeOrAddCampaign i').addClass( 'fa-check' );
                jQuery(this).find('.removeOrAddCampaign i').removeClass( 'fa-trash-o' );
            } else {
                // New items should be included so show them as enabled.
                jQuery(this).removeClass('disabled');
                jQuery(this).find('.three-up').removeClass('removed');
                jQuery(this).find('.removeOrAddCampaign i').removeClass( 'fa-check' );
                jQuery(this).find('.removeOrAddCampaign i').addClass( 'fa-trash-o' );
            }
        }
    });

    // Show that a new campaign is available in the bottom bar.
    if (newCampaignAvailable) {
        jQuery('#new-campaign-available').removeClass('hidden');
    } else {
        jQuery('#new-campaign-available').addClass('hidden');
    }
};

function markAsLowEPC() {
    jQuery( "#sortable li" ).each(function(index) {
        var campEpc = parseFloat(jQuery(this).attr('data-campEpc'));
        var epcLimit = parseFloat(jQuery(this).attr('data-epcLimit'));

        if (campEpc >= 0 && epcLimit > 0 && campEpc < epcLimit) {
            // Show that the item has a low EPC as is being filtered.
            jQuery(this).find('.low-epc-tag').removeClass('hidden');
        }
    });
}

function updateMinRating(input) {
    var rating = jQuery(input).val();
    jQuery('#adminTableHolder').attr('data-minRating', rating);
    jQuery('#adminTableHolder').adserviceFeed({reload:true});
}

function updateUseIframe(input) {
    var checkbox = jQuery(input);
    if (checkbox.prop('checked')) {
        usingIframe = true;
        checkbox.val('1');
        jQuery('#adservice-comparison-feed .categoryFilter').slideUp();
        jQuery('#as-iframe-options').slideDown();
        jQuery('#as-feed-shortcode').html('[adservice-comparison-feed-iframe]');
    } else {
        usingIframe = false;
        checkbox.val('0');
        if (filterAvailable) {
            jQuery('#adservice-comparison-feed .categoryFilter').slideDown();
        }
        jQuery('#as-iframe-options').slideUp();
        jQuery('#as-feed-shortcode').html('[adservice-comparison-feed]');
    }
}

function updateShowFilter(input) {
    var checkbox = jQuery(input);
    if (checkbox.prop('checked')) {
        checkbox.val('1');
    } else {
        checkbox.val('0');
    }
}

function updateIncludeNewCampaigns(input) {
    var checkbox = jQuery(input);
    if (checkbox.prop('checked')) {
        checkbox.val('true');
    } else {
        checkbox.val('false');
        // When not including new campaigns we should also use a custom order
        // since it's used to filter the feed data.
        // Run updateOrder() once to save it.
        if (!usingCustomOrder) {
            updateOrder();
        }
    }

    var disabledItems = getDisabledItems();
    var customOrder = getCustomOrder();

    // Mark items as disabled/enabled.
    // This is to make sure new campaigns are marked correctly.
    markAsDisabled(disabledItems, customOrder);
}

function updateLazyLoading(input) {
    var checkbox = jQuery(input);
    if (checkbox.prop('checked')) {
        checkbox.val('true');
    } else {
        checkbox.val('false');
    }
}

function jsonFix(json) {
    return json.replace(/(\d*\.*\d+):/gm, "\"$1\":");
}

function exportFeed(pid, token) {
    var name = jQuery('#feedName').val().trim();
    var id = jQuery('#feedID').val().trim();
    jQuery('#feedName').css('border', '');
    jQuery('#feedID').css('border', '');

    if (name.length < 4 || name.length > 32) {
        jQuery('#feedName').css('border', '1px solid red');
        jQuery('#export-feed-error').find('span').text('Name must be between 4 and 32 characters.');
        jQuery('#export-feed-error').css('display', '');
        return;
    }

    if (id.length < 4 || id.length > 32) {
        jQuery('#feedID').css('border', '1px solid red');
        jQuery('#export-feed-error').find('span').text('Feed ID must be between 4 and 32 characters.');
        jQuery('#export-feed-error').css('display', '');
        return;
    }

    var regex = new RegExp(/(^[a-z])([a-z]|\-|\d)*([a-z\d]$)/g);
    var result = regex.exec(id);

    if (result === null) {
        jQuery('#feedID').css('border', '1px solid red');
        jQuery('#export-feed-error').find('span').text('Feed ID can have lowercase letters (no special characters), digits, or hyphens. It must start with a lowercase letter and end with a letter or number.');
        jQuery('#export-feed-error').css('display', '');
        return;
    }

    // Authentication data.
    var data = {
        PID: pid,
        LoginToken: token
    };

    jQuery.getJSON('https://feedcontentcloud.com/cgi-bin/publisher/API/ComparisonFeed/Feed.pl/' + id + '/available', data, function(response) {
        if (response && response.available === false) {
            jQuery('#feedID').css('border', '1px solid red');
            jQuery('#export-feed-error').find('span').text('Feed ID is already in use.');
            jQuery('#export-feed-error').css('display', '');
            return;
        } else if (response && response.error) {
            jQuery('#feedID').css('border', '1px solid red');
            jQuery('#export-feed-error').find('span').text('Checking feed ID availability failed.');
            jQuery('#export-feed-error').css('display', '');
            return;
        } else {
            jQuery('#feedID').css('border', '');
            jQuery('#export-feed-error').find('span').text('');
            jQuery('#export-feed-error').css('display', 'none');

            var accountName = jQuery('select#compare-account option:selected').data('accountname');
            var countryName = jQuery('select#compare-account option:selected').data('countryname');

            // Build feed settings.
            var feedSettings = {
                id: id,
                name: name,
                agentId: parseInt(jQuery('select#compare-account option:selected').val()),
                categoryId: jQuery('select#compare-template option:selected').val(),
                type: (usingIframe) ? 'IFRAME' : 'REGULAR',
                settings: {
                    showFilter: (jQuery('#using-filter-shortcode').val() == 1 || (jQuery('#show-filter').val() == 1 && usingIframe)) ? 1 : 0,
                    includeNewCampaigns: (jQuery('#include-new-campaigns').val() === 'true') ? true : false,
                    lazyLoading: (jQuery('#lazy-loading').val() === 'true') ? true : false,
                    color: jQuery('#button-color').val().substr(1),
                    hColor: jQuery('#button-hover-color').val().substr(1),
                    fontUrl: jQuery('#font-url').val(),
                    fontName: jQuery('#font-name').val(),
                    removedItems: getDisabledItems(),
                    conditions: getConditions(),
                    customOrder: getCustomOrder(),
                    customRating: getCustomRating(),
                    initialRows: jQuery('#initial-rows').val(),
                    maxRows: jQuery('#max-rows').val(),
                    minRating: jQuery('#min-rating').val(),
                    sub: jQuery('#subID').val(),
                    media_id: Number(jQuery('#mediaID').val())
                }
            };

            // Save feed.
            var payload = jQuery.extend(true, {}, feedSettings, data);
            payload.settings = JSON.stringify(payload.settings);
            jQuery.ajax({
                method: 'POST',
                url: 'https://feedcontentcloud.com/cgi-bin/publisher/API/ComparisonFeed/Feed.pl/' + payload.id,
                data: payload
            })
            .done(function (response) {
                if (response && response.status === 'OK') {
                    // Successfully saved feed.
                    jQuery('#export-feed-completed-section').find('span:eq(0)').text(payload.id);
                    jQuery('#export-feed-completed-section').find('span:eq(1)').text(accountName);
                    jQuery('#export-feed-completed-section').find('span:eq(2)').text(countryName);
                    jQuery('#export-feed-completed-section').find('code')
                    .text('[adservice-comparison-feed feed=' + payload.id + ']');
                    jQuery('#export-feed-section').hide();
                    jQuery('#export-feed-completed-section').show();
                    jQuery('#feed-id').val(payload.id);
                    jQuery('#feed-id').attr('value', payload.id);
                    alert("Feed '" + payload.id + "' was successfully exported.");

                    // Update the post to save feed ID.
                    if (jQuery('#publish') > 0) {
                        jQuery('#publish').click();
                    } else {
                        jQuery('.components-button.editor-post-publish-button').click();
                    }
                } else if (response && response.status === 'ERROR') {
                    // API responded with an error. Most likely due to invalid data.
                    alert('Received the following error when trying to export the feed: ' + response.msg);
                } else {
                    // Unknown API error.
                    alert('Something went wrong when trying to export the feed.');
                }
            })
            .fail(function (response) {
                // Request failed.
                alert('Request to export feed failed.');
            });
        }
    });
}