Major UI cleanup, still much more to go - warvox - VoIP based wardialing tool, forked from rapid7/warvox.
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
 (DIR) commit e1547bc2058230f93ae14da36e96917886d42647
 (DIR) parent c076798b456974f4d6a4992f2ff8256183424a45
 (HTM) Author: HD Moore <hd_moore@rapid7.com>
       Date:   Sat, 29 Dec 2012 14:26:58 -0600
       
       Major UI cleanup, still much more to go
       
       Diffstat:
         M Gemfile                             |       9 ++++++---
         M Gemfile.lock                        |       5 ++++-
         M app/assets/images/logo.png          |       0 
         A app/assets/images/logo_light.png    |       0 
         M app/assets/javascripts/application… |       2 ++
         M app/assets/javascripts/highcharts.… |       2 +-
         A app/assets/javascripts/html5.js     |       4 ++++
         D app/assets/stylesheets/application… |       7 -------
         M app/assets/stylesheets/application… |       3 +++
         M app/assets/stylesheets/bootstrap_a… |     160 +++++++++++++++++++++++++++----
         D app/assets/stylesheets/global.css   |     555 -------------------------------
         D app/assets/stylesheets/ie7.css      |       3 ---
         M app/controllers/dial_jobs_controll… |      22 +---------------------
         M app/controllers/dial_results_contr… |      14 ++------------
         M app/tabs/tabulous.rb                |      30 +++++++++++++++---------------
         M app/views/analyze/index.html.erb    |      32 +++++++++++++++++++++++--------
         M app/views/analyze/view.html.erb     |       7 +++++--
         M app/views/analyze/view_matches.htm… |      10 +++++++---
         M app/views/dial_jobs/index.html.erb  |      64 +++++++++----------------------
         M app/views/dial_results/index.html.… |      52 ++++++++++++++++++++-----------
         M app/views/dial_results/view.html.e… |      16 +++++++++++++++-
         M app/views/home/about.html.erb       |      76 ++++++++++++++++----------------
         M app/views/home/index.html.erb       |      22 +++++++++++++++++++---
         M app/views/layouts/application.html… |      51 ++++++++++++-------------------
         M app/views/providers/index.html.erb  |      63 ++++++++++---------------------
         M app/views/shared/graphs/_call_resu… |      57 ++++++++++++++++---------------
         M app/views/shared/graphs/_lines_by_… |      56 +++++++++++++++----------------
         M config/environments/development.rb  |       2 ++
         A lib/templates/erb/scaffold/_form.h… |      11 +++++++++++
         M public/robots.txt                   |       7 ++-----
       
       30 files changed, 449 insertions(+), 893 deletions(-)
       ---
 (DIR) diff --git a/Gemfile b/Gemfile
       @@ -5,6 +5,9 @@ gem 'thin'
        gem 'rails', '3.2.8'
        gem 'pg', '0.11'
        
       +gem 'jquery-rails'
       +gem 'jquery-datatables-rails'
       +
        # Integer array support (until Rails 4.0 is released)
        # Git version required to work around this bug: https://github.com/dockyard/postgres_ext/issues/5
        gem 'postgres_ext', :git => 'git://github.com/dockyard/postgres_ext.git'
       @@ -20,11 +23,11 @@ group :assets do
          gem 'uglifier', '>= 1.0.3'
        end
        
       -gem "less-rails" 
       -gem "twitter-bootstrap-rails"
       +gem 'twitter-bootstrap-rails'
        gem 'formtastic-bootstrap'
        gem 'tabulous'
        
       -gem 'jquery-rails'
       +gem "therubyracer", :group => :assets, :platform => :ruby
       +
        gem 'will_paginate', '~> 3.0'
        gem 'dynamic_form'
 (DIR) diff --git a/Gemfile.lock b/Gemfile.lock
       @@ -61,6 +61,8 @@ GEM
            hike (1.2.1)
            i18n (0.6.1)
            journey (1.0.4)
       +    jquery-datatables-rails (1.11.1)
       +      jquery-rails
            jquery-rails (2.1.4)
              railties (>= 3.0, < 5.0)
              thor (>= 0.14, < 2.0)
       @@ -148,15 +150,16 @@ DEPENDENCIES
          coffee-rails (~> 3.2.1)
          dynamic_form
          formtastic-bootstrap
       +  jquery-datatables-rails
          jquery-rails
          kissfft
       -  less-rails
          librex
          pg (= 0.11)
          postgres_ext!
          rails (= 3.2.8)
          sass-rails (~> 3.2.3)
          tabulous
       +  therubyracer
          thin
          twitter-bootstrap-rails
          uglifier (>= 1.0.3)
 (DIR) diff --git a/app/assets/images/logo.png b/app/assets/images/logo.png
       Binary files differ.
 (DIR) diff --git a/app/assets/images/logo_light.png b/app/assets/images/logo_light.png
       Binary files differ.
 (DIR) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
       @@ -4,4 +4,6 @@
        //= require jquery_ujs
        //= require twitter/bootstrap
        //= require jquery.lightbox-0.5
       +//= require dataTables/jquery.dataTables
       +//= require dataTables/jquery.dataTables.bootstrap
        //= require highcharts
 (DIR) diff --git a/app/assets/javascripts/highcharts.js b/app/assets/javascripts/highcharts.js
       @@ -30,7 +30,7 @@ canvasToolsURL:"http://code.highcharts.com/2.3.3/modules/canvas-tools.js",VMLRad
        position:{align:"right",x:-10,y:10}}},title:{text:"Chart title",align:"center",y:15,style:{color:"#3E576F",fontSize:"16px"}},subtitle:{text:"",align:"center",y:30,style:{color:"#6D869F"}},plotOptions:{line:{allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},lineWidth:2,shadow:!0,marker:{enabled:!0,lineWidth:0,radius:4,lineColor:"#FFFFFF",states:{hover:{enabled:!0},select:{fillColor:"#FFFFFF",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:A(G,{enabled:!1,formatter:function(){return this.y},
        verticalAlign:"bottom",y:0}),cropThreshold:300,pointRange:0,showInLegend:!0,states:{hover:{marker:{}},select:{marker:{}}},stickyTracking:!0}},labels:{style:{position:"absolute",color:"#3E576F"}},legend:{enabled:!0,align:"center",layout:"horizontal",labelFormatter:function(){return this.name},borderWidth:1,borderColor:"#909090",borderRadius:5,navigation:{activeColor:"#3E576F",inactiveColor:"#CCC"},shadow:!1,itemStyle:{cursor:"pointer",color:"#3E576F",fontSize:"12px"},itemHoverStyle:{color:"#000"},
        itemHiddenStyle:{color:"#CCC"},itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},symbolWidth:16,symbolPadding:5,verticalAlign:"bottom",x:0,y:0},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"1em"},style:{position:"absolute",backgroundColor:"white",opacity:0.5,textAlign:"center"}},tooltip:{enabled:!0,backgroundColor:"rgba(255, 255, 255, .85)",borderWidth:2,borderRadius:5,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",
       -hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},headerFormat:'<span style="font-size: 10px">{point.key}</span><br/>',pointFormat:'<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b><br/>',shadow:!0,shared:U,snap:fa?25:10,style:{color:"#333333",fontSize:"12px",padding:"5px",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"Rapid7.com",href:"http://www.rapid7.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},
       +hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},headerFormat:'<span style="font-size: 10px">{point.key}</span><br/>',pointFormat:'<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b><br/>',shadow:!0,shared:U,snap:fa?25:10,style:{color:"#333333",fontSize:"12px",padding:"5px",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"WarVOX by Rapid7",href:"http://www.rapid7.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},
        style:{cursor:"pointer",color:"#909090",fontSize:"10px"}}};var W=M.plotOptions,ga=W.line;Gb();var qa=function(a){var b=[],c;(function(a){(c=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/.exec(a))?b=[w(c[1]),w(c[2]),w(c[3]),parseFloat(c[4],10)]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(a))&&(b=[w(c[1],16),w(c[2],16),w(c[3],16),1])})(a);return{get:function(c){return b&&!isNaN(b[0])?c==="rgb"?"rgb("+b[0]+","+b[1]+","+b[2]+")":c==="a"?
        b[3]:"rgba("+b.join(",")+")":a},brighten:function(a){if(Aa(a)&&a!==0){var c;for(c=0;c<3;c++)b[c]+=w(a*255),b[c]<0&&(b[c]=0),b[c]>255&&(b[c]=255)}return this},setOpacity:function(a){b[3]=a;return this}}};va.prototype={init:function(a,b){this.element=b==="span"?Q(b):C.createElementNS(pa,b);this.renderer=a;this.attrSetters={}},animate:function(a,b,c){b=o(b,Oa,!0);eb(this);if(b){b=A(b);if(c)b.complete=c;xb(this,a,b)}else this.attr(a),c&&c()},attr:function(a,b){var c,d,e,f,g=this.element,h=g.nodeName.toLowerCase(),
        i=this.renderer,j,k=this.attrSetters,l=this.shadows,m,p,u=this;la(a)&&t(b)&&(c=a,a={},a[c]=b);if(la(a))c=a,h==="circle"?c={x:"cx",y:"cy"}[c]||c:c==="strokeWidth"&&(c="stroke-width"),u=z(g,c)||this[c]||0,c!=="d"&&c!=="visibility"&&(u=parseFloat(u));else for(c in a)if(j=!1,d=a[c],e=k[c]&&k[c].call(this,d,c),e!==!1){e!==x&&(d=e);if(c==="d")d&&d.join&&(d=d.join(" ")),/(NaN| {2}|^$)/.test(d)&&(d="M 0 0");else if(c==="x"&&h==="text"){for(e=0;e<g.childNodes.length;e++)f=g.childNodes[e],z(f,"x")===z(g,"x")&&
 (DIR) diff --git a/app/assets/javascripts/html5.js b/app/assets/javascripts/html5.js
       @@ -0,0 +1,3 @@
       +/*! HTML5 Shiv vpre3.6 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
       +  Uncompressed source: https://github.com/aFarkas/html5shiv  */
       +(function(a,b){function h(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function i(){var a=l.elements;return typeof a=="string"?a.split(" "):a}function j(a){var b={},c=a.createElement,f=a.createDocumentFragment,g=f();a.createElement=function(a){if(!l.shivMethods)return c(a);var f;return b[a]?f=b[a].cloneNode():e.test(a)?f=(b[a]=c(a)).cloneNode():f=c(a),f.canHaveChildren&&!d.test(a)?g.appendChild(f):f},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+i().join().replace(/\w+/g,function(a){return c(a),g.createElement(a),'c("'+a+'")'})+");return n}")(l,g)}function k(a){var b;return a.documentShived?a:(l.shivCSS&&!f&&(b=!!h(a,"article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio{display:none}canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}mark{background:#FF0;color:#000}")),g||(b=!j(a)),b&&(a.documentShived=b),a)}var c=a.html5||{},d=/^<|^(?:button|form|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^<|^(?:a|b|button|code|div|fieldset|form|h1|h2|h3|h4|h5|h6|i|iframe|img|input|label|li|link|ol|option|p|param|q|script|select|span|strong|style|table|tbody|td|textarea|tfoot|th|thead|tr|ul)$/i,f,g;(function(){var c=b.createElement("a");c.innerHTML="<xyz></xyz>",f="hidden"in c,f&&typeof injectElementWithStyles=="function"&&injectElementWithStyles("#modernizr{}",function(b){b.hidden=!0,f=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle).display=="none"}),g=c.childNodes.length==1||function(){try{b.createElement("a")}catch(a){return!0}var c=b.createDocumentFragment();return typeof c.cloneNode=="undefined"||typeof c.createDocumentFragment=="undefined"||typeof c.createElement=="undefined"}()})();var l={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:k};a.html5=l,k(b)})(this,document)
       +\ No newline at end of file
 (DIR) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css
       @@ -1,7 +0,0 @@
       -/*
       - * This is a manifest file that'll automatically include all the stylesheets available in this directory
       - * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
       - * the top of the compiled file, but it's generally better to create a new file per style scope.
       - *= require_self
       - *= require_tree .
       -*/
 (DIR) diff --git a/app/assets/stylesheets/application.css.scss b/app/assets/stylesheets/application.css.scss
       @@ -4,4 +4,7 @@
        
        /*
         *= require_self
       + *= require formtastic
       + *= require formtastic-bootstrap
       + *= require dataTables/jquery.dataTables.bootstrap
        */
 (DIR) diff --git a/app/assets/stylesheets/bootstrap_and_overrides.css.less b/app/assets/stylesheets/bootstrap_and_overrides.css.less
       @@ -1,30 +1,148 @@
        @import "twitter/bootstrap/bootstrap";
       +
       +body {
       +        padding-top: 5px;
       +}
       +
        @import "twitter/bootstrap/responsive";
        
        // Set the correct sprite paths
       -@iconSpritePath: asset-path("twitter/bootstrap/glyphicons-halflings.png");
       -@iconWhiteSpritePath: asset-path("twitter/bootstrap/glyphicons-halflings-white.png");
       +@iconSpritePath: asset-path('twitter/bootstrap/glyphicons-halflings.png');
       +@iconWhiteSpritePath: asset-path('twitter/bootstrap/glyphicons-halflings-white.png');
        
        // Set the Font Awesome (Font Awesome is default. You can disable by commenting below lines)
        // Note: If you use asset_path() here, your compiled boostrap_and_overrides.css will not
       -//       have the proper paths. So for now we use the absolute path.
       -@fontAwesomeEotPath: asset-path("fontawesome-webfont.eot");
       -@fontAwesomeWoffPath: asset-path("fontawesome-webfont.woff");
       -@fontAwesomeTtfPath: asset-path("fontawesome-webfont.ttf");
       -@fontAwesomeSvgPath: asset-path("fontawesome-webfont.svg");
       +// have the proper paths. So for now we use the absolute path.
       +@fontAwesomeEotPath: '/assets/fontawesome-webfont.eot';
       +@fontAwesomeWoffPath: '/assets/fontawesome-webfont.woff';
       +@fontAwesomeTtfPath: '/assets/fontawesome-webfont.ttf';
       +@fontAwesomeSvgPath: '/assets/fontawesome-webfont.svg';
        
        // Font Awesome
       -@import "fontawesome";
       -
       -// Your custom LESS stylesheets goes here
       -//
       -// Since bootstrap was imported above you have access to its mixins which
       -// you may use and inherit here
       -//
       -// If you'd like to override bootstrap's own variables, you can do so here as well
       -// See http://twitter.github.com/bootstrap/customize.html#variables for their names and documentation
       -//
       -// Example:
       -// @linkColor: #ff0000;
       -
       -body { padding-top: 80px; }
       +@import "fontawesome.less";
       +
       +@sansFontFamily: "Trebuchet MS", Arial, Helvetica, sans-serif;
       +@green: #90d552;
       +@orange: #ea5709;
       +@darkGray: #29383f;
       +@lightGray: #666666;
       +@blue: #0197b8;
       +
       +@linkColor: @blue;
       +@linkColorHover: @darkGray;
       +
       +@btnPrimaryBackground: @blue;
       +@btnPrimaryBackgroundHighlight: @btnPrimaryBackground;
       +
       +@navbarLinkColor: @white;
       +@navbarLinkColorActive: @white;
       +@navbarLinkColorHover: @yellow;
       +
       +@dropdownLinkColorHover: @yellow;
       +@dropdownLinkBackgroundHover: @dropdownBackground;
       +
       +@headingsColor: @darkGray;
       +
       +@navbarBackground: #ea5709;
       +@navbarBackgroundHighlight: #4A1C04;
       +
       +.nav {
       +   a {
       +    font-size: 15px;
       +  }
       +}
       +
       +.content {
       +        margin-top: 40px;
       +}
       +
       +.accordion-toggle:hover {
       +  text-decoration: none;
       +}
       +
       +h1 {
       +        font-size: 24px;
       +        line-height: 30px;
       +}
       +
       +h2 {
       +        font-size: 20px;
       +        line-height: 24px;
       +}
       +
       +h3 {
       +        font-size: 16px;
       +        line-height: 18px;
       +}
       +
       +.header {
       +  border-top: solid 4px @orange;
       +  padding-top: 20px;
       +}
       +
       +.header a {
       +  color: @darkGray;
       +}
       +
       +.header a:hover {
       +  text-decoration: none;
       +  color: @orange;
       +}
       +
       +.footer {
       +  text-align: center;
       +  font-size: 12px;
       +  margin-top: 50px;
       +  color: #aaa;
       +}
       +
       +.no-space {
       +  margin-left: 0;
       +  margin-right: 0;
       +}
       +
       +.right {
       +  text-align: right;
       +}
       +
       +.tabs-left {
       +  text-align: left;
       +}
       +
       +.text-large {
       +  font-size: 18px;
       +}
       +
       +h3.toc {
       +  border-bottom: 1px solid #ccc;
       +}
       +
       +.carousel .item {
       +  height: 50px;
       +  text-align: center;
       +}
       +
       +.carousel .item > img {
       +  display: inline;
       +}
       +
       +.lead-box h3 {
       +  text-align: center;
       +}
       +
       +.lead-box p {
       +  height: 80px;
       +}
       +
       +.table td {
       +  vertical-align: middle;
       +}
       +table.dataTable tr td.sorting_1 {
       +  background-color: #fff !important;
       +}
       +.tab-content {
       +  overflow: hidden;
       +}
       +.carousel-control {
       +  background: #fff;
       +}
 (DIR) diff --git a/app/assets/stylesheets/global.css b/app/assets/stylesheets/global.css
       @@ -1,555 +0,0 @@
       -/* global element overrides */
       -
       -body {
       -        height: 100%;
       -        background: #fff;
       -        margin: 0;
       -        padding: 0;
       -        font-family: Tahoma, sans-serif;
       -        font-size: 12px;
       -        color: #555;
       -}
       -
       -img {
       -        border: none;
       -}
       -
       -table {
       -        border: none;
       -        padding: 0;
       -        margin: 0;
       -}
       -
       -a:link, a:visited {
       -        color: #003366;
       -        text-decoration: none;
       -}
       -
       -a:hover, a:active {
       -        color: #cc0033;
       -        text-decoration: underline;
       -}
       -
       -h1 {
       -        color: #333;
       -        margin-top: 0;
       -        padding-top: 0;
       -        font-weight: normal;
       -        font-size: 36px;
       -}
       -
       -h2 {
       -        font-size: 1.4em;
       -        margin-bottom: 4px;
       -}
       -
       -h3 {
       -        font-size: 1.05em;
       -        font-weight: normal;
       -        font-style: italic;
       -}
       -
       -/* unique elements */
       -
       -#content {
       -        padding: 0;
       -        margin: 0 auto;
       -        width: 800px;
       -        line-height: 1.5;
       -}
       -
       -#main {
       -        border: 0;
       -        padding: 0;
       -        background-color: white;
       -        padding-top: 6px;
       -        padding-left: 18px;
       -        padding-right: 20px;
       -        margin-top: -3px;
       -        margin-bottom: -3px;
       -}
       -
       -#main img {
       -        max-width: 530px;
       -}
       -
       -#footer {
       -
       -        margin: 0;
       -        text-align: center;
       -}
       -
       -#quote {
       -        font-size: 12px;
       -        padding: 10px;
       -        margin: 0 auto;
       -        width: 70%;
       -        background: #dddddd;
       -        margin-bottom: 10px;
       -}
       -
       -#copyright {
       -        padding: 10px;
       -        text-align: center;
       -        font-size: 10px;
       -        color: #cccccc;
       -}
       -
       -#header {
       -        width: 800px;
       -        margin: 0 auto 10px;
       -        color: white;
       -
       -}
       -
       -#logo {
       -        float: left;
       -        margin-top: 0px;
       -}
       -
       -
       -
       -#warvox_stats {
       -        margin-top: 5px;
       -        border: 1px solid black;
       -        font-size: 12px;
       -        color: #555;
       -}
       -
       -#warvox_stats td {
       -        margin-left: 20px;
       -        padding: 0 10px 0px 6px;
       -}
       -
       -
       -#warvox_conf {
       -        margin-top: 5px;
       -        border: 1px solid black;
       -        font-size: 12px;
       -        color: #555;
       -}
       -
       -#warvox_conf td {
       -        margin-left: 20px;
       -        padding: 0 10px 0px 6px;
       -}
       -
       -#warvox_blacklist {
       -        margin-top: 5px;
       -        border: 1px solid black;
       -        font-size: 12px;
       -        color: #555;
       -}
       -
       -#warvox_blacklist td {
       -        margin-left: 20px;
       -        padding: 0 10px 0px 6px;
       -}
       -
       -#home_logo {
       -        border: 0;
       -}
       -
       -#home_links {
       -
       -}
       -
       -#home_intro, #home_intro td {
       -        border: 0;
       -}
       -
       -#home_table {
       -        border: 0;
       -        margin-top: 0px;
       -}
       -
       -#home_table td  {
       -        border: 0;
       -}
       -
       -#home_text {
       -        padding-left: 20px;
       -}
       -
       -#navwrap {
       -        margin-top: 10px;
       -        padding-top: 10px;
       -        text-align: center;
       -}
       -
       -#nav {
       -        margin: 0 0 0 0 auto;
       -        padding: 10px;
       -}
       -
       -#sections_container {
       -        font-size: 14px;
       -}
       -
       -#sections_ul {
       -        margin: 0;
       -        padding: 0;
       -        white-space: nowrap;
       -}
       -
       -#sections_ul li {
       -        display: inline;
       -        list-style-type: none;
       -}
       -
       -#sections_container a {
       -        padding: 5px 10px 5px 10px;
       -        line-height: 28px;
       -}
       -
       -#sections_container a:link, #sections_container a:visited {
       -        color: #fff;
       -        background: black repeat-x top;
       -        text-decoration: none;
       -        font-variant: small-caps;
       -}
       -
       -#sections_container a:hover {
       -        color: #fff;
       -        background: red repeat-x top;
       -        text-decoration: none;
       -        font-variant: small-caps;
       -}
       -
       -#sections_active {
       -        font-weight: bold;
       -}
       -
       -#subsections_active {
       -        font-weight: bold;
       -}
       -
       -#subsections_container {
       -        font-size: 12px;
       -        padding-top: 5px;
       -}
       -
       -#subsections_ul {
       -        margin: 0;
       -        padding: 0;
       -        white-space: nowrap;
       -}
       -
       -#subsections_ul li {
       -        display: inline;
       -        list-style-type: none;
       -}
       -
       -#subsections_container a {
       -        padding: 5px 10px 5px 10px;
       -        line-height: 20px;
       -}
       -
       -#subsections_container a:link, #subsections_container a:visited {
       -        color: #fff;
       -        background: #333333 repeat-x top;
       -        text-decoration: none;
       -        font-variant: small-caps;
       -}
       -
       -#subsections_container a:hover {
       -        color: #fff;
       -        background: #440000 repeat-x top;
       -        text-decoration: none;
       -        font-variant: small-caps;
       -}
       -
       -
       -#calls_pie1 {
       -        text-align: center;
       -}
       -#calls_pie2 {
       -        text-align: center;
       -}
       -#calls_pie3 {
       -        text-align: center;
       -}
       -
       -/* non-unique elements */
       -
       -
       -.title {
       -        font-size: 20px;
       -        font-weight: bold;
       -        color: black;
       -        font-variant: small-caps;
       -}
       -
       -.active_job_row {
       -        background: yellow;
       -}
       -
       -.table_scaffold {
       -        margin-top: 5px;
       -        border: 1px solid black;
       -        font-size: 12px;
       -        color: #555;
       -}
       -
       -.table_scaffold th {
       -        font-size: 14px;
       -        text-decoration: underline;
       -}
       -
       -.table_scaffold td {
       -        margin-left: 20px;
       -        padding: 0 10px 0px 6px;
       -        border: 1px solid #cccccc;
       -}
       -
       -.header_item {
       -        font-weight: bold;
       -}
       -
       -.date-header {
       -        background: url('/assets/bluefade.jpg') #222222 repeat-x top;
       -        color: white;
       -        padding: 2px;
       -        margin: 2px;
       -        font-weight: bold;
       -        padding-left: 8px;
       -        font-variant: small-caps;
       -        border: 0;
       -}
       -
       -.date-header-center {
       -        background: url('/assets/bluefade.jpg') #8c0000 repeat-x top;
       -        color: white;
       -        padding: 2px;
       -        margin: 2px;
       -        font-weight: bold;
       -        padding-left: 8px;
       -        font-variant: small-caps;
       -        text-align: center;
       -        border: 0;
       -}
       -
       -
       -.balloon {
       -        background: url('/assets/balloon.jpg') repeat-x top;
       -        width: 277px;
       -        height: 98px;
       -        color: white;
       -        margin: 40px auto;
       -}
       -
       -.balloon_links {
       -        float: left;
       -        margin-top: 10px;
       -        margin-left: 6px;
       -
       -}
       -
       -.balloon_links p {
       -        font-size: 14px;
       -        font-weight: bold;
       -        margin: 0;
       -}
       -
       -.balloon_links a, .balloon_links a:link, .balloon_links a:visited {
       -        font-size: 12px;
       -        color: white;
       -        text-decoration: none;
       -        margin-left: 12px;
       -}
       -
       -.balloon_links a:hover, .balloon_links a:active {
       -        color: yellow;
       -        text-decoration: underline;
       -}
       -
       -.balloon_icon {
       -        float: left;
       -        padding-top: 25px;
       -        padding-left: 14px;
       -}
       -
       -.box_full {
       -        position: relative;
       -        clear: both;
       -        width: 790px;
       -}
       -
       -#round_top {
       -        padding: 0;
       -        border: 0;
       -        margin: 0;
       -        height: 9px;
       -        margin-bottom: -2px;
       -        visibility: hidden;
       -}
       -
       -#round_bot {
       -        padding: 0;
       -        border: 0;
       -        margin-top: -2px;
       -        height: 15px;
       -        visibility: hidden;
       -}
       -
       -.box_full p {
       -        line-height: 1.5em;
       -}
       -
       -
       -.intro {
       -        font-size: 14px;
       -}
       -
       -.center {
       -        text-align: center;
       -}
       -
       -.code {
       -        font-family: fixed, courier new;
       -        color: black;
       -        background: #dddddd;
       -        padding: 0.25em 0.25em 0.25em 0.25em;
       -}
       -
       -.fatp {
       -        margin: 2.0em 0 0.5em;
       -}
       -
       -.announce {
       -        padding: 0px 20px 0px 20px;
       -        line-height: 1.5;
       -        font-size: 12px;
       -        font-weight: bold;
       -}
       -
       -.vulnTitle {
       -        font-weight: bold;
       -        font-size: 10pt;
       -        padding-bottom: 2em;
       -}
       -
       -.vulnHeader {
       -        font-weight: bold;
       -}
       -
       -.vulnText {
       -        padding-bottom: 1em;
       -}
       -
       -.vulnInfoTable {
       -        background: #dddddd;
       -
       -}
       -
       -.vulnInfoHeader {
       -        font-weight: bold;
       -}
       -
       -.vulnInfoData {
       -
       -}
       -
       -.talk_title {
       -        font-family: verdana, sans-serif, arial, helvetica;
       -        font-size: 9pt;
       -        padding: 0.1em 0.5em 0.15em .5em;
       -        font-weight: bold;
       -}
       -
       -.materials {
       -        background: #dddddd;
       -        padding: 10px 10px 10px 10px;
       -        border: 1px solid black;
       -}
       -
       -
       -
       -.level1
       -{
       -        list-style: none;
       -        text-align: left;
       -        padding: 0em 0em 1em 0em;
       -        font-size: 16px;
       -        font-weight: bold;
       -}
       -.level1 li
       -{
       -        padding: 1em .25em 0.25em 0.25em;
       -}
       -
       -.level2
       -{
       -        list-style: circle;
       -        text-align: left;
       -        padding: 0em 0.25em 0.25em 4em;
       -}
       -.level2 li
       -{
       -        padding: 0.25em .25em 0.25em 0.25em;
       -        font-size: 14px;
       -        font-weight: bold;
       -}
       -
       -.level3
       -{
       -        list-style: square;
       -        text-align: left;
       -        padding: 0em 0.25em 0.25em 4em;
       -}
       -.level3 li
       -{
       -        padding: 0.25em .25em 0.25em 0.25em;
       -}
       -
       -
       -
       -.boxTable
       -{
       -        border-left-style: solid;
       -        border-top-style: solid;
       -        border-right-style: solid;
       -        border-bottom-style: solid;
       -        border-color: #dddddd;
       -        font-family: verdana, sans-serif;
       -        font-size: 8pt;
       -        background-color: #dddddd;
       -}
       -.boxInnerTable
       -{
       -        font-family: verdana, sans-serif;
       -        font-size: 8pt;
       -}
       -.boxTdHeader
       -{
       -        border-width: 0 0 0 0;
       -        border-color: #dddddd;
       -        border-left-style: solid;
       -        border-top-style: solid;
       -        border-right-style: solid;
       -        border-bottom-style: solid;
       -        background-color: #dddddd;
       -        color: black;
       -        height: 20px;
       -        font-weight: bold
       -}
       -.boxTd
       -{
       -        border-width: 0 0 0 0;
       -        border-left-style: solid;
       -        border-top-style: solid;
       -        border-right-style: solid;
       -        border-bottom-style: solid;
       -}
       -.boxTd1
       -{
       -        background-color: #eeeeee;
       -}
       -.boxTd2
       -{
       -        background-color: #eeeeee;
       -}
       -.boxTh
       -{
       -        background-color: #dddddd;
       -}
 (DIR) diff --git a/app/assets/stylesheets/ie7.css b/app/assets/stylesheets/ie7.css
       @@ -1,3 +0,0 @@
       -#logo {
       -        margin-top: 7px;
       -}
 (DIR) diff --git a/app/controllers/dial_jobs_controller.rb b/app/controllers/dial_jobs_controller.rb
       @@ -22,14 +22,6 @@ class DialJobsController < ApplicationController
            end
          end
        
       -=begin
       -  # GET /dial_jobs/1/edit
       -  def edit
       -    @dial_job = DialJob.find(params[:id])
       -  end
       -=end
       -
       -
          # GET /dial_jobs/1/run
          def run
            @dial_job = DialJob.find(params[:id])
       @@ -86,7 +78,7 @@ class DialJobsController < ApplicationController
                # Launch it
                WarVOX::JobManager.schedule(::WarVOX::Jobs::Dialer, @dial_job.id)
        
       -        format.html { redirect_to(@dial_job) }
       +        format.html { redirect_to :action => 'index' }
                format.xml  { render :xml => @dial_job, :status => :created, :location => @dial_job }
              else
                format.html { render :action => "new" }
       @@ -107,16 +99,4 @@ class DialJobsController < ApplicationController
            end
          end
        
       -  # GET /dial_jobs/1
       -  # GET /dial_jobs/1.xml
       -  def show
       -    @dial_job = DialJob.find(params[:id])
       -
       -    respond_to do |format|
       -      format.html # show.html.erb
       -      format.xml  { render :xml => @dial_job }
       -    end
       -  end
       -
       -
        end
 (DIR) diff --git a/app/controllers/dial_results_controller.rb b/app/controllers/dial_results_controller.rb
       @@ -3,7 +3,7 @@ class DialResultsController < ApplicationController
          # GET /dial_results
          # GET /dial_results.xml
          def index
       -    @completed_jobs = DialJob.where(:status => 'completed').paginate(
       +    @jobs = DialJob.where(:status => 'completed').paginate(
                        :page => params[:page],
                        :order => 'id DESC',
                        :per_page => 30
       @@ -162,7 +162,7 @@ class DialResultsController < ApplicationController
        
          # DELETE /dial_results/1
          # DELETE /dial_results/1.xml
       -  def purge
       +  def destroy
        
            @job = DialJob.find(params[:id])
                @job.destroy
       @@ -173,14 +173,4 @@ class DialResultsController < ApplicationController
            end
          end
        
       -  # DELETE /dial_results/1
       -  # DELETE /dial_results/1.xml
       -  def delete
       -    @res = DialResult.find(params[:id])
       -        @res.destroy
       -    respond_to do |format|
       -      format.html { redirect_to :action => 'index' }
       -      format.xml  { head :ok }
       -    end
       -  end
        end
 (DIR) diff --git a/app/tabs/tabulous.rb b/app/tabs/tabulous.rb
       @@ -57,11 +57,10 @@ Tabulous.setup do |config|
              #----------------------------------------------------------------------------------------------------------#
              #    TAB NAME             |    DISPLAY TEXT    |    PATH                 |    VISIBLE?    |    ENABLED?    #
              #----------------------------------------------------------------------------------------------------------#
       -      [    :home_tab            ,    'Home'          ,    root_path            ,    true        ,    true        ],
       +      [    :start_tab           ,    'Start'         ,    new_dial_job_path    ,    true        ,    true        ],
              [    :dial_jobs_tab       ,    'Jobs'          ,    dial_jobs_path       ,    true        ,    true        ],
              [    :dial_results_tab    ,    'Results'       ,    dial_results_path    ,    true        ,    true        ],
              [    :providers_tab       ,    'Providers'     ,    providers_path       ,    true        ,    true        ],
       -      [    :analyze_tab         ,    'Analysis'      ,    analyze_path         ,    true        ,    true        ],
              [    :about_tab           ,    'About'         ,    about_path           ,    true        ,    true        ],
              #----------------------------------------------------------------------------------------------------------#
              #    TAB NAME             |    DISPLAY TEXT    |    PATH                 |    VISIBLE?    |    ENABLED?    #
       @@ -88,11 +87,11 @@ Tabulous.setup do |config|
              #--------------------------------------------------------------------#
              #    CONTROLLER       |    ACTION          |    TAB                  #
              #--------------------------------------------------------------------#
       -      [    :dial_jobs       ,    :all_actions    ,    :dial_jobs_tab       ],
       +      [    :dial_jobs       ,    :new            ,    :start_tab           ],
       +      [    :dial_jobs       ,    :index          ,    :dial_jobs_tab       ],
              [    :dial_results    ,    :all_actions    ,    :dial_results_tab    ],
       +      [    :analyze         ,    :all_actions    ,    :dial_results_tab    ],
              [    :providers       ,    :all_actions    ,    :providers_tab       ],
       -      [    :analyze         ,    :all_actions    ,    :analyze_tab         ],
       -      [    :home            ,    :index          ,    :home_tab            ],
              [    :home            ,    :about          ,    :about_tab           ],
              #--------------------------------------------------------------------#
              #    CONTROLLER       |    ACTION          |    TAB                  #
       @@ -113,9 +112,10 @@ Tabulous.setup do |config|
          # Tabulous expects every controller action to be associated with a tab.
          # When an action does not have an associated tab (or subtab), you can
          # instruct tabulous how to behave:
       -  config.when_action_has_no_tab = :raise_error      # the default behavior
       -  # config.when_action_has_no_tab = :do_not_render  # no tab navigation HTML will be generated
       -  # config.when_action_has_no_tab = :render         # the tab navigation HTML will be generated,
       +  #config.when_action_has_no_tab = :raise_error      # the default behavior
       +  #config.when_action_has_no_tab = :do_not_render  # no tab navigation HTML will be generated
       +
       +  config.when_action_has_no_tab = :render         # the tab navigation HTML will be generated,
                                                            # but no tab or subtab will be active
        
          #--------------------
       @@ -129,7 +129,7 @@ Tabulous.setup do |config|
          # This gives you control over what class the <ul> element that wraps the tabs
          # will have.  Good for interfacing with third-party code like Twitter
          # Bootstrap.
       -  config.tabs_ul_class = "nav nav-pills"
       +  config.tabs_ul_class = "nav"
        
          # This gives you control over what class the <ul> element that wraps the subtabs
          # will have.  Good for interfacing with third-party code.
       @@ -138,7 +138,7 @@ Tabulous.setup do |config|
          # Set this to true to have subtabs rendered in markup that Twitter Bootstrap
          # understands.  If this is set to true, you don't need to call subtabs in
          # your layout, just tabs.
       -  # config.bootstrap_style_subtabs = true
       +  config.bootstrap_style_subtabs = true
        
        
          #-------------------
       @@ -165,11 +165,11 @@ Tabulous.setup do |config|
        
          # You can tweak the colors of the generated CSS.
        
       -  config.css.background_color = '#ccc'
       +  config.css.background_color = '#000'
          config.css.text_color = '#444'
       -  config.css.active_tab_color = 'white'
       -  config.css.hover_tab_color = '#ddd'
       -  config.css.inactive_tab_color = '#aaa'
       -  config.css.inactive_text_color = '#888'
       +  config.css.active_tab_color = '#000'
       +  config.css.hover_tab_color = '#000'
       +  config.css.inactive_tab_color = '#000'
       +  config.css.inactive_text_color = '#000'
        
        end
 (DIR) diff --git a/app/views/analyze/index.html.erb b/app/views/analyze/index.html.erb
       @@ -2,31 +2,47 @@
        <h1 class='title'>Analyzed Jobs</h1>
        
        <%= raw(will_paginate @jobs) %>
       -<table class='table_scaffold' width='100%'>
       +<table class='table table-striped table-bordered' width='90%'>
       +  <thead>
          <tr>
            <th>ID</th>
            <th>Range</th>
                <th>CallerID</th>
            <th>Connected</th>
            <th>Date</th>
       +    <th>Actions</th>
          </tr>
       +  </thead>
       +  <tbody>
        
        <% @jobs.sort{|a,b| b.id <=> a.id}.each do |dial_job|  %>
          <tr>
            <td><%=h dial_job.id %></td>
            <td><%=h dial_job.range %></td>
       -    <td><%=h dial_job.cid_mask %></td>        
       +    <td><%=h dial_job.cid_mask %></td>
            <td><%=h (
       -                DialResult.count(:conditions => ['dial_job_id = ? and processed = ?', dial_job.id, true]).to_s + 
       -                "/" + 
       -                DialResult.count(:conditions => ['dial_job_id = ?', dial_job.id]).to_s 
       +                DialResult.count(:conditions => ['dial_job_id = ? and processed = ?', dial_job.id, true]).to_s +
       +                "/" +
       +                DialResult.count(:conditions => ['dial_job_id = ?', dial_job.id]).to_s
                )%></td>
            <td><%=h dial_job.started_at.localtime.strftime("%Y-%m-%d %H:%M:%S") %></td>
       -    <!-- <td><%= link_to 'Overview', show_analyze_path(dial_job) %></td> -->
       -    <td><%= link_to 'Browse', view_analyze_path(dial_job) %></td>
       -        <td><%= link_to 'ReAnalyze', reanalyze_dial_result_path(dial_job), :confirm => 'Process this job again?' %></td>
       +
       +    <td>
       +        <a class="btn btn-mini" href="<%= view_dial_result_path(dial_job) %>"><i class="icon-bar-chart"></i></a>
       +
       +                <% if(dial_job.processed) %>
       +                        <a class="btn btn-mini" href="<%= analyze_dial_result_path(dial_job) %>"><i class="icon-eye-open"></i></a>
       +                        <a class="btn btn-mini" href="<%= reanalyze_dial_result_path(dial_job) %>" data-confirm="Reprocess this job?" rel="nofollow"><i class="icon-refresh"></i></a>
       +                <% else %>
       +                        <a class="btn btn-mini" href="<%= analyze_dial_result_path(dial_job) %>"><i class="icon-bolt"></i></a>
       +                <% end %>
       +
       +            <a class="btn btn-mini" href="<%= dial_result_path(dial_job) %>" data-confirm="Delete all data for this job?" data-method="delete" rel="nofollow"><i class="icon-trash"></i></a>
       +        </td>
          </tr>
       +
        <% end %>
       +</tbody>
        </table>
        
        <%= raw(will_paginate @jobs) %>
 (DIR) diff --git a/app/views/analyze/view.html.erb b/app/views/analyze/view.html.erb
       @@ -12,11 +12,14 @@
        
        <%= raw(will_paginate @results) %>
        
       -<table class='table_scaffold' width='100%'>
       +<table class='table table-striped table-bordered' width='90%'>
       +  <thead>
          <tr>
            <th>Number</th>
                  <th>Signal</th>
          </tr>
       +  </thead>
       +  <tbody>
        
        <%  @results.each do |dial_result| %>
          <tr>
       @@ -56,13 +59,13 @@
                </td>
          </tr>
        <% end %>
       +</tbody>
        </table>
        
        <%= raw(will_paginate @results) %>
        
        <script type="text/javascript">
        $(function() {
       -        // Use this example, or...
                $('a.lightbox').lightBox();
        });
        </script>
 (DIR) diff --git a/app/views/analyze/view_matches.html.erb b/app/views/analyze/view_matches.html.erb
       @@ -1,13 +1,12 @@
        <%  dial_result = @result %>
        
        <h1 class='title'><%= @result.number %> (<a href="<%=view_analyze_path(dial_result.dial_job_id)%>">Back to Job</a>)</h1>
       -<table class='table_scaffold' width='100%'>
       +<table class='table table-striped table-bordered' width='90%'>
          <tr>
            <th>Number</th>
                  <th>Signal</th>
          </tr>
        
       -
          <tr>
            <td align='center'>
        
       @@ -42,15 +41,19 @@
                        <% end %>
                </td>
          </tr>
       +
        </table><br/><br/>
        
        <h1 class='title'>Matches for <%= @result.number %></h1>
        
       -<table class='table_scaffold' width='100%'>
       +<table class='table table-striped table-bordered' width='90%'>
       +  <thead>
          <tr>
            <th>Number</th>
                  <th>Signal</th>
          </tr>
       +  </thead>
       +  <tbody>
        
        <%  @results.each do |dial_result| %>
          <tr>
       @@ -93,6 +96,7 @@
                </td>
          </tr>
        <% end %>
       +</tbody>
        </table>
        
        <script type="text/javascript">
 (DIR) diff --git a/app/views/dial_jobs/index.html.erb b/app/views/dial_jobs/index.html.erb
       @@ -2,27 +2,30 @@
        
        <h1 class='title'>Submitted Jobs</h1>
        
       -<table class='table_scaffold' width='100%'>
       +<table class='table table-striped table-bordered' width='90%'>
          <tr>
       -    <th>ID</th>  
       +    <th>ID</th>
            <th>Range</th>
       -    <th>CallerID</th>        
       +    <th>CallerID</th>
            <th>Seconds</th>
            <th>Lines</th>
       -    <th>Submitted Time</th>        
       +    <th>Submitted Time</th>
       +    <th>Actions</th>
          </tr>
        
        <% @submitted_jobs.each do |dial_job| %>
          <tr>
            <td><%=h dial_job.id %></td>
            <td><%=h dial_job.range %></td>
       -        <td><%=h dial_job.cid_mask %></td>        
       +        <td><%=h dial_job.cid_mask %></td>
            <td><%=h dial_job.seconds %></td>
            <td><%=h dial_job.lines %></td>
            <td><%=h dial_job.created_at.localtime.strftime("%Y-%m-%d %H:%M:%S %Z") %></td>
       -    <td><%= link_to 'Execute', run_dial_job_path(dial_job), :confirm => 'Launch this job?'%></td>
       -    <td><%= link_to 'Modify', edit_dial_job_path(dial_job)%></td>
       -    <td><%= link_to 'Delete', dial_job, :confirm => 'Are you sure?', :method => :delete %></td>
       +
       +    <td>
       +            <a class="btn btn-mini" href="<%= run_dial_job_path(dial_job) %>" data-confirm="Launch this job?" rel="nofollow tooltip" title="Launch Job"><i class="icon-play"></i></a>
       +                <a class="btn btn-mini" href="<%= dial_job %>" data-confirm="Remove this job?" data-method="delete" rel="nofollow tooltip" title="Remove Job"><i class="icon-trash"></i></a>
       +        </td>
          </tr>
        <% end %>
        </table>
       @@ -33,7 +36,7 @@
        
        <h1 class='title'>Active Jobs</h1>
        
       -<table class='table_scaffold' width='100%'>
       +<table class='table table-striped table-bordered' width='90%'>
          <tr>
            <th>ID</th>
            <th>Range</th>
       @@ -43,8 +46,9 @@
            <th>Status</th>
            <th>Progress</th>
            <th>Start Time</th>
       +    <th>Actions</th>
          </tr>
       -  
       +
        <% @active_jobs.each do |dial_job| %>
          <tr class='active_job_row'>
            <td><%=h dial_job.id %></td>
       @@ -55,7 +59,9 @@
            <td><%=h dial_job.status %></td>
            <td><%=h dial_job.progress %>%</td>
            <td><%=h dial_job.started_at.localtime.strftime("%Y-%m-%d %H:%M:%S %Z") %></td>
       -    <td colspan='3'><%= link_to 'Stop', dial_job, :confirm => 'Are you sure?', :method => :delete %></td>
       +    <td>
       +                <a class="btn btn-mini" href="<%= stop_dial_job(dial_job) %>" data-confirm="Terminate this job?" rel="nofollow tooltip" title="Terminate Job"><i class="icon-stop"></i></a>
       +        </td>
          </tr>
        <% end %>
        </table>
       @@ -68,40 +74,8 @@
        <% end %>
        
        <% if (@active_jobs.length + @submitted_jobs.length == 0) %>
       -<h1 class='title'>No Active or Submitted Jobs</h1>
       +<h1 class='title'>No Active Jobs</h1>
        <br/>
       +<a class="btn" href="<%= new_dial_job_path %>"><i class="icon-plus"></i> Start Job </a>
        
        <% end %>
       -<h1 class='title'>Submit a New Job</h1>
       -
       -<%= form_for(@new_job, :html => { :multipart => true }) do |f| %>
       -  <%= f.error_messages %>
       -  <p>
       -    <%= f.label :range, 'Specify target telephone range(s) (1-123-456-7890 or 1-123-456-XXXX or 1-123-300-1000:1-123-400-2000)' %><br />
       -    <%= f.text_area :range, :size => "35x5" %>
       -  </p>
       -  
       -  <p>
       -    <%= f.label :range_file, 'Or upload a file containing the target ranges' %><br />
       -    <%= f.file_field :range_file %>
       -  </p>
       -  
       -  <p>
       -    <%= f.label :seconds, 'Seconds of audio to capture' %><br />
       -    <%= f.text_field :seconds, :value => 53 %>
       -  </p>
       -  
       -  <p>
       -    <%= f.label :lines, 'Maximum number of outgoing lines' %><br />
       -    <%= f.text_field :lines, :value => 10 %>
       -  </p>
       -  
       -  <p>
       -    <%= f.label :lines, 'The source Caller ID range (1-555-555-5555 or 1-555-555-55XX)' %><br />
       -    <%= f.text_field :cid_mask, :value => '1-123-456-XXXX' %>
       -  </p>
       -  
       -  <p>
       -    <%= f.submit "Create" %>
       -  </p>
       -<% end %>
 (DIR) diff --git a/app/views/dial_results/index.html.erb b/app/views/dial_results/index.html.erb
       @@ -1,41 +1,57 @@
       -<% if @completed_jobs.length > 0 %>
       +<% if @jobs.length > 0 %>
        <h1 class='title'>Completed Jobs</h1>
        
       -<table class='table_scaffold' width='100%'>
       +<%= raw(will_paginate @jobs) %>
       +<table class='table table-striped table-bordered' width='90%'>
       +  <thead>
          <tr>
            <th>ID</th>
            <th>Range</th>
       -    <th>CID</th>
       -    <th>Answered</th>        
       -    <th>Time</th>
       +        <th>CallerID</th>
       +    <th>Connected</th>
       +    <th>Date</th>
       +    <th>Actions</th>
          </tr>
       +  </thead>
       +  <tbody>
        
       -<% @completed_jobs.sort{|a,b| b.id <=> a.id}.each do |dial_job|  %>
       +<% @jobs.sort{|a,b| b.id <=> a.id}.each do |dial_job|  %>
          <tr>
            <td><%=h dial_job.id %></td>
            <td><%=h dial_job.range %></td>
       -    <td><%=h dial_job.cid_mask %></td>        
       +    <td><%=h dial_job.cid_mask %></td>
            <td><%=h (
       -                DialResult.count(:conditions => ['dial_job_id = ? and completed = ?', dial_job.id, true]).to_s + 
       -                "/" + 
       -                DialResult.count(:conditions => ['dial_job_id = ?', dial_job.id]).to_s 
       +                DialResult.count(:conditions => ['dial_job_id = ? and processed = ?', dial_job.id, true]).to_s +
       +                "/" +
       +                DialResult.count(:conditions => ['dial_job_id = ?', dial_job.id]).to_s
                )%></td>
            <td><%=h dial_job.started_at.localtime.strftime("%Y-%m-%d %H:%M:%S") %></td>
       -    <td><%= link_to 'View', view_dial_result_path(dial_job) %></td>
       -        <% if(dial_job.processed) %>
       -                <td><%= link_to 'View Analysis', analyze_dial_result_path(dial_job) %></td>
       -        <% else %>
       -                <td><%= link_to 'Analyze Calls', analyze_dial_result_path(dial_job) %></td>
       -        <% end %>
       -        <td><%= link_to 'Purge', purge_dial_result_path(dial_job), :confirm => "Delete all data for this job?" %></td>
       +
       +    <td>
       +        <a class="btn btn-mini" href="<%= view_dial_result_path(dial_job) %>" rel="tooltip" title="View Call Connections" ><i class="icon-bar-chart"></i></a>
       +
       +                <% if(dial_job.processed) %>
       +                        <a class="btn btn-mini" href="<%= analyze_dial_result_path(dial_job) %>" rel="tooltip" title="View Call Analysis"><i class="icon-eye-open"></i></a>
       +                        <a class="btn btn-mini" href="<%= reanalyze_dial_result_path(dial_job) %>" data-confirm="Reprocess this job?" rel="nofollow tooltip" title="Rerun Call Analysis"><i class="icon-refresh"></i></a>
       +                <% else %>
       +                        <a class="btn btn-mini" href="<%= analyze_dial_result_path(dial_job) %>" data-confirm="Analyze this job?" rel="nofollow tooltip" title="Run Call Analysis"><i class="icon-bolt"></i></a>
       +                <% end %>
       +
       +            <a class="btn btn-mini" href="<%= dial_result_path(dial_job) %>" data-confirm="Delete all data for this job?" data-method="delete" rel="nofollow tooltip" title="Delete Call Data"><i class="icon-trash"></i></a>
       +        </td>
          </tr>
       +
        <% end %>
       +</tbody>
        </table>
        
       -<%= raw(will_paginate @completed_jobs) %>
       +<%= raw(will_paginate @jobs) %>
        
        <% else %>
        
        <h1 class='title'>No Completed Jobs</h1>
       +<br/>
        
        <% end %>
       +
       +<a class="btn" href="<%= new_dial_job_path %>"><i class="icon-plus"></i> Start Job </a>
 (DIR) diff --git a/app/views/dial_results/view.html.erb b/app/views/dial_results/view.html.erb
       @@ -12,7 +12,10 @@
        </tr>
        </table>
        
       -<table class='table_scaffold' width='100%'>
       +<br/>
       +
       +<table class='table table-striped table-bordered' width='90%' id='results'>
       +  <thead>
          <tr>
            <th>Number</th>
            <th>CallerID</th>
       @@ -22,6 +25,8 @@
            <th>Seconds</th>
                <th>Ring Time</th>
          </tr>
       +  </thead>
       +  <tbody>
        <% for dial_result in @dial_results.sort{|a,b| a.number <=> b.number } %>
          <tr>
            <td><%= dial_result.number %></td>
       @@ -33,6 +38,7 @@
            <td><%= dial_result.ringtime.to_i %></td>
          </tr>
        <% end %>
       +  </tbody>
        </table>
        <%= raw(will_paginate @dial_results) %>
        
       @@ -42,3 +48,11 @@
        
        <% end %>
        <br />
       +
       +<%= javascript_tag do %>
       +// For fixed width containers
       +$('#results').dataTable({
       +  "sDom": "<'row'<'span6'l><'span6'f>r>t<'row'<'span6'i><'span6'p>>",
       +  "sPaginationType": "bootstrap"
       +});
       +<% end %>
 (DIR) diff --git a/app/views/home/about.html.erb b/app/views/home/about.html.erb
       @@ -1,111 +1,116 @@
       -<table width='100%' align='center' border='0' cellpadding='9' cellspacing='0'>
       -<tr><td valign='top'>
       +<div class="row">
       +
       +<div class="span9">
        
        <h1 class='title'>About WarVOX</h1>
        
        <b>WarVOX</b> is a product of <a href="http://www.rapid7.com/">Rapid7 Inc</a> and is provided as
        free software. WarVOX is intended for legal security assessment, asset inventory,
       -and research purposes only. The latest version of WarVOX can be found at
       -<a href="https://github.com/rapid7/warvox/">https://github.com/rapid7/warvox/</a>.
       -
       -</td><td valign='top' align='center'>
       +and research purposes only. The latest version of WarVOX can be found in <i class="icon-github"></i> GitHub at the following url
       +<a href="https://github.com/rapid7/warvox/"> https://github.com/rapid7/warvox/</a>.
        
       +</div>
       +<div class="span3">
        
        <h1 class='title'>Statistics</h1>
        
       -<table id="warvox_stats" cellspacing="0" width=200>
       +<table class='table table-condensed'>
        
        <tr>
       -        <td valign="top" align="right" class="header_item">
       -                Version:
       +        <td>
       +                Version
                </td>
                <td><%= WarVOX::VERSION %></td>
        </tr>
        
        <tr>
       -        <td valign="top" align="right" class="header_item">
       -                Providers:
       +        <td>
       +                Providers
                </td>
                <td><%= Provider.count %></td>
        </tr>
        
        
        <tr>
       -        <td valign="top" align="right" class="header_item">
       -                Active Jobs:
       +        <td>
       +                Active Jobs
                </td>
                <td><%= DialJob.count(:conditions => ['status = ?', 'active']) %></td>
        </tr>
        
        <tr>
       -        <td valign="top" align="right" class="header_item">
       -                Total Jobs:
       +        <td>
       +                Total Jobs
                </td>
                <td><%= DialJob.count %></td>
        </tr>
        
        <tr>
       -        <td valign="top" align="right" class="header_item">
       -                Results:
       +        <td>
       +                Results
                </td>
                <td><%= DialResult.count %></td>
        </tr>
        </table>
       +</div>
       +</div>
       +<!-- // row -->
        
        
       -</td></tr>
       -<tr><td valign='top' colspan='2'>
       +<div class="row">
       +<div class="span12">
       +
        
        <h1 class='title'>Configuration</h1>
        
        
       -<table id="warvox_conf" cellspacing="0" width='100%'>
       +<table width='100%' class='table table-bordered'>
        
        <tr>
       -        <td valign="top" align="right" class="header_item" width='200'>
       -                Base Directory:
       +        <td>
       +                Base Directory
                </td>
                <td><%= WarVOX::Base %></td>
        </tr>
        
        
        <tr>
       -        <td valign="top" align="right" class="header_item" width='200'>
       -                Configuration File:
       +        <td>
       +                Configuration File
                </td>
                <td><%= WarVOX::Conf %></td>
        </tr>
        
        <tr>
       -        <td valign="top" align="right" class="header_item" width='200'>
       -                Admin User:
       +        <td>
       +                Admin User
                </td>
                <td><%= WarVOX::Config.authentication_creds[0] %></td>
        </tr>
        
        <tr>
       -        <td valign="top" align="right" class="header_item" width='200'>
       +        <td>
                        GNUPlot
                </td>
                <td><%= WarVOX::Config.tool_path('gnuplot') || "MISSING" %></td>
        </tr>
        
        <tr>
       -        <td valign="top" align="right" class="header_item" width='200'>
       +        <td>
                        LAME
                </td>
                <td><%= WarVOX::Config.tool_path('lame') || "MISSING" %></td>
        </tr>
        
        <tr>
       -        <td valign="top" align="right" class="header_item" width='200'>
       +        <td>
                        IAXRECORD
                </td>
                <td><%= WarVOX::Config.tool_path('iaxrecord') || "MISSING" %></td>
        </tr>
        
        <tr>
       -        <td valign="top" align="right" class="header_item" width='200'>
       +        <td>
                        KissFFT
                </td>
                <td><%= @has_kissfft %></td>
       @@ -115,12 +120,7 @@ and research purposes only. The latest version of WarVOX can be found at
        <br/><br/>
        
        <h1 class='title'>Dial Exclusions (Blacklist)</h1>
       -<table id="warvox_blacklist" cellspacing="0" width='100%'>
       -<tr>
       -        <td valign="top" align="left" class="header_item" width='200'>
       -                <pre><%=h File.read(WarVOX::Config.blacklist_path) %></pre>
       -        </td>
       -</tr>
       -</table>
       +<pre><%=h File.read(WarVOX::Config.blacklist_path) %></pre>
        
       -</td></tr></table>
       +</div>
       +</div>
 (DIR) diff --git a/app/views/home/index.html.erb b/app/views/home/index.html.erb
       @@ -1,10 +1,23 @@
       +<div class="row">
       +<div class="span3">
       +<div class="sidebar">
       +    <ul class="nav nav-list">
       +    <li class="active"><a href="#"><i class="icon-play"></i> Getting Started</a></li>
       +    <li><a href="#"><i class="icon-book"></i> Library</a></li>
       +    <li><a href="#"><i class="icon-pencil"></i> Applications</a></li>
       +    <li><a href="#"><i class="icon-cogs"></i> Settings</a></li>
       +    </ul>
       +</div>
       +</div>
       +<div class="span9">
       +
        <h1 class='title'>Introduction</h1>
        
        <p>
       -WarVOX is a suite of tools for exploring, classifying, and auditing telephone systems. Unlike normal wardialing tools, 
       -WarVOX works with the actual audio from each call and does not use a modem directly. This model allows WarVOX to find 
       +WarVOX is a suite of tools for exploring, classifying, and auditing telephone systems. Unlike normal wardialing tools,
       +WarVOX works with the actual audio from each call and does not use a modem directly. This model allows WarVOX to find
        and classify a wide range of interesting lines, including modems, faxes, voice mail boxes, PBXs, loops, dial tones, IVRs,
       -and forwarders. WarVOX provides the unique ability to classify all telephone lines in a given range, not just those 
       +and forwarders. WarVOX provides the unique ability to classify all telephone lines in a given range, not just those
        connected to modems, allowing for a comprehensive audit of a telephone system.
        </p>
        
       @@ -43,3 +56,6 @@ After the job completes, access the <a href="/dial_results/">Results</a> link to
        <p>
        If for some reason WarVOX is not working correctly, or if you have any questions, please contact the WarVOX development team at warvox[at]metasploit.com. To determine whether software dependencies have been satisfied, you can use the <b>bin/verify_install.rb</b> Ruby script included with the WarVOX distribution. The <a href="/home/about/">About</a> page also includes detailed information that may help resolve installation issues. If your calls fail to produce any results, double check the Provider configuration. To obtain the latest version of this software, please check the <a href="http://warvox.org/">WarVOX Web Site</a>.
        </p>
       +
       +</div>
       +</div>
 (DIR) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
       @@ -7,64 +7,53 @@
            <title><%= content_for?(:title) ? yield(:title) : "WarVOX v#{WarVOX::VERSION}" %></title>
            <%= csrf_meta_tags %>
        
       -    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
            <!--[if lt IE 9]>
       -      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js" type="text/javascript"></script>
       +        <%= javascript_include_tag "html5" %>
            <![endif]-->
        
       +    <%= javascript_include_tag "application" %>
            <%= stylesheet_link_tag "application", :media => "all" %>
        
       -    <!-- For third-generation iPad with high-resolution Retina display: -->
       -    <!-- Size should be 144 x 144 pixels -->
            <%= favicon_link_tag 'images/apple-touch-icon-144x144-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '144x144' %>
       -
       -    <!-- For iPhone with high-resolution Retina display: -->
       -    <!-- Size should be 114 x 114 pixels -->
            <%= favicon_link_tag 'images/apple-touch-icon-114x114-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '114x114' %>
       -
       -    <!-- For first- and second-generation iPad: -->
       -    <!-- Size should be 72 x 72 pixels -->
            <%= favicon_link_tag 'images/apple-touch-icon-72x72-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '72x72' %>
       -
       -    <!-- For non-Retina iPhone, iPod Touch, and Android 2.1+ devices: -->
       -    <!-- Size should be 57 x 57 pixels -->
            <%= favicon_link_tag 'images/apple-touch-icon-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png' %>
       -
       -    <!-- For all other devices -->
       -    <!-- Size should be 32 x 32 pixels -->
            <%= favicon_link_tag 'images/favicon.ico', :rel => 'shortcut icon' %>
       +
       +        <%= javascript_tag do %>
       +                $(document).ready(function() {
       +                        $("a").tooltip();
       +                }
       +        <% end %>
          </head>
          <body>
        
            <div class="navbar navbar-fixed-top">
              <div class="navbar-inner">
                <div class="container">
       -          <a class="btn btn-navbar" data-target=".nav-collapse" data-toggle="collapse">
       -            <span class="icon-bar"></span>
       -            <span class="icon-bar"></span>
       -            <span class="icon-bar"></span>
       -            <span class="icon-bar"></span>
       -          </a>
       -          <a class="brand" href="/">WarVOX</a>
       +          <a class="brand" href="/"><img src="/assets/logo_light.png" border=0 alt="WarVOX"></a>
                  <%= tabs %>
                </div>
              </div>
            </div>
        
       +
            <div class="container">
       -        <div class="row">
       -          <div class="span12">
       -             <%= yield %>
       +      <div class="row">
       +        <div class="span12 content">
       +
       +          <div class="content">
       +          <%= yield %>
                  </div>
       -        </div><!--/row-->
        
       -      <footer>
       -        <p>&copy; Rapid7, Inc. 2009-2013</p>
       -      </footer>
       +          <footer class="footer">
       +            <p>&copy; Rapid7, Inc. 2009-2013</p>
       +          </footer>
        
       +        </div>
       +      </div>
            </div> <!-- /container -->
        
       -    <%= javascript_include_tag "application" %>
        
          </body>
        </html>
 (DIR) diff --git a/app/views/providers/index.html.erb b/app/views/providers/index.html.erb
       @@ -1,71 +1,46 @@
        <% if @providers.length > 0 %>
       -<h1 class='title'>Providers</h1>
       -<table class='table_scaffold' width='100%'>
       +<h1 class='title'>VoIP Providers (IAX)</h1>
       +<table class='table table-striped table-bordered' width='90%'>
          <tr>
       -    <th>Enabled</th>
       -    <th>Name</th>
       -    <th>Host</th>
       -    <th>Port</th>
       -    <th>User</th>
       -    <th>Pass</th>
       +    <th>Active</th>
       +    <th>Provider Name</th>
       +    <th>IAX Server</th>
       +    <th>IAX Port</th>
       +    <th>Username</th>
            <th>Lines</th>
       +    <th>Actions</th>
       +
          </tr>
        
        <% for provider in @providers %>
          <tr>
       -    <td><%=h provider.enabled %></td>
       +    <td>
       +    <i class="icon-<%= provider.enabled  ? "ok" : "remove" %>"></i>
       +    </td>
            <td><%=h provider.name %></td>
            <td><%=h provider.host %></td>
            <td><%=h provider.port %></td>
            <td><%=h provider.user %></td>
       -    <td>********</td>
            <td><%=h provider.lines %></td>
       -    <td><%= link_to 'Modify', edit_provider_path(provider) %></td>
       -    <td><%= link_to 'Delete', provider, :confirm => 'Are you sure?', :method => :delete %></td>
       +    <td>
       +            <a class="btn btn-mini" href="<%= edit_provider_path(provider) %>"rel="tooltip" title="Update Provider Information"><i class="icon-pencil"></i></a>
       +            <a class="btn btn-mini" href="<%= provider_path(provider) %>" data-confirm="Remove this provider?" data-method="delete" rel="nofollow tooltip" title="Remove Provider"><i class="icon-trash"></i></a>
       +    </td>
          </tr>
        <% end %>
        </table>
        
        <br />
        
       -<%= link_to 'New Provider', new_provider_path %>
       +
       +<a class="btn" href="<%= new_provider_path %>"><i class="icon-plus"></i> Add Provider </a>
        
        <% else %>
        
        <h1 class='title'>No Configured Providers</h1>
        <br/>
        
       -<h1 class='title'>Configure a New Provider</h1>
       +<a class="btn" href="<%= new_provider_path %>"><i class="icon-plus"></i> Add Provider </a>
        
       -<%= form_for(@new_provider) do |f| %>
       -  <%= f.error_messages %>
       -  <p>
       -    <%= f.label :name, 'The nickname for this provider' %><br />
       -    <%= f.text_field :name %>
       -  </p>
       -  <p>
       -    <%= f.label :host, 'The IAX2 server name' %><br />
       -    <%= f.text_field :host %>
       -  </p>
       -  <p>
       -    <%= f.label :port, 'The IAX2 port (normally 4569)' %><br />
       -    <%= f.text_field :port, :value => 4569 %>
       -  </p>
       -  <p>
       -    <%= f.label :user, 'The username to access the provider' %><br />
       -    <%= f.text_field :user %>
       -  </p>
       -  <p>
       -    <%= f.label :pass, 'The password to access the provider' %><br />
       -    <%= f.text_field :pass %>
       -  </p>
       -  <p>
       -    <%= f.label :lines, 'The number of available outbound lines' %><br />
       -    <%= f.text_field :lines, :value => 1 %>
       -  </p>
       -  <p>
       -    <%= f.submit "Create" %>
       -  </p>
       -<% end %>
        
        <% end %>
 (DIR) diff --git a/app/views/shared/graphs/_call_results.html.erb b/app/views/shared/graphs/_call_results.html.erb
       @@ -1,7 +1,11 @@
        <%
        
        graph_id = "g" + rand(0x1000000).to_s
       -pie_data = raw("[ 'Timeout', #{@call_results[:Timeout].to_i.to_s} ], ['Busy', #{@call_results[:Busy].to_i.to_s} ], ['Answered', #{@call_results[:Answered].to_i.to_s} ]")
       +line_data = raw("")
       +
       +line_data << raw("{ name: 'Timeout', data: [ #{@call_results[:Timeout].to_i.to_s } ] }, ")
       +line_data << raw("{ name: 'Busy', data: [ #{@call_results[:Busy].to_i.to_s } ] }, ")
       +line_data << raw("{ name: 'Answered', data: [ #{@call_results[:Answered].to_i.to_s } ] }, ")
        
        %>
        
       @@ -12,44 +16,43 @@ pie_data = raw("[ 'Timeout', #{@call_results[:Timeout].to_i.to_s} ], ['Busy', #{
         $(function () {
            var chart;
            $(document).ready(function() {
       -        chart = new Highcharts.Chart({
       +          chart = new Highcharts.Chart({
                    chart: {
                        renderTo: '<%= graph_id %>',
       -                plotBackgroundColor: null,
       -                plotBorderWidth: null,
       -                plotShadow: false,
       -                shadow: true,
       -                width: 600,
       -                height: 400
       +                type: 'bar',
       +                height: 150
                    },
                    title: {
       -                text: 'Dial Results'
       +                text: 'Call Results'
       +            },
       +            xAxis: {
       +                categories: ['Calls']
       +            },
       +            yAxis: {
       +                min: 0,
       +                title: {
       +                    text: 'Calls by Result'
       +                }
       +            },
       +            legend: {
       +                backgroundColor: '#FFFFFF',
       +                reversed: true
                    },
                    tooltip: {
       -                pointFormat: '{series.name}: <b>{point.percentage}%</b>',
       -                percentageDecimals: 1
       +                formatter: function() {
       +                    return ''+
       +                        this.series.name +': '+ this.y +'';
       +                }
                    },
                    plotOptions: {
       -                pie: {
       -                    allowPointSelect: true,
       -                    cursor: 'pointer',
       -                    dataLabels: {
       -                        enabled: true,
       -                        color: '#000000',
       -                        connectorColor: '#000000',
       -                        formatter: function() {
       -                            return '<b>'+ this.point.name +'</b>: '+ Math.round(this.percentage) +' %';
       -                        }
       -                    }
       +                series: {
       +                    stacking: 'normal'
                        }
                    },
       -            series: [{
       -                type: 'pie',
       -                name: 'Result',
       -                data: [<%= pie_data %>]
       -            }]
       +            series: [ <%= line_data %> ]
                });
            });
       +
        });
        
        
 (DIR) diff --git a/app/views/shared/graphs/_lines_by_type.html.erb b/app/views/shared/graphs/_lines_by_type.html.erb
       @@ -1,11 +1,10 @@
        <%
        
        graph_id = "g" + rand(0x1000000).to_s
       -pie_data = raw("")
       -
       +line_data = raw("")
        
        @lines_by_type.keys.sort{|a,b| @lines_by_type[b] <=> @lines_by_type[a]}.each do |k|
       -        pie_data << raw("[ '#{k.to_s.capitalize}', #{@lines_by_type[k].to_i.to_s} ], ")
       +        line_data << raw("{ name: '#{k.to_s.capitalize}', data: [ #{ @lines_by_type[k].to_i.to_s} ]}, ")
        end
        
        %>
       @@ -17,44 +16,43 @@ end
         $(function () {
            var chart;
            $(document).ready(function() {
       -        chart = new Highcharts.Chart({
       +          chart = new Highcharts.Chart({
                    chart: {
                        renderTo: '<%= graph_id %>',
       -                plotBackgroundColor: null,
       -                plotBorderWidth: null,
       -                plotShadow: false,
       -                shadow: true,
       -                width: 600,
       -                height: 400
       +                type: 'bar',
       +                height: 150
                    },
                    title: {
       -                text: 'Line Classification'
       +                text: 'Line Types'
       +            },
       +            xAxis: {
       +                categories: ['Lines']
       +            },
       +            yAxis: {
       +                min: 0,
       +                title: {
       +                    text: 'Lines by Type'
       +                }
       +            },
       +            legend: {
       +                backgroundColor: '#FFFFFF',
       +                reversed: true
                    },
                    tooltip: {
       -                pointFormat: '{series.name}: <b>{point.percentage}%</b>',
       -                percentageDecimals: 1
       +                formatter: function() {
       +                    return ''+
       +                        this.series.name +': '+ this.y +'';
       +                }
                    },
                    plotOptions: {
       -                pie: {
       -                    allowPointSelect: true,
       -                    cursor: 'pointer',
       -                    dataLabels: {
       -                        enabled: true,
       -                        color: '#000000',
       -                        connectorColor: '#000000',
       -                        formatter: function() {
       -                            return '<b>'+ this.point.name +'</b>: '+ Math.round(this.percentage) +' %';
       -                        }
       -                    }
       +                series: {
       +                    stacking: 'normal'
                        }
                    },
       -            series: [{
       -                type: 'pie',
       -                name: 'Result',
       -                data: [<%= pie_data %>]
       -            }]
       +            series: [ <%= line_data %> ]
                });
            });
       +
        });
        
        
 (DIR) diff --git a/config/environments/development.rb b/config/environments/development.rb
       @@ -34,4 +34,6 @@ Web::Application.configure do
        
          # Expands the lines which load the assets
          config.assets.debug = true
       +
       +  config.serve_static_assets = true
        end
 (DIR) diff --git a/lib/templates/erb/scaffold/_form.html.erb b/lib/templates/erb/scaffold/_form.html.erb
       @@ -0,0 +1,11 @@
       +<%%= semantic_form_for @<%= singular_name %> do |f| %>
       +  <%%= f.inputs do %>
       +  <%- attributes.each do |attribute| -%>
       +    <%%= f.input :<%= attribute.name %> %>
       +  <%- end -%>
       +  <%% end %>
       +
       +  <%%= f.actions do %>
       +    <%%= f.action :submit, :as => :input %>
       +  <%% end %>
       +<%% end %>
 (DIR) diff --git a/public/robots.txt b/public/robots.txt
       @@ -1,5 +1,2 @@
       -# See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
       -#
       -# To ban all spiders from the entire site uncomment the next two lines:
       -# User-Agent: *
       -# Disallow: /
       + User-Agent: *
       + Disallow: /