/*global wpml_tm_strings, jQuery, Backbone, icl_ajxloaderimg, ajaxurl, ProgressBar */
/*jslint laxbreak: true */
var WPML_TM = WPML_TM || {};
(function () {
'use strict';
WPML_TM.Dashboard = Backbone.View.extend({
events: {
'click td[scope="row"] :checkbox': 'update_td',
"click td.check-column :checkbox": 'icl_tm_select_all_documents',
"change #icl_tm_languages :radio": 'change_radio',
"change #parent-filter-control": 'populate_parent_list',
"change #icl_language_selector": 'populate_parent_list',
"click #duplicate-all": 'icl_tm_bulk_batch_selection',
"click #translate-all": 'icl_tm_bulk_batch_selection',
"click #update-none": 'icl_tm_bulk_batch_selection',
"submit #icl_tm_dashboard_form": 'submit',
"change #filter_type": 'show_hide_parent_controls'
},
counts: {
all: 0,
duplicate: 0,
translate: 0
},
init: function ( $ ) {
var self = this;
self.$ = $;
self.counts.all = self.setElement( '.icl_tm_wrap' );
self.change_radio();
self.show_hide_parent_controls();
},
submit: function (e) {
var self = this;
self.recount();
if (self.counts.duplicate > 0) {
e.preventDefault();
var post_ids = [];
var langs = [];
var radios = jQuery('#icl_tm_languages').find('tbody').find(':radio:checked').filter('[value=2]');
radios.each(function () {
langs.push(jQuery(this).attr('name').replace('tr_action[', '').replace(']', ''));
});
var languagesCount = langs.length;
if (0 < languagesCount) {
var post_id_boxes = self.$el.find('#icl-tm-translation-dashboard tbody td :checkbox:checked');
var post_ids_count = post_id_boxes.length;
for (var p = 0; p < post_ids_count; p++) {
for (var l = 0; l < languagesCount; l++) {
post_ids.push({
postId: jQuery(post_id_boxes[p]).val(),
languageCode: langs[l]
});
}
}
var duplication_ui = new PostDuplication(post_ids, jQuery('#icl_dup_ovr_warn'));
duplication_ui.sendBatch();
}
}
},
iclTmUpdateDashboardSelection: function () {
var self = this;
if (self.$el.find(':checkbox:checked').length > 0) {
var checked_items = self.$el.find('td.check-column :checkbox');
if (self.$el.find('td[scope="row"] :checkbox:checked').length === self.$el.find('td[scope="row"] :checkbox').length) {
checked_items.prop('checked', true);
} else {
checked_items.prop('checked', false);
}
}
},
recount: function(){
var self = this;
var radios = jQuery('#icl_tm_languages').find('tbody').find(':radio:checked');
self.counts.duplicate = radios.filter('[value=2]').length;
self.counts.translate = radios.filter('[value=1]').length;
self.counts.all = radios.length;
return self;
},
change_radio: function () {
var bulk_select_radio, bulk_select_val, self;
self = this;
self.recount();
self.icl_tm_enable_submit();
self.icl_tm_dup_warn();
bulk_select_val = self.counts.duplicate === self.counts.all ? "2" : false;
bulk_select_val = self.counts.translate === self.counts.all ? "1" : bulk_select_val;
bulk_select_val = self.counts.translate === 0 && self.counts.duplicate === 0 ? "0" : bulk_select_val;
bulk_select_radio = bulk_select_val !== false
? self.$el.find('[name="radio-action-all"]').filter('[value=' + bulk_select_val + ']')
: self.$el.find('[name="radio-action-all"]');
bulk_select_radio.prop('checked', !!bulk_select_val);
},
update_td: function () {
var self = this;
self.icl_tm_update_word_count_estimate();
self.iclTmUpdateDashboardSelection();
},
icl_tm_select_all_documents: function (e) {
var self = this;
self.$el.find('#icl-tm-translation-dashboard').find(':checkbox').prop('checked', !!jQuery(e.target).prop('checked'));
self.icl_tm_update_word_count_estimate();
self.icl_tm_update_doc_count();
self.icl_tm_enable_submit();
},
icl_tm_update_word_count_estimate: function () {
var self = this;
self.icl_tm_enable_submit();
var element_rows = self.$el.find('tbody').find('tr');
var current_overall_word_count = 0;
var icl_tm_estimated_words_count = jQuery('#icl-tm-estimated-words-count');
jQuery.each(element_rows, function () {
var row = jQuery(this);
if (row.find(':checkbox').prop('checked')) {
var item_word_count = row.data('word_count');
var val = parseInt(item_word_count);
val = isNaN(val) ? 0 : val;
current_overall_word_count += val;
}
});
icl_tm_estimated_words_count.html(current_overall_word_count);
self.icl_tm_update_doc_count();
},
populate_parent_list: function () {
var self = this,
parent_select = self.$( '#parent-filter-control' ),
parent_taxonomy_item_container = self.$( '[name="parent-taxonomy-item-container"]' ),
val = parent_select.val();
if ( val ) {
parent_taxonomy_item_container.hide();
if ( val != 'any' ) {
var ajax_loader = self.$( '' );
ajax_loader.insertBefore( parent_taxonomy_item_container ).css( {
visibility: "visible",
float: "none"
} );
self.$.ajax( {
type: "POST",
url: ajaxurl,
dataType: 'json',
data: {
action: 'icl_tm_parent_filter',
type: val,
from_lang: self.$( 'select[name="filter[from_lang]"]' ).val(),
parent_id: self.$( '[name="filter[parent_id]"]' ).val()
},
success: function ( response ) {
parent_taxonomy_item_container.html( response.data.html );
parent_taxonomy_item_container.show();
ajax_loader.remove();
}
} );
}
}
},
show_hide_parent_controls: function (e) {
var self = this,
selected_option = self.$( '#filter_type option:selected' ),
parent_data = selected_option.data( 'parent' ),
taxonomy_data = selected_option.data( 'taxonomy' );
if ( parent_data || taxonomy_data ) {
self.$( '#parent-taxonomy-container' ).show();
self.fill_parent_type_select( parent_data, taxonomy_data );
self.populate_parent_list();
} else {
self.$( '#parent-taxonomy-container' ).hide();
}
},
fill_parent_type_select: function ( parent_data, taxonomy_data ) {
var self = this,
parent_select = self.$( '#parent-filter-control' );
parent_select.find( 'option' ).remove();
parent_select.append( '' );
if ( parent_data ) {
parent_select.append( '' );
}
if ( taxonomy_data ) {
taxonomy_data = taxonomy_data.split( ',' );
for ( var i = 0; i < taxonomy_data.length; i++ ) {
var parts = taxonomy_data[i].split( '=' );
parent_select.append( '' );
}
}
parent_select.val( parent_select.data( 'original' ) );
parent_select.data( 'original', '' );
if ( ! parent_select.val() ) {
parent_select.val( 'any' );
}
},
icl_update_button_label: function (dupl_count, trans_count) {
var button_label;
if (dupl_count > 0 && trans_count === 0) {
button_label = wpml_tm_strings.BB_duplicate_all;
} else if (dupl_count > 0 && trans_count > 0) {
button_label = wpml_tm_strings.BB_mixed_actions;
} else if (dupl_count === 0 && trans_count > 0) {
button_label = wpml_tm_strings.BB_default;
} else {
button_label = wpml_tm_strings.BB_no_actions;
}
jQuery('#icl_tm_jobs_submit').html(button_label);
},
icl_update_button_class: function (dupl_count, trans_count) {
var button= jQuery('#icl_tm_jobs_submit');
var button_class= 'wpml-tm-button-basket';
if (dupl_count > 0 && trans_count === 0) {
button.removeClass(button_class);
} else {
button.addClass(button_class);
}
},
icl_tm_dup_warn: function () {
var self = this;
if (self.counts.duplicate > 0 !== self.$el.find('[id="icl_dup_ovr_warn"]:visible').length > 0) {
self.$el.find('#icl_dup_ovr_warn').fadeToggle(400);
}
self.icl_update_button_label(self.counts.duplicate, self.counts.translate);
self.icl_update_button_class(self.counts.duplicate, self.counts.translate);
},
icl_tm_bulk_batch_selection: function (e) {
var self = this;
var element = jQuery(e.target);
var value = element.val();
element.prop('checked', true);
self.$el.find('#icl_tm_languages').find('tbody input:radio[value=' + value + ']').prop('checked', true);
self.change_radio();
return self;
},
icl_tm_enable_submit: function () {
var self = this;
var hasSelection = (self.counts.duplicate > 0 || self.counts.translate > 0)
&& jQuery('#icl-tm-translation-dashboard').find('td :checkbox:checked').length > 0;
jQuery('#icl_tm_jobs_submit').prop('disabled', !hasSelection);
},
icl_tm_update_doc_count: function () {
var self = this;
var dox = self.$el.find('tbody td :checkbox:checked').length;
jQuery('#icl-tm-sel-doc-count').html(dox);
if (dox) {
jQuery('#icl-tm-doc-wrap').fadeIn();
} else {
jQuery('#icl-tm-doc-wrap').fadeOut();
}
}
});
var PostDuplication = Backbone.View.extend({
ui: {},
posts: [],
duplicatedIDs: [],
langs: '',
initialize: function (posts, element) {
var self = this;
self.posts = posts;
self.ui = new ProgressBar();
self.ui.overall_count = posts.length;
self.ui.actionText = wpml_tm_strings.duplicating;
element.replaceWith(self.ui.getDomElement());
self.ui.start();
},
sendBatch: function () {
var nonce;
var p;
var postsToSend;
var languages;
var self = this;
var postsDataToSend = self.posts.splice(0, 5);
var postsDataToSendCount = postsDataToSend.length;
if(0 < postsDataToSendCount) {
postsToSend = [];
languages = [];
for (p = 0; p < postsDataToSendCount; p++) {
if (-1 === jQuery.inArray(postsDataToSend[p].postId, postsToSend)) {
postsToSend.push(postsDataToSend[p].postId);
}
if (-1 === jQuery.inArray(postsDataToSend[p].languageCode, languages)) {
languages.push(postsDataToSend[p].languageCode);
}
}
if(0 < postsToSend.length && 0 < languages.length) {
nonce = wpml_tm_strings.wpml_duplicate_dashboard_nonce;
jQuery.ajax({
type: "POST",
url: ajaxurl,
dataType: 'json',
data: {
action: 'wpml_duplicate_dashboard',
duplicate_post_ids: postsToSend,
duplicate_target_languages: languages,
_icl_nonce: nonce
},
success: function () {
self.ui.change(postsToSend.length);
self.duplicatedIDs = self.duplicatedIDs.concat(postsToSend);
if (0 < self.posts.length) {
self.sendBatch();
} else {
self.ui.complete(wpml_tm_strings.duplication_complete, false);
jQuery('#icl_tm_languages').find('tbody').find(':radio:checked').filter('[value=2]').prop('checked', false);
self.setHierarchyNoticeAndSubmit();
}
}
});
}
}
},
setHierarchyNoticeAndSubmit: function () {
var self = this;
jQuery.ajax({
type: "POST",
url: ajaxurl,
dataType: 'json',
data: {
action: 'wpml_need_sync_message',
duplicated_post_ids: self.duplicatedIDs.join(','),
_icl_nonce: wpml_tm_strings.wpml_need_sync_message_nonce
},
success: function () {
jQuery('#icl_tm_dashboard_form').submit();
}
});
}
});
jQuery(function () {
var tmDashboard = new WPML_TM.Dashboard();
tmDashboard.init(jQuery);
});
}());