1157 lines
36 KiB
JavaScript
1157 lines
36 KiB
JavaScript
$(document).ready(function () {
|
|
setSmartBlockEvents();
|
|
});
|
|
|
|
function setSmartBlockEvents() {
|
|
var activeTab = $(".active-tab"),
|
|
form = activeTab.find(".smart-block-form");
|
|
|
|
/********** ADD CRITERIA ROW **********/
|
|
form.find("#criteria_add").live("click", function () {
|
|
var div = $('dd[id="sp_criteria-element"]').children("div:visible:last");
|
|
|
|
if (div.length == 0) {
|
|
div = $('dd[id="sp_criteria-element"]').children("div:first");
|
|
div.children().removeAttr("disabled");
|
|
div.show();
|
|
|
|
appendAddButton();
|
|
appendModAddButton();
|
|
removeButtonCheck();
|
|
disableAndHideDateTimeDropdown(newRowVal);
|
|
} else {
|
|
div.find(".db-logic-label").text("and").css("display", "table");
|
|
div.removeClass("search-row-or").addClass("search-row-and");
|
|
|
|
div = div.next().show();
|
|
|
|
div.children().removeAttr("disabled");
|
|
div.find(".modifier_add_link").show();
|
|
|
|
div = div.next();
|
|
if (div.length === 0) {
|
|
$(this).hide();
|
|
}
|
|
|
|
appendAddButton();
|
|
appendModAddButton();
|
|
removeButtonCheck();
|
|
// disableAndHideDateTimeDropdown(newRowVal);
|
|
groupCriteriaRows();
|
|
}
|
|
});
|
|
|
|
/********** ADD MODIFIER ROW **********/
|
|
form.find('a[id^="modifier_add"]').live("click", function () {
|
|
var criteria_value = $(this)
|
|
.siblings('select[name^="sp_criteria_field"]')
|
|
.val();
|
|
|
|
//make new modifier row
|
|
var newRow = $(this).parent().clone(),
|
|
newRowCrit = newRow.find('select[name^="sp_criteria_field"]'),
|
|
newRowMod = newRow.find('select[name^="sp_criteria_modifier"]'),
|
|
newRowVal = newRow.find('input[name^="sp_criteria_value"]'),
|
|
newRowExtra = newRow.find('input[name^="sp_criteria_extra"]'),
|
|
newRowRemove = newRow.find('a[id^="criteria_remove"]');
|
|
|
|
//remove error msg
|
|
if (newRow.children().hasClass("errors sp-errors")) {
|
|
newRow.find('span[class="errors sp-errors"]').remove();
|
|
}
|
|
|
|
//hide the critieria field select box
|
|
newRowCrit.addClass("sp-invisible");
|
|
|
|
//keep criteria value the same
|
|
newRowCrit.val(criteria_value);
|
|
|
|
//reset all other values
|
|
newRowMod.val("0");
|
|
newRowVal.val("");
|
|
newRowExtra.val("");
|
|
disableAndHideExtraField(newRowVal);
|
|
disableAndHideDateTimeDropdown(newRowVal);
|
|
disableAndHideExtraDateTimeDropdown(newRowVal);
|
|
sizeTextBoxes(newRowVal, "sp_extra_input_text", "sp_input_text");
|
|
|
|
//remove the 'criteria add' button from new modifier row
|
|
newRow.find("#criteria_add").remove();
|
|
|
|
$(this).parent().after(newRow);
|
|
|
|
// remove extra spacing from previous row
|
|
newRow.prev().removeClass("search-row-and").addClass("search-row-or");
|
|
|
|
reindexElements();
|
|
appendAddButton();
|
|
appendModAddButton();
|
|
removeButtonCheck();
|
|
groupCriteriaRows();
|
|
});
|
|
|
|
/********** REMOVE ROW **********/
|
|
form.find('a[id^="criteria_remove"]').live("click", function () {
|
|
var curr = $(this).parent();
|
|
var curr_pos = curr.index();
|
|
var list = curr.parent();
|
|
var list_length = list.find("div:visible").length;
|
|
var count = list_length - curr_pos;
|
|
var next = curr.next();
|
|
var item_to_hide;
|
|
var prev;
|
|
var index;
|
|
//remove error message from current row, if any
|
|
var error_element = curr.find('span[class="errors sp-errors"]');
|
|
if (error_element.is(":visible")) {
|
|
error_element.remove();
|
|
}
|
|
|
|
/* In the case that there is only one element we need to remove the
|
|
* date_select drop down.
|
|
*/
|
|
|
|
if (count == 0) {
|
|
disableAndHideDateTimeDropdown(curr.find(":first-child"), index);
|
|
disableAndHideExtraDateTimeDropdown(curr.find(":first-child"), index);
|
|
disableAndHideExtraField(curr.find(":first-child"), index);
|
|
}
|
|
|
|
/* assign next row to current row for all rows below and including
|
|
* the row getting removed
|
|
*/
|
|
|
|
for (var i = 0; i < count; i++) {
|
|
index = getRowIndex(curr);
|
|
|
|
var criteria = next.find('[name^="sp_criteria_field"]').val();
|
|
curr.find('[name^="sp_criteria_field"]').val(criteria);
|
|
|
|
var modifier = next.find('[name^="sp_criteria_modifier"]').val();
|
|
populateModifierSelect(curr.find('[name^="sp_criteria_field"]'), false);
|
|
curr.find('[name^="sp_criteria_modifier"]').val(modifier);
|
|
|
|
var criteria_value = next.find('[name^="sp_criteria_value"]').val();
|
|
curr.find('[name^="sp_criteria_value"]').val(criteria_value);
|
|
|
|
/* if current and next row have the extra criteria value
|
|
* (for 'is in the range' modifier), then assign the next
|
|
* extra value to current and remove that element from
|
|
* next row
|
|
*/
|
|
if (
|
|
curr.find('[name^="sp_criteria_extra"]').attr("disabled") !=
|
|
"disabled" &&
|
|
next.find("#extra_criteria").is(":visible")
|
|
) {
|
|
var criteria_extra = next.find('[name^="sp_criteria_extra"]').val();
|
|
curr.find('[name^="sp_criteria_extra"]').val(criteria_extra);
|
|
disableAndHideExtraField(next.find(":first-child"), getRowIndex(next));
|
|
|
|
/* if only the current row has the extra criteria value,
|
|
* then just remove the current row's extra criteria element
|
|
*/
|
|
} else if (
|
|
curr.find('[name^="sp_criteria_extra"]').attr("disabled") !=
|
|
"disabled" &&
|
|
next.find("#extra_criteria").not(":visible")
|
|
) {
|
|
disableAndHideExtraField(curr.find(":first-child"), index);
|
|
|
|
/* if only the next row has the extra criteria value,
|
|
* then add the extra criteria element to current row
|
|
* and assign next row's value to it
|
|
*/
|
|
} else if (next.find("#extra_criteria").is(":visible")) {
|
|
criteria_extra = next.find('[name^="sp_criteria_extra"]').val();
|
|
enableAndShowExtraField(curr.find(":first-child"), index);
|
|
curr.find('[name^="sp_criteria_extra"]').val(criteria_extra);
|
|
}
|
|
|
|
/* if current and next row have the date_time_select_criteria visible
|
|
* then show the current and it from the next row
|
|
*/
|
|
if (
|
|
curr.find('[name^="sp_criteria_datetime_select"]').attr("disabled") !=
|
|
"disabled" &&
|
|
next.find("#datetime_select").is(":visible")
|
|
) {
|
|
var criteria_datetime = next
|
|
.find('[name^="sp_criteria_datetime_select"]')
|
|
.val();
|
|
curr
|
|
.find('[name^="sp_criteria_datetime_select"]')
|
|
.val(criteria_datetime);
|
|
disableAndHideDateTimeDropdown(
|
|
next.find("first-child"),
|
|
getRowIndex(next),
|
|
);
|
|
/* if only the current row has the extra criteria value,
|
|
* then just remove the current row's extra criteria element
|
|
*/
|
|
} else if (
|
|
curr.find('[name^="sp_criteria_datetime_select"]').attr("disabled") !=
|
|
"disabled" &&
|
|
next.find("#datetime_select").not(":visible")
|
|
) {
|
|
disableAndHideDateTimeDropdown(curr.find(":first-child"), index);
|
|
/* if only the next row has date_time_select then just enable it on the current row
|
|
*/
|
|
} else if (next.find("#datetime_select").is(":visible")) {
|
|
criteria_datetime = next
|
|
.find('[name^="sp_criteria_datetime_select"]')
|
|
.val();
|
|
enableAndShowDateTimeDropdown(curr.find(":first-child"), index);
|
|
curr
|
|
.find('[name^="sp_criteria_datetime_select"]')
|
|
.val(criteria_datetime);
|
|
}
|
|
|
|
/* if current and next row have the extra_date_time_select_criteria visible
|
|
* then show the current and it from the next row
|
|
*/
|
|
if (
|
|
curr
|
|
.find('[name^="sp_criteria_extra_datetime_select"]')
|
|
.attr("disabled") != "disabled" &&
|
|
next.find("#extra_datetime_select").is(":visible")
|
|
) {
|
|
var extra_criteria_datetime = next
|
|
.find('[name^="sp_criteria_extra_datetime_select"]')
|
|
.val();
|
|
curr
|
|
.find('[name^="sp_criteria_extra_datetime_select"]')
|
|
.val(extra_criteria_datetime);
|
|
disableAndHideExtraDateTimeDropdown(
|
|
next.find("first-child"),
|
|
getRowIndex(next),
|
|
);
|
|
/* if only the current row has the extra criteria value,
|
|
* then just remove the current row's extra criteria element
|
|
*/
|
|
} else if (
|
|
curr
|
|
.find('[name^="sp_criteria_extra_datetime_select"]')
|
|
.attr("disabled") != "disabled" &&
|
|
next.find("#extra_datetime_select").not(":visible")
|
|
) {
|
|
disableAndHideExtraDateTimeDropdown(curr.find(":first-child"), index);
|
|
/* if only the next row has date_time_select then just enable it on the current row
|
|
*/
|
|
} else if (next.find("#datetime_select").is(":visible")) {
|
|
criteria_datetime = next
|
|
.find('[name^="sp_criteria_extra_datetime_select"]')
|
|
.val();
|
|
enableAndShowExtraDateTimeDropdown(curr.find(":first-child"), index);
|
|
curr
|
|
.find('[name^="sp_criteria_extra_datetime_select"]')
|
|
.val(criteria_datetime);
|
|
}
|
|
|
|
/* determine if current row is a modifier row
|
|
* if it is, make the criteria select invisible
|
|
*/
|
|
prev = curr.prev();
|
|
if (
|
|
curr.find('[name^="sp_criteria_field"]').val() ==
|
|
prev.find('[name^="sp_criteria_field"]').val()
|
|
) {
|
|
if (
|
|
!curr
|
|
.find('select[name^="sp_criteria_field"]')
|
|
.hasClass("sp-invisible")
|
|
) {
|
|
curr
|
|
.find('select[name^="sp_criteria_field"]')
|
|
.addClass("sp-invisible");
|
|
}
|
|
} else {
|
|
if (
|
|
curr
|
|
.find('select[name^="sp_criteria_field"]')
|
|
.hasClass("sp-invisible")
|
|
) {
|
|
curr
|
|
.find('select[name^="sp_criteria_field"]')
|
|
.removeClass("sp-invisible");
|
|
}
|
|
}
|
|
|
|
curr = next;
|
|
next = curr.next();
|
|
}
|
|
|
|
/* Disable the last visible row since it holds the values the user removed
|
|
* Reset the values to empty and resize the criteria value textbox
|
|
* in case the row had the extra criteria textbox
|
|
*/
|
|
item_to_hide = list.find("div:visible:last");
|
|
item_to_hide.children().attr("disabled", "disabled");
|
|
item_to_hide
|
|
.find('[name^="sp_criteria_datetime_select"]')
|
|
.attr("disabled", "disabled");
|
|
item_to_hide
|
|
.find('[name^="sp_criteria_extra"]')
|
|
.attr("disabled", "disabled");
|
|
item_to_hide
|
|
.find('[name^="sp_criteria_extra_datetime_select"]')
|
|
.attr("disabled", "disabled");
|
|
if (
|
|
item_to_hide
|
|
.find('select[name^="sp_criteria_field"]')
|
|
.hasClass("sp-invisible")
|
|
) {
|
|
item_to_hide
|
|
.find('select[name^="sp_criteria_field"]')
|
|
.removeClass("sp-invisible");
|
|
}
|
|
item_to_hide
|
|
.find('[name^="sp_criteria_field"]')
|
|
.val(0)
|
|
.end()
|
|
.find('[name^="sp_criteria_modifier"]')
|
|
.val(0)
|
|
.end()
|
|
.find('[name^="sp_criteria_datetime_select"]')
|
|
.end()
|
|
.find('[name^="sp_criteria_value"]')
|
|
.val("")
|
|
.end()
|
|
.find('[name^="sp_criteria_extra"]')
|
|
.val("")
|
|
.find('[name^="sp_criteria_extra_datetime_select"]')
|
|
.end();
|
|
|
|
sizeTextBoxes(
|
|
item_to_hide.find('[name^="sp_criteria_value"]'),
|
|
"sp_extra_input_text",
|
|
"sp_input_text",
|
|
);
|
|
item_to_hide.hide();
|
|
|
|
list.next().show();
|
|
|
|
//check if last row is a modifier row
|
|
var last_row = list.find("div:visible:last");
|
|
if (
|
|
last_row.find('[name^="sp_criteria_field"]').val() ==
|
|
last_row.prev().find('[name^="sp_criteria_field"]').val()
|
|
) {
|
|
if (
|
|
!last_row
|
|
.find('select[name^="sp_criteria_field"]')
|
|
.hasClass("sp-invisible")
|
|
) {
|
|
last_row
|
|
.find('select[name^="sp_criteria_field"]')
|
|
.addClass("sp-invisible");
|
|
}
|
|
}
|
|
|
|
// always put '+' button on the last enabled row
|
|
appendAddButton();
|
|
|
|
reindexElements();
|
|
|
|
// always put '+' button on the last modifier row
|
|
appendModAddButton();
|
|
|
|
// remove the 'x' button if only one row is enabled
|
|
removeButtonCheck();
|
|
|
|
groupCriteriaRows();
|
|
});
|
|
|
|
/********** SAVE ACTION **********/
|
|
// moved to spl.js
|
|
|
|
/********** GENERATE ACTION **********/
|
|
activeTab.find('button[id="generate_button"]').live("click", function () {
|
|
buttonClickAction("generate", "playlist/smart-block-generate");
|
|
});
|
|
|
|
/********** SHUFFLE ACTION **********/
|
|
activeTab.find('button[id="shuffle_button"]').live("click", function () {
|
|
buttonClickAction("shuffle", "playlist/smart-block-shuffle");
|
|
});
|
|
|
|
/********** CHANGE PLAYLIST TYPE **********/
|
|
form.find('dd[id="sp_type-element"]').live("change", function () {
|
|
//buttonClickAction('generate', 'playlist/empty-content');
|
|
$(".active-tab").find('button[id="save_button"]').click();
|
|
setupUI();
|
|
AIRTIME.library.checkAddButton();
|
|
});
|
|
|
|
/********** LIMIT CHANGE *************/
|
|
form.find('select[id="sp_limit_options"]').live("change", function () {
|
|
var limVal = form.find('input[id="sp_limit_value"]');
|
|
if ($(this).val() === "remaining") {
|
|
disableAndHideLimitValue();
|
|
} else {
|
|
enableAndShowLimitValue();
|
|
}
|
|
});
|
|
|
|
/********** CRITERIA CHANGE **********/
|
|
form
|
|
.find(
|
|
'select[id^="sp_criteria"]:not([id^="sp_criteria_modifier"]):not([id^="sp_criteria_datetime"]):not([id^="sp_criteria_extra_datetime"]):not([id^="sp_criteria_value"])',
|
|
)
|
|
.live("change", function () {
|
|
var index = getRowIndex($(this).parent());
|
|
//need to change the criteria value for any modifier rows
|
|
var critVal = $(this).val();
|
|
var divs = $(this).parent().nextAll(":visible");
|
|
$.each(divs, function (i, div) {
|
|
var critSelect = $(div).children('select[id^="sp_criteria_field"]');
|
|
if (critSelect.hasClass("sp-invisible")) {
|
|
critSelect.val(critVal);
|
|
/* If the select box is visible we know the modifier rows
|
|
* have ended
|
|
*/
|
|
} else {
|
|
return false;
|
|
}
|
|
});
|
|
|
|
// disable extra field and hide the span
|
|
disableAndHideExtraField($(this), index);
|
|
disableAndHideDateTimeDropdown($(this), index);
|
|
disableAndHideExtraDateTimeDropdown($(this), index);
|
|
|
|
if (
|
|
$("#sp_criteria_field_" + index + " option:selected").val() ===
|
|
"track_type_id"
|
|
) {
|
|
populateTracktypeSelect(this, false);
|
|
} else {
|
|
disableAndHideTracktypeDropdown($(this), index);
|
|
populateModifierSelect(this, true);
|
|
}
|
|
});
|
|
|
|
/********** MODIFIER CHANGE **********/
|
|
form.find('select[id^="sp_criteria_modifier"]').live("change", function () {
|
|
var criteria_value = $(this).next(),
|
|
index_num = getRowIndex($(this).parent());
|
|
|
|
if ($(this).val().match("before|after")) {
|
|
enableAndShowDateTimeDropdown(criteria_value, index_num);
|
|
console.log($(this).val());
|
|
} else {
|
|
disableAndHideDateTimeDropdown(criteria_value, index_num);
|
|
disableAndHideExtraDateTimeDropdown(criteria_value, index_num);
|
|
}
|
|
|
|
if ($(this).val().match("is in the range")) {
|
|
enableAndShowExtraField(criteria_value, index_num);
|
|
} else {
|
|
disableAndHideExtraField(criteria_value, index_num);
|
|
}
|
|
if ($(this).val().match("between")) {
|
|
enableAndShowExtraField(criteria_value, index_num);
|
|
enableAndShowDateTimeDropdown(criteria_value, index_num);
|
|
enableAndShowExtraDateTimeDropdown(criteria_value, index_num);
|
|
} else {
|
|
disableAndHideExtraDateTimeDropdown(criteria_value, index_num);
|
|
}
|
|
|
|
var get_crit_field = $(this).siblings(":first-child");
|
|
var crit_field = get_crit_field[0]["id"];
|
|
if ($("#" + crit_field + " option:selected").val() === "track_type_id") {
|
|
if ($(this).val() == "is" || $(this).val() == "is not") {
|
|
enableAndShowTracktypeDropdown(criteria_value, index_num);
|
|
} else {
|
|
disableAndHideTracktypeDropdown(criteria_value, index_num);
|
|
}
|
|
}
|
|
});
|
|
|
|
setupUI();
|
|
appendAddButton();
|
|
appendModAddButton();
|
|
removeButtonCheck();
|
|
}
|
|
|
|
function getRowIndex(ele) {
|
|
var id = ele.find('[name^="sp_criteria_field"]').attr("id"),
|
|
delimiter = "_",
|
|
start = 3,
|
|
tokens = id.split(delimiter).slice(start),
|
|
index = tokens.join(delimiter);
|
|
|
|
return index;
|
|
}
|
|
|
|
/* This function appends a '+' button for the last
|
|
* modifier row of each criteria.
|
|
* If there are no modifier rows, the '+' button
|
|
* remains at the criteria row
|
|
*/
|
|
function appendModAddButton() {
|
|
var divs = $(".active-tab .smart-block-form")
|
|
.find('div select[name^="sp_criteria_modifier"]')
|
|
.parent(":visible");
|
|
$.each(divs, function (i, div) {
|
|
if (i > 0) {
|
|
/* If the criteria field is hidden we know it is a modifier row
|
|
* and can hide the previous row's modifier add button
|
|
*/
|
|
if (
|
|
$(div)
|
|
.find('select[name^="sp_criteria_field"]')
|
|
.hasClass("sp-invisible")
|
|
) {
|
|
$(div).prev().find('a[id^="modifier_add"]').addClass("sp-invisible");
|
|
} else {
|
|
$(div).prev().find('a[id^="modifier_add"]').removeClass("sp-invisible");
|
|
}
|
|
}
|
|
|
|
//always add modifier add button to the last row
|
|
if (i + 1 == divs.length) {
|
|
$(div).find('a[id^="modifier_add"]').removeClass("sp-invisible");
|
|
}
|
|
});
|
|
}
|
|
|
|
/* This function re-indexes all the form elements.
|
|
* We need to do this everytime a row gets deleted
|
|
*/
|
|
function reindexElements() {
|
|
var divs = $(".active-tab .smart-block-form")
|
|
.find('div select[name^="sp_criteria_field"]')
|
|
.parent(),
|
|
index = 0,
|
|
modIndex = 0;
|
|
/* Hide all logic labels
|
|
* We will re-add them as each row gets indexed
|
|
*/
|
|
$(".db-logic-label").text("").hide();
|
|
|
|
$.each(divs, function (i, div) {
|
|
if (i > 0 && index < 26) {
|
|
/* If the current row's criteria field is hidden we know it is
|
|
* a modifier row
|
|
*/
|
|
if (
|
|
$(div)
|
|
.find('select[name^="sp_criteria_field"]')
|
|
.hasClass("sp-invisible")
|
|
) {
|
|
if ($(div).is(":visible")) {
|
|
$(div).prev().find(".db-logic-label").text($.i18n._("or")).show();
|
|
}
|
|
modIndex++;
|
|
} else {
|
|
if ($(div).is(":visible")) {
|
|
$(div).prev().find(".db-logic-label").text($.i18n._("and")).show();
|
|
}
|
|
index++;
|
|
modIndex = 0;
|
|
}
|
|
|
|
$(div)
|
|
.find('select[name^="sp_criteria_field"]')
|
|
.attr("name", "sp_criteria_field_" + index + "_" + modIndex);
|
|
$(div)
|
|
.find('select[name^="sp_criteria_field"]')
|
|
.attr("id", "sp_criteria_field_" + index + "_" + modIndex);
|
|
$(div)
|
|
.find('select[name^="sp_criteria_modifier"]')
|
|
.attr("name", "sp_criteria_modifier_" + index + "_" + modIndex);
|
|
$(div)
|
|
.find('select[name^="sp_criteria_modifier"]')
|
|
.attr("id", "sp_criteria_modifier_" + index + "_" + modIndex);
|
|
$(div)
|
|
.find('input[name^="sp_criteria_value"]')
|
|
.attr("name", "sp_criteria_value_" + index + "_" + modIndex);
|
|
$(div)
|
|
.find('input[name^="sp_criteria_value"]')
|
|
.attr("id", "sp_criteria_value_" + index + "_" + modIndex);
|
|
$(div)
|
|
.find('select[name^="sp_criteria_value"]')
|
|
.attr("name", "sp_criteria_value_" + index + "_" + modIndex);
|
|
$(div)
|
|
.find('select[name^="sp_criteria_value"]')
|
|
.attr("id", "sp_criteria_value_" + index + "_" + modIndex);
|
|
$(div)
|
|
.find('input[name^="sp_criteria_extra"]')
|
|
.attr("name", "sp_criteria_extra_" + index + "_" + modIndex);
|
|
$(div)
|
|
.find('input[name^="sp_criteria_extra"]')
|
|
.attr("id", "sp_criteria_extra_" + index + "_" + modIndex);
|
|
$(div)
|
|
.find('a[name^="modifier_add"]')
|
|
.attr("id", "modifier_add_" + index);
|
|
$(div)
|
|
.find('a[id^="criteria_remove"]')
|
|
.attr("id", "criteria_remove_" + index + "_" + modIndex);
|
|
} else if (i > 0) {
|
|
$(div).remove();
|
|
}
|
|
});
|
|
}
|
|
|
|
function buttonClickAction(clickType, url) {
|
|
var data = $(".active-tab .smart-block-form").serializeArray(),
|
|
obj_id = $(".active-tab .obj_id").val();
|
|
|
|
enableLoadingIcon();
|
|
$.post(
|
|
url,
|
|
{
|
|
format: "json",
|
|
data: data,
|
|
obj_id: obj_id,
|
|
obj_type: "block",
|
|
modified: AIRTIME.playlist.getModified(),
|
|
},
|
|
function (data) {
|
|
callback(data, clickType);
|
|
disableLoadingIcon();
|
|
},
|
|
);
|
|
}
|
|
|
|
function setupUI() {
|
|
var activeTab = $(".active-tab"),
|
|
playlist_type = activeTab.find("input:radio[name=sp_type]:checked").val();
|
|
|
|
/* Activate or Deactivate shuffle button
|
|
* It is only active if playlist is not empty
|
|
*/
|
|
var sortable = activeTab.find(".spl_sortable"),
|
|
plContents = sortable.children(),
|
|
shuffleButton = activeTab.find('button[name="shuffle_button"]'),
|
|
generateButton = activeTab.find('button[name="generate_button"]'),
|
|
fadesButton = activeTab.find("#spl_crossfade, #pl-bl-clear-content");
|
|
if (activeTab.find("#sp_limit_options").val() == "remaining") {
|
|
disableAndHideLimitValue();
|
|
}
|
|
|
|
if (!plContents.hasClass("spl_empty")) {
|
|
if (shuffleButton.hasClass("ui-state-disabled")) {
|
|
shuffleButton.removeClass("ui-state-disabled");
|
|
shuffleButton.removeAttr("disabled");
|
|
}
|
|
} else if (!shuffleButton.hasClass("ui-state-disabled")) {
|
|
shuffleButton.addClass("ui-state-disabled");
|
|
shuffleButton.attr("disabled", "disabled");
|
|
}
|
|
|
|
if (activeTab.find(".obj_type").val() == "block") {
|
|
if (playlist_type == "1") {
|
|
shuffleButton.removeAttr("disabled");
|
|
generateButton.removeAttr("disabled");
|
|
generateButton.html($.i18n._("Generate"));
|
|
fadesButton.removeAttr("disabled");
|
|
//sortable.children().show();
|
|
} else {
|
|
shuffleButton.attr("disabled", "disabled");
|
|
generateButton.html($.i18n._("Preview"));
|
|
fadesButton.attr("disabled", "disabled");
|
|
//sortable.children().hide();
|
|
}
|
|
}
|
|
|
|
$(".playlist_type_help_icon").qtip({
|
|
content: {
|
|
text:
|
|
$.i18n._(
|
|
"A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show.",
|
|
) +
|
|
"<br /><br />" +
|
|
$.i18n._(
|
|
"A dynamic smart block will only save the criteria. The block content will get generated upon adding it to a show. You will not be able to view and edit the content in the Library.",
|
|
),
|
|
},
|
|
hide: {
|
|
delay: 500,
|
|
fixed: true,
|
|
},
|
|
style: {
|
|
border: {
|
|
width: 0,
|
|
radius: 4,
|
|
},
|
|
classes: "ui-tooltip-dark ui-tooltip-rounded",
|
|
},
|
|
position: {
|
|
my: "left bottom",
|
|
at: "right center",
|
|
},
|
|
});
|
|
|
|
$(".repeat_tracks_help_icon").qtip({
|
|
content: {
|
|
text: sprintf(
|
|
$.i18n._(
|
|
"The desired block length will not be reached if %s cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block.",
|
|
),
|
|
PRODUCT_NAME,
|
|
),
|
|
},
|
|
hide: {
|
|
delay: 500,
|
|
fixed: true,
|
|
},
|
|
style: {
|
|
border: {
|
|
width: 0,
|
|
radius: 4,
|
|
},
|
|
classes: "ui-tooltip-dark ui-tooltip-rounded",
|
|
},
|
|
position: {
|
|
my: "left bottom",
|
|
at: "right center",
|
|
},
|
|
});
|
|
|
|
$(".overflow_tracks_help_icon").qtip({
|
|
content: {
|
|
text: sprintf(
|
|
$.i18n._(
|
|
"<p>If this option is unchecked, the smartblock will schedule as many tracks as can be played out <strong>in their entirety</strong> within the specified duration. This will usually result in audio playback that is slightly less than the specified duration.</p><p>If this option is checked, the smartblock will also schedule one final track which will overflow the specified duration. This final track may be cut off mid-way if the show into which the smartblock is added finishes.</p>",
|
|
),
|
|
PRODUCT_NAME,
|
|
),
|
|
},
|
|
hide: {
|
|
delay: 500,
|
|
fixed: true,
|
|
},
|
|
style: {
|
|
border: {
|
|
width: 0,
|
|
radius: 4,
|
|
},
|
|
classes: "ui-tooltip-dark ui-tooltip-rounded",
|
|
},
|
|
position: {
|
|
my: "left bottom",
|
|
at: "right center",
|
|
},
|
|
});
|
|
|
|
activeTab
|
|
.find(".collapsible-header")
|
|
.off("click")
|
|
.on("click", function () {
|
|
$(this).toggleClass("visible");
|
|
$(".smart-block-advanced").toggle();
|
|
});
|
|
}
|
|
|
|
function enableAndShowTracktypeDropdown(valEle, index) {
|
|
console.log("tracktype show");
|
|
$("#sp_criteria_value_" + index).replaceWith(
|
|
'<select name="sp_criteria_value_' +
|
|
index +
|
|
'" id="sp_criteria_value_' +
|
|
index +
|
|
'" class="input_select sp_input_select"></select>',
|
|
);
|
|
$.each(stringTracktypeOptions, function (key, value) {
|
|
$("#sp_criteria_value_" + index).append(
|
|
$("<option></option>").attr("value", key).text(value),
|
|
);
|
|
});
|
|
}
|
|
|
|
function disableAndHideTracktypeDropdown(valEle, index) {
|
|
console.log("tracktype hide");
|
|
$("#sp_criteria_value_" + index).replaceWith(
|
|
'<input type="text" name="sp_criteria_value_' +
|
|
index +
|
|
'" id="sp_criteria_value_' +
|
|
index +
|
|
'" value="" class="input_text sp_input_text">',
|
|
);
|
|
}
|
|
|
|
/* Utilizing jQuery this function finds the #datetime_select element on the given row
|
|
* and shows the criteria drop-down
|
|
*/
|
|
function enableAndShowDateTimeDropdown(valEle, index) {
|
|
console.log("datetime show");
|
|
var spanDatetime = valEle.nextAll("#datetime_select");
|
|
spanDatetime
|
|
.children("#sp_criteria_datetime_select_" + index)
|
|
.removeAttr("disabled");
|
|
spanDatetime
|
|
.children("#sp_criteria_extra_datetime_select_" + index)
|
|
.removeAttr("disabled");
|
|
spanDatetime.show();
|
|
|
|
//make value input smaller since we have extra element now
|
|
var criteria_val = $("#sp_criteria_value_" + index);
|
|
sizeTextBoxes(criteria_val, "sp_input_text", "sp_extra_input_text");
|
|
}
|
|
|
|
/* Utilizing jQuery this function finds the #datetime_select element on the given row
|
|
* and hides the datetime criteria drop-down
|
|
*/
|
|
|
|
function disableAndHideDateTimeDropdown(valEle, index) {
|
|
console.log("datetime hide");
|
|
var spanDatetime = valEle.nextAll("#datetime_select");
|
|
spanDatetime
|
|
.children("#sp_criteria_datetime_select_" + index)
|
|
.val("")
|
|
.attr("disabled", "disabled");
|
|
spanDatetime.hide();
|
|
|
|
//make value input larger since we don't have extra field now
|
|
var criteria_value = $("#sp_criteria_value_" + index);
|
|
sizeTextBoxes(criteria_value, "sp_extra_input_text", "sp_input_text");
|
|
}
|
|
|
|
/* Utilizing jQuery this function finds the #datetime_select element on the given row
|
|
* and shows the criteria drop-down
|
|
*/
|
|
function enableAndShowExtraDateTimeDropdown(valEle, index) {
|
|
console.log("datetime show");
|
|
var spanDatetime = valEle.nextAll("#extra_datetime_select");
|
|
spanDatetime
|
|
.children("#sp_criteria_extra_datetime_select_" + index)
|
|
.removeAttr("disabled");
|
|
spanDatetime.show();
|
|
|
|
//make value input smaller since we have extra element now
|
|
var criteria_val = $("#sp_criteria_value_" + index);
|
|
sizeTextBoxes(criteria_val, "sp_input_text", "sp_extra_input_text");
|
|
}
|
|
/* Utilizing jQuery this function finds the #datetime_select element on the given row
|
|
* and hides the datetime criteria drop-down
|
|
*/
|
|
|
|
function disableAndHideExtraDateTimeDropdown(valEle, index) {
|
|
console.log("datetime hide");
|
|
var spanDatetime = valEle.nextAll("#extra_datetime_select");
|
|
spanDatetime
|
|
.children("#sp_criteria_extra_datetime_select_" + index)
|
|
.val("")
|
|
.attr("disabled", "disabled");
|
|
spanDatetime.hide();
|
|
|
|
//make value input larger since we don't have extra field now
|
|
var criteria_value = $("#sp_criteria_value_" + index);
|
|
sizeTextBoxes(criteria_value, "sp_extra_input_text", "sp_input_text");
|
|
}
|
|
|
|
function enableAndShowExtraField(valEle, index) {
|
|
var spanExtra = valEle.nextAll("#extra_criteria");
|
|
console.log("shown");
|
|
spanExtra.children("#sp_criteria_extra_" + index).removeAttr("disabled");
|
|
spanExtra.show();
|
|
|
|
//make value input smaller since we have extra element now
|
|
var criteria_val = $("#sp_criteria_value_" + index);
|
|
sizeTextBoxes(criteria_val, "sp_input_text", "sp_extra_input_text");
|
|
}
|
|
|
|
function disableAndHideExtraField(valEle, index) {
|
|
var spanExtra = valEle.nextAll("#extra_criteria");
|
|
spanExtra
|
|
.children("#sp_criteria_extra_" + index)
|
|
.val("")
|
|
.attr("disabled", "disabled");
|
|
spanExtra.hide();
|
|
console.log("hidden");
|
|
|
|
//make value input larger since we don't have extra field now
|
|
var criteria_value = $("#sp_criteria_value_" + index);
|
|
sizeTextBoxes(criteria_value, "sp_extra_input_text", "sp_input_text");
|
|
}
|
|
function disableAndHideLimitValue() {
|
|
console.log("we hide it");
|
|
$("#sp_limit_value").hide();
|
|
}
|
|
function enableAndShowLimitValue() {
|
|
console.log("we show it");
|
|
$("#sp_limit_value").show();
|
|
}
|
|
|
|
function sizeTextBoxes(ele, classToRemove, classToAdd) {
|
|
if (ele.hasClass(classToRemove)) {
|
|
ele.removeClass(classToRemove).addClass(classToAdd);
|
|
}
|
|
}
|
|
|
|
function populateModifierSelect(e, popAllMods) {
|
|
var criteria_type = getCriteriaOptionType(e),
|
|
index = getRowIndex($(e).parent()),
|
|
divs;
|
|
|
|
if (popAllMods) {
|
|
index = index.substring(0, 1);
|
|
}
|
|
divs = $(e)
|
|
.parents()
|
|
.find('select[id^="sp_criteria_modifier_' + index + '"]');
|
|
|
|
$.each(divs, function (i, div) {
|
|
$(div).children().remove();
|
|
|
|
if (criteria_type == "s") {
|
|
$.each(stringCriteriaOptions, function (key, value) {
|
|
$(div).append($("<option></option>").attr("value", key).text(value));
|
|
});
|
|
} else if (criteria_type == "d") {
|
|
$.each(dateTimeCriteriaOptions, function (key, value) {
|
|
$(div).append($("<option></option>").attr("value", key).text(value));
|
|
});
|
|
} else if (criteria_type == "tt") {
|
|
$.each(stringIsNotOptions, function (key, value) {
|
|
$(div).append($("<option></option>").attr("value", key).text(value));
|
|
});
|
|
} else {
|
|
$.each(numericCriteriaOptions, function (key, value) {
|
|
$(div).append($("<option></option>").attr("value", key).text(value));
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
function populateTracktypeSelect(e, popAllMods) {
|
|
var criteria_type = getTracktype(e),
|
|
index = getRowIndex($(e).parent()),
|
|
divs;
|
|
|
|
if (popAllMods) {
|
|
index = index.substring(0, 1);
|
|
}
|
|
divs = $(e)
|
|
.parents()
|
|
.find('select[id^="sp_criteria_modifier_' + index + '"]');
|
|
$.each(divs, function (i, div) {
|
|
$(div).children().remove();
|
|
$.each(stringIsNotOptions, function (key, value) {
|
|
$(div).append($("<option></option>").attr("value", key).text(value));
|
|
});
|
|
});
|
|
}
|
|
|
|
function getCriteriaOptionType(e) {
|
|
var criteria = $(e).val();
|
|
return criteriaTypes[criteria];
|
|
}
|
|
|
|
function getTracktype(e) {
|
|
var type = $(e).val();
|
|
return stringTracktypeOptions[type];
|
|
}
|
|
|
|
function callback(json, type) {
|
|
var dt = $('table[id="library_display"]').dataTable(),
|
|
form = $(".active-tab .smart-block-form");
|
|
|
|
if (json.modified !== undefined) {
|
|
AIRTIME.playlist.setModified(json.modified);
|
|
}
|
|
|
|
if (type == "shuffle" || type == "generate") {
|
|
if (json.error !== undefined) {
|
|
alert(json.error);
|
|
}
|
|
if (json.result == "0") {
|
|
if (type == "shuffle") {
|
|
form.find(".success").text($.i18n._("Smart block shuffled"));
|
|
} else if (type == "generate") {
|
|
form
|
|
.find(".success")
|
|
.text($.i18n._("Smart block generated and criteria saved"));
|
|
//redraw library table so the length gets updated
|
|
dt.fnStandingRedraw();
|
|
}
|
|
|
|
AIRTIME.playlist.playlistResponse(json);
|
|
|
|
form.find(".success").show();
|
|
}
|
|
removeButtonCheck();
|
|
|
|
form.find(".smart-block-form").removeClass("closed");
|
|
} else {
|
|
if (json.result == "0") {
|
|
$(".active-tab #sp-success-saved")
|
|
.text($.i18n._("Smart block saved"))
|
|
.show();
|
|
|
|
AIRTIME.playlist.playlistResponse(json);
|
|
|
|
//redraw library table so the length gets updated
|
|
dt.fnStandingRedraw();
|
|
} else {
|
|
AIRTIME.playlist.playlistResponse(json);
|
|
removeButtonCheck();
|
|
}
|
|
form.find(".smart-block-form").removeClass("closed");
|
|
}
|
|
setTimeout(removeSuccessMsg, 5000);
|
|
}
|
|
|
|
function appendAddButton() {
|
|
/*
|
|
var add_button = "<a class='btn btn-small' id='criteria_add'>" +
|
|
"<i class='icon-white icon-plus'></i>Add Criteria</a>";
|
|
var rows = $('.active-tab .smart-block-form'),
|
|
enabled = rows.find('select[name^="sp_criteria_field"]:enabled');
|
|
|
|
rows.find('#criteria_add').remove();
|
|
|
|
if (enabled.length > 1) {
|
|
rows.find('select[name^="sp_criteria_field"]:enabled:last')
|
|
.siblings('a[id^="criteria_remove"]')
|
|
.after(add_button);
|
|
} else {
|
|
enabled.siblings('span[id="extra_criteria"]')
|
|
.after(add_button);
|
|
}
|
|
*/
|
|
}
|
|
|
|
function removeButtonCheck() {
|
|
/*
|
|
var rows = $('.active-tab dd[id="sp_criteria-element"]').children('div'),
|
|
enabled = rows.find('select[name^="sp_criteria_field"]:enabled'),
|
|
rmv_button = enabled.siblings('a[id^="criteria_remove"]');
|
|
if (enabled.length == 1) {
|
|
rmv_button.attr('disabled', 'disabled');
|
|
rmv_button.hide();
|
|
} else {
|
|
rmv_button.removeAttr('disabled');
|
|
rmv_button.show();
|
|
}*/
|
|
}
|
|
|
|
function enableLoadingIcon() {
|
|
// Disable the default overlay style
|
|
$.blockUI.defaults.overlayCSS = {};
|
|
$(".side_playlist.active-tab").block({
|
|
//message: $.i18n._("Processing..."),
|
|
message: $.i18n._(""),
|
|
theme: true,
|
|
allowBodyStretch: true,
|
|
applyPlatformOpacityRules: false,
|
|
});
|
|
}
|
|
|
|
function disableLoadingIcon() {
|
|
$(".side_playlist.active-tab").unblock();
|
|
}
|
|
|
|
function groupCriteriaRows() {
|
|
// check whether rows should be "grouped" and shown with an "or" "logic label", or separated by an "and" "logic label"
|
|
var visibleRows = $("#sp_criteria-element > div:visible"),
|
|
prevRowGroup = "0";
|
|
|
|
visibleRows.each(function (index) {
|
|
if (index > 0) {
|
|
var fieldId = $(this).find('select[id^="sp_criteria_field"]').attr("id");
|
|
var currRowGroup = fieldId[fieldId.length - 3];
|
|
if (currRowGroup === prevRowGroup) {
|
|
$(this).prev().addClass("search-row-or").removeClass("search-row-and");
|
|
} else {
|
|
$(this).prev().addClass("search-row-and").removeClass("search-row-or");
|
|
}
|
|
prevRowGroup = currRowGroup;
|
|
}
|
|
});
|
|
|
|
// ensure spacing below last visible row
|
|
$("#sp_criteria-element > div:visible:last")
|
|
.addClass("search-row-and")
|
|
.removeClass("search-row-or");
|
|
}
|
|
|
|
// We need to know if the criteria value will be a string
|
|
// or numeric value in order to populate the modifier
|
|
// select list
|
|
var criteriaTypes = {
|
|
0: "",
|
|
album_title: "s",
|
|
bit_rate: "n",
|
|
bpm: "n",
|
|
composer: "s",
|
|
conductor: "s",
|
|
copyright: "s",
|
|
cuein: "n",
|
|
cueout: "n",
|
|
description: "s",
|
|
artist_name: "s",
|
|
encoded_by: "s",
|
|
utime: "d",
|
|
mtime: "d",
|
|
lptime: "d",
|
|
genre: "s",
|
|
isrc_number: "s",
|
|
label: "s",
|
|
language: "s",
|
|
length: "n",
|
|
mime: "s",
|
|
mood: "s",
|
|
owner_id: "s",
|
|
replay_gain: "n",
|
|
sample_rate: "n",
|
|
track_title: "s",
|
|
track_number: "n",
|
|
info_url: "s",
|
|
year: "n",
|
|
track_type_id: "tt",
|
|
filepath: "s",
|
|
};
|
|
|
|
var stringCriteriaOptions = {
|
|
0: $.i18n._("Select modifier"),
|
|
contains: $.i18n._("contains"),
|
|
"does not contain": $.i18n._("does not contain"),
|
|
is: $.i18n._("is"),
|
|
"is not": $.i18n._("is not"),
|
|
"starts with": $.i18n._("starts with"),
|
|
"ends with": $.i18n._("ends with"),
|
|
};
|
|
|
|
var numericCriteriaOptions = {
|
|
0: $.i18n._("Select modifier"),
|
|
is: $.i18n._("is"),
|
|
"is not": $.i18n._("is not"),
|
|
"is greater than": $.i18n._("is greater than"),
|
|
"is less than": $.i18n._("is less than"),
|
|
"is in the range": $.i18n._("is in the range"),
|
|
};
|
|
|
|
var dateTimeCriteriaOptions = {
|
|
0: $.i18n._("Select modifier"),
|
|
before: $.i18n._("before"),
|
|
after: $.i18n._("after"),
|
|
between: $.i18n._("between"),
|
|
is: $.i18n._("is"),
|
|
"is not": $.i18n._("is not"),
|
|
"is greater than": $.i18n._("is greater than"),
|
|
"is less than": $.i18n._("is less than"),
|
|
"is in the range": $.i18n._("is in the range"),
|
|
};
|
|
|
|
var stringIsNotOptions = {
|
|
0: $.i18n._("Select modifier"),
|
|
is: $.i18n._("is"),
|
|
"is not": $.i18n._("is not"),
|
|
};
|
|
|
|
let tracktypes = {};
|
|
|
|
for (var key in TRACKTYPES) {
|
|
if (TRACKTYPES.hasOwnProperty(key)) {
|
|
tracktypes[key] = TRACKTYPES[key].name;
|
|
}
|
|
}
|
|
|
|
var stringTracktypeOptions = Object.assign(
|
|
{ 0: "Select Track Type" },
|
|
tracktypes,
|
|
);
|