You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by yu...@apache.org on 2012/12/09 12:53:23 UTC

svn commit: r1418895 [5/5] - in /incubator/ambari/branches/AMBARI-666: ./ ambari-web/ ambari-web/app/ ambari-web/app/assets/data/alerts/ ambari-web/app/assets/data/background_operations/ ambari-web/app/assets/data/dashboard/ ambari-web/app/assets/data/...

Added: incubator/ambari/branches/AMBARI-666/ambari-web/app/views/main/test.js
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-web/app/views/main/test.js?rev=1418895&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-web/app/views/main/test.js (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-web/app/views/main/test.js Sun Dec  9 11:53:15 2012
@@ -0,0 +1,24 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+
+App.MainTestView = Em.View.extend({
+  templateName: require('templates/main/test'),
+  services: App.Service1.find()
+});

Modified: incubator/ambari/branches/AMBARI-666/ambari-web/app/views/wizard/step2_view.js
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-web/app/views/wizard/step2_view.js?rev=1418895&r1=1418894&r2=1418895&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-web/app/views/wizard/step2_view.js (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-web/app/views/wizard/step2_view.js Sun Dec  9 11:53:15 2012
@@ -19,6 +19,27 @@
 
 var App = require('app');
 
+App.SshKeyFileUploader = Ember.View.extend({
+  template:Ember.Handlebars.compile('<input type="file" />'),
+
+  change: function (e) {
+    self=this;
+    if (e.target.files && e.target.files.length == 1) {
+      var file = e.target.files[0];
+      var reader = new FileReader();
+
+      reader.onload = (function(theFile) {
+        return function(e) {
+          $('#sshKey').html(e.target.result);
+          //$('.sshKey-file-view').html(e.target.result);
+          self.set("controller.content.sshKey", e.target.result);
+        };
+      })(file);
+      reader.readAsText(file);
+    }
+  }
+});
+
 App.WizardStep2View = Em.View.extend({
 
   templateName: require('templates/wizard/step2'),
@@ -38,7 +59,24 @@ App.WizardStep2View = Em.View.extend({
     } else {
       this.set('hostNameErr', true);
     }
-  }.observes('controller.hostNameEmptyError', 'controller.hostNameNotRequiredErr', 'controller.hostNameErr')
+  }.observes('controller.hostNameEmptyError', 'controller.hostNameNotRequiredErr', 'controller.hostNameErr'),
+
+  sshKeyState: function(){
+    return this.get("controller").get("content.manualInstall");
+  }.property("controller.content.manualInstall"),
+
+  sshKeyClass:function() {
+    //alert(this.get("isFileApi"))
+    return (this.get("isFileApi")) ? "hide" : "" ;
+  }.property("isFileApi"),
+
+  isFileApi: function () {
+    return (window.File && window.FileReader && window.FileList) ? true : false ;
+  }.property(),
+
+  sshKeyPreviewClass: function() {
+    return (this.get('controller.content.sshKey').trim() != '') ? 'sshKey-file-view help-inline' : 'hidden';
+  }.property('controller.content.sshKey')
 
 });
 

Modified: incubator/ambari/branches/AMBARI-666/ambari-web/config.coffee
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-web/config.coffee?rev=1418895&r1=1418894&r2=1418895&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-web/config.coffee (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-web/config.coffee Sun Dec  9 11:53:15 2012
@@ -39,6 +39,7 @@ exports.config =
           'vendor/scripts/ember-data-latest.js',
           'vendor/scripts/ember-i18n-1.2.0.js',
           'vendor/scripts/bootstrap.js',
+          'vendor/scripts/bootstrap-combobox.js'
           'vendor/scripts/d3.v2.js',
           'vendor/scripts/sinon-1.4.2.js',
           'vendor/scripts/cubism.v1.js',
@@ -66,6 +67,7 @@ exports.config =
           'vendor/styles/font-awesome-ie7.css',
           'vendor/styles/cubism.css',
           'vendor/styles/rickshaw.css'
+          'vendor/styles/bootstrap-combobox.css'
         ]
 
     templates:

Modified: incubator/ambari/branches/AMBARI-666/ambari-web/package.json
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-web/package.json?rev=1418895&r1=1418894&r2=1418895&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-web/package.json (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-web/package.json Sun Dec  9 11:53:15 2012
@@ -19,8 +19,7 @@
     "uglify-js-brunch": ">= 1.0 < 1.5",
     "clean-css-brunch": ">= 1.0 < 1.5",
     "ember-handlebars-brunch": "git://github.com/icholy/ember-handlebars-brunch.git",
-    "less-brunch": "git://github.com/brunch/less-brunch.git",
-    "d3": ">=2.10.3"
+    "less-brunch": "git://github.com/brunch/less-brunch.git"
   },
   "devDependencies": {
     "mocha": "0.14.0",

Modified: incubator/ambari/branches/AMBARI-666/ambari-web/pom.xml
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-web/pom.xml?rev=1418895&r1=1418894&r2=1418895&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-web/pom.xml (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-web/pom.xml Sun Dec  9 11:53:15 2012
@@ -16,7 +16,7 @@
   <artifactId>ambari-web</artifactId>
   <packaging>pom</packaging>
   <name>Ambari Web</name>
-  <version>1.0.3-SNAPSHOT</version>
+  <version>1.0.3</version>
   <description>Ambari Web</description>
   <dependencies>
     <dependency>

Added: incubator/ambari/branches/AMBARI-666/ambari-web/vendor/scripts/bootstrap-combobox.js
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-web/vendor/scripts/bootstrap-combobox.js?rev=1418895&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-web/vendor/scripts/bootstrap-combobox.js (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-web/vendor/scripts/bootstrap-combobox.js Sun Dec  9 11:53:15 2012
@@ -0,0 +1,217 @@
+/* =============================================================
+ * bootstrap-combobox.js v1.0.0
+ * =============================================================
+ * Copyright 2012 Daniel Farrell
+ *
+ * Licensed 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.
+ * ============================================================ */
+
+!function ($) {
+
+  "use strict"
+
+  var Combobox = function (element, options) {
+    this.options = $.extend({}, $.fn.combobox.defaults, options)
+    this.$container = this.setup(element)
+    this.$element = this.$container.find('input')
+    this.$button = this.$container.find('.dropdown-toggle')
+    this.$target = this.$container.find('select')
+    this.matcher = this.options.matcher || this.matcher
+    this.sorter = this.options.sorter || this.sorter
+    this.highlighter = this.options.highlighter || this.highlighter
+    this.$menu = $(this.options.menu).appendTo('body')
+    this.placeholder = this.options.placeholder || this.$target.attr('data-placeholder')
+    this.$element.attr('placeholder', this.placeholder)
+    this.shown = false
+    this.selected = false
+    this.refresh()
+    this.listen()
+  }
+
+  /* NOTE: COMBOBOX EXTENDS BOOTSTRAP-TYPEAHEAD.js
+   ========================================== */
+
+  Combobox.prototype = $.extend({}, $.fn.typeahead.Constructor.prototype, {
+
+    constructor:Combobox, setup:function (element) {
+      var select = $(element)
+        , combobox = $(this.options.template)
+      select.before(combobox)
+      select.detach()
+      combobox.append(select)
+      return combobox
+    },
+    parse:function () {
+      var map = {}
+        , source = []
+        , selected = false
+      this.$target.find('option').each(function () {
+        var option = $(this)
+        map[option.text()] = option.val()
+        source.push(option.text())
+        if (option.attr('selected')) selected = option.html()
+      })
+      this.map = map
+      if (selected) {
+        this.$element.val(selected)
+        this.$container.addClass('combobox-selected')
+        this.selected = true
+      }
+      return source
+    },
+    toggle:function () {
+      if (this.$container.hasClass('combobox-selected')) {
+        this.clearTarget()
+        this.$element.val('').focus()
+      } else {
+        if (this.shown) {
+          this.hide()
+        } else {
+          this.lookup()
+        }
+      }
+    },
+    clearTarget:function () {
+      this.$target.val('')
+      this.$container.removeClass('combobox-selected')
+      this.selected = false
+      this.$target.trigger('change')
+    },
+    refresh:function () {
+      this.source = this.parse()
+      this.options.items = this.source.length
+    }
+
+    // modified typeahead function adding container and target handling
+    , select:function () {
+      var val = this.$menu.find('.active').attr('data-value')
+      this.$element.val(val)
+      this.$container.addClass('combobox-selected')
+      this.$target.val(this.map[val])
+      this.$target.trigger('change')
+      this.selected = true
+      return this.hide()
+    }
+
+    // modified typeahead function removing the blank handling
+    , lookup:function (event) {
+      var that = this
+        , items
+        , q
+
+      this.query = this.$element.val()
+
+      items = $.grep(this.source, function (item) {
+        if (that.matcher(item)) return item
+      })
+
+      items = this.sorter(items)
+
+      if (!items.length) {
+        return this.shown ? this.hide() : this
+      }
+
+      return this.render(items.slice(0, this.options.items)).show()
+    }
+
+    // modified typeahead function adding button handling
+    , listen:function () {
+      this.$element
+        .on('blur', $.proxy(this.blur, this))
+        .on('keypress', $.proxy(this.keypress, this))
+        .on('keyup', $.proxy(this.keyup, this))
+
+      if ($.browser.webkit || $.browser.msie) {
+        this.$element.on('keydown', $.proxy(this.keypress, this))
+      }
+
+      this.$menu
+        .on('click', $.proxy(this.click, this))
+        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
+
+      this.$button
+        .on('click', $.proxy(this.toggle, this))
+    }
+
+    // modified typeahead function to clear on type and prevent on moving around
+    , keyup:function (e) {
+      switch (e.keyCode) {
+        case 40: // down arrow
+        case 39: // right arrow
+        case 38: // up arrow
+        case 37: // left arrow
+        case 36: // home
+        case 35: // end
+        case 16: // shift
+          break
+
+        case 9: // tab
+        case 13: // enter
+          if (!this.shown) return
+          this.select()
+          break
+
+        case 27: // escape
+          if (!this.shown) return
+          this.hide()
+          break
+
+        default:
+          this.clearTarget()
+          this.lookup()
+      }
+
+      e.stopPropagation()
+      e.preventDefault()
+    }
+
+    // modified typeahead function to only hide menu if it is visible
+    , blur:function (e) {
+      var that = this
+      e.stopPropagation()
+      e.preventDefault()
+      var val = this.$element.val()
+      if (!this.selected && val != "") {
+        this.$element.val("")
+        this.$target.val("").trigger('change')
+      }
+      if (this.shown) {
+        setTimeout(function () {
+          that.hide()
+        }, 150)
+      }
+    }
+  })
+
+  /* COMBOBOX PLUGIN DEFINITION
+   * =========================== */
+
+  $.fn.combobox = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('combobox')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('combobox', (data = new Combobox(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.combobox.defaults = {
+    template:'<div class="combobox-container"><input type="text" autocomplete="off" /><button class="add-on btn dropdown-toggle" data-dropdown="dropdown"><span class="caret"/><span class="combobox-clear"><i class="icon-remove"/></span></button></div>',
+    menu:'<ul class="typeahead typeahead-long dropdown-menu"></ul>',
+    item:'<li><a href="#"></a></li>', placeholder:null
+  }
+
+  $.fn.combobox.Constructor = Combobox
+
+}(window.jQuery);

Modified: incubator/ambari/branches/AMBARI-666/ambari-web/vendor/scripts/jquery.dataTables.js
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-web/vendor/scripts/jquery.dataTables.js?rev=1418895&r1=1418894&r2=1418895&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-web/vendor/scripts/jquery.dataTables.js (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-web/vendor/scripts/jquery.dataTables.js Sun Dec  9 11:53:15 2012
@@ -745,7 +745,7 @@
             };
           }
           else if (typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1)) {
-            /* If there is a . in the source string then the data source is in a 
+            /* If there is a . in the source string then the data source is in a
              * nested object so we loop over the data for each level to get the next
              * level down. On each loop we test for undefined, and if found immediately
              * return. This allows entire objects to be missing and sDefaultContent to
@@ -1336,9 +1336,9 @@
           _fnCallbackFire(oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],
             _fnGetDataMaster(oSettings), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ]);
 
-          /* 
+          /*
            * Need to remove any old row from the display - note we can't just empty the tbody using
-           * $().html('') since this will unbind the jQuery event handlers (even although the node 
+           * $().html('') since this will unbind the jQuery event handlers (even although the node
            * still exists!) - equally we can't use innerHTML, since IE throws an exception.
            */
           var
@@ -1422,7 +1422,7 @@
           var nHolding = $('<div></div>')[0];
           oSettings.nTable.parentNode.insertBefore(nHolding, oSettings.nTable);
 
-          /* 
+          /*
            * All DataTables are wrapped in a div
            */
           oSettings.nTableWrapper = $('<div id="' + oSettings.sTableId + '_wrapper" class="' + oSettings.oClasses.sWrapper + '" role="grid"></div>')[0];
@@ -1590,7 +1590,7 @@
                 iColspan = (!iColspan || iColspan === 0 || iColspan === 1) ? 1 : iColspan;
                 iRowspan = (!iRowspan || iRowspan === 0 || iRowspan === 1) ? 1 : iRowspan;
 
-                /* There might be colspan cells already in this row, so shift our target 
+                /* There might be colspan cells already in this row, so shift our target
                  * accordingly
                  */
                 iColShifted = fnShiftCol(aLayout, i, iColumn);
@@ -2015,7 +2015,7 @@
           }
           else {
             /*
-             * We are starting a new search or the new search string is smaller 
+             * We are starting a new search or the new search string is smaller
              * then the old one (i.e. delete). Search from the master array
              */
             if (oSettings.aiDisplay.length == oSettings.aiDisplayMaster.length ||
@@ -2028,7 +2028,7 @@
               _fnBuildSearchArray(oSettings, 1);
 
               /* Search through all records to populate the search array
-               * The the oSettings.aiDisplayMaster and asDataSearch arrays have 1 to 1 
+               * The the oSettings.aiDisplayMaster and asDataSearch arrays have 1 to 1
                * mapping
                */
               for (i = 0; i < oSettings.aiDisplayMaster.length; i++) {
@@ -2505,7 +2505,7 @@
 
 
         /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-         * Note that most of the paging logic is done in 
+         * Note that most of the paging logic is done in
          * DataTable.ext.oPagination
          */
 
@@ -2927,11 +2927,11 @@
            * set the width based on the real headers
            */
 
-          // Apply all styles in one pass. Invalidates layout only once because we don't read any 
+          // Apply all styles in one pass. Invalidates layout only once because we don't read any
           // DOM properties.
           _fnApplyToChildren(zeroOut, anHeadSizers);
 
-          // Read all widths in next pass. Forces layout only once because we do not change 
+          // Read all widths in next pass. Forces layout only once because we do not change
           // any DOM properties.
           _fnApplyToChildren(function (nSizer) {
             aApplied.push(_fnStringToCss($(nSizer).width()));
@@ -3165,8 +3165,8 @@
             }
           }
 
-          /* If the number of columns in the DOM equals the number that we have to process in 
-           * DataTables, then we can use the offsets that are created by the web-browser. No custom 
+          /* If the number of columns in the DOM equals the number that we have to process in
+           * DataTables, then we can use the offsets that are created by the web-browser. No custom
            * sizes can be set in order for this to happen, nor scrolling used
            */
           if (iColums == oHeaders.length && iUserInputs === 0 && iVisibleColumns == iColums &&
@@ -3275,7 +3275,7 @@
               oNodes = _fnGetUniqueThs(oSettings, $('thead', nCalcTmp)[0]);
             }
 
-            /* Browsers need a bit of a hand when a width is assigned to any columns when 
+            /* Browsers need a bit of a hand when a width is assigned to any columns when
              * x-scrolling as they tend to collapse the table to the min-width, even if
              * we sent the column widths. So we need to keep track of what the table width
              * should be by summing the user given values, and the automatic values
@@ -3542,7 +3542,7 @@
              *  	return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
              *  }
              * Basically we have a test for each sorting column, if the data in that column is equal,
-             * test the next column. If all columns match, then we use a numeric sort on the row 
+             * test the next column. If all columns match, then we use a numeric sort on the row
              * positions in the original data array to provide a stable sort.
              */
             oSettings.aiDisplayMaster.sort(function (a, b) {
@@ -3635,14 +3635,14 @@
 
             /*
              * This is a little bit odd I admit... I declare a temporary function inside the scope of
-             * _fnBuildHead and the click handler in order that the code presented here can be used 
-             * twice - once for when bProcessing is enabled, and another time for when it is 
+             * _fnBuildHead and the click handler in order that the code presented here can be used
+             * twice - once for when bProcessing is enabled, and another time for when it is
              * disabled, as we need to perform slightly different actions.
-             *   Basically the issue here is that the Javascript engine in modern browsers don't 
+             *   Basically the issue here is that the Javascript engine in modern browsers don't
              * appear to allow the rendering engine to update the display while it is still executing
-             * it's thread (well - it does but only after long intervals). This means that the 
+             * it's thread (well - it does but only after long intervals). This means that the
              * 'processing' display doesn't appear for a table sort. To break the js thread up a bit
-             * I force an execution break by using setTimeout - but this breaks the expected 
+             * I force an execution break by using setTimeout - but this breaks the expected
              * thread continuation for the end-developer's point of view (their code would execute
              * too early), so we only do it when we absolutely have to.
              */
@@ -3791,11 +3791,11 @@
             }
           }
 
-          /* 
+          /*
            * Apply the required classes to the table body
            * Note that this is given as a feature switch since it can significantly slow down a sort
            * on large data sets (adding and removing of classes is always slow at the best of times..)
-           * Further to this, note that this code is admittedly fairly ugly. It could be made a lot 
+           * Further to this, note that this code is admittedly fairly ugly. It could be made a lot
            * simpler using jQuery selectors and add/removeClass, but that is significantly slower
            * (on the order of 5 times slower) - hence the direct DOM manipulation here.
            * Note that for deferred drawing we do use jQuery - the reason being that taking the first
@@ -3948,7 +3948,7 @@
           var date = new Date();
           date.setTime(date.getTime() + (iSecs * 1000));
 
-          /* 
+          /*
            * Shocking but true - it would appear IE has major issues with having the path not having
            * a trailing slash on it. We need the cookie to be available based on the path, so we
            * have to append the file name to the cookie name. Appalling. Thanks to vex for adding the
@@ -4502,10 +4502,10 @@
          *    $(document).ready(function() {
 		 *      var oTable = $('#example').dataTable();
 		 *
-		 *      // Filter to 'Webkit' and get all data for 
+		 *      // Filter to 'Webkit' and get all data for
 		 *      oTable.fnFilter('Webkit');
 		 *      var data = oTable._('tr', {"filter": "applied"});
-		 *      
+		 *
 		 *      // Do something with the data
 		 *      alert( data.length+" rows matched the filter" );
 		 *    } );
@@ -4556,7 +4556,7 @@
 		 *        giCount+".3",
 		 *        giCount+".4" ]
 		 *      );
-		 *        
+		 *
 		 *      giCount++;
 		 *    }
          */
@@ -4612,7 +4612,7 @@
 		 *        "sScrollY": "200px",
 		 *        "bPaginate": false
 		 *      } );
-		 *      
+		 *
 		 *      $(window).bind('resize', function () {
 		 *        oTable.fnAdjustColumnSizing();
 		 *      } );
@@ -4640,7 +4640,7 @@
          *  @example
          *    $(document).ready(function() {
 		 *      var oTable = $('#example').dataTable();
-		 *      
+		 *
 		 *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)
 		 *      oTable.fnClearTable();
 		 *    } );
@@ -4666,7 +4666,7 @@
          *  @example
          *    $(document).ready(function() {
 		 *      var oTable;
-		 *      
+		 *
 		 *      // 'open' an information row when a row is clicked on
 		 *      $('#example tbody tr').click( function () {
 		 *        if ( oTable.fnIsOpen(this) ) {
@@ -4675,7 +4675,7 @@
 		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
 		 *        }
 		 *      } );
-		 *      
+		 *
 		 *      oTable = $('#example').dataTable();
 		 *    } );
          */
@@ -4710,7 +4710,7 @@
          *  @example
          *    $(document).ready(function() {
 		 *      var oTable = $('#example').dataTable();
-		 *      
+		 *
 		 *      // Immediately remove the first row
 		 *      oTable.fnDeleteRow( 0 );
 		 *    } );
@@ -4896,7 +4896,7 @@
          *  @example
          *    $(document).ready(function() {
 		 *      var oTable = $('#example').dataTable();
-		 *      
+		 *
 		 *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)
 		 *      oTable.fnDraw();
 		 *    } );
@@ -4926,7 +4926,7 @@
          *  @example
          *    $(document).ready(function() {
 		 *      var oTable = $('#example').dataTable();
-		 *      
+		 *
 		 *      // Sometime later - filter...
 		 *      oTable.fnFilter( 'test string' );
 		 *    } );
@@ -5066,7 +5066,7 @@
          *  @example
          *    $(document).ready(function() {
 		 *      var oTable = $('#example').dataTable();
-		 *      
+		 *
 		 *      // Get the nodes from the table
 		 *      var nNodes = oTable.fnGetNodes( );
 		 *    } );
@@ -5096,15 +5096,15 @@
 		 *      $('#example tbody td').click( function () {
 		 *        // Get the position of the current data from the node
 		 *        var aPos = oTable.fnGetPosition( this );
-		 *        
+		 *
 		 *        // Get the data array for this row
 		 *        var aData = oTable.fnGetData( aPos[0] );
-		 *        
+		 *
 		 *        // Update the data array and return the value
 		 *        aData[ aPos[1] ] = 'clicked';
 		 *        this.innerHTML = 'clicked';
 		 *      } );
-		 *      
+		 *
 		 *      // Init DataTables
 		 *      oTable = $('#example').dataTable();
 		 *    } );
@@ -5134,7 +5134,7 @@
          *  @example
          *    $(document).ready(function() {
 		 *      var oTable;
-		 *      
+		 *
 		 *      // 'open' an information row when a row is clicked on
 		 *      $('#example tbody tr').click( function () {
 		 *        if ( oTable.fnIsOpen(this) ) {
@@ -5143,7 +5143,7 @@
 		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
 		 *        }
 		 *      } );
-		 *      
+		 *
 		 *      oTable = $('#example').dataTable();
 		 *    } );
          */
@@ -5176,7 +5176,7 @@
          *  @example
          *    $(document).ready(function() {
 		 *      var oTable;
-		 *      
+		 *
 		 *      // 'open' an information row when a row is clicked on
 		 *      $('#example tbody tr').click( function () {
 		 *        if ( oTable.fnIsOpen(this) ) {
@@ -5185,7 +5185,7 @@
 		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
 		 *        }
 		 *      } );
-		 *      
+		 *
 		 *      oTable = $('#example').dataTable();
 		 *    } );
          */
@@ -5266,7 +5266,7 @@
          *  @example
          *    $(document).ready(function() {
 		 *      var oTable = $('#example').dataTable();
-		 *      
+		 *
 		 *      // Hide the second column after initialisation
 		 *      oTable.fnSetColumnVis( 1, false );
 		 *    } );
@@ -5345,8 +5345,8 @@
             oSettings.aoOpenRows[i].nTr.colSpan = _fnVisbleColumns(oSettings);
           }
 
-          /* Do a redraw incase anything depending on the table columns needs it 
-           * (built-in: scrolling) 
+          /* Do a redraw incase anything depending on the table columns needs it
+           * (built-in: scrolling)
            */
           if (bRedraw === undefined || bRedraw) {
             _fnAdjustColumnSizing(oSettings);
@@ -5367,7 +5367,7 @@
          *    $(document).ready(function() {
 		 *      var oTable = $('#example').dataTable();
 		 *      var oSettings = oTable.fnSettings();
-		 *      
+		 *
 		 *      // Show an example parameter from the settings
 		 *      alert( oSettings._iDisplayStart );
 		 *    } );
@@ -5386,7 +5386,7 @@
          *  @example
          *    $(document).ready(function() {
 		 *      var oTable = $('#example').dataTable();
-		 *      
+		 *
 		 *      // Sort immediately with columns 0 and 1
 		 *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );
 		 *    } );
@@ -5408,7 +5408,7 @@
          *  @example
          *    $(document).ready(function() {
 		 *      var oTable = $('#example').dataTable();
-		 *      
+		 *
 		 *      // Sort on column 1, when 'sorter' is clicked on
 		 *      oTable.fnSortListener( document.getElementById('sorter'), 1 );
 		 *    } );
@@ -5434,10 +5434,10 @@
          *
          *  @example
          *    $(document).ready(function() {
-		 *      var oTable = $('#example').dataTable();
-		 *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell
-		 *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], 1, 0 ); // Row
-		 *    } );
+         *      var oTable = $('#example').dataTable();
+         *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell
+         *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], 1, 0 ); // Row
+         *    } );
          */
         this.fnUpdate = function (mData, mRow, iColumn, bRedraw, bAction) {
           var oSettings = _fnSettingsFromNode(this[DataTable.ext.iApiIndex]);
@@ -5795,8 +5795,8 @@
           }
 
           if (oInit.bJQueryUI) {
-            /* Use the JUI classes object for display. You could clone the oStdClasses object if 
-             * you want to have multiple tables with multiple independent classes 
+            /* Use the JUI classes object for display. You could clone the oStdClasses object if
+             * you want to have multiple tables with multiple independent classes
              */
             $.extend(oSettings.oClasses, DataTable.ext.oJUIClasses);
 
@@ -5842,7 +5842,7 @@
           /* Language definitions */
           if (oInit.oLanguage.sUrl !== "") {
             /* Get the language definitions from a file - because this Ajax call makes the language
-             * get async to the remainder of this function we use bInitHandedOff to indicate that 
+             * get async to the remainder of this function we use bInitHandedOff to indicate that
              * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor
              */
             oSettings.oLanguage.sUrl = oInit.oLanguage.sUrl;

Added: incubator/ambari/branches/AMBARI-666/ambari-web/vendor/scripts/jquery.periodic.js
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-web/vendor/scripts/jquery.periodic.js?rev=1418895&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-web/vendor/scripts/jquery.periodic.js (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-web/vendor/scripts/jquery.periodic.js Sun Dec  9 11:53:15 2012
@@ -0,0 +1,198 @@
+/*!
+ * jQuery periodic plugin
+ *
+ * Copyright 2010, Tom Anderson
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ */
+
+jQuery.periodic = function (options, callback) {
+
+  // if the first argument is a function then assume the options aren't being passed
+  if (jQuery.isFunction(options)) {
+    callback = options;
+    options = {};
+  }
+
+  // Merge passed settings with default values
+  var settings = jQuery.extend({}, jQuery.periodic.defaults, {
+    ajax_complete : ajaxComplete,
+    increment     : increment,
+    reset         : reset,
+    cancel        : cancel
+  }, options);
+
+  // bookkeeping variables
+  settings.cur_period = settings.period;
+  settings.tid = false;
+  var prev_ajax_response = '';
+
+  run();
+
+  // return settings so user can tweak them externally
+  return settings;
+
+  // run (or restart if already running) the looping construct
+  function run() {
+    // clear/stop existing timer (multiple calls to run() won't result in multiple timers)
+    cancel();
+    // let it rip!
+    settings.tid = setTimeout(function() {
+      // set the context (this) for the callback to the settings object
+      callback.call(settings);
+
+      // compute the next value for cur_period
+      increment();
+
+      // queue up the next run
+      if(settings.tid)
+        run();
+    }, settings.cur_period);
+  }
+
+  // utility function for use with ajax calls
+  function ajaxComplete(xhr, status) {
+    if (status === 'success' && prev_ajax_response !== xhr.responseText) {
+      // reset the period whenever the response changes
+      prev_ajax_response = xhr.responseText;
+      reset();
+    }
+  }
+
+  // compute the next delay
+  function increment() {
+    settings.cur_period *= settings.decay;
+    if (settings.cur_period < settings.period) {
+      // don't let it drop below the minimum
+      reset();
+    } else if (settings.cur_period > settings.max_period) {
+      settings.cur_period = settings.max_period;
+      if (settings.on_max !== undefined) {
+        // call the user-supplied callback if we reach max_period
+        settings.on_max.call(settings);
+      }
+    }
+  }
+
+  function reset() {
+    settings.cur_period = settings.period;
+    // restart with the new timeout
+    run();
+  }
+
+  function cancel() {
+    clearTimeout(settings.tid);
+    settings.tid = null;
+  }
+
+  // other functions we might want to implement
+  function pause() {}
+  function resume() {}
+  function log() {}
+};
+
+jQuery.periodic.defaults = {
+    period       : 4000,      // 4 sec.
+    max_period   : 1800000,   // 30 min.
+    decay        : 1.5,       // time period multiplier
+    on_max       : undefined  // called if max_period is reached
+};
+/*!
+ * jQuery periodic plugin
+ *
+ * Copyright 2010, Tom Anderson
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ */
+
+jQuery.periodic = function (options, callback) {
+
+  // if the first argument is a function then assume the options aren't being passed
+  if (jQuery.isFunction(options)) {
+    callback = options;
+    options = {};
+  }
+
+  // Merge passed settings with default values
+  var settings = jQuery.extend({}, jQuery.periodic.defaults, {
+    ajax_complete : ajaxComplete,
+    increment     : increment,
+    reset         : reset,
+    cancel        : cancel
+  }, options);
+
+  // bookkeeping variables
+  settings.cur_period = settings.period;
+  settings.tid = false;
+  var prev_ajax_response = '';
+
+  run();
+
+  // return settings so user can tweak them externally
+  return settings;
+
+  // run (or restart if already running) the looping construct
+  function run() {
+    // clear/stop existing timer (multiple calls to run() won't result in multiple timers)
+    cancel();
+    // let it rip!
+    settings.tid = setTimeout(function() {
+      // set the context (this) for the callback to the settings object
+      callback.call(settings);
+
+      // compute the next value for cur_period
+      increment();
+      
+      // queue up the next run
+      if(settings.tid)
+        run();
+    }, settings.cur_period);
+  }
+
+  // utility function for use with ajax calls
+  function ajaxComplete(xhr, status) {
+    if (status === 'success' && prev_ajax_response !== xhr.responseText) {
+      // reset the period whenever the response changes
+      prev_ajax_response = xhr.responseText;
+      reset();
+    }
+  }
+
+  // compute the next delay
+  function increment() {
+    settings.cur_period *= settings.decay;
+    if (settings.cur_period < settings.period) {
+      // don't let it drop below the minimum
+      reset();
+    } else if (settings.cur_period > settings.max_period) {
+      settings.cur_period = settings.max_period;
+      if (settings.on_max !== undefined) {
+        // call the user-supplied callback if we reach max_period
+        settings.on_max.call(settings);
+      }
+    }
+  }
+
+  function reset() {
+    settings.cur_period = settings.period;
+    // restart with the new timeout
+    run();
+  }
+
+  function cancel() {
+    clearTimeout(settings.tid);
+    settings.tid = null;
+  }
+  
+  // other functions we might want to implement
+  function pause() {}
+  function resume() {}
+  function log() {}
+};
+
+jQuery.periodic.defaults = {
+    period       : 4000,      // 4 sec.
+    max_period   : 1800000,   // 30 min.
+    decay        : 1.5,       // time period multiplier
+    on_max       : undefined  // called if max_period is reached
+};
\ No newline at end of file

Added: incubator/ambari/branches/AMBARI-666/ambari-web/vendor/styles/bootstrap-combobox.css
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-web/vendor/styles/bootstrap-combobox.css?rev=1418895&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-web/vendor/styles/bootstrap-combobox.css (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-web/vendor/styles/bootstrap-combobox.css Sun Dec  9 11:53:15 2012
@@ -0,0 +1,180 @@
+.combobox-container {
+    margin-bottom: 5px;
+    *zoom: 1;
+}
+
+.combobox-container:before,
+.combobox-container:after {
+    display: table;
+    content: "";
+}
+
+.combobox-container:after {
+    clear: both;
+}
+
+.combobox-container input,
+.combobox-container .uneditable-input {
+    -webkit-border-radius: 0 3px 3px 0;
+    -moz-border-radius: 0 3px 3px 0;
+    border-radius: 0 3px 3px 0;
+}
+
+.combobox-container input:focus,
+.combobox-container .uneditable-input:focus {
+    position: relative;
+    z-index: 2;
+}
+
+.combobox-container .uneditable-input {
+    border-left-color: #ccc;
+}
+
+.combobox-container .add-on {
+    float: left;
+    display: block;
+    width: auto;
+    min-width: 16px;
+    height: 18px;
+    margin-right: -1px;
+    padding: 4px 5px;
+    font-weight: normal;
+    line-height: 18px;
+    color: #999999;
+    text-align: center;
+    text-shadow: 0 1px 0 #ffffff;
+    background-color: #f5f5f5;
+    border: 1px solid #ccc;
+    -webkit-border-radius: 3px 0 0 3px;
+    -moz-border-radius: 3px 0 0 3px;
+    border-radius: 3px 0 0 3px;
+}
+
+.combobox-container .active {
+    background-color: #a9dba9;
+    border-color: #46a546;
+}
+
+.combobox-container input,
+.combobox-container .uneditable-input {
+    float: left;
+    -webkit-border-radius: 3px 0 0 3px;
+    -moz-border-radius: 3px 0 0 3px;
+    border-radius: 3px 0 0 3px;
+}
+
+.combobox-container .uneditable-input {
+    border-left-color: #eee;
+    border-right-color: #ccc;
+}
+
+.combobox-container .add-on {
+    margin-right: 0;
+    margin-left: -1px;
+    -webkit-border-radius: 0 3px 3px 0;
+    -moz-border-radius: 0 3px 3px 0;
+    border-radius: 0 3px 3px 0;
+}
+
+.combobox-container input:first-child {
+    *margin-left: -160px;
+}
+
+.combobox-container input:first-child + .add-on {
+    *margin-left: -21px;
+}
+
+.combobox-container select {
+    display: inline-block;
+    width: 0;
+    height: 0;
+    border: 0;
+    padding: 0;
+    margin: 0;
+    text-indent: -99999px;
+    *text-indent: 0;
+}
+
+.form-search .combobox-container,
+.form-inline .combobox-container {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: top;
+}
+
+.form-search .combobox-container .add-on,
+.form-inline .combobox-container .add-on {
+    vertical-align: middle;
+}
+
+.combobox-selected .combobox-clear {
+    display: inline-block;
+}
+
+.combobox-selected .caret {
+    display: none;
+}
+
+.combobox-clear {
+    display: none;
+    width: 14px;
+    height: 14px;
+    line-height: 14px;
+    vertical-align: top;
+    opacity: 0.3;
+    filter: alpha(opacity = 30);
+}
+
+.dropdown:hover .combobox-clear,
+.open.dropdown .combobox-clear {
+    opacity: 1;
+    filter: alpha(opacity = 100);
+}
+
+.btn .combobox-clear {
+    margin-top: 1px;
+    margin-left: 1px;
+}
+
+.btn:hover .combobox-clear,
+.open.btn-group .combobox-clear {
+    opacity: 1;
+    filter: alpha(opacity = 100);
+}
+
+.typeahead-long {
+    max-height: 300px;
+    overflow-y: auto;
+}
+
+.control-group.error .combobox-container .add-on {
+    color: #B94A48;
+    border-color: #B94A48;
+}
+
+.control-group.error .combobox-container .caret {
+    border-top-color: #B94A48;
+}
+
+.control-group.warning .combobox-container .add-on {
+    color: #C09853;
+    border-color: #C09853;
+}
+
+.control-group.warning .combobox-container .caret {
+    border-top-color: #C09853;
+}
+
+.control-group.success .combobox-container .add-on {
+    color: #468847;
+    border-color: #468847;
+}
+
+.control-group.success .combobox-container .caret {
+    border-top-color: #468847;
+}
+
+.combobox-container button.add-on {
+    height: 30px;
+    width: 30px;
+}
\ No newline at end of file