From 7aea1823e96c46b770637e232826f24f2fe0c4a7 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 14 Mar 2011 13:48:16 +0100 Subject: [PATCH] repalced own ajax queue by jquery news deferred objects --- htdocs/frontend/index.html | 6 +- htdocs/frontend/javascripts/entity.js | 157 ++++++++++++++++-- htdocs/frontend/javascripts/functions.js | 33 +--- htdocs/frontend/javascripts/helper.js | 12 +- htdocs/frontend/javascripts/init.js | 13 +- htdocs/frontend/javascripts/options.js | 8 +- htdocs/frontend/javascripts/wui.js | 196 +++++++---------------- 7 files changed, 231 insertions(+), 194 deletions(-) diff --git a/htdocs/frontend/index.html b/htdocs/frontend/index.html index 21129c2..61fb065 100644 --- a/htdocs/frontend/index.html +++ b/htdocs/frontend/index.html @@ -138,7 +138,7 @@

Hier können Sie einen existierenden Kanal über seine UUID hinzufügen

@@ -153,12 +153,12 @@

-
+
diff --git a/htdocs/frontend/javascripts/entity.js b/htdocs/frontend/javascripts/entity.js index e8bfda3..b55ab6e 100644 --- a/htdocs/frontend/javascripts/entity.js +++ b/htdocs/frontend/javascripts/entity.js @@ -32,15 +32,16 @@ var Entity = function(json, parent) { $.extend(true, this, json); this.parent = parent; + if (this.active === undefined) { + this.active = true; // active by default + } + if (this.children) { - var children = new Array(); for (var i = 0; i < this.children.length; i++) { - children.push(new Entity(this.children[i], this)); + this.children[i] = new Entity(this.children[i], this); }; - this.children = children.sort(function(e1, e2) { - e1.title < e2.title; - }); + this.children.sort(Entity.compare); } this.definition = vz.capabilities.definitions.get('entities', this.type); @@ -65,7 +66,7 @@ Entity.prototype.showDetails = function() { * * @todo implement/test */ -Entity.prototype.getDOM = function() { +Entity.prototype.getDOM = function(edit) { var table = $('
EigenschaftWert
'); var data = $(''); @@ -118,6 +119,115 @@ Entity.prototype.getDOM = function() { return table.append(data); }; +Entity.prototype.getRow = function() { + var row = $('') + .addClass((this.parent) ? 'child-of-entity-' + this.parent.uuid : '') + .addClass((this.definition.model == 'Volkszaehler\\Model\\Aggregator') ? 'aggregator' : 'channel') + .attr('id', 'entity-' + this.uuid) + .append($('') + .addClass('visibility') + .css('background-color', this.color) + .append($('') + .attr('type', 'checkbox') + .attr('checked', this.active) + .bind('change', this, function(event) { + var state = $(this).attr('checked'); + + event.data.each(function(entity, parent) { + $('#entity-' + entity.uuid + ((parent) ? '.child-of-entity-' + parent.uuid : '') + ' input[type=checkbox]') + .attr('checked', state); + entity.active = state; + }); + + vz.wui.drawPlot(); + }) + ) + ) + .append($('').addClass('expander')) + .append($('') + .append($('') + .text(this.title) + .addClass('indicator') + ) + ) + .append($('').text(this.definition.translation[vz.options.language])) // channel type + .append($('').addClass('min')) // min + .append($('').addClass('max')) // max + .append($('').addClass('average')) // avg + .append($('').addClass('consumption')) // consumption + .append($('').addClass('last')) // last + .append($('') // operations + .addClass('ops') + .append($('') + .attr('type', 'image') + .attr('src', 'images/information.png') + .attr('alt', 'details') + .bind('click', this, function(event) { + event.data.showDetails(); + }) + ) + ) + .data('entity', this); + + if (vz.uuids.contains(this.uuid)) { // removable from cookies? + $('td.ops', row).prepend($('') + .attr('type', 'image') + .attr('src', 'images/delete.png') + .attr('alt', 'delete') + .bind('click', this, function(event) { + vz.uuids.remove(event.data.uuid); + vz.uuids.save(); + + vz.entities.remove(event.data); + vz.entities.showTable(); + + vz.wui.drawPlot(); + }) + ); + } + + return row; +}; + +Entity.prototype.loadData = function() { + //var delta = vz.options.plot.xaxis.max - vz.options.plot.xaxis.min; + //var offset = delta * 0.1; + var offset = 1000*30*60; // load additional data to avoid paddings + + return vz.load({ + controller: 'data', + identifier: this.uuid, + context: this, + data: { + from: Math.floor(vz.options.plot.xaxis.min - offset), // TODO fuzy-logic to get enough data + to: Math.ceil(vz.options.plot.xaxis.max + offset), + tuples: vz.options.tuples + }, + success: function(json) { + this.data = json.data; + + if (this.data.min !== null && this.data.min[1] < vz.options.plot.yaxis.min) { // allow negative values for temperature sensors + vz.options.plot.yaxis.min = null; + } + + // update entity table + var unit = ' ' + this.definition.unit; + $('#entity-' + this.uuid + ' .min') + .text( + (this.data.min !== null) ? vz.wui.formatNumber(this.data.min[1]) + unit : '-') + .attr('title', (this.data.min !== null) ? $.plot.formatDate(new Date(this.data.min[0]), '%d. %b %h:%M:%S', vz.options.plot.xaxis.monthNames) : ''); + $('#entity-' + this.uuid + ' .max') + .text((this.data.max !== null) ? vz.wui.formatNumber(this.data.max[1]) + unit : '-') + .attr('title', (this.data.max !== null) ? $.plot.formatDate(new Date(this.data.max[0]), '%d. %b %h:%M:%S', vz.options.plot.xaxis.monthNames) : ''); + $('#entity-' + this.uuid + ' .average').text((this.data.average !== null) ? vz.wui.formatNumber(this.data.average) + unit : ''); + $('#entity-' + this.uuid + ' .last').text((this.data.tuples) ? vz.wui.formatNumber(this.data.tuples.last()[1]) + unit : ''); + if (this.definition.interpreter == 'Volkszaehler\\Interpreter\\MeterInterpreter') { // sensors have no consumption + $('#entity-' + this.uuid + ' .consumption').text(vz.wui.formatNumber(this.data.consumption) + unit + 'h'); + } + } + }); +}; + /** * Add entity as child */ @@ -126,14 +236,13 @@ Entity.prototype.addChild = function(child) { throw new Exception('EntityException', 'Entity is not an Aggregator'); } - vz.load({ - context: 'group', + return vz.load({ + controller: 'group', identifier: this.uuid, data: { uuid: child.uuid }, - type: 'post', - success: vz.wait($.noop, vz.entities.loadDetails, 'information') + type: 'post' }); } @@ -141,14 +250,13 @@ Entity.prototype.addChild = function(child) { * Remove entity from children */ Entity.prototype.removeChild = function(child) { - vz.load({ - context: 'group', + return vz.load({ + controller: 'group', identifier: this.uuid, data: { uuid: child.uuid, operation: 'delete' - }, - success: vz.wait($.noop, vz.entities.loadDetails, 'information') + } }); }; @@ -178,8 +286,8 @@ Entity.prototype.validate = function() { * * @param cb callback function */ -Entity.prototype.each = function(cb, parent) { - cb(this, parent); +Entity.prototype.each = function(cb) { + cb(this, this.parent); if (this.children) { for (var i = 0; i < this.children.length; i++) { @@ -187,3 +295,20 @@ Entity.prototype.each = function(cb, parent) { } } }; + +/** + * Compares two entities for sorting + * + * @static + * @todo Channels before Aggregators + */ +Entity.compare = function(a, b) { + if (a.definition.model == 'Volkszaehler\\Model\\Channel' && // Channels before Aggregators + b.definition.model == 'Volkszaehler\\Model\\Aggregator') + { + return 1; + } + else { + return ((a.title < b.title) ? -1 : ((a.title > b.title) ? 1 : 0)); + } +} diff --git a/htdocs/frontend/javascripts/functions.js b/htdocs/frontend/javascripts/functions.js index 6108cd4..78ee485 100644 --- a/htdocs/frontend/javascripts/functions.js +++ b/htdocs/frontend/javascripts/functions.js @@ -24,24 +24,6 @@ * volkszaehler.org. If not, see . */ -/** - * Helper function to wait for multiple ajax requests to complete - */ -vz.wait = function(callback, finished, identifier) { - if (!vz.wait.counter) { vz.wait.counter = new Array(); } - if (!vz.wait.counter[identifier]) { vz.wait.counter[identifier] = 0; } - - vz.wait.counter[identifier]++; - - return function (data, textStatus) { - callback(data, textStatus); - - if (!--vz.wait.counter[identifier]) { - finished(); - } - }; -}; - /** * Universal helper for backend ajax requests with error handling */ @@ -55,15 +37,15 @@ vz.load = function(args) { } }); - if (args.context) { - args.url += '/' + args.context; + if (args.controller) { + args.url += '/' + args.controller; } if (args.identifier) { args.url += '/' + args.identifier; } args.url += '.json'; - $.ajax(args); + return $.ajax(args); }; /** @@ -89,7 +71,7 @@ vz.parseUrlParams = function() { vz.options.plot.xaxis.max = parseInt(vars[key]); break; - case 'debug': + case 'debug': // TODO test $.getScript('javascripts/firebug-lite.js'); break; } @@ -101,14 +83,11 @@ vz.parseUrlParams = function() { * Load capabilities from backend */ vz.capabilities.load = function() { - vz.load({ - context: 'capabilities', + return vz.load({ + controller: 'capabilities', identifier: 'definitions', success: function(json) { $.extend(true, vz.capabilities, json.capabilities); - - // load entity details - vz.entities.loadDetails(); } }); }; diff --git a/htdocs/frontend/javascripts/helper.js b/htdocs/frontend/javascripts/helper.js index 888c3c5..84cfa47 100644 --- a/htdocs/frontend/javascripts/helper.js +++ b/htdocs/frontend/javascripts/helper.js @@ -40,9 +40,11 @@ Array.prototype.remove = function(n) { this.splice(this.indexOf(n), 1); }; -Array.prototype.each = function(cb) { +Array.prototype.each = function(cb, ctx) { for (var i = 0, l = this.length; i < l; i++) { - cb(i, this[i]); + if (cb.call((ctx === undefined) ? this[i] : ctx, i, this[i]) === false) { + break; + } } }; @@ -55,7 +57,7 @@ Array.prototype.clear = function() { } Array.prototype.unique = function() { - var r = new Array(); + var r = new Array; this.each(function(key, value) { if (!r.contains(value)) { r.push(value); @@ -65,5 +67,7 @@ Array.prototype.unique = function() { } Array.prototype.last = function() { - return (this.length > 0) ? this[this.length-1] : null; + if (this.length > 0) { + return this[this.length-1]; + } } diff --git a/htdocs/frontend/javascripts/init.js b/htdocs/frontend/javascripts/init.js index 39a074c..716acb1 100644 --- a/htdocs/frontend/javascripts/init.js +++ b/htdocs/frontend/javascripts/init.js @@ -83,7 +83,12 @@ $(document).ready(function() { $('#entity-add').dialog('open'); } - // starting with request to backend; try to follow the callbacks ;) - // capabiltities -> entities -> data - vz.capabilities.load(); // load properties, entity types and other capabilities from backend -}); + // chaining ajax request with jquery deferred object + vz.capabilities.load().done(function() { + vz.entities.loadDetails().done(function(a, b, c, d) { + vz.entities.showTable(); + vz.entities.loadData().done(vz.wui.drawPlot); + }); + }); +}); + diff --git a/htdocs/frontend/javascripts/options.js b/htdocs/frontend/javascripts/options.js index 3529ef2..dbc93e9 100644 --- a/htdocs/frontend/javascripts/options.js +++ b/htdocs/frontend/javascripts/options.js @@ -77,7 +77,11 @@ vz.options.plot = { vz.options.save = function() { for (var key in this) { - if (this.hasOwnProperty(key) && typeof this[key] != 'function' && typeof this[key] != 'object' && typeof this[key] != 'undefined') { + if (this.hasOwnProperty(key) && + typeof this[key] != 'function' && + typeof this[key] != 'object' && + typeof this[key] != 'undefined') + { $.setCookie('vz_' + key, this[key]); } } @@ -86,7 +90,7 @@ vz.options.save = function() { vz.options.load = function() { for (var key in this) { var value = $.getCookie('vz_' + key); - if (typeof value != 'undefined') { + if (value !== undefined) { switch(typeof this[key]) { case 'string': this[key] = value; diff --git a/htdocs/frontend/javascripts/wui.js b/htdocs/frontend/javascripts/wui.js index 6c32869..a69e1fe 100644 --- a/htdocs/frontend/javascripts/wui.js +++ b/htdocs/frontend/javascripts/wui.js @@ -37,7 +37,7 @@ vz.wui.init = function() { // buttons $('button, input[type=button],[type=image]').button(); - $('button[name=options-save]').click(function() { vz.options.save(); }); + $('button[name=options-save]').click(vz.options.save); $('#permalink').click(function() { var uuids = []; var url = window.location.protocol + '//' + @@ -58,7 +58,7 @@ vz.wui.init = function() { window.location = url; }); - $('button[name=entity-add]').click(vz.wui.dialogs.init); + $('button[name=entity-add]').click(this.dialogs.init); // bind plot actions $('#controls button').click(this.handleControls); @@ -68,7 +68,7 @@ vz.wui.init = function() { vz.options.tuples = Math.round($('#flot').width() / 4); $('#tuples').val(vz.options.tuples).change(function() { vz.options.tuples = $(this).val(); - vz.entities.loadData(); + vz.entities.loadData().done(vz.wui.drawPlot); }); // backend address @@ -81,16 +81,16 @@ vz.wui.init = function() { // auto refresh if (vz.options.refresh) { $('#refresh').attr('checked', true); - vz.wui.timeout = window.setTimeout(vz.wui.refresh, 3000); + this.timeout = window.setTimeout(this.refresh, 3000); } $('#refresh').change(function() { if ($(this).attr('checked')) { vz.options.refresh = true; - vz.wui.timeout = window.setTimeout(vz.wui.refresh, 3000); + this.timeout = window.setTimeout(this.refresh, 3000); } else { vz.options.refresh = false; - window.clearTimeout(vz.wui.timeout); + window.clearTimeout(this.timeout); } }); @@ -119,7 +119,7 @@ vz.wui.dialogs.init = function() { // load public entities vz.load({ - context: 'entity', + controller: 'entity', success: function(json) { if (json.entities.length > 0) { json.entities.each(function(index, entity) { @@ -128,9 +128,6 @@ vz.wui.dialogs.init = function() { ); }); } - else { - - } } }); @@ -157,7 +154,10 @@ vz.wui.dialogs.init = function() { vz.uuids.save(); } - vz.entities.loadDetails(); // reload entity details and load data + vz.entities.loadDetails().done(function() { + vz.entities.showTable(); + vz.entities.loadData().done(vz.wui.drawPlot); + }); // reload entity details and load data } catch (e) { vz.wui.dialogs.exception(e); @@ -179,7 +179,10 @@ vz.wui.dialogs.init = function() { vz.uuids.save(); } - vz.entities.loadDetails(); // reload entity details and load data + vz.entities.loadDetails().done(function() { + vz.entities.showTable(); + vz.entities.loadData().done(vz.wui.drawPlot); + }); // reload entity details and load data } catch (e) { vz.wui.dialogs.exception(e); @@ -196,7 +199,7 @@ vz.wui.dialogs.init = function() { });*/ // update event handler - $('button[name=entity-add]').unbind('click', vz.wui.dialogs.init); + $('button[name=entity-add]').unbind('click', this.init); $('button[name=entity-add]').click(function() { $('#entity-add.dialog').dialog('open'); }); @@ -212,7 +215,7 @@ vz.wui.initEvents = function() { vz.options.plot.xaxis.max = ranges.xaxis.to; vz.options.plot.yaxis.max = null; // autoscaling vz.options.plot.yaxis.min = 0; // fixed to 0 - vz.entities.loadData(); + vz.entities.loadData().done(vz.wui.drawPlot); }) /*.bind('plotpan', function (event, plot) { var axes = plot.getAxes(); @@ -222,7 +225,7 @@ vz.wui.initEvents = function() { vz.options.plot.yaxis.max = axes.yaxis.max; }) .bind('mouseup', function(event) { - vz.entities.loadData(); + vz.entities.loadData().done(vz.wui.drawPlot); })*/ .bind('plotzoom', function (event, plot) { var axes = plot.getAxes(); @@ -230,7 +233,7 @@ vz.wui.initEvents = function() { vz.options.plot.xaxis.max = axes.xaxis.max; vz.options.plot.yaxis.min = axes.yaxis.min; vz.options.plot.yaxis.max = axes.yaxis.max; - vz.entities.loadData(); + vz.entities.loadData().done(vz.wui.drawPlot); }); }; @@ -242,9 +245,9 @@ vz.wui.refresh = function() { vz.options.plot.xaxis.max = new Date().getTime(); // move plot vz.options.plot.xaxis.min = vz.options.plot.xaxis.max - delta; // move plot - vz.entities.loadData(); + vz.entities.loadData().done(vz.wui.drawPlot); - vz.wui.timeout = window.setTimeout(vz.wui.refresh, (delta / 100 < 3000) ? 3000 : delta / 100); // TODO update timeout after zooming + this.timeout = window.setTimeout(this.refresh, (delta / 100 < 3000) ? 3000 : delta / 100); // TODO update timeout after zooming }; /** @@ -317,7 +320,7 @@ vz.wui.handleControls = function () { vz.options.plot.xaxis.min = new Date().getTime() - delta; } - vz.entities.loadData(); + vz.entities.loadData().done(vz.wui.drawPlot); }; /** @@ -352,17 +355,21 @@ vz.entities.each = function(cb) { * Get all entity information from backend */ vz.entities.loadDetails = function() { - vz.entities.clear(); + this.clear(); - vz.uuids.each(function(index, value) { - vz.load({ - context: 'entity', - identifier: value, - success: vz.wait(function(json) { + var queue = new Array; + + vz.uuids.each(function(index, uuid) { + queue.push(vz.load({ + controller: 'entity', + identifier: uuid, + success: function(json) { vz.entities.push(new Entity(json.entity)); - }, vz.entities.showTable, 'information') - }); + } + })); }); + + return $.when.apply($, queue); }; /** @@ -372,77 +379,14 @@ vz.entities.loadDetails = function() { */ vz.entities.showTable = function() { $('#entity-list tbody').empty(); + + vz.entities.sort(Entity.compare); var c = 0; // for colors - - vz.entities = vz.entities.sort(function(e1, e2) { - e1.title > e2.title; - }); - vz.entities.each(function(entity, parent) { entity.color = vz.options.plot.colors[c++ % vz.options.plot.colors.length]; - entity.active = (entity.active) ? entity.active : true; // TODO check - - var row = $('') - .addClass((parent) ? 'child-of-entity-' + parent.uuid : '') - .addClass((entity.definition.model == 'Volkszaehler\\Model\\Aggregator') ? 'aggregator' : 'channel') - .attr('id', 'entity-' + entity.uuid) - .append($('') - .addClass('visibility') - .css('background-color', entity.color) - .append($('') - .attr('type', 'checkbox') - .attr('checked', entity.active) - .bind('change', function(event) { - var state = $(this).attr('checked'); - - entity.each(function(child) { - $('#entity-' + child.uuid + '.child-of-entity-' + entity.uuid + ' input[type=checkbox]').attr('checked', state); - child.active = state; - }); - - vz.wui.drawPlot(); - }) - ) - ) - .append($('').addClass('expander')) - .append($('') - .append($('') - .text(entity.title) - .addClass('indicator') - ) - ) - .append($('').text(entity.definition.translation[vz.options.language])) // channel type - .append($('').addClass('min')) // min - .append($('').addClass('max')) // max - .append($('').addClass('average')) // avg - .append($('').addClass('consumption')) // consumption - .append($('').addClass('last')) // last - .append($('') // operations - .addClass('ops') - .append($('') - .attr('type', 'image') - .attr('src', 'images/information.png') - .attr('alt', 'details') - .bind('click', entity, function(event) { event.data.showDetails(); }) - ) - ) - .data('entity', entity); - - if (vz.uuids.contains(entity.uuid)) { // removable from cookies? - $('td.ops', row).prepend($('') - .attr('type', 'image') - .attr('src', 'images/delete.png') - .attr('alt', 'delete') - .bind('click', entity, function(event) { - vz.uuids.remove(event.data.uuid); - vz.uuids.save(); - vz.entities.loadDetails(); - }) - ); - } - $('#entity-list tbody').append(row); + $('#entity-list tbody').append(entity.getRow()); }); /* @@ -464,7 +408,7 @@ vz.entities.showTable = function() { // configure aggregators as droppable $('#entity-list tr.aggregator span.indicator').each(function() { $(this).parents('tr').droppable({ - //accept: 'tr.channel span.indicator, tr.aggregator span.indicator', + //accept: 'tr.channel span.indicator, tr.aggregator span.indicator', // TODO drop: function(event, ui) { var child = $(ui.draggable.parents('tr')[0]).data('entity'); var from = child.parent; @@ -478,18 +422,26 @@ vz.entities.showTable = function() { buttons: { 'Verschieben': function() { try { - to.addChild(child); // add to new aggregator + var queue = new Array; + console.log('moving...'); + queue.push(to.addChild(child)); // add to new aggregator - if (typeof from != 'undefined') { - from.removeChild(child); // remove from aggregator + if (from !== undefined) { + console.log('remove from aggre'); + queue.push(from.removeChild(child)); // remove from aggregator } else { - vz.uuids.remove(child.uuid); // remove from cookies + console.log('remove from cookies'); + queue.push(vz.uuids.remove(child.uuid)); // remove from cookies vz.uuids.save(); } } catch (e) { vz.wui.dialogs.exception(e); } finally { + $.when(queue).done(function() { + // wait for backend + vz.entities.loadDetails().done(vz.entities.showTable); + }); $(this).dialog('close'); } }, @@ -525,9 +477,6 @@ vz.entities.showTable = function() { clickableNodeNames: true, initialState: 'expanded' }); - - // load data and show plot - vz.entities.loadData(); }; /** @@ -537,45 +486,16 @@ vz.entities.showTable = function() { */ vz.entities.loadData = function() { $('#overlay').html('loading...

loading...

'); + + var queue = new Array; + vz.entities.each(function(entity) { - if (entity.active && entity.type != 'group') { // TODO add group data aggregation - //var delta = vz.options.plot.xaxis.max - vz.options.plot.xaxis.min; - //var offset = delta * 0.1; - var offset = 1000*60*60; // load additional data to avoid paddings - - vz.load({ - context: 'data', - identifier: entity.uuid, - data: { - from: Math.floor(vz.options.plot.xaxis.min - offset), // TODO fuzy-logic to get enough data - to: Math.ceil(vz.options.plot.xaxis.max + offset), - tuples: vz.options.tuples - }, - success: vz.wait(function(json) { - entity.data = json.data; - - if (entity.data.min !== null && entity.data.min[1] < vz.options.plot.yaxis.min) { // allow negative values for temperature sensors - vz.options.plot.yaxis.min = null; - } - - // update entity table - var unit = ' ' + entity.definition.unit; - $('#entity-' + entity.uuid + ' .min') - .text( - (entity.data.min !== null) ? vz.wui.formatNumber(entity.data.min[1]) + unit : '-') - .attr('title', (entity.data.min !== null) ? $.plot.formatDate(new Date(entity.data.min[0]), '%d. %b %h:%M:%S', vz.options.plot.xaxis.monthNames) : ''); - $('#entity-' + entity.uuid + ' .max') - .text((entity.data.max !== null) ? vz.wui.formatNumber(entity.data.max[1]) + unit : '-') - .attr('title', (entity.data.max !== null) ? $.plot.formatDate(new Date(entity.data.max[0]), '%d. %b %h:%M:%S', vz.options.plot.xaxis.monthNames) : ''); - $('#entity-' + entity.uuid + ' .average').text((entity.data.average !== null) ? vz.wui.formatNumber(entity.data.average) + unit : ''); - $('#entity-' + entity.uuid + ' .last').text((entity.data.tuples) ? vz.wui.formatNumber(entity.data.tuples.last()[1]) + unit : ''); - if (entity.definition.interpreter == 'Volkszaehler\\Interpreter\\MeterInterpreter') { // sensors have no consumption - $('#entity-' + entity.uuid + ' .consumption').text(vz.wui.formatNumber(entity.data.consumption) + unit + 'h'); - } - }, vz.wui.drawPlot, 'data') - }); + if (entity.active && entity.definition.model == 'Volkszaehler\\Model\\Channel') { + queue.push(entity.loadData()); } }); + + return $.when.apply($, queue); }; /** @@ -621,7 +541,7 @@ var Exception = function(type, message, code) { } vz.wui.dialogs.error = function(error, description, code) { - if (typeof code != 'undefined') { + if (code !== undefined) { error = code + ': ' + error; }