You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apex.apache.org by da...@apache.org on 2015/11/30 22:06:55 UTC

[49/98] [abbrv] [partial] incubator-apex-malhar git commit: Removing all web demos

http://git-wip-us.apache.org/repos/asf/incubator-apex-malhar/blob/e1a45507/web/demos/app/scripts/controllers/twitter.js
----------------------------------------------------------------------
diff --git a/web/demos/app/scripts/controllers/twitter.js b/web/demos/app/scripts/controllers/twitter.js
deleted file mode 100644
index f9e8ffd..0000000
--- a/web/demos/app/scripts/controllers/twitter.js
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*global settings, angular, jQuery, _*/
-(function () {
-'use strict';
-
-angular.module('twitter')
-    .controller('TwitterUrlsController', ['$scope', 'rest', function ($scope, rest) {
-        rest.getApp(settings.twitterUrls.appName).then(function (app) {
-            $scope.app = app;
-            $scope.appURL = settings.appsURL + app.id;
-        });
-
-        $scope.topic = settings.twitterUrls.topic;
-        $scope.pageTitle = 'Twitter Top URLs';
-        $scope.entity = 'URLs';
-        $scope.gridTitle = 'Twitter Top URLs';
-        $scope.chartTitle = 'Top 10 URLs Chart';
-        $scope.colName = 'URL';
-        $scope.formatter = function(url) {
-            return '<a class="svg-link" xlink:href="' + url + '">' + url + '</a>';
-        };
-    }])
-    .controller('TwitterHashtagsController', ['$scope', 'rest', function ($scope, rest) {
-        rest.getApp(settings.twitterHashtags.appName).then(function (app) {
-          $scope.app = app;
-          $scope.appURL = settings.appsURL + app.id;
-        });
-
-        $scope.topic = settings.twitterHashtags.topic;
-        $scope.pageTitle = 'Twitter Top Hashtags';
-        $scope.entity = 'hashtags';
-        $scope.gridTitle = 'Twitter Top Hashtags';
-        $scope.chartTitle = 'Top 10 Hashtags Chart';
-        $scope.colName = 'Hashtag';
-        $scope.formatter = function(Hashtag) {
-            return '<a class="svg-link" xlink:href="https://twitter.com/search?q=%23' + encodeURIComponent(Hashtag) + '">' + Hashtag + '</a>';
-        };
-    }])
-    .controller('TwitterGridControlller', ['$scope', 'socket', function ($scope, socket) {
-        socket.subscribe($scope.topic, function(data) {
-            var list = [];
-            jQuery.each(data.data, function(key, value) {
-                list.push( { name: key, value: parseInt(value, 10) } );
-            });
-            list = _.sortBy(list, function(item) {
-                return -item.value;
-            });
-            $scope.topTen = list;
-            $scope.$apply();
-        }, $scope);
-
-        $scope.gridOptions = {
-            data: 'topTen',
-            enableColumnResize: true,
-          columnDefs: [
-            { field: "name", displayName: $scope.colName, width: '75%', sortable: false },
-            { field: "value", displayName: 'Count', width: '25%', sortable: false }
-          ]
-        };
-    }])
-    .controller('TwitterBarChartController', ['$scope', 'socket', function($scope, socket) {
-        socket.subscribe($scope.topic, function(data) {
-            var list = [];
-            jQuery.each(data.data, function(key, value) {
-                list.push( { name: key, value: parseInt(value, 10) } );
-            });
-            list = _.sortBy(list, function(item) {
-                return -item.value;
-            });
-            //var max = _.max(list, function(item) {item.value});
-            var max = list[0].value;
-            _.each(list, function(item) {
-                if ($scope.formatter) {
-                    item.name = $scope.formatter(item.name);
-                }
-                item.name += ' - ' + item.value;
-                item.score = item.value / max * 100;
-            });
-
-            $scope.twitterBarChartData = list;
-            $scope.$apply();
-        }, $scope);
-        $scope.twitterBarChartData = [];
-    }]);
-
-})();

http://git-wip-us.apache.org/repos/asf/incubator-apex-malhar/blob/e1a45507/web/demos/app/scripts/directives/barChart.js
----------------------------------------------------------------------
diff --git a/web/demos/app/scripts/directives/barChart.js b/web/demos/app/scripts/directives/barChart.js
deleted file mode 100644
index dad2b4c..0000000
--- a/web/demos/app/scripts/directives/barChart.js
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*global angular, d3*/
-(function () {
-'use strict';
-
-angular.module('widgets')
-    .directive('widgetsBarChart', function () {
-        return {
-            restrict: 'A',
-            scope: {
-                data: "=",
-                label: "@",
-                onClick: "&"
-            },
-            link: function(scope, iElement, iAttrs) {
-                var svg = d3.select(iElement[0])
-                    .append("svg")
-                    .attr("width", "100%");
-
-                // on window resize, re-render d3 canvas
-                window.onresize = function() {
-                    return scope.$apply();
-                };
-                scope.$watch(function(){
-                        return angular.element(window)[0].innerWidth;
-                    }, function(){
-                        return scope.render(scope.data);
-                    }
-                );
-
-                // watch for data changes and re-render
-                scope.$watch('data', function(newVals, oldVals) {
-                    return scope.render(newVals);
-                }, true);
-
-                // define render function
-                scope.render = function(data){
-                    // remove all previous items before render
-                    svg.selectAll("*").remove();
-
-                    // setup variables
-                    var width, height, max;
-                    width = d3.select(iElement[0])[0][0].offsetWidth - 20;
-                    // 20 is for margins and can be changed
-                    height = scope.data.length * 35;
-                    // 35 = 30(bar height) + 5(margin between bars)
-                    max = 98;
-                    // this can also be found dynamically when the data is not static
-                    // max = Math.max.apply(Math, _.map(data, ((val)-> val.count)))
-
-                    // set the height based on the calculations above
-                    svg.attr('height', height);
-
-                    //create the rectangles for the bar chart
-                    svg.selectAll("rect")
-                        .data(data)
-                        .enter()
-                        .append("rect")
-                        .on("click", function(d, i){return scope.onClick({item: d});})
-                        .attr("height", 30) // height of each bar
-                        .attr("width", 0) // initial width of 0 for transition
-                        .attr("x", 10) // half of the 20 side margin specified above
-                        .attr("y", function(d, i){
-                            return i * 35;
-                        }) // height + margin between bars
-                        //.transition()
-                        //.duration(1000)
-                        .attr("width", function(d){
-                            var w = d.score/(max/width); // width based on scale
-                            return w > 10 ? w : 10;
-                        });
-
-                    svg.selectAll("text")
-                        .data(data)
-                        .enter()
-                        .append("text")
-                        .attr("fill", "#fff")
-                        .attr("y", function(d, i){return i * 35 + 22;})
-                        .attr("x", 15)
-                        .html(function(d){return d[scope.label];});
-
-                };
-            }
-        };
-    });
-
-})();

