Files

421 lines
11 KiB
JavaScript
Executable File

(function ( w, d ) {
var _id = 0;
function PKSimpleModal ( config ) {
var q = this;
this.id = config.id ? config.id : (++_id);
var el = d.createElement ('div');
this.els = {
toolbar:[],
bottom:[]
};
el.className = 'pk_modal ' + (config.clss ? config.clss : '');
q.el = el;
// backdrop
var el_back = d.createElement ('div');
el_back.className = 'pk_modal_back';
this.el_back = el_back;
// var centerer
var el_cont = d.createElement ('div');
el_cont.className = 'pk_modal_cnt';
this.el_cont = el_cont;
// title
var el_title = d.createElement ('div');
el_title.className = 'pk_noselect pk_modal_title';
el_title.innerHTML = '<span>'+ (config.title || '') +'</span>';
el.appendChild ( el_title );
this.el_title = el_title;
// main
var el_main = d.createElement ('div');
el_main.className = 'pk_modal_main';
el.appendChild ( el_main );
this.el_body = el_main;
// bottom buttons
var el_bottom = d.createElement ('div');
el_bottom.className = 'pk_noselect pk_modal_bottom';
// -----------
var a_cancel = d.createElement ('a');
a_cancel.innerHTML = 'CANCEL';
a_cancel.className = 'pk_modal_cancel pk_modal_a_bottom';
a_cancel.onclick = function () {
q.Destroy ();
};
el_bottom.appendChild ( a_cancel );
// check if we need to construct more buttons from the config...
if (config.buttons && config.buttons.length > 0)
{
for (var i = 0; i < config.buttons.length; ++i)
{
var curr = config.buttons[i];
if (!curr.title || !curr.callback) continue;
var a_bottom = d.createElement ('a');
a_bottom.innerHTML = curr.title;
a_bottom.className = 'pk_modal_a_bottom ' + (curr.clss ? curr.clss : '');
if (curr.callback)
{
(function ( callback ) {
a_bottom.onclick = function () {
callback ( q );
};
})( curr.callback );
}
q.els.bottom.push (a_bottom);
el_bottom.appendChild ( a_bottom );
}
}
el.appendChild ( el_bottom );
// -----
if (config.toolbar && config.toolbar.length > 0)
{
for (var i = 0; i < config.toolbar.length; ++i)
{
var curr = config.toolbar[i];
if (!curr.title || !curr.callback) continue;
var a_link = d.createElement ('a');
a_link.innerHTML = curr.title;
a_link.className = 'pk_modal_a_top ' + (curr.clss ? curr.clss : '');
el_title.appendChild ( a_link );
if (curr.callback)
{
(function ( callback ) {
a_link.onclick = function () {
callback ( q, this );
};
})( curr.callback );
}
q.els.toolbar.push (a_link);
}
}
this.ondestroy = config.ondestroy;
if (config.body) q.el_body.innerHTML = config.body;
if (config.onpreset) this.onpreset = config.onpreset;
if (config.setup) config.setup ( this );
};
PKSimpleModal.prototype.Show = function () {
this.el_back.appendChild ( this.el_cont );
this.el_cont.appendChild ( this.el );
d.body.appendChild ( this.el_back );
return (this);
};
PKSimpleModal.prototype.Destroy = function () {
if (this.ondestroy) {
this.ondestroy ( this );
this.ondestroy = null;
}
this.els = null;
d.body.removeChild ( this.el_back );
};
// Extended modal
function PKAudioFXModal ( config, app ) {
var toolbar = null;
if (config.preview)
{
toolbar = [
{
title:'ON',
clss:'pk_inact',
callback: function ( q, el ) {
app.fireEvent ('RequestActionFX_TOGGLE');
}
},
{
title:'Preview',
callback: function ( q ) {
config.preview && config.preview ( q );
}
}
];
}
var inner_modal = new PKSimpleModal({
id: config.id,
title: config.title,
clss: config.clss,
presets: config.presets,
updateFilter: config.updateFilter,
ondestroy: function ( q ) {
app.fireEvent ('DidCloseFX_UI');
app.stopListeningFor ('DidStartPreview', q._evstart);
app.stopListeningFor ('DidStopPreview', q._evstop);
app.stopListeningFor ('DidTogglePreview', q._evtoggle);
app.stopListeningFor ('DidSetPresets', q._updatePresets);
app.stopListeningFor ('RequestActionFX_UPDATE_PREVIEW', q._updpreview);
app.stopListeningFor ('RequestSetPresetActive', q._updpreset);
app.fireEvent ('RequestActionFX_PREVIEW_STOP');
// if preview remove callback
app.ui.KeyHandler.removeCallback ('ksp' + q.id);
config.ondestroy && config.ondestroy ( q );
},
toolbar: toolbar,
buttons: config.buttons,
body: config.body,
onpreset: config.onpreset,
setup:function( q ) {
app.fireEvent ('RequestActionFX_TOGGLE', 1);
var slf = this;
app.ui.KeyHandler.addCallback ('ksp' + q.id, function ( key, map ) {
if (!app.ui.InteractionHandler.check ('modalfx')) return ;
var tb = slf.toolbar;
if (tb && tb.length > 0)
{
var k = tb.length;
while (k-- > 0) {
if (tb[k].title === 'Preview') {
tb[k].callback ( q );
break;
}
}
}
}, [32]);
q._evstart = function () {
q.els.toolbar[0].classList.remove ('pk_inact');
q.els.toolbar[1].classList.add ('pk_act');
};
q._evstop = function () {
q.els.toolbar[0].classList.add ('pk_inact');
q.els.toolbar[1].classList.remove ('pk_act');
}
q._evtoggle = function ( val ) {
var el = q.els.toolbar[0];
if (val) el.innerHTML = 'ON';
else el.innerHTML = 'OFF';
};
var stopped_listening = false;
q._updpreview = function ( val ) {
var sel_opt = q.el_presets.options[q.el_presets.selectedIndex];
var btn = q.el.getElementsByClassName('pk_sel_edt')[0];
if (val === 't')
{
if (sel_opt && sel_opt.getAttribute('data-custom')) {
btn.style.visibility = 'visible';
btn.style.opacity = '1';
app.stopListeningFor ('RequestActionFX_UPDATE_PREVIEW', q._updpreview);
}
else
{
btn.style.visibility = 'hidden';
btn.style.opacity = '0';
app.stopListeningFor ('RequestActionFX_UPDATE_PREVIEW', q._updpreview);
//if (stopped_listening)
//{
setTimeout(function (){
app.listenFor ('RequestActionFX_UPDATE_PREVIEW', q._updpreview);
}, 100);
stopped_listening = false;
//}
}
return ;
}
// if (sel_opt && sel_opt.getAttribute('data-custom')) {
btn.style.visibility = 'visible';
btn.style.opacity = '1';
stopped_listening = true;
app.stopListeningFor ('RequestActionFX_UPDATE_PREVIEW', q._updpreview);
// }
};
q._updpreset = function ( fx_id, preset_id ) {
if (fx_id && fx_id !== q.id) {
return ;
}
var opts = q.el_presets.getElementsByTagName('option');
var ll = opts.length;
var curr = null;
while (ll-- > 0) {
curr = opts[ll];
if (curr.getAttribute('data-custom') === preset_id) {
curr.selected = 'selected';
break;
}
}
};
q._updatePresets = function ( fx_id, presets ) {
if (fx_id && fx_id !== q.id) {
return ;
}
var d = document;
var sel_presets = q.el.getElementsByClassName ('pk_sel');
// if presets exist remove them
if (sel_presets.length > 0)
{
sel_presets = sel_presets[0];
var opts = sel_presets.getElementsByTagName('option');
var ll = opts.length;
var curr = null;
while (ll-- > 0) {
curr = opts[ll];
if (curr.getAttribute('data-custom')) {
sel_presets.removeChild( curr );
}
}
if (presets.length === 0) return ;
var opt = d.createElement ('option');
// opt.value = '---custom----';
opt.setAttribute ('disabled', '1');
opt.setAttribute ('data-custom', '1');
opt.innerHTML = '----custom-----';
sel_presets.appendChild( opt );
for (var i = 0; i < presets.length; ++i)
{
var opt = d.createElement ('option');
var curr = presets[ i ];
opt.value = curr.val;
opt.setAttribute ('data-custom', curr.id);
opt.innerHTML = curr.name;
sel_presets.appendChild( opt );
}
return ;
}
else
{
sel_presets = d.createElement ('select');
sel_presets.className = 'pk_sel';
}
if (presets.length === 0) return ;
for (var i = -1; i < presets.length; ++i)
{
var opt = d.createElement ('option');
if (i === -1)
{
opt.value = 'null';
opt.innerHTML = 'Presets';
}
else
{
var curr = presets[ i ];
opt.value = curr.val;
opt.innerHTML = curr.name;
}
sel_presets.appendChild( opt );
}
sel_presets.onchange = function () {
var val_arr = this.value.split(',');
var els = q.el.getElementsByTagName('input');
q._updpreview ('t');
if (q.onpreset)
{
q.onpreset (this.value);
return ;
}
var len = els.length;
for (var i = 0; i < len; ++i) {
if (!val_arr[ i ]) break;
var curr_val = val_arr[ i ].trim ();
var curr_input = els[ i ];
if (curr_val === 'null') continue;
if (curr_input.type === 'checkbox' || curr_input.type === 'radio')
curr_input.checked = curr_val;
else
{
curr_input.value = curr_val;
curr_input.oninput && curr_input.oninput.apply (curr_input);
}
}
};
var btm = q.el.getElementsByClassName('pk_modal_bottom')[0];
btm.appendChild ( sel_presets );
q.el_presets = sel_presets;
// now add preset edit button
var edit_presets = d.createElement ('a');
edit_presets.className = 'pk_sel_edt';
edit_presets.innerHTML = '...<span>Save or Modify preset</span>';
edit_presets.onclick = function () {
app.fireEvent ('RequestSavePreset');
};
btm.appendChild ( edit_presets );
app.listenFor ('RequestActionFX_UPDATE_PREVIEW', q._updpreview);
app.listenFor ('RequestSetPresetActive', q._updpreset);
};
app.listenFor ('DidStartPreview', q._evstart);
app.listenFor ('DidStopPreview', q._evstop);
app.listenFor ('DidTogglePreview', q._evtoggle);
app.fireEvent ('DidOpenFX_UI', q);
if (config.updateFilter) q.updateFilter = config.updateFilter;
if (config.presets)
{
q._updatePresets (null, config.presets);
if (config.custom_pres) q._updatePresets (null, config.custom_pres);
app.listenFor ('DidSetPresets', q._updatePresets);
}
config.setup && config.setup ( q );
}
});
return (inner_modal);
};
w.PKSimpleModal = PKSimpleModal;
w.PKAudioFXModal = PKAudioFXModal;
})( window, document );