File: freeboard%2Bplugins.min.js

package info (click to toggle)
freeboard 1.1.0%2Bdfsg.1-5
  • links: PTS
  • area: main
  • in suites: bookworm, bullseye, sid, trixie
  • size: 3,512 kB
  • sloc: javascript: 40,335; makefile: 6; sh: 4
file content (2 lines) | stat: -rw-r--r-- 50,373 bytes parent folder | download
1
2
function DialogBox(e,t,n,i,a){function s(){o.fadeOut(200,function(){$(this).remove()})}var o=$('<div id="modal_overlay" style="display:none;"></div>'),r=$('<div class="modal"></div>');r.append('<header><h2 class="title">'+t+"</h2></header>"),$("<section></section>").appendTo(r).append(e);var l=$("<footer></footer>").appendTo(r);n&&$('<span id="dialog-ok" class="text-button">'+n+"</span>").appendTo(l).click(function(){var e=!1;_.isFunction(a)&&(e=a()),e||s()}),i&&$('<span id="dialog-cancel" class="text-button">'+i+"</span>").appendTo(l).click(function(){s()}),o.append(r),$("body").append(o),o.fadeIn(200)}function FreeboardModel(e,t,n){var i=this,a=1;this.version=0,this.isEditing=ko.observable(!1),this.allow_edit=ko.observable(!1),this.allow_edit.subscribe(function(e){e?$("#main-header").show():$("#main-header").hide()}),this.header_image=ko.observable(),this.plugins=ko.observableArray(),this.datasources=ko.observableArray(),this.panes=ko.observableArray(),this.datasourceData={},this.processDatasourceUpdate=function(e,t){var n=e.name();i.datasourceData[n]=t,_.each(i.panes(),function(e){_.each(e.widgets(),function(e){e.processDatasourceUpdate(n)})})},this._datasourceTypes=ko.observable(),this.datasourceTypes=ko.computed({read:function(){i._datasourceTypes();var t=[];return _.each(e,function(e){var n=e.type_name,i=n;_.isUndefined(e.display_name)||(i=e.display_name),t.push({name:n,display_name:i})}),t}}),this._widgetTypes=ko.observable(),this.widgetTypes=ko.computed({read:function(){i._widgetTypes();var e=[];return _.each(t,function(t){var n=t.type_name,i=n;_.isUndefined(t.display_name)||(i=t.display_name),e.push({name:n,display_name:i})}),e}}),this.addPluginSource=function(e){e&&-1==i.plugins.indexOf(e)&&i.plugins.push(e)},this.serialize=function(){var e=[];_.each(i.panes(),function(t){e.push(t.serialize())});var t=[];return _.each(i.datasources(),function(e){t.push(e.serialize())}),{version:a,header_image:i.header_image(),allow_edit:i.allow_edit(),plugins:i.plugins(),panes:e,datasources:t,columns:n.getUserColumns()}},this.deserialize=function(a,s){function o(){n.setUserColumns(a.columns),_.isUndefined(a.allow_edit)?i.allow_edit(!0):i.allow_edit(a.allow_edit),i.version=a.version||0,i.header_image(a.header_image),_.each(a.datasources,function(t){var n=new DatasourceModel(i,e);n.deserialize(t),i.addDatasource(n)});var o=_.sortBy(a.panes,function(e){return n.getPositionForScreenSize(e).row});_.each(o,function(e){var n=new PaneModel(i,t);n.deserialize(e),i.panes.push(n)}),i.allow_edit()&&0==i.panes().length&&i.setEditing(!0),_.isFunction(s)&&s(),n.processResize(!0)}i.clearDashboard(),_.each(a.plugins,function(e){i.addPluginSource(e)}),_.isArray(a.plugins)&&a.plugins.length>0?head.js(a.plugins,function(){o()}):o()},this.clearDashboard=function(){n.removeAllPanes(),_.each(i.datasources(),function(e){e.dispose()}),_.each(i.panes(),function(e){e.dispose()}),i.plugins.removeAll(),i.datasources.removeAll(),i.panes.removeAll()},this.loadDashboard=function(e,t){n.showLoadingIndicator(!0),i.deserialize(e,function(){n.showLoadingIndicator(!1),_.isFunction(t)&&t(),freeboard.emit("dashboard_loaded")})},this.loadDashboardFromLocalFile=function(){if(window.File&&window.FileReader&&window.FileList&&window.Blob){var e=document.createElement("input");e.type="file",$(e).on("change",function(e){var t=e.target.files;if(t&&t.length>0){var n=t[0],a=new FileReader;a.addEventListener("load",function(e){var t=e.target,n=JSON.parse(t.result);i.loadDashboard(n),i.setEditing(!1)}),a.readAsText(n)}}),$(e).trigger("click")}else alert("Unable to load a file in this browser.")},this.saveDashboard=function(){var e="application/octet-stream",t=document.createElement("a"),n=new Blob([JSON.stringify(i.serialize())],{type:e});document.body.appendChild(t),t.href=window.URL.createObjectURL(n),t.download="dashboard.json",t.target="_self",t.click()},this.addDatasource=function(e){i.datasources.push(e)},this.deleteDatasource=function(e){delete i.datasourceData[e.name()],e.dispose(),i.datasources.remove(e)},this.createPane=function(){var e=new PaneModel(i,t);i.addPane(e)},this.addGridColumnLeft=function(){n.addGridColumnLeft()},this.addGridColumnRight=function(){n.addGridColumnRight()},this.subGridColumnLeft=function(){n.subGridColumnLeft()},this.subGridColumnRight=function(){n.subGridColumnRight()},this.addPane=function(e){i.panes.push(e)},this.deletePane=function(e){e.dispose(),i.panes.remove(e)},this.deleteWidget=function(e){ko.utils.arrayForEach(i.panes(),function(t){t.widgets.remove(e)}),e.dispose()},this.setEditing=function(e,t){if(i.allow_edit()||!e){i.isEditing(e),_.isUndefined(t)&&(t=!0);var a=t?250:0,s=$("#admin-bar").outerHeight();e?($("#toggle-header-icon").addClass("icon-chevron-up").removeClass("icon-wrench"),$(".gridster .gs_w").css({cursor:"pointer"}),$("#main-header").animate({top:"0px"},a),$("#board-content").animate({top:s+20+"px"},a),$("#main-header").data().shown=!0,n.attachWidgetEditIcons($(".sub-section")),n.enableGrid()):($("#toggle-header-icon").addClass("icon-wrench").removeClass("icon-chevron-up"),$(".gridster .gs_w").css({cursor:"default"}),$("#main-header").animate({top:"-"+s+"px"},a),$("#board-content").animate({top:"20"},a),$("#main-header").data().shown=!1,$(".sub-section").unbind(),n.disableGrid()),n.showPaneEditIcons(e,t)}},this.toggleEditing=function(){var e=!i.isEditing();i.setEditing(e)}}function FreeboardUI(){function e(e){var t=a(),n=function(){};e&&(n=function(){var e=this,n=ko.dataFor(e),i=m(n);$(e).attr("data-sizex",Math.min(n.col_width(),t,v.cols)).attr("data-row",i.row).attr("data-col",i.col)}),s(Math.min(t,C)),o(n),i()}function t(e){var t=v.cols+1;s(t)&&o(function(){var t,n=this,i=ko.dataFor(n),a=v.cols>1?v.cols-1:1,s=i.col[a],o=i.row[a];if(e){leftPreviewCol=!0;var r=v.cols>s?s+1:v.cols;t={row:o,col:r}}else rightPreviewCol=!0,t={row:o,col:s};$(n).attr("data-sizex",Math.min(i.col_width(),v.cols)).attr("data-row",t.row).attr("data-col",t.col)}),i(),C=v.cols}function n(e){var t=v.cols-1;s(t)&&o(function(){var t,n=this,i=ko.dataFor(n),a=v.cols+1,s=i.col[a],o=i.row[a];if(e){var r=s>1?s-1:1;t={row:o,col:r}}else{var r=v.cols>=s?s:v.cols;t={row:o,col:r}}$(n).attr("data-sizex",Math.min(i.col_width(),v.cols)).attr("data-row",t.row).attr("data-col",t.col)}),i(),C=v.cols}function i(){var e=$(".column-tool"),t=$("#board-content").width(),n=Math.floor(t/x);b>=v.cols?e.addClass("min"):e.removeClass("min"),v.cols>=n?e.addClass("max"):e.removeClass("max")}function a(){var e=$("#board-content").width();return Math.floor(e/x)}function s(e){(void 0===e||b>e)&&(e=b);var t=a();e>t&&(e=t);var n=x*e;return $(".responsive-column-width").css("max-width",n),e===v.cols?!1:!0}function o(e){var t=v.$el;t.find("> li").unbind().removeData(),$(".responsive-column-width").css("width",""),v.generate_grid_and_stylesheet(),t.find("> li").each(e),v.init(),$(".responsive-column-width").css("width",v.cols*w+2*v.cols*y)}function r(){return C}function l(e){C=Math.max(b,e)}function d(e,t,n){var i=m(t),a=i.col,s=i.row,o=Number(t.width()),r=Number(t.getCalculatedHeight());v.add_widget(e,o,r,a,s),n&&f(!0),u(t,s,a),$(e).attrchange({trackValues:!0,callback:function(e){"data-row"==e.attributeName?u(t,Number(e.newValue),void 0):"data-col"==e.attributeName&&u(t,void 0,Number(e.newValue))}})}function c(e,t){var n=t.getCalculatedHeight(),i=Number($(e).attr("data-sizey")),a=Number($(e).attr("data-sizex"));(n!=i||t.col_width()!=a)&&v.resize_widget($(e),t.col_width(),n,function(){v.set_dom_grid_height()})}function u(e,t,n){var i=v.cols;_.isUndefined(t)||(e.row[i]=t),_.isUndefined(n)||(e.col[i]=n)}function p(e){e?k.fadeOut(0).appendTo("body").fadeIn(500):k.fadeOut(500).remove()}function f(e,t){_.isUndefined(t)&&(t=!0);var n=t?250:0;e?($(".pane-tools").fadeIn(n),$("#column-tools").fadeIn(n)):($(".pane-tools").fadeOut(n),$("#column-tools").fadeOut(n))}function h(e){$(e).hover(function(){g(this,!0)},function(){g(this,!1)})}function g(e,t){t?$(e).find(".sub-section-tools").fadeIn(250):$(e).find(".sub-section-tools").fadeOut(250)}function m(e){var t=v.cols;if(_.isNumber(e.row)&&_.isNumber(e.col)){var n={};n[t]=e.row,e.row=n,n={},n[t]=e.col,e.col=n}var i=1,a=1e3;for(var s in e.col){if(s==t)return{row:e.row[s],col:e.col[s]};if(e.col[s]>t)i=t;else{var o=t-s;a>o&&(i=s,a=o)}}return i in e.col&&i in e.row?{row:e.row[i],col:e.col[i]}:{row:1,col:i}}var v,y=10,w=300,b=3,x=y+w+y,C=b,k=$('<div class="wrapperloading"><div class="loading up" ></div><div class="loading down"></div></div>');return ko.bindingHandlers.grid={init:function(t){v=$(t).gridster({widget_margins:[y,y],widget_base_dimensions:[w,10],resize:{enabled:!1,axes:"x"}}).data("gridster"),e(!1),v.disable()}},{showLoadingIndicator:function(e){p(e)},showPaneEditIcons:function(e,t){f(e,t)},attachWidgetEditIcons:function(e){h(e)},getPositionForScreenSize:function(e){return m(e)},processResize:function(t){e(t)},disableGrid:function(){v.disable()},enableGrid:function(){v.enable()},addPane:function(e,t,n){d(e,t,n)},updatePane:function(e,t){c(e,t)},removePane:function(e){v.remove_widget(e)},removeAllPanes:function(){v.remove_all_widgets()},addGridColumnLeft:function(){t(!0)},addGridColumnRight:function(){t(!1)},subGridColumnLeft:function(){n(!0)},subGridColumnRight:function(){n(!1)},getUserColumns:function(){return r()},setUserColumns:function(e){l(e)}}}function PaneModel(e,t){var n=this;this.title=ko.observable(),this.width=ko.observable(1),this.row={},this.col={},this.col_width=ko.observable(1),this.widgets=ko.observableArray(),this.addWidget=function(e){this.widgets.push(e)},this.widgetCanMoveUp=function(e){return n.widgets.indexOf(e)>=1},this.widgetCanMoveDown=function(e){var t=n.widgets.indexOf(e);return n.widgets().length-1>t},this.moveWidgetUp=function(e){if(n.widgetCanMoveUp(e)){var t=n.widgets.indexOf(e),i=n.widgets();n.widgets.splice(t-1,2,i[t],i[t-1])}},this.moveWidgetDown=function(e){if(n.widgetCanMoveDown(e)){var t=n.widgets.indexOf(e),i=n.widgets();n.widgets.splice(t,2,i[t+1],i[t])}},this.getCalculatedHeight=function(){var e=_.reduce(n.widgets(),function(e,t){return e+t.height()},0);e*=6,e+=3,e*=10;var t=Math.ceil((e+20)/30);return Math.max(4,t)},this.serialize=function(){var e=[];return _.each(n.widgets(),function(t){e.push(t.serialize())}),{title:n.title(),width:n.width(),row:n.row,col:n.col,col_width:n.col_width(),widgets:e}},this.deserialize=function(i){n.title(i.title),n.width(i.width),n.row=i.row,n.col=i.col,n.col_width(i.col_width||1),_.each(i.widgets,function(i){var a=new WidgetModel(e,t);a.deserialize(i),n.widgets.push(a)})},this.dispose=function(){_.each(n.widgets(),function(e){e.dispose()})}}function WidgetModel(e,t){function n(){_.isUndefined(i.widgetInstance)||(_.isFunction(i.widgetInstance.onDispose)&&i.widgetInstance.onDispose(),i.widgetInstance=void 0)}var i=this;this.datasourceRefreshNotifications={},this.calculatedSettingScripts={},this.title=ko.observable(),this.fillSize=ko.observable(!1),this.type=ko.observable(),this.type.subscribe(function(e){function a(){s.newInstance(i.settings(),function(e){i.fillSize(s.fill_size===!0),i.widgetInstance=e,i.shouldRender(!0),i._heightUpdate.valueHasMutated()})}if(n(),e in t&&_.isFunction(t[e].newInstance)){var s=t[e];s.external_scripts?head.js(s.external_scripts.slice(0),a):a()}}),this.settings=ko.observable({}),this.settings.subscribe(function(e){!_.isUndefined(i.widgetInstance)&&_.isFunction(i.widgetInstance.onSettingsChanged)&&i.widgetInstance.onSettingsChanged(e),i.updateCalculatedSettings(),i._heightUpdate.valueHasMutated()}),this.processDatasourceUpdate=function(e){var t=i.datasourceRefreshNotifications[e];_.isArray(t)&&_.each(t,function(e){i.processCalculatedSetting(e)})},this.callValueFunction=function(t){return t.call(void 0,e.datasourceData)},this.processCalculatedSetting=function(e){if(_.isFunction(i.calculatedSettingScripts[e])){var t=void 0;try{t=i.callValueFunction(i.calculatedSettingScripts[e])}catch(n){var a=i.settings()[e];n instanceof ReferenceError&&/^\w+$/.test(a)&&(t=a)}if(!_.isUndefined(i.widgetInstance)&&_.isFunction(i.widgetInstance.onCalculatedValueChanged)&&!_.isUndefined(t))try{i.widgetInstance.onCalculatedValueChanged(e,t)}catch(n){console.log(""+n)}}},this.updateCalculatedSettings=function(){if(i.datasourceRefreshNotifications={},i.calculatedSettingScripts={},!_.isUndefined(i.type())){var e=t[i.type()].settings,n=RegExp("datasources.([\\w_-]+)|datasources\\[['\"]([^'\"]+)","g"),a=i.settings();_.each(e,function(e){if("calculated"==e.type){var t=a[e.name];if(!_.isUndefined(t)){1>=(t.match(/;/g)||[]).length&&-1==t.indexOf("return")&&(t="return "+t);var s;try{s=Function("datasources",t)}catch(o){var r=a[e.name].replace(/"/g,'\\"').replace(/[\r\n]/g," \\\n");s=Function("datasources",'return "'+r+'";')}i.calculatedSettingScripts[e.name]=s,i.processCalculatedSetting(e.name);for(var l;l=n.exec(t);){var d=l[1]||l[2],c=i.datasourceRefreshNotifications[d];_.isUndefined(c)&&(c=[],i.datasourceRefreshNotifications[d]=c),c.push(e.name)}}}})}},this._heightUpdate=ko.observable(),this.height=ko.computed({read:function(){return i._heightUpdate(),!_.isUndefined(i.widgetInstance)&&_.isFunction(i.widgetInstance.getHeight)?i.widgetInstance.getHeight():1}}),this.shouldRender=ko.observable(!1),this.render=function(e){i.shouldRender(!1),!_.isUndefined(i.widgetInstance)&&_.isFunction(i.widgetInstance.render)&&(i.widgetInstance.render(e),i.updateCalculatedSettings())},this.dispose=function(){},this.serialize=function(){return{title:i.title(),type:i.type(),settings:i.settings()}},this.deserialize=function(e){i.title(e.title),i.settings(e.settings),i.type(e.type)}}DatasourceModel=function(e,t){function n(){_.isUndefined(i.datasourceInstance)||(_.isFunction(i.datasourceInstance.onDispose)&&i.datasourceInstance.onDispose(),i.datasourceInstance=void 0)}var i=this;this.name=ko.observable(),this.latestData=ko.observable(),this.settings=ko.observable({}),this.settings.subscribe(function(e){!_.isUndefined(i.datasourceInstance)&&_.isFunction(i.datasourceInstance.onSettingsChanged)&&i.datasourceInstance.onSettingsChanged(e)}),this.updateCallback=function(t){e.processDatasourceUpdate(i,t),i.latestData(t);var n=new Date;i.last_updated(n.toLocaleTimeString())},this.type=ko.observable(),this.type.subscribe(function(e){function a(){s.newInstance(i.settings(),function(e){i.datasourceInstance=e,e.updateNow()},i.updateCallback)}if(n(),e in t&&_.isFunction(t[e].newInstance)){var s=t[e];s.external_scripts?head.js(s.external_scripts.slice(0),a):a()}}),this.last_updated=ko.observable("never"),this.last_error=ko.observable(),this.serialize=function(){return{name:i.name(),type:i.type(),settings:i.settings()}},this.deserialize=function(e){i.settings(e.settings),i.name(e.name),i.type(e.type)},this.getDataRepresentation=function(e){var t=Function("data","return "+e+";");return t.call(void 0,i.latestData())},this.updateNow=function(){!_.isUndefined(i.datasourceInstance)&&_.isFunction(i.datasourceInstance.updateNow)&&i.datasourceInstance.updateNow()},this.dispose=function(){n()}},DeveloperConsole=function(e){function t(){function t(e){var t=$("<tr></tr>"),i=$('<ul class="board-toolbar"></ul>'),a=$('<input class="table-row-value" style="width:100%;" type="text">'),s=$('<li><i class="icon-trash icon-white"></i></li>').click(function(){n=_.without(n,a),t.remove()});n.push(a),e&&a.val(e),i.append(s),o.append(t.append($("<td></td>").append(a)).append($('<td class="table-row-operation">').append(i)))}var n=[],i=$("<div></div>"),a=$('<div class="table-operation text-button">ADD</div>'),s=$('<table class="table table-condensed sub-table"></table>');s.append($('<thead style=""><tr><th>Plugin Script URL</th></tr></thead>'));var o=$("<tbody></tbody>");s.append(o),i.append($("<p>Here you can add references to other scripts to load datasource or widget plugins.</p>")).append(s).append(a).append('<p>To learn how to build plugins for freeboard, please visit <a target="_blank" href="http://freeboard.github.io/freeboard/docs/plugin_example.html">http://freeboard.github.io/freeboard/docs/plugin_example.html</a></p>'),_.each(e.plugins(),function(e){t(e)}),a.click(function(){t()}),new DialogBox(i,"Developer Console","OK",null,function(){_.each(e.plugins(),function(e){$('script[src^="'+e+'"]').remove()}),e.plugins.removeAll(),_.each(n,function(t){var n=t.val();n&&n.length>0&&(e.addPluginSource(n),head.js(n+"?"+Date.now()))})})}return{showDeveloperConsole:function(){t()}}},JSEditor=function(){function e(e){n=e}function t(e,t){head.js(n+"css/codemirror.css",n+"css/codemirror-ambiance.css",n+"js/codemirror.js",function(){var n='// Example: Convert temp from C to F and truncate to 2 decimal places.\n// return (datasources["MyDatasource"].sensor.tempInF * 1.8 + 32).toFixed(2);';e||(e=n);var i=$('<div class="code-window"></div>'),a=$('<div class="code-mirror-wrapper"></div>'),s=$('<div class="code-window-footer"></div>'),o=$('<div class="code-window-header cm-s-ambiance">This javascript will be re-evaluated any time a datasource referenced here is updated, and the value you <code><span class="cm-keyword">return</span></code> will be displayed in the widget. You can assume this javascript is wrapped in a function of the form <code><span class="cm-keyword">function</span>(<span class="cm-def">datasources</span>)</code> where datasources is a collection of javascript objects (keyed by their name) corresponding to the most current data in a datasource.</div>');i.append([o,a,s]),$("body").append(i);var r=CodeMirror(a.get(0),{value:e,mode:"javascript",theme:"ambiance",indentUnit:4,lineNumbers:!0,matchBrackets:!0,autoCloseBrackets:!0}),l=$('<span id="dialog-cancel" class="text-button">Close</span>').click(function(){if(t){var e=r.getValue();e===n&&(e=""),t(e),i.remove()}});s.append(l)})}var n="";return{displayJSEditor:function(e,n){t(e,n)},setAssetRoot:function(t){e(t)}}},PluginEditor=function(e,t){function n(e,t){var n=$('<div class="validation-error"></div>').html(t);$("#setting-value-container-"+e).append(n)}function i(){$("#setting-row-instance-name").length?$("#setting-row-instance-name").nextAll().remove():$("#setting-row-plugin-types").nextAll().remove()}function a(e){return!isNaN(parseFloat(e))&&isFinite(e)}function s(s,o,r,l,d){function c(e,t){var n=$('<div id="setting-row-'+e+'" class="form-row"></div>').appendTo(h);return n.append('<div class="form-label"><label class="control-label">'+t+"</label></div>"),$('<div id="setting-value-container-'+e+'" class="form-value"></div>').appendTo(n)}function u(n){_.each(n,function(n){function i(){f.settings[n.name].length>0?u.show():u.hide()}function a(e){var t=$("<tr></tr>").appendTo(h),a={};_.isArray(f.settings[n.name])||(f.settings[n.name]=[]),f.settings[n.name].push(a),_.each(n.settings,function(n){var i=$("<td></td>").appendTo(t),s="";_.isUndefined(e[n.name])||(s=e[n.name]),a[n.name]=s,$('<input class="table-row-value" type="text">').appendTo(i).val(s).change(function(){a[n.name]=$(this).val()})}),t.append($('<td class="table-row-operation"></td>').append($('<ul class="board-toolbar"></ul>').append($("<li></li>").append($('<i class="icon-trash icon-white"></i>').click(function(){var e=f.settings[n.name].indexOf(a);-1!=e&&(f.settings[n.name].splice(e,1),t.remove(),i())}))))),r.scrollTop(r[0].scrollHeight),i()}!_.isUndefined(n.default_value)&&_.isUndefined(l[n.name])&&(l[n.name]=n.default_value);var s=n.name;_.isUndefined(n.display_name)||(s=n.display_name);var o=c(n.name,s);switch(n.type){case"array":var r=$('<div class="form-table-value-subtable"></div>').appendTo(o),d=$('<table class="table table-condensed sub-table"></table>').appendTo(r),u=$("<thead></thead>").hide().appendTo(d),p=$("<tr></tr>").appendTo(u),h=$("<tbody></tbody>").appendTo(d),g=[];_.each(n.settings,function(e){var t=e.name;_.isUndefined(e.display_name)||(t=e.display_name),$("<th>"+t+"</th>").appendTo(p)}),n.name in l&&(g=l[n.name]),$('<div class="table-operation text-button">ADD</div>').appendTo(o).click(function(){var e={};_.each(n.settings,function(t){e[t.name]=""}),a(e)}),_.each(g,function(e){a(e)});break;case"boolean":f.settings[n.name]=l[n.name];var m=$('<div class="onoffswitch"><label class="onoffswitch-label" for="'+n.name+'-onoff"><div class="onoffswitch-inner"><span class="on">YES</span><span class="off">NO</span></div><div class="onoffswitch-switch"></div></label></div>').appendTo(o),v=$('<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="'+n.name+'-onoff">').prependTo(m).change(function(){f.settings[n.name]=this.checked});n.name in l&&v.prop("checked",l[n.name]);break;case"option":var y=l[n.name],v=$("<select></select>").appendTo($('<div class="styled-select"></div>').appendTo(o)).change(function(){f.settings[n.name]=$(this).val()});_.each(n.options,function(e){var t,n;_.isObject(e)?(t=e.name,n=e.value):t=e,_.isUndefined(n)&&(n=t),_.isUndefined(y)&&(y=n),$("<option></option>").text(t).attr("value",n).appendTo(v)}),f.settings[n.name]=y,n.name in l&&v.val(l[n.name]);break;default:if(f.settings[n.name]=l[n.name],"calculated"==n.type){var v=$("<textarea></textarea>").appendTo(o).change(function(){f.settings[n.name]=$(this).val()});n.name in l&&v.val(l[n.name]),t.createValueEditor(v);var w=$('<ul class="board-toolbar datasource-input-suffix"></ul>'),b=$('<li><i class="icon-plus icon-white"></i><label>DATASOURCE</label></li>').mousedown(function(e){e.preventDefault(),$(v).focus(),$(v).insertAtCaret('datasources["'),$(v).trigger("freeboard-eval")}),x=$('<li><i class="icon-fullscreen icon-white"></i><label>.JS EDITOR</label></li>').mousedown(function(t){t.preventDefault(),e.displayJSEditor(v.val(),function(e){v.val(e),v.change()})});$(o).append(w.append([b,x]))}else{var v=$('<input type="text">').appendTo(o).change(function(){f.settings[n.name]="number"==n.type?Number($(this).val()):$(this).val()});n.name in l&&v.val(l[n.name])}}_.isUndefined(n.suffix)||o.append($('<div class="input-suffix">'+n.suffix+"</div>")),_.isUndefined(n.description)||o.append($('<div class="setting-description">'+n.description+"</div>"))})}var p,f={type:r,settings:{}},h=$("<div></div>"),g=$('<div id="plugin-description"></div>').hide();h.append(g),new DialogBox(h,s,"Save","Cancel",function(){$(".validation-error").remove();for(var e=0;p.settings.length>e;e++){var t=p.settings[e];if(t.required&&(_.isUndefined(f.settings[t.name])||""==f.settings[t.name]))return n(t.name,"This is required."),!0;if("number"==t.type&&!a(f.settings[t.name]))return n(t.name,"Must be a number."),!0}_.isFunction(d)&&d(f)});var m,v=_.keys(o);if(v.length>1){var y=c("plugin-types","Type");m=$("<select></select>").appendTo($('<div class="styled-select"></div>').appendTo(y)),m.append($("<option>Select a type...</option>").attr("value","undefined")),_.each(o,function(e){m.append($("<option></option>").text(e.display_name).attr("value",e.type_name))}),m.change(function(){f.type=$(this).val(),f.settings={},i(),p=o[m.val()],_.isUndefined(p)?($("#setting-row-instance-name").hide(),$("#dialog-ok").hide()):($("#setting-row-instance-name").show(),p.description&&p.description.length>0?g.html(p.description).show():g.hide(),$("#dialog-ok").show(),u(p.settings))})}else 1==v.length&&(p=o[v[0]],u(p.settings));m&&(_.isUndefined(r)?($("#setting-row-instance-name").hide(),$("#dialog-ok").hide()):($("#dialog-ok").show(),m.val(r).trigger("change")))}return{createPluginEditor:function(e,t,n,i,a,o){s(e,t,n,i,a,o)}}},ValueEditor=function(e){function t(e){var t=($(e).val().match(/\n/g)||[]).length,n=Math.min(200,20*(t+1));$(e).css({height:n+"px"})}function n(e,t){var n,i=s.exec(e),r=[];if(i)if(""==i[1])_.each(t,function(e){r.push({value:e.name(),follow_char:'"]["'})});else if(""!=i[1]&&_.isUndefined(i[2]))n=i[1],_.each(t,function(e){var t=e.name();t!=n&&0==t.indexOf(n)&&r.push({value:t,follow_char:'"]["'})});else{var l=_.find(t,function(e){return e.name()===i[1]});if(!_.isUndefined(l)){var d="";_.isUndefined(i[2])||(d=i[2]+i[3]);var c=d.split('"]["');d="data";for(var u=1;c.length-1>u;u++)""!=c[u]&&(dataPathItem='["'+c[u]+'"]',d+=dataPathItem);var p=_.last(c);'"'==p.charAt(p.length-1)&&(p=p.replace(/\[\"?$/,""),d=d+'["'+p+'"]');var f=l.getDataRepresentation(d);if(_.isArray(f))for(var u=0;f.length>u;u++){var h='"]';_.isObject(f[u])?h+='"]["':_.isArray(f[u])&&(h+='"]['),r.push({value:u,follow_char:h})}else _.isObject(f)&&(n=p,-1==_.keys(f).indexOf(n)&&_.each(f,function(e,t){if(t!=p&&0==t.indexOf(p)){var n='"]';_.isArray(e)?n='"][':_.isObject(e)&&(n='"]["'),r.push({value:t,follow_char:n})}}))}}o=r,a=n}function i(i){var s=null,r=0;$(i).addClass("calculated-value-input").bind("keyup mouseup freeboard-eval",function(t){if(s&&"keyup"==t.type&&(38==t.keyCode||40==t.keyCode||13==t.keyCode))return t.preventDefault(),void 0;var l=$(i).val().substring(0,$(i).getCaretPosition());if(l=l.replace(String.fromCharCode(160)," "),n(l,e.datasources()),o.length>0){s||(s=$('<ul id="value-selector" class="value-dropdown"></ul>').insertAfter(i).width($(i).outerWidth()-2).css("left",$(i).position().left).css("top",$(i).position().top+$(i).outerHeight()-1)),s.empty(),s.scrollTop(0);var d=!0;r=0;var c=0;_.each(o,function(e){var t=$("<li>"+e.value+"</li>").appendTo(s).mouseenter(function(){$(this).trigger("freeboard-select")}).mousedown(function(e){$(this).trigger("freeboard-insertValue"),e.preventDefault()}).data("freeboard-optionIndex",c).data("freeboard-optionValue",e.value).bind("freeboard-insertValue",function(){var t=e.value;if(_.isUndefined(e.follow_char)||(t+=e.follow_char),_.isUndefined(a))$(i).insertAtCaret(t);else{var n=l.lastIndexOf(a);-1!=n&&$(i).replaceTextAt(n,n+a.length,t)}$(i).triggerHandler("mouseup")}).bind("freeboard-select",function(){$(this).parent().find("li.selected").removeClass("selected"),$(this).addClass("selected"),r=$(this).data("freeboard-optionIndex")});d&&($(t).addClass("selected"),d=!1),c++})}else $(i).next("ul#value-selector").remove(),s=null,r=-1}).focus(function(){t(i)}).focusout(function(){$(i).css({height:""}),$(i).next("ul#value-selector").remove(),s=null,r=-1}).bind("keydown",function(e){if(s)if(38==e.keyCode||40==e.keyCode){e.preventDefault();var t=$(s).find("li");38==e.keyCode?r--:40==e.keyCode&&r++,0>r?r=t.size()-1:r>=t.size()&&(r=0);var n=$(t).eq(r);n.trigger("freeboard-select"),$(s).scrollTop($(n).position().top)}else 13==e.keyCode&&(e.preventDefault(),-1!=r&&$(s).find("li").eq(r).trigger("freeboard-insertValue"))})}var a,s=RegExp('.*datasources\\["([^"]*)("\\]\\[")?(.*)$'),o=[];return{createValueEditor:function(e){i(e)}}},function(e){function t(){var e=document.createElement("p"),t=!1;if(e.addEventListener)e.addEventListener("DOMAttrModified",function(){t=!0},!1);else{if(!e.attachEvent)return!1;e.attachEvent("onDOMAttrModified",function(){t=!0})}return e.setAttribute("id","target"),t}function n(t,n){if(t){var i=this.data("attr-old-value");if(n.attributeName.indexOf("style")>=0){i.style||(i.style={});var a=n.attributeName.split(".");n.attributeName=a[0],n.oldValue=i.style[a[1]],n.newValue=a[1]+":"+this.prop("style")[e.camelCase(a[1])],i.style[a[1]]=n.newValue}else n.oldValue=i[n.attributeName],n.newValue=this.attr(n.attributeName),i[n.attributeName]=n.newValue;this.data("attr-old-value",i)}}var i=window.MutationObserver||window.WebKitMutationObserver;e.fn.attrchange=function(a){var s={trackValues:!1,callback:e.noop};if("function"==typeof a?s.callback=a:e.extend(s,a),s.trackValues&&e(this).each(function(t,n){for(var i,a={},t=0,s=n.attributes,o=s.length;o>t;t++)i=s.item(t),a[i.nodeName]=i.value;e(this).data("attr-old-value",a)}),i){var o={subtree:!1,attributes:!0,attributeOldValue:s.trackValues},r=new i(function(t){t.forEach(function(t){var n=t.target;s.trackValues&&(t.newValue=e(n).attr(t.attributeName)),s.callback.call(n,t)})});return this.each(function(){r.observe(this,o)})}return t()?this.on("DOMAttrModified",function(e){e.originalEvent&&(e=e.originalEvent),e.attributeName=e.attrName,e.oldValue=e.prevValue,s.callback.call(this,e)}):"onpropertychange"in document.body?this.on("propertychange",function(t){t.attributeName=window.event.propertyName,n.call(e(this),s.trackValues,t),s.callback.call(this,t)}):this}}(jQuery),function(e){e.eventEmitter={_JQInit:function(){this._JQ=e(this)},emit:function(e,t){!this._JQ&&this._JQInit(),this._JQ.trigger(e,t)},once:function(e,t){!this._JQ&&this._JQInit(),this._JQ.one(e,t)},on:function(e,t){!this._JQ&&this._JQInit(),this._JQ.bind(e,t)},off:function(e,t){!this._JQ&&this._JQInit(),this._JQ.unbind(e,t)}}}(jQuery);var freeboard=function(){function e(e){e=e.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var t=RegExp("[\\?&]"+e+"=([^&#]*)"),n=t.exec(location.search);return null==n?"":decodeURIComponent(n[1].replace(/\+/g," "))}var t={},n={},i=new FreeboardUI,a=new FreeboardModel(t,n,i),s=new JSEditor,o=new ValueEditor(a),r=new PluginEditor(s,o),l=new DeveloperConsole(a),d={values:{"font-family":'"HelveticaNeue-UltraLight", "Helvetica Neue Ultra Light", "Helvetica Neue", sans-serif',color:"#d3d4d4","font-weight":100}};return ko.bindingHandlers.pluginEditor={init:function(e,s,o,l){var d=ko.unwrap(s()),c={},u=void 0,p="";"datasource"==d.type?(c=t,p="Datasource"):"widget"==d.type?(c=n,p="Widget"):"pane"==d.type&&(p="Pane"),$(e).click(function(){if("delete"==d.operation){var s=$("<p>Are you sure you want to delete this "+p+"?</p>");new DialogBox(s,"Confirm Delete","Yes","No",function(){"datasource"==d.type?a.deleteDatasource(l):"widget"==d.type?a.deleteWidget(l):"pane"==d.type&&a.deletePane(l)})}else{var o=void 0;"datasource"==d.type?"add"==d.operation?u={}:(o=l.type(),u=l.settings(),u.name=l.name()):"widget"==d.type?"add"==d.operation?u={}:(o=l.type(),u=l.settings()):"pane"==d.type&&(u={},"edit"==d.operation&&(u.title=l.title(),u.col_width=l.col_width()),c={settings:{settings:[{name:"title",display_name:"Title",type:"text"},{name:"col_width",display_name:"Columns",type:"number",default_value:1,required:!0}]}}),r.createPluginEditor(p,c,o,u,function(s){if("add"==d.operation){if("datasource"==d.type){var o=new DatasourceModel(a,t);a.addDatasource(o),o.name(s.settings.name),delete s.settings.name,o.settings(s.settings),o.type(s.type)}else if("widget"==d.type){var o=new WidgetModel(a,n);o.settings(s.settings),o.type(s.type),l.widgets.push(o),i.attachWidgetEditIcons(e)}}else"edit"==d.operation&&("pane"==d.type?(l.title(s.settings.title),l.col_width(s.settings.col_width),i.processResize(!1)):("datasource"==d.type&&(l.name(s.settings.name),delete s.settings.name),l.type(s.type),l.settings(s.settings)))})}})}},ko.virtualElements.allowedBindings.datasourceTypeSettings=!0,ko.bindingHandlers.datasourceTypeSettings={update:function(e,t,n,i,a){processPluginSettings(e,t,n,i,a)}},ko.bindingHandlers.pane={init:function(e,t,n,s,o){a.isEditing()&&$(e).css({cursor:"pointer"}),i.addPane(e,s,o.$root.isEditing())},update:function(e,t,n,s){-1==a.panes.indexOf(s)&&i.removePane(e),i.updatePane(e,s)}},ko.bindingHandlers.widget={init:function(e){a.isEditing()&&i.attachWidgetEditIcons($(e).parent())},update:function(e,t,n,i){i.shouldRender()&&($(e).empty(),i.render(e))}},$(function(){function e(){i.processResize(!0)}i.showLoadingIndicator(!0);var t;$(window).resize(function(){clearTimeout(t),t=setTimeout(e,500)})}),{initialize:function(t,n){ko.applyBindings(a);var s=e("load");""!=s?$.ajax({url:s,success:function(e){a.loadDashboard(e),_.isFunction(n)&&n()}}):(a.allow_edit(t),a.setEditing(t),i.showLoadingIndicator(!1),_.isFunction(n)&&n(),freeboard.emit("initialized"))},newDashboard:function(){a.loadDashboard({allow_edit:!0})},loadDashboard:function(e,t){a.loadDashboard(e,t)},serialize:function(){return a.serialize()},setEditing:function(e,t){a.setEditing(e,t)},isEditing:function(){return a.isEditing()},loadDatasourcePlugin:function(e){_.isUndefined(e.display_name)&&(e.display_name=e.type_name),e.settings.unshift({name:"name",display_name:"Name",type:"text",required:!0}),a.addPluginSource(e.source),t[e.type_name]=e,a._datasourceTypes.valueHasMutated()},resize:function(){i.processResize(!0)},loadWidgetPlugin:function(e){_.isUndefined(e.display_name)&&(e.display_name=e.type_name),a.addPluginSource(e.source),n[e.type_name]=e,a._widgetTypes.valueHasMutated()
},setAssetRoot:function(e){s.setAssetRoot(e)},addStyle:function(e,t){var n,i=document;"object"==typeof i.styleSheets&&(i.styleSheets.length&&(n=i.styleSheets[i.styleSheets.length-1]),i.styleSheets.length&&(i.createStyleSheet?n=i.createStyleSheet():(i.getElementsByTagName("head")[0].appendChild(i.createElement("style")),n=i.styleSheets[i.styleSheets.length-1])),n.addRule?n.addRule(e,t):n.insertRule(e+"{"+t+"}",n.cssRules.length))},showLoadingIndicator:function(e){i.showLoadingIndicator(e)},showDialog:function(e,t,n,i,a){new DialogBox(e,t,n,i,a)},getDatasourceSettings:function(e){var t=a.datasources(),n=_.find(t,function(t){return t.name()===e});return n?n.settings():null},setDatasourceSettings:function(e,t){var n=a.datasources(),i=_.find(n,function(t){return t.name()===e});if(!i)return console.log("Datasource not found"),void 0;var s=_.defaults(t,i.settings());i.settings(s)},getStyleString:function(e){var t="";return _.each(d[e],function(e,n){t=t+n+":"+e+";"}),t},getStyleObject:function(e){return d[e]},showDeveloperConsole:function(){l.showDeveloperConsole()}}}();$.extend(freeboard,jQuery.eventEmitter),function(){var e=function(e,t){function n(e){a&&clearInterval(a),a=setInterval(function(){i.updateNow()},e)}var i=this,a=null,s=e,o=0,r=!1;n(1e3*s.refresh),this.updateNow=function(){if(!(o>1&&!s.use_thingproxy||o>2)){var e=s.url;2==o&&s.use_thingproxy&&(e=("https:"==location.protocol?"https:":"http:")+"//thingproxy.freeboard.io/fetch/"+encodeURI(s.url));var n=s.body;if(n)try{n=JSON.parse(n)}catch(a){}$.ajax({url:e,dataType:1==o?"JSONP":"JSON",type:s.method||"GET",data:n,beforeSend:function(e){try{_.each(s.headers,function(t){var n=t.name,i=t.value;_.isUndefined(n)||_.isUndefined(i)||e.setRequestHeader(n,i)})}catch(t){}},success:function(e){r=!0,t(e)},error:function(){r||(o++,i.updateNow())}})}},this.onDispose=function(){clearInterval(a),a=null},this.onSettingsChanged=function(e){r=!1,o=0,s=e,n(1e3*s.refresh),i.updateNow()}};freeboard.loadDatasourcePlugin({type_name:"JSON",settings:[{name:"url",display_name:"URL",type:"text"},{name:"use_thingproxy",display_name:"Try thingproxy",description:'A direct JSON connection will be tried first, if that fails, a JSONP connection will be tried. If that fails, you can use thingproxy, which can solve many connection problems to APIs. <a href="https://github.com/Freeboard/thingproxy" target="_blank">More information</a>.',type:"boolean",default_value:!0},{name:"refresh",display_name:"Refresh Every",type:"number",suffix:"seconds",default_value:5},{name:"method",display_name:"Method",type:"option",options:[{name:"GET",value:"GET"},{name:"POST",value:"POST"},{name:"PUT",value:"PUT"},{name:"DELETE",value:"DELETE"}]},{name:"body",display_name:"Body",type:"text",description:"The body of the request. Normally only used if method is POST"},{name:"headers",display_name:"Headers",type:"array",settings:[{name:"name",display_name:"Name",type:"text"},{name:"value",display_name:"Value",type:"text"}]}],newInstance:function(t,n,i){n(new e(t,i))}});var t=function(e,t){function n(e){s&&clearInterval(s),s=setInterval(function(){a.updateNow()},e)}function i(e){return e.replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}var a=this,s=null,o=e;n(1e3*o.refresh),this.updateNow=function(){$.ajax({url:"http://api.openweathermap.org/data/2.5/weather?q="+encodeURIComponent(o.location)+"&units="+o.units,dataType:"JSONP",success:function(e){var n={place_name:e.name,sunrise:new Date(1e3*e.sys.sunrise).toLocaleTimeString(),sunset:new Date(1e3*e.sys.sunset).toLocaleTimeString(),conditions:i(e.weather[0].description),current_temp:e.main.temp,high_temp:e.main.temp_max,low_temp:e.main.temp_min,pressure:e.main.pressure,humidity:e.main.humidity,wind_speed:e.wind.speed,wind_direction:e.wind.deg};t(n)},error:function(){}})},this.onDispose=function(){clearInterval(s),s=null},this.onSettingsChanged=function(e){o=e,a.updateNow(),n(1e3*o.refresh)}};freeboard.loadDatasourcePlugin({type_name:"openweathermap",display_name:"Open Weather Map API",settings:[{name:"location",display_name:"Location",type:"text",description:"Example: London, UK"},{name:"units",display_name:"Units",type:"option","default":"imperial",options:[{name:"Imperial",value:"imperial"},{name:"Metric",value:"metric"}]},{name:"refresh",display_name:"Refresh Every",type:"number",suffix:"seconds",default_value:5}],newInstance:function(e,n,i){n(new t(e,i))}});var n=function(e,t){function n(e){t(e)}var i=this,a=e;this.updateNow=function(){dweetio.get_latest_dweet_for(a.thing_id,function(e,t){e||n(t[0].content)})},this.onDispose=function(){},this.onSettingsChanged=function(e){dweetio.stop_listening(),a=e,dweetio.listen_for(a.thing_id,function(e){n(e.content)})},i.onSettingsChanged(e)};freeboard.loadDatasourcePlugin({type_name:"dweet_io",display_name:"Dweet.io",external_scripts:["http://dweet.io/client/dweet.io.min.js"],settings:[{name:"thing_id",display_name:"Thing Name",description:"Example: salty-dog-1",type:"text"}],newInstance:function(e,t,i){t(new n(e,i))}});var i=function(e,t){function n(){r.length>0?(r.length>l&&(t(r[l]),l++),l>=r.length&&o.loop&&(l=0),r.length>l&&(a=setTimeout(n,1e3*o.refresh))):t({})}function i(){r=[],l=0,a&&(clearTimeout(a),a=null)}var a,s=this,o=e,r=[],l=0;this.updateNow=function(){i(),$.ajax({url:o.datafile,dataType:o.is_jsonp?"JSONP":"JSON",success:function(e){r=_.isArray(e)?e:[],l=0,n()},error:function(){}})},this.onDispose=function(){i()},this.onSettingsChanged=function(e){o=e,s.updateNow()}};freeboard.loadDatasourcePlugin({type_name:"playback",display_name:"Playback",settings:[{name:"datafile",display_name:"Data File URL",type:"text",description:"A link to a JSON array of data."},{name:"is_jsonp",display_name:"Is JSONP",type:"boolean"},{name:"loop",display_name:"Loop",type:"boolean",description:"Rewind and loop when finished"},{name:"refresh",display_name:"Refresh Every",type:"number",suffix:"seconds",default_value:5}],newInstance:function(e,t,n){t(new i(e,n))}});var a=function(e,t){function n(){a&&(clearTimeout(a),a=null)}function i(){n(),a=setInterval(s.updateNow,1e3*o.refresh)}var a,s=this,o=e;this.updateNow=function(){var e=new Date,n={numeric_value:e.getTime(),full_string_value:e.toLocaleString(),date_string_value:e.toLocaleDateString(),time_string_value:e.toLocaleTimeString(),date_object:e};t(n)},this.onDispose=function(){n()},this.onSettingsChanged=function(e){o=e,i()},i()};freeboard.loadDatasourcePlugin({type_name:"clock",display_name:"Clock",settings:[{name:"refresh",display_name:"Refresh Every",type:"number",suffix:"seconds",default_value:1}],newInstance:function(e,t,n){t(new a(e,n))}})}(),function(){function e(e,t,n,i){if(e!=t)if($.isNumeric(t)&&$.isNumeric(e)){var a=(""+t).split("."),s=0;a.length>1&&(s=a[1].length),a=(""+e).split(".");var o=0;a.length>1&&(o=a[1].length),jQuery({transitionValue:Number(e),precisionValue:o}).animate({transitionValue:Number(t),precisionValue:s},{duration:i,step:function(){$(n).text(this.transitionValue.toFixed(this.precisionValue))},done:function(){$(n).text(t)}})}else $(n).text(t)}function t(e,t){var i=$(e).data().values;i||(i=[]),i.length>=n&&i.shift(),i.push(Number(t)),$(e).data().values=i,$(e).sparkline(i,{type:"line",height:"100%",width:"100%",fillColor:!1,lineColor:"#FF9900",lineWidth:2,spotRadius:3,spotColor:!1,minSpotColor:"#78AB49",maxSpotColor:"#78AB49",highlightSpotColor:"#9D3926",highlightLineColor:"#9D3926"})}var n=100,i=freeboard.getStyleString("values");i+="overflow: hidden;text-overflow: ellipsis;display: inline;",freeboard.addStyle(".text-widget-unit","padding-left: 5px;display:inline;"),freeboard.addStyle(".text-widget-regular-value",i+"font-size:30px;"),freeboard.addStyle(".text-widget-big-value",i+"font-size:75px;"),freeboard.addStyle(".gauge-widget-wrapper","width: 100%;text-align: center;"),freeboard.addStyle(".gauge-widget","width:200px;height:160px;display:inline-block;"),freeboard.addStyle(".sparkline","width:100%;height: 75px;"),freeboard.addStyle(".sparkline-inline","width:50%;float:right;height:30px;"),freeboard.addStyle(".indicator-light","border-radius:50%;width:22px;height:22px;border:2px solid #3d3d3d;margin-top:5px;float:left;background-color:#222;margin-right:10px;"),freeboard.addStyle(".indicator-light.on","background-color:#FFC773;box-shadow: 0px 0px 15px #FF9900;border-color:#FDF1DF;"),freeboard.addStyle(".indicator-text","margin-top:10px;"),freeboard.addStyle("div.pointer-value","position:absolute;height:95px;margin: auto;top: 0px;bottom: 0px;width: 100%;text-align:center;");var a=function(n){var i,a=n,s=$('<h2 class="section-title"></h2>'),o=$("<div></div>"),r=$('<div class="text-widget-unit"></div>'),l=$('<span class="sparkline-inline"></span>');this.render=function(e){$(e).append(s).append(o).append(r).append(l)},this.onSettingsChanged=function(e){a=e,s.html(_.isUndefined(e.title)?"":e.title),o.toggleClass("text-widget-regular-value","regular"==e.size).toggleClass("text-widget-big-value","big"==e.size),r.html(_.isUndefined(e.units)?"":e.units),e.sparkline?l.show():(delete l.data().values,l.empty(),l.hide())},this.onCalculatedValueChanged=function(n,s){"value"==n&&(a.animate?e(i,s,o,500):o.text(s),a.sparkline&&t(l,s),i=s)},this.onDispose=function(){},this.getHeight=function(){return"big"==a.size?2:1},this.onSettingsChanged(n)};freeboard.loadWidgetPlugin({type_name:"text_widget",display_name:"Text",external_scripts:["plugins/thirdparty/jquery.sparkline.min.js"],settings:[{name:"title",display_name:"Title",type:"text"},{name:"size",display_name:"Size",type:"option",options:[{name:"Regular",value:"regular"},{name:"Big",value:"big"}]},{name:"value",display_name:"Value",type:"calculated"},{name:"sparkline",display_name:"Include Sparkline",type:"boolean"},{name:"animate",display_name:"Animate Value Changes",type:"boolean",default_value:!0},{name:"units",display_name:"Units",type:"text"}],newInstance:function(e,t){t(new a(e))}});var s=0,o=function(e){function t(){r&&(o.empty(),n=new JustGage({id:i,value:_.isUndefined(l.min_value)?0:l.min_value,min:_.isUndefined(l.min_value)?0:l.min_value,max:_.isUndefined(l.max_value)?0:l.max_value,label:l.units,showInnerShadow:!1,valueFontColor:"#d3d4d4"}))}var n,i="gauge-"+s++,a=$('<h2 class="section-title"></h2>'),o=$('<div class="gauge-widget" id="'+i+'"></div>'),r=!1,l=e;this.render=function(e){r=!0,$(e).append(a).append($('<div class="gauge-widget-wrapper"></div>').append(o)),t()},this.onSettingsChanged=function(e){e.min_value!=l.min_value||e.max_value!=l.max_value||e.units!=l.units?(l=e,t()):l=e,a.html(e.title)},this.onCalculatedValueChanged=function(e,t){_.isUndefined(n)||n.refresh(Number(t))},this.onDispose=function(){},this.getHeight=function(){return 3},this.onSettingsChanged(e)};freeboard.loadWidgetPlugin({type_name:"gauge",display_name:"Gauge",external_scripts:["plugins/thirdparty/raphael.2.1.0.min.js","plugins/thirdparty/justgage.1.0.1.js"],settings:[{name:"title",display_name:"Title",type:"text"},{name:"value",display_name:"Value",type:"calculated"},{name:"units",display_name:"Units",type:"text"},{name:"min_value",display_name:"Minimum",type:"text",default_value:0},{name:"max_value",display_name:"Maximum",type:"text",default_value:100}],newInstance:function(e,t){t(new o(e))}});var r=function(e){var n=$('<h2 class="section-title"></h2>'),i=$('<div class="sparkline"></div>');this.render=function(e){$(e).append(n).append(i)},this.onSettingsChanged=function(e){n.html(_.isUndefined(e.title)?"":e.title)},this.onCalculatedValueChanged=function(e,n){t(i,n)},this.onDispose=function(){},this.getHeight=function(){return 2},this.onSettingsChanged(e)};freeboard.loadWidgetPlugin({type_name:"sparkline",display_name:"Sparkline",external_scripts:["plugins/thirdparty/jquery.sparkline.min.js"],settings:[{name:"title",display_name:"Title",type:"text"},{name:"value",display_name:"Value",type:"calculated"}],newInstance:function(e,t){t(new r(e))}});var l=function(e){function t(e){if(!e||2>e.length)return[];var t=[];t.push(["m",e[0],e[1]]);for(var n=2;e.length>n;n+=2)t.push(["l",e[n],e[n+1]]);return t.push(["z"]),t}var n,i,a,s,o=3,r=0,l=$('<div class="text-widget-big-value"></div>'),d=$("<div></div>");this.render=function(e){a=$(e).width(),s=$(e).height();var r=Math.min(a,s)/2-2*o;n=Raphael($(e).get()[0],a,s);var c=n.circle(a/2,s/2,r);c.attr("stroke","#FF9900"),c.attr("stroke-width",o),i=n.path(t([a/2,s/2-r+o,15,20,-30,0])),i.attr("stroke-width",0),i.attr("fill","#fff"),$(e).append($('<div class="pointer-value"></div>').append(l).append(d))},this.onSettingsChanged=function(e){d.html(e.units)},this.onCalculatedValueChanged=function(e,t){if("direction"==e){if(!_.isUndefined(i)){i.animate({transform:"r"+t+","+a/2+","+s/2},250,"bounce")}r=t}else"value_text"==e&&l.html(t)},this.onDispose=function(){},this.getHeight=function(){return 4},this.onSettingsChanged(e)};freeboard.loadWidgetPlugin({type_name:"pointer",display_name:"Pointer",external_scripts:["plugins/thirdparty/raphael.2.1.0.min.js"],settings:[{name:"direction",display_name:"Direction",type:"calculated",description:"In degrees"},{name:"value_text",display_name:"Value Text",type:"calculated"},{name:"units",display_name:"Units",type:"text"}],newInstance:function(e,t){t(new l(e))}});var d=function(e){function t(){a&&(clearInterval(a),a=null)}function n(){if(i&&s){var e=s+(-1==s.indexOf("?")?"?":"&")+Date.now();$(i).css({"background-image":"url("+e+")"})}}var i,a,s;this.render=function(e){$(e).css({width:"100%",height:"100%","background-size":"cover","background-position":"center"}),i=e},this.onSettingsChanged=function(e){t(),e.refresh&&e.refresh>0&&(a=setInterval(n,1e3*Number(e.refresh)))},this.onCalculatedValueChanged=function(e,t){"src"==e&&(s=t),n()},this.onDispose=function(){t()},this.getHeight=function(){return 4},this.onSettingsChanged(e)};freeboard.loadWidgetPlugin({type_name:"picture",display_name:"Picture",fill_size:!0,settings:[{name:"src",display_name:"Image URL",type:"calculated"},{type:"number",display_name:"Refresh every",name:"refresh",suffix:"seconds",description:"Leave blank if the image doesn't need to be refreshed"}],newInstance:function(e,t){t(new d(e))}});var c=function(e){function t(){a.toggleClass("on",o),o?i.text(_.isUndefined(s.on_text)?"":s.on_text):i.text(_.isUndefined(s.off_text)?"":s.off_text)}var n=$('<h2 class="section-title"></h2>'),i=$('<div class="indicator-text"></div>'),a=$('<div class="indicator-light"></div>'),s=e,o=!1;this.render=function(e){$(e).append(n).append(a).append(i)},this.onSettingsChanged=function(e){s=e,n.html(_.isUndefined(e.title)?"":e.title),t()},this.onCalculatedValueChanged=function(e,n){"value"==e&&(o=Boolean(n)),t()},this.onDispose=function(){},this.getHeight=function(){return 1},this.onSettingsChanged(e)};freeboard.loadWidgetPlugin({type_name:"indicator",display_name:"Indicator Light",settings:[{name:"title",display_name:"Title",type:"text"},{name:"value",display_name:"Value",type:"calculated"},{name:"on_text",display_name:"On Text",type:"calculated"},{name:"off_text",display_name:"Off Text",type:"calculated"}],newInstance:function(e,t){t(new c(e))}}),freeboard.addStyle(".gm-style-cc a","text-shadow:none;");var u=function(e){function t(){if(n&&i&&s.lat&&s.lon){var e=new google.maps.LatLng(s.lat,s.lon);i.setPosition(e),n.panTo(e)}}var n,i,a=e,s={};this.render=function(e){function a(){var a={zoom:13,center:new google.maps.LatLng(37.235,-115.811111),disableDefaultUI:!0,draggable:!1,styles:[{featureType:"water",elementType:"geometry",stylers:[{color:"#2a2a2a"}]},{featureType:"landscape",elementType:"geometry",stylers:[{color:"#000000"},{lightness:20}]},{featureType:"road.highway",elementType:"geometry.fill",stylers:[{color:"#000000"},{lightness:17}]},{featureType:"road.highway",elementType:"geometry.stroke",stylers:[{color:"#000000"},{lightness:29},{weight:.2}]},{featureType:"road.arterial",elementType:"geometry",stylers:[{color:"#000000"},{lightness:18}]},{featureType:"road.local",elementType:"geometry",stylers:[{color:"#000000"},{lightness:16}]},{featureType:"poi",elementType:"geometry",stylers:[{color:"#000000"},{lightness:21}]},{elementType:"labels.text.stroke",stylers:[{visibility:"on"},{color:"#000000"},{lightness:16}]},{elementType:"labels.text.fill",stylers:[{saturation:36},{color:"#000000"},{lightness:40}]},{elementType:"labels.icon",stylers:[{visibility:"off"}]},{featureType:"transit",elementType:"geometry",stylers:[{color:"#000000"},{lightness:19}]},{featureType:"administrative",elementType:"geometry.fill",stylers:[{color:"#000000"},{lightness:20}]},{featureType:"administrative",elementType:"geometry.stroke",stylers:[{color:"#000000"},{lightness:17},{weight:1.2}]}]};n=new google.maps.Map(e,a),google.maps.event.addDomListener(e,"mouseenter",function(e){e.cancelBubble=!0,n.hover||(n.hover=!0,n.setOptions({zoomControl:!0}))}),google.maps.event.addDomListener(e,"mouseleave",function(){n.hover&&(n.setOptions({zoomControl:!1}),n.hover=!1)}),i=new google.maps.Marker({map:n}),t()}window.google&&window.google.maps?a():(window.gmap_initialize=a,head.js("https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=gmap_initialize"))},this.onSettingsChanged=function(e){a=e},this.onCalculatedValueChanged=function(e,n){"lat"==e?s.lat=n:"lon"==e&&(s.lon=n),t()},this.onDispose=function(){},this.getHeight=function(){return 4},this.onSettingsChanged(e)};freeboard.loadWidgetPlugin({type_name:"google_map",display_name:"Google Map",fill_size:!0,settings:[{name:"lat",display_name:"Latitude",type:"calculated"},{name:"lon",display_name:"Longitude",type:"calculated"}],newInstance:function(e,t){t(new u(e))}}),freeboard.addStyle(".html-widget","white-space:normal;width:100%;height:100%");var p=function(e){var t=$('<div class="html-widget"></div>'),n=e;this.render=function(e){$(e).append(t)},this.onSettingsChanged=function(e){n=e},this.onCalculatedValueChanged=function(e,n){"html"==e&&t.html(n)},this.onDispose=function(){},this.getHeight=function(){return Number(n.height)},this.onSettingsChanged(e)};freeboard.loadWidgetPlugin({type_name:"html",display_name:"HTML",fill_size:!0,settings:[{name:"html",display_name:"HTML",type:"calculated",description:"Can be literal HTML, or javascript that outputs HTML."},{name:"height",display_name:"Height Blocks",type:"number",default_value:4,description:"A height block is around 60 pixels"}],newInstance:function(e,t){t(new p(e))}})}();