http://git-wip-us.apache.org/repos/asf/incubator-apex-malhar/blob/e1a45507/web/demos/app/scripts/directives/gauge.js
----------------------------------------------------------------------
diff --git a/web/demos/app/scripts/directives/gauge.js b/web/demos/app/scripts/directives/gauge.js
deleted file mode 100644
index f3bc06f..0000000
--- a/web/demos/app/scripts/directives/gauge.js
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/**
- * Modified copy of https://github.com/lithiumtech/angular_and_d3/blob/master/step5/custom/gauges.js
- */
-
-/*global Gauge, angular, d3*/
-(function () {
-'use strict';
-
-    angular.module('widgets').directive( 'gauge', function () {
-        return {
-            restrict: 'A',
-            replace: true,
-            scope: {
-                label: "@",
-                min: "=",
-                max: "=",
-                value: "="
-            },
-            link: function (scope, element, attrs) {
-                var config = {
-                    size: 280,
-                    label: attrs.label,
-                    min: undefined !== scope.min ? scope.min : 0,
-                    max: undefined !== scope.max ? scope.max : 100,
-                    minorTicks: 5
-                };
-
-                var range = config.max - config.min;
-                config.yellowZones = [ { from: config.min + range*0.75, to: config.min + range*0.9 } ];
-                config.redZones = [ { from: config.min + range*0.9, to: config.max } ];
-
-                scope.gauge = new Gauge( element[0], config );
-                scope.gauge.render();
-                scope.gauge.redraw( scope.value );
-
-                scope.$watch('value', function() {
-                    if (scope.gauge) {
-                        scope.gauge.redraw( scope.value );
-                    }
-                });
-            }
-        };
-    });
-
-})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-apex-malhar/blob/e1a45507/web/demos/app/scripts/directives/lineChart.js
----------------------------------------------------------------------
diff --git a/web/demos/app/scripts/directives/lineChart.js b/web/demos/app/scripts/directives/lineChart.js
deleted file mode 100644
index 5ff3310..0000000
--- a/web/demos/app/scripts/directives/lineChart.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*global angular, google*/
-(function () {
-'use strict';
-
-angular.module('widgets')
-  .directive('lineChart', function () {
-    return {
-      template: '<div></div>',
-      scope: {
-        chart: '='
-      },
-      restrict: 'E',
-      replace: true,
-      link: function postLink(scope, element, attrs) {
-        var lineChart = new google.visualization.LineChart(element[0]);
-
-        function draw(chart) {
-          var data = chart.data;
-
-          if (!data) {
-            data = [];
-          }
-
-          var table = new google.visualization.DataTable();
-          table.addColumn('datetime');
-          table.addColumn('number');
-          table.addRows(data.length);
-
-          var view = new google.visualization.DataView(table);
-
-          for (var i = 0; i < data.length; i++) {
-            var item = data[i];
-            table.setCell(i, 0, new Date(item.timestamp));
-            var value = parseFloat(item.value);
-            table.setCell(i, 1, value);
-          }
-
-          var options;
-          if (data.length === 0 && chart.emptyChartOptions) {
-            options = chart.emptyChartOptions();
-          } else {
-            options = chart.options;
-          }
-
-          lineChart.draw(view, options);
-        }
-
-        scope.$watch('chart', function (chart) {
-          if (chart) {
-            draw(chart);
-          }
-        });
-      }
-    };
-  });
-
-})();

http://git-wip-us.apache.org/repos/asf/incubator-apex-malhar/blob/e1a45507/web/demos/app/scripts/directives/stat.js
----------------------------------------------------------------------
diff --git a/web/demos/app/scripts/directives/stat.js b/web/demos/app/scripts/directives/stat.js
deleted file mode 100644
index c0b6dc4..0000000
--- a/web/demos/app/scripts/directives/stat.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*global BigInteger, angular, _*/
-(function () {
-'use strict';
-
-angular.module('widgets')
-    .directive('widgetsStat', ['$timeout', 'socket', function ($timeout, socket) {
-        return {
-            restrict: 'A',
-            templateUrl: 'views/stat.html',
-            scope: {
-                app: "=",
-                label: "@",
-                onClick: "&"
-            },
-            link: function($scope, iElement, iAttrs) {
-                $scope.totalEmitted = 0;
-                $scope.totalProcessed = 0;
-                $scope.elapsed = 0;
-
-                var initialElapsedTime;
-                var startTime;
-
-                function updatedElapsedTime() {
-                    $scope.elapsed = initialElapsedTime + (Date.now() - startTime);
-                    $timeout(updatedElapsedTime, 1000);
-                }
-
-                $scope.$watch('app', function (app) {
-                    if (app) {
-                        initialElapsedTime = parseInt(app.elapsedTime);
-                        startTime = Date.now();
-                        updatedElapsedTime();
-
-                        var topic = 'applications.' + app.id;
-
-                        socket.subscribe(topic, function (message) {
-                            var appData = message.data;
-                            $scope.totalEmitted = appData.tuplesEmittedPSMA;
-                            $scope.totalProcessed = appData.totalTuplesProcessed;
-                            $scope.$apply();
-                        }, $scope);
-                    }
-                });
-            }
-        };
-    }]);
-
-})();

http://git-wip-us.apache.org/repos/asf/incubator-apex-malhar/blob/e1a45507/web/demos/app/scripts/filters/elapsed.js
----------------------------------------------------------------------
diff --git a/web/demos/app/scripts/filters/elapsed.js b/web/demos/app/scripts/filters/elapsed.js
deleted file mode 100644
index f52c97e..0000000
--- a/web/demos/app/scripts/filters/elapsed.js
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*global angular, _*/
-(function () {
-'use strict';
-
-angular.module('widgets').filter('elapsed', function() {
-    return function(timeStamp) {
-        var options = { timeChunk: timeStamp * 1, unixUptime: true };
-
-        _.defaults(options, {
-            compareDate: +new Date(),
-            timeChunk: undefined,
-            maxUnit: "year",
-            unixUptime: false,
-            max_levels: 3,
-            timeStamp: timeStamp || 0
-        });
-        var remaining = (options.timeChunk !== undefined) ? options.timeChunk : options.compareDate - options.timeStamp;
-        var string = "";
-        var separator = ", ";
-        var level = 0;
-        var max_levels = options.max_levels;
-        var milli_per_second = 1000;
-        var milli_per_minute = milli_per_second * 60;
-        var milli_per_hour = milli_per_minute * 60;
-        var milli_per_day = milli_per_hour * 24;
-        var milli_per_week = milli_per_day * 7;
-        var milli_per_month = milli_per_week * 4;
-        var milli_per_year = milli_per_day * 365;
-
-        if (options.unixUptime) {
-            var days = Math.floor(remaining / milli_per_day);
-            remaining -= days*milli_per_day;
-            var hours = Math.floor(remaining / milli_per_hour);
-            remaining -= hours*milli_per_hour;
-            var minutes = Math.round(remaining / milli_per_minute);
-
-            if (days === 0) {
-                minutes = Math.floor(remaining / milli_per_minute);
-                remaining -= minutes*milli_per_minute;
-                var seconds = Math.round(remaining / 1000);
-                string = (hours < 10 ? "0" : "")+hours+':'+(minutes < 10 ? "0" : "")+minutes+':'+(seconds < 10 ? "0" : "")+seconds;
-            }
-            else {
-                string = days + " days, " + hours.toString() + ":" + (minutes < 10 ? "0" : "") + minutes.toString();
-            }
-
-        } else {
-            var levels = [
-                { plural: "years", singular: "year", ms: milli_per_year },
-                { plural: "months", singular: "month", ms: milli_per_month },
-                { plural: "weeks", singular: "week", ms: milli_per_week },
-                { plural: "days", singular: "day", ms: milli_per_day },
-                { plural: "hours", singular: "hour", ms: milli_per_hour },
-                { plural: "minutes", singular: "minute", ms: milli_per_minute },
-                { plural: "seconds", singular: "second", ms: milli_per_second }
-            ];
-
-            var crossedThreshold = false;
-            for (var i=0; i < levels.length; i++) {
-                if ( options.maxUnit === levels[i].singular ) {
-                    crossedThreshold = true;
-                }
-                if ( remaining < levels[i].ms || !crossedThreshold ) {
-                    continue;
-                }
-                level++;
-                var num = Math.floor( remaining / levels[i].ms );
-                var label = num === 1 ? levels[i].singular : levels[i].plural ;
-                string += num + " " + label + separator;
-                remaining %= levels[i].ms;
-                if ( level >= max_levels ) {
-                    break;
-                }
-            }
-            string = string.substring(0, string.length - separator.length);
-        }
-
-
-        return string;
-    };
-});
-
-})();
-
-
-    
-    
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-apex-malhar/blob/e1a45507/web/demos/app/scripts/services/rest.js
----------------------------------------------------------------------
diff --git a/web/demos/app/scripts/services/rest.js b/web/demos/app/scripts/services/rest.js
deleted file mode 100644
index 7e1ef01..0000000
--- a/web/demos/app/scripts/services/rest.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*global angular, jQuery, _*/
-(function () {
-'use strict';
-
-angular.module('rest', ['ng', 'restangular'])
-    .factory('rest', ['$q', 'Restangular', function($q, Restangular) {
-        return {
-            getApp: function (appName) {
-                var deferred = $q.defer();
-                Restangular.oneUrl('applications', 'ws/v2/applications').get().then(function (response) {
-                    var errorMessage = null;
-                    if (response && response.apps && response.apps.length > 0) {
-                        var apps = _.where(response.apps, { name: appName, state: 'RUNNING' });
-                        if (apps.length > 0) {
-                            apps = _.sortBy(apps, function (app) { return parseInt(app.elapsedTime, 10); });
-                            var app = apps[0];
-                            deferred.resolve(app);
-                        } else {
-                            errorMessage = appName + ' is not found. Please make sure application is running.';
-                        }
-                    } else {
-                        errorMessage = 'No applications available.';
-                    }
-
-                    if (errorMessage) {
-                        deferred.reject(errorMessage);
-                        jQuery.pnotify({
-                            title: 'Error',
-                            text: errorMessage,
-                            type: 'error',
-                            icon: false,
-                            hide: false
-                        });
-                    }
-                });
-
-                return deferred.promise;
-            },
-
-            getMachineData: function (query) {
-                var promise = Restangular.one('machine').get(query);
-
-                promise.then(null, function (response) {
-                  jQuery.pnotify({
-                    title: 'Error',
-                    text: 'Error getting data from server. Status Code: ' + response.status,
-                    type: 'error',
-                    icon: false,
-                    hide: false
-                  });
-                });
-
-                return promise;
-            },
-
-          getDimensionsData: function (query) {
-            var promise = Restangular.one('dimensions').get(query);
-
-            promise.then(null, function (response) {
-              jQuery.pnotify({
-                title: 'Error',
-                text: 'Error getting data from server. Status Code: ' + response.status,
-                type: 'error',
-                icon: false,
-                hide: false
-              });
-            });
-
-            return promise;
-          }
-        };
-    }])
-    .run(function(Restangular) {
-        //Restangular.setBaseUrl('/ws/v1');
-        //Restangular.setBaseUrl('/stram/v1');
-    });
-})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-apex-malhar/blob/e1a45507/web/demos/app/scripts/services/socket.js
----------------------------------------------------------------------
diff --git a/web/demos/app/scripts/services/socket.js b/web/demos/app/scripts/services/socket.js
deleted file mode 100644
index 1dc16a0..0000000
--- a/web/demos/app/scripts/services/socket.js
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*global settings, console, angular, jQuery, _*/
-(function () {
-  'use strict';
-
-  angular.module('socket', [])
-    .factory('visibly', function ($window) {
-      return $window.visibly;
-    })
-    .provider('socket', function () {
-
-      var webSocketURL;
-      var webSocketObject; // for testing only
-
-      return {
-        $get: function ($q, $rootScope, $timeout, visibly) {
-          if (!webSocketURL && !webSocketObject) {
-            throw 'WebSocket URL is not defined';
-          }
-
-          var socket = !webSocketObject ? new WebSocket(webSocketURL) : webSocketObject;
-
-          var deferred = $q.defer();
-
-          socket.onopen = function () {
-            deferred.resolve();
-            $rootScope.$apply();
-
-            jQuery.pnotify({
-              title: 'WebSocket',
-              text: 'WebSocket connection established.',
-              type: 'success',
-              delay: 2000,
-              icon: false,
-              history: false
-            });
-          };
-
-          var webSocketError = false;
-
-          socket.onclose = function () {
-            if (!webSocketError) {
-              jQuery.pnotify({
-                title: 'WebSocket Closed',
-                text: 'WebSocket connection has been closed. Try refreshing the page.',
-                type: 'error',
-                icon: false,
-                hide: false,
-                history: false
-              });
-            }
-          };
-
-          //TODO
-          socket.onerror = function () {
-            webSocketError = true;
-            jQuery.pnotify({
-              title: 'WebSocket Error',
-              text: 'WebSocket error. Try refreshing the page.',
-              type: 'error',
-              icon: false,
-              hide: false,
-              history: false
-            });
-          };
-
-          var topicMap = {}; // topic -> [callbacks] mapping
-
-          var stopUpdates = false;
-
-          socket.onmessage = function (event) {
-            if (stopUpdates) { // stop updates if page is inactive
-              return;
-            }
-
-            var message = JSON.parse(event.data);
-
-            var topic = message.topic;
-
-            if (topicMap.hasOwnProperty(topic)) {
-              topicMap[topic].fire(message);
-            }
-          };
-
-          var timeoutPromise;
-
-          visibly.onHidden(function () {
-            timeoutPromise = $timeout(function () {
-              stopUpdates = true;
-              timeoutPromise = null;
-            }, 60000);
-          });
-
-          visibly.onVisible(function () {
-            /*
-            if (stopUpdates && !webSocketError) {
-              jQuery.pnotify({
-                title: 'Warning',
-                text: 'Page has not been visible for more than 60 seconds. WebSocket real-time updates have been suspended to conserve system resources. ' +
-                  'Refreshing the page is recommended.',
-                type: 'warning',
-                icon: false,
-                hide: false,
-                history: false
-              });
-            }
-            */
-
-            stopUpdates = false;
-
-            if (timeoutPromise) {
-              $timeout.cancel(timeoutPromise);
-            }
-          });
-
-          return {
-            send: function (message) {
-              var msg = JSON.stringify(message);
-
-              deferred.promise.then(function () {
-                console.log('send ' + msg);
-                socket.send(msg);
-              });
-            },
-
-            publish: function(topic, data) {
-              var message = { "type": "publish", "topic": topic, "data": data };
-              this.send(message);
-            },
-
-            subscribe: function (topic, callback, $scope) {
-              var callbacks = topicMap[topic];
-
-              if (!callbacks) {
-                var message = { type: 'subscribe', topic: topic }; // subscribe message
-                this.send(message);
-
-                callbacks = jQuery.Callbacks();
-                topicMap[topic] = callbacks;
-              }
-
-              callbacks.add(callback);
-
-              if ($scope) {
-                $scope.$on('$destroy', function () {
-                  this.unsubscribe(topic, callback);
-                }.bind(this));
-              }
-            },
-
-            unsubscribe: function (topic, callback) {
-              if (topicMap.hasOwnProperty(topic)) {
-                var callbacks = topicMap[topic];
-                callbacks.remove(callback); //TODO remove topic from topicMap if callbacks is empty
-              }
-            }
-          };
-        },
-
-        setWebSocketURL: function (wsURL) {
-          webSocketURL = wsURL;
-        },
-
-        setWebSocketObject: function (wsObject) {
-          webSocketObject = wsObject;
-        }
-      };
-    });
-
-})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-apex-malhar/blob/e1a45507/web/demos/app/scripts/vendor/angular-google-maps.js
----------------------------------------------------------------------
diff --git a/web/demos/app/scripts/vendor/angular-google-maps.js b/web/demos/app/scripts/vendor/angular-google-maps.js
deleted file mode 100644
index e74ba38..0000000
--- a/web/demos/app/scripts/vendor/angular-google-maps.js
+++ /dev/null
@@ -1,584 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/**
- * Modified copy (using MarkerWithLabel instead of google.maps.Marker).
- */
-
-/**!
- * The MIT License
- *
- * Copyright (c) 2010-2012 Google, Inc. http://angularjs.org
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * angular-google-maps
- * https://github.com/nlaplante/angular-google-maps
- *
- * @author Nicolas Laplante https://plus.google.com/108189012221374960701
- */
-
-(function () {
-
-    "use strict";
-
-    /*
-     * Utility functions
-     */
-
-    /**
-     * Check if 2 floating point numbers are equal
-     *
-     * @see http://stackoverflow.com/a/588014
-     */
-    function floatEqual (f1, f2) {
-        return (Math.abs(f1 - f2) < 0.000001);
-    }
-
-    /*
-     * Create the model in a self-contained class where map-specific logic is
-     * done. This model will be used in the directive.
-     */
-
-    var MapModel = (function () {
-
-        var _defaults = {
-            zoom: 8,
-            draggable: false,
-            container: null
-        };
-
-        /**
-         *
-         */
-        function PrivateMapModel(opts) {
-
-            var _instance = null,
-                _markers = [],  // caches the instances of google.maps.Marker
-                _handlers = [], // event handlers
-                _windows = [],  // InfoWindow objects
-                o = angular.extend({}, _defaults, opts),
-                that = this,
-                currentInfoWindow = null;
-
-            this.center = opts.center;
-            this.zoom = o.zoom;
-            this.draggable = o.draggable;
-            this.dragging = false;
-            this.selector = o.container;
-            this.markers = [];
-            this.options = o.options;
-
-            this.draw = function () {
-
-                if (that.center == null) {
-                    // TODO log error
-                    return;
-                }
-
-                if (_instance == null) {
-
-                    // Create a new map instance
-
-                    _instance = new google.maps.Map(that.selector, angular.extend(that.options, {
-                        center: that.center,
-                        zoom: that.zoom,
-                        draggable: that.draggable,
-                        mapTypeId : google.maps.MapTypeId.ROADMAP
-                    }));
-
-                    google.maps.event.addListener(_instance, "dragstart",
-
-                        function () {
-                            that.dragging = true;
-                        }
-                    );
-
-                    google.maps.event.addListener(_instance, "idle",
-
-                        function () {
-                            that.dragging = false;
-                        }
-                    );
-
-                    google.maps.event.addListener(_instance, "drag",
-
-                        function () {
-                            that.dragging = true;
-                        }
-                    );
-
-                    google.maps.event.addListener(_instance, "zoom_changed",
-
-                        function () {
-                            that.zoom = _instance.getZoom();
-                            that.center = _instance.getCenter();
-                        }
-                    );
-
-                    google.maps.event.addListener(_instance, "center_changed",
-
-                        function () {
-                            that.center = _instance.getCenter();
-                        }
-                    );
-
-                    // Attach additional event listeners if needed
-                    if (_handlers.length) {
-
-                        angular.forEach(_handlers, function (h, i) {
-
-                            google.maps.event.addListener(_instance,
-                                h.on, h.handler);
-                        });
-                    }
-                }
-                else {
-
-                    // Refresh the existing instance
-                    google.maps.event.trigger(_instance, "resize");
-
-                    var instanceCenter = _instance.getCenter();
-
-                    if (!floatEqual(instanceCenter.lat(), that.center.lat())
-                        || !floatEqual(instanceCenter.lng(), that.center.lng())) {
-                        _instance.setCenter(that.center);
-                    }
-
-                    if (_instance.getZoom() != that.zoom) {
-                        _instance.setZoom(that.zoom);
-                    }
-                }
-            };
-
-            this.fit = function () {
-                if (_instance && _markers.length) {
-
-                    var bounds = new google.maps.LatLngBounds();
-
-                    angular.forEach(_markers, function (m, i) {
-                        bounds.extend(m.getPosition());
-                    });
-
-                    _instance.fitBounds(bounds);
-                }
-            };
-
-            this.on = function(event, handler) {
-                _handlers.push({
-                    "on": event,
-                    "handler": handler
-                });
-            };
-
-            this.addMarker = function (lat, lng, icon, infoWindowContent, label, url,
-                                       thumbnail) {
-
-                if (that.findMarker(lat, lng) != null) {
-                    return;
-                }
-
-                var marker = new MarkerWithLabel({
-                    position: new google.maps.LatLng(lat, lng),
-                    draggable: false,
-                    raiseOnDrag: true,
-                    map: _instance,
-                    labelContent: label,
-                    labelAnchor: new google.maps.Point(25, 0),
-                    labelClass: "marker-label", // the CSS class for the label
-                    labelStyle: {opacity: 1.0}
-                });
-
-                /*
-                var marker = new google.maps.Marker({
-                    position: new google.maps.LatLng(lat, lng),
-                    map: _instance,
-                    icon: icon
-                });
-                */
-
-                if (label) {
-
-                }
-
-                if (url) {
-
-                }
-
-                if (infoWindowContent != null) {
-                    var infoWindow = new google.maps.InfoWindow({
-                        content: infoWindowContent
-                    });
-
-                    google.maps.event.addListener(marker, 'click', function() {
-                        if (currentInfoWindow != null) {
-                            currentInfoWindow.close();
-                        }
-                        infoWindow.open(_instance, marker);
-                        currentInfoWindow = infoWindow;
-                    });
-                }
-
-                // Cache marker
-                _markers.unshift(marker);
-
-                // Cache instance of our marker for scope purposes
-                that.markers.unshift({
-                    "lat": lat,
-                    "lng": lng,
-                    "draggable": false,
-                    "icon": icon,
-                    "infoWindowContent": infoWindowContent,
-                    "label": label,
-                    "url": url,
-                    "thumbnail": thumbnail
-                });
-
-                // Return marker instance
-                return marker;
-            };
-
-            this.findMarker = function (lat, lng) {
-                for (var i = 0; i < _markers.length; i++) {
-                    var pos = _markers[i].getPosition();
-
-                    if (floatEqual(pos.lat(), lat) && floatEqual(pos.lng(), lng)) {
-                        return _markers[i];
-                    }
-                }
-
-                return null;
-            };
-
-            this.findMarkerIndex = function (lat, lng) {
-                for (var i = 0; i < _markers.length; i++) {
-                    var pos = _markers[i].getPosition();
-
-                    if (floatEqual(pos.lat(), lat) && floatEqual(pos.lng(), lng)) {
-                        return i;
-                    }
-                }
-
-                return -1;
-            };
-
-            this.addInfoWindow = function (lat, lng, html) {
-                var win = new google.maps.InfoWindow({
-                    content: html,
-                    position: new google.maps.LatLng(lat, lng)
-                });
-
-                _windows.push(win);
-
-                return win;
-            };
-
-            this.hasMarker = function (lat, lng) {
-                return that.findMarker(lat, lng) !== null;
-            };
-
-            this.getMarkerInstances = function () {
-                return _markers;
-            };
-
-            this.removeMarkers = function (markerInstances) {
-
-                var s = this;
-
-                angular.forEach(markerInstances, function (v, i) {
-                    var pos = v.getPosition(),
-                        lat = pos.lat(),
-                        lng = pos.lng(),
-                        index = s.findMarkerIndex(lat, lng);
-
-                    // Remove from local arrays
-                    _markers.splice(index, 1);
-                    s.markers.splice(index, 1);
-
-                    // Remove from map
-                    v.setMap(null);
-                });
-            };
-        }
-
-        // Done
-        return PrivateMapModel;
-    }());
-
-    // End model
-
-    // Start Angular directive
-
-    var googleMapsModule = angular.module("google-maps", []);
-
-    /**
-     * Map directive
-     */
-    googleMapsModule.directive("googleMap", ["$log", "$timeout", "$filter", function ($log, $timeout,
-                                                                                      $filter) {
-
-        var controller = function ($scope, $element) {
-
-            var _m = $scope.map;
-
-            self.addInfoWindow = function (lat, lng, content) {
-                _m.addInfoWindow(lat, lng, content);
-            };
-        };
-
-        controller.$inject = ['$scope', '$element'];
-
-        return {
-            restrict: "ECA",
-            priority: 100,
-            transclude: true,
-            template: "<div class='angular-google-map' ng-transclude></div>",
-            replace: false,
-            scope: {
-                center: "=center", // required
-                markers: "=markers", // optional
-                latitude: "=latitude", // required
-                longitude: "=longitude", // required
-                zoom: "=zoom", // required
-                refresh: "&refresh", // optional
-                windows: "=windows", // optional
-                events: "=events"
-            },
-            controller: controller,
-            link: function (scope, element, attrs, ctrl) {
-
-                // Center property must be specified and provide lat &
-                // lng properties
-                if (!angular.isDefined(scope.center) ||
-                    (!angular.isDefined(scope.center.latitude) ||
-                        !angular.isDefined(scope.center.longitude))) {
-
-                    $log.error("angular-google-maps: could not find a valid center property");
-                    return;
-                }
-
-                if (!angular.isDefined(scope.zoom)) {
-                    $log.error("angular-google-maps: map zoom property not set");
-                    return;
-                }
-
-                angular.element(element).addClass("angular-google-map");
-
-                // Parse options
-                var opts = {options: {}};
-                if (attrs.options) {
-                    opts.options = angular.fromJson(attrs.options);
-                }
-
-                // Create our model
-                var _m = new MapModel(angular.extend(opts, {
-                    container: element[0],
-                    center: new google.maps.LatLng(scope.center.latitude, scope.center.longitude),
-                    draggable: attrs.draggable == "true",
-                    zoom: scope.zoom
-                }));
-
-                _m.on("drag", function () {
-
-                    var c = _m.center;
-
-                    $timeout(function () {
-
-                        scope.$apply(function (s) {
-                            scope.center.latitude = c.lat();
-                            scope.center.longitude = c.lng();
-                        });
-                    });
-                });
-
-                _m.on("zoom_changed", function () {
-
-                    if (scope.zoom != _m.zoom) {
-
-                        $timeout(function () {
-
-                            scope.$apply(function (s) {
-                                scope.zoom = _m.zoom;
-                            });
-                        });
-                    }
-                });
-
-                _m.on("center_changed", function () {
-                    var c = _m.center;
-
-                    $timeout(function () {
-
-                        scope.$apply(function (s) {
-
-                            if (!_m.dragging) {
-                                scope.center.latitude = c.lat();
-                                scope.center.longitude = c.lng();
-                            }
-                        });
-                    });
-                });
-
-                if (angular.isDefined(scope.events)) {
-                    for (var eventName in scope.events) {
-                        if (scope.events.hasOwnProperty(eventName) && angular.isFunction(scope.events[eventName])) {
-                            _m.on(eventName, function () {
-                                scope.events[eventName].apply(scope, [_m, eventName, arguments]);
-                            });
-                        }
-                    }
-                }
-
-                if (attrs.markClick == "true") {
-                    (function () {
-                        var cm = null;
-
-                        _m.on("click", function (e) {
-                            if (cm == null) {
-
-                                cm = {
-                                    latitude: e.latLng.lat(),
-                                    longitude: e.latLng.lng()
-                                };
-
-                                scope.markers.push(cm);
-                            }
-                            else {
-                                cm.latitude = e.latLng.lat();
-                                cm.longitude = e.latLng.lng();
-                            }
-
-
-                            $timeout(function () {
-                                scope.latitude = cm.latitude;
-                                scope.longitude = cm.longitude;
-                                scope.$apply();
-                            });
-                        });
-                    }());
-                }
-
-                // Put the map into the scope
-                scope.map = _m;
-
-                // Check if we need to refresh the map
-                if (angular.isUndefined(scope.refresh())) {
-                    // No refresh property given; draw the map immediately
-                    _m.draw();
-                }
-                else {
-                    scope.$watch("refresh()", function (newValue, oldValue) {
-                        if (newValue && !oldValue) {
-                            _m.draw();
-                        }
-                    });
-                }
-
-                // Markers
-                scope.$watch("markers", function (newValue, oldValue) {
-
-                    $timeout(function () {
-
-                        angular.forEach(newValue, function (v, i) {
-                            if (!_m.hasMarker(v.latitude, v.longitude)) {
-                                _m.addMarker(v.latitude, v.longitude, v.icon, v.infoWindow, v.label);
-                            }
-                        });
-
-                        // Clear orphaned markers
-                        var orphaned = [];
-
-                        angular.forEach(_m.getMarkerInstances(), function (v, i) {
-                            // Check our scope if a marker with equal latitude and longitude.
-                            // If not found, then that marker has been removed form the scope.
-
-                            var pos = v.getPosition(),
-                                lat = pos.lat(),
-                                lng = pos.lng(),
-                                found = false;
-
-                            // Test against each marker in the scope
-                            for (var si = 0; si < scope.markers.length; si++) {
-
-                                var sm = scope.markers[si];
-
-                                if (floatEqual(sm.latitude, lat) && floatEqual(sm.longitude, lng)) {
-                                    // Map marker is present in scope too, don't remove
-                                    found = true;
-                                }
-                            }
-
-                            // Marker in map has not been found in scope. Remove.
-                            if (!found) {
-                                orphaned.push(v);
-                            }
-                        });
-
-                        orphaned.length && _m.removeMarkers(orphaned);
-
-                        // Fit map when there are more than one marker.
-                        // This will change the map center coordinates
-                        if (attrs.fit == "true" && newValue && newValue.length > 1) {
-                            _m.fit();
-                        }
-                    });
-
-                }, true);
-
-
-                // Update map when center coordinates change
-                scope.$watch("center", function (newValue, oldValue) {
-                    if (newValue === oldValue) {
-                        return;
-                    }
-
-                    if (!_m.dragging) {
-                        _m.center = new google.maps.LatLng(newValue.latitude,
-                            newValue.longitude);
-                        _m.draw();
-                    }
-                }, true);
-
-                scope.$watch("zoom", function (newValue, oldValue) {
-                    if (newValue === oldValue) {
-                        return;
-                    }
-
-                    _m.zoom = newValue;
-                    _m.draw();
-                });
-            }
-        };
-    }]);
-}());
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-apex-malhar/blob/e1a45507/web/demos/app/scripts/vendor/gauge.js
----------------------------------------------------------------------
diff --git a/web/demos/app/scripts/vendor/gauge.js b/web/demos/app/scripts/vendor/gauge.js
deleted file mode 100644
index edf6d9b..0000000
--- a/web/demos/app/scripts/vendor/gauge.js
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/**
- * Copied from https://github.com/lithiumtech/angular_and_d3
- */
-
-function Gauge(element, configuration)
-{
-	this.element = element;
-
-	var self = this; // for internal d3 functions
-
-	this.configure = function(configuration)
-	{
-		this.config = configuration;
-
-		this.config.size = this.config.size * 0.9;
-
-		this.config.raduis = this.config.size * 0.97 / 2;
-		this.config.cx = this.config.size / 2;
-		this.config.cy = this.config.size / 2;
-
-		this.config.min = undefined != configuration.min ? configuration.min : 0;
-		this.config.max = undefined != configuration.max ? configuration.max : 100;
-		this.config.range = this.config.max - this.config.min;
-
-		this.config.majorTicks = configuration.majorTicks || 5;
-		this.config.minorTicks = configuration.minorTicks || 2;
-
-		this.config.greenColor 	= configuration.greenColor || "#109618";
-		this.config.yellowColor = configuration.yellowColor || "#FF9900";
-		this.config.redColor 	= configuration.redColor || "#DC3912";
-
-		this.config.transitionDuration = configuration.transitionDuration || 500;
-	}
-
-	this.render = function()
-	{
-		this.body = d3.select( this.element )
-							.append("svg:svg")
-							.attr("class", "gauge")
-							.attr("width", this.config.size)
-							.attr("height", this.config.size);
-
-		this.body.append("svg:circle")
-					.attr("cx", this.config.cx)
-					.attr("cy", this.config.cy)
-					.attr("r", this.config.raduis)
-					.style("fill", "#ccc")
-					.style("stroke", "#000")
-					.style("stroke-width", "0.5px");
-
-		this.body.append("svg:circle")
-					.attr("cx", this.config.cx)
-					.attr("cy", this.config.cy)
-					.attr("r", 0.9 * this.config.raduis)
-					.style("fill", "#fff")
-					.style("stroke", "#e0e0e0")
-					.style("stroke-width", "2px");
-
-		for (var index in this.config.greenZones)
-		{
-			this.drawBand(this.config.greenZones[index].from, this.config.greenZones[index].to, self.config.greenColor);
-		}
-
-		for (var index in this.config.yellowZones)
-		{
-			this.drawBand(this.config.yellowZones[index].from, this.config.yellowZones[index].to, self.config.yellowColor);
-		}
-
-		for (var index in this.config.redZones)
-		{
-			this.drawBand(this.config.redZones[index].from, this.config.redZones[index].to, self.config.redColor);
-		}
-
-		if (undefined != this.config.label)
-		{
-			var fontSize = Math.round(this.config.size / 9);
-			this.body.append("svg:text")
-						.attr("x", this.config.cx)
-						.attr("y", this.config.cy / 2 + fontSize / 2)
-						.attr("dy", fontSize / 2)
-						.attr("text-anchor", "middle")
-						.text(this.config.label)
-						.style("font-size", fontSize + "px")
-						.style("fill", "#333")
-						.style("stroke-width", "0px");
-		}
-
-		var fontSize = Math.round(this.config.size / 16);
-		var majorDelta = this.config.range / (this.config.majorTicks - 1);
-		for (var major = this.config.min; major <= this.config.max; major += majorDelta)
-		{
-			var minorDelta = majorDelta / this.config.minorTicks;
-			for (var minor = major + minorDelta; minor < Math.min(major + majorDelta, this.config.max); minor += minorDelta)
-			{
-				var point1 = this.valueToPoint(minor, 0.75);
-				var point2 = this.valueToPoint(minor, 0.85);
-
-				this.body.append("svg:line")
-							.attr("x1", point1.x)
-							.attr("y1", point1.y)
-							.attr("x2", point2.x)
-							.attr("y2", point2.y)
-							.style("stroke", "#666")
-							.style("stroke-width", "1px");
-			}
-
-			var point1 = this.valueToPoint(major, 0.7);
-			var point2 = this.valueToPoint(major, 0.85);
-
-			this.body.append("svg:line")
-						.attr("x1", point1.x)
-						.attr("y1", point1.y)
-						.attr("x2", point2.x)
-						.attr("y2", point2.y)
-						.style("stroke", "#333")
-						.style("stroke-width", "2px");
-
-			if (major == this.config.min || major == this.config.max)
-			{
-				var point = this.valueToPoint(major, 0.63);
-
-				this.body.append("svg:text")
-				 			.attr("x", point.x)
-				 			.attr("y", point.y)
-				 			.attr("dy", fontSize / 3)
-				 			.attr("text-anchor", major == this.config.min ? "start" : "end")
-				 			.text(major)
-				 			.style("font-size", fontSize + "px")
-							.style("fill", "#333")
-							.style("stroke-width", "0px");
-			}
-		}
-
-		var pointerContainer = this.body.append("svg:g").attr("class", "pointerContainer");
-
-		var midValue = (this.config.min + this.config.max) / 2;
-
-		var pointerPath = this.buildPointerPath(midValue);
-
-		var pointerLine = d3.svg.line()
-									.x(function(d) { return d.x })
-									.y(function(d) { return d.y })
-									.interpolate("basis");
-
-		pointerContainer.selectAll("path")
-							.data([pointerPath])
-							.enter()
-								.append("svg:path")
-									.attr("d", pointerLine)
-									.style("fill", "#dc3912")
-									.style("stroke", "#c63310")
-									.style("fill-opacity", 0.7)
-
-		pointerContainer.append("svg:circle")
-							.attr("cx", this.config.cx)
-							.attr("cy", this.config.cy)
-							.attr("r", 0.12 * this.config.raduis)
-							.style("fill", "#4684EE")
-							.style("stroke", "#666")
-							.style("opacity", 1);
-
-		var fontSize = Math.round(this.config.size / 10);
-		pointerContainer.selectAll("text")
-							.data([midValue])
-							.enter()
-								.append("svg:text")
-									.attr("x", this.config.cx)
-									.attr("y", this.config.size - this.config.cy / 4 - fontSize)
-									.attr("dy", fontSize / 2)
-									.attr("text-anchor", "middle")
-									.style("font-size", fontSize + "px")
-									.style("fill", "#000")
-									.style("stroke-width", "0px");
-
-		this.redraw(this.config.min, 0);
-	}
-
-	this.buildPointerPath = function(value)
-	{
-		var delta = this.config.range / 13;
-
-		var head = valueToPoint(value, 0.85);
-		var head1 = valueToPoint(value - delta, 0.12);
-		var head2 = valueToPoint(value + delta, 0.12);
-
-		var tailValue = value - (this.config.range * (1/(270/360)) / 2);
-		var tail = valueToPoint(tailValue, 0.28);
-		var tail1 = valueToPoint(tailValue - delta, 0.12);
-		var tail2 = valueToPoint(tailValue + delta, 0.12);
-
-		return [head, head1, tail2, tail, tail1, head2, head];
-
-		function valueToPoint(value, factor)
-		{
-			var point = self.valueToPoint(value, factor);
-			point.x -= self.config.cx;
-			point.y -= self.config.cy;
-			return point;
-		}
-	}
-
-	this.drawBand = function(start, end, color)
-	{
-		if (0 >= end - start) return;
-
-		this.body.append("svg:path")
-					.style("fill", color)
-					.attr("d", d3.svg.arc()
-						.startAngle(this.valueToRadians(start))
-						.endAngle(this.valueToRadians(end))
-						.innerRadius(0.65 * this.config.raduis)
-						.outerRadius(0.85 * this.config.raduis))
-					.attr("transform", function() { return "translate(" + self.config.cx + ", " + self.config.cy + ") rotate(270)" });
-	}
-
-	this.redraw = function(value, transitionDuration)
-	{
-		var pointerContainer = this.body.select(".pointerContainer");
-
-		pointerContainer.selectAll("text").text(Math.round(value));
-
-		var pointer = pointerContainer.selectAll("path");
-		pointer.transition()
-					.duration(undefined != transitionDuration ? transitionDuration : this.config.transitionDuration)
-					//.delay(0)
-					//.ease("linear")
-					//.attr("transform", function(d)
-					.attrTween("transform", function()
-					{
-						var pointerValue = value;
-						if (value > self.config.max) pointerValue = self.config.max + 0.02*self.config.range;
-						else if (value < self.config.min) pointerValue = self.config.min - 0.02*self.config.range;
-						var targetRotation = (self.valueToDegrees(pointerValue) - 90);
-						var currentRotation = self._currentRotation || targetRotation;
-						self._currentRotation = targetRotation;
-
-						return function(step)
-						{
-							var rotation = currentRotation + (targetRotation-currentRotation)*step;
-							return "translate(" + self.config.cx + ", " + self.config.cy + ") rotate(" + rotation + ")";
-						}
-					});
-	}
-
-	this.valueToDegrees = function(value)
-	{
-		// thanks @closealert
-		//return value / this.config.range * 270 - 45;
-		return value / this.config.range * 270 - (this.config.min / this.config.range * 270 + 45);
-	}
-
-	this.valueToRadians = function(value)
-	{
-		return this.valueToDegrees(value) * Math.PI / 180;
-	}
-
-	this.valueToPoint = function(value, factor)
-	{
-		return { 	x: this.config.cx - this.config.raduis * factor * Math.cos(this.valueToRadians(value)),
-					y: this.config.cy - this.config.raduis * factor * Math.sin(this.valueToRadians(value)) 		};
-	}
-
-	// initialization
-	this.configure(configuration);
-}
\ No newline at end of file