Still a work in progress, closer - warvox - VoIP based wardialing tool, forked from rapid7/warvox.
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
 (DIR) commit 384b73e9317c52d227b226504ddc07016da7fa65
 (DIR) parent 11e8b26bad69969870b96fa4f730a2873bff1e43
 (HTM) Author: HD Moore <hd_moore@rapid7.com>
       Date:   Wed, 10 Oct 2012 01:29:49 -0500
       
       Still a work in progress, closer
       
       Diffstat:
         M web/Gemfile                         |      34 ++++++++-----------------------
         M web/Gemfile.lock                    |      28 ++++++++++++++++++++++++++++
         R web/public/images/balloon.png -> w… |       0 
         R web/public/images/bluefade.jpg -> … |       0 
         R web/public/images/close.gif -> web… |       0 
         R web/public/images/left-round.png -… |       0 
         R web/public/images/loading.gif -> w… |       0 
         R web/public/images/logo.png -> web/… |       0 
         R web/public/images/logo_raw.xcf -> … |       0 
         R web/public/images/musicplayer.swf … |       0 
         R web/public/images/rails.png -> web… |       0 
         R web/public/images/right-round.png … |       0 
         R web/public/images/round_bot.png ->… |       0 
         R web/public/images/round_top.png ->… |       0 
         R web/public/javascripts/FusionChart… |       0 
         R web/public/javascripts/application… |       0 
         R web/public/javascripts/controls.js… |       0 
         R web/public/javascripts/custom.js -… |       0 
         R web/public/javascripts/dragdrop.js… |       0 
         R web/public/javascripts/effects.js … |       0 
         A web/app/assets/javascripts/lightbo… |     426 +++++++++++++++++++++++++++++++
         R web/public/javascripts/prototype.j… |       0 
         R web/public/javascripts/rails.js ->… |       0 
         A web/app/assets/stylesheets/global.… |     556 ++++++++++++++++++++++++++++++
         R web/public/stylesheets/ie7.css -> … |       0 
         R web/public/stylesheets/lightbox.cs… |       0 
         R web/public/stylesheets/overlay.png… |       0 
         R web/public/stylesheets/scaffold.cs… |       0 
         M web/app/views/analyze/view.html.erb |       4 ++--
         M web/app/views/analyze/view_matches… |       8 ++++----
         M web/app/views/layouts/warvox.html.… |      10 ++++------
         M web/app/views/shared/_header.html.… |       2 +-
         M web/config/application.rb           |      38 ++++++++++++++++++++++++-------
         M web/config/boot.rb                  |      13 +++----------
         M web/config/database.yml             |      11 +++++++++++
         M web/config/environments/developmen… |      21 ++++++++++++++++-----
         M web/config/environments/production… |      49 +++++++++++++++++++++----------
         M web/config/initializers/inflection… |       5 +++++
         M web/config/initializers/secret_tok… |       6 ------
         M web/config/initializers/session_st… |       6 +++---
         A web/config/initializers/wrap_param… |      14 ++++++++++++++
         M web/db/schema.rb                    |      24 +++++++-----------------
         D web/public/javascripts/lightbox.js  |     426 -------------------------------
         D web/public/stylesheets/global.css   |     556 ------------------------------
       
       44 files changed, 1152 insertions(+), 1085 deletions(-)
       ---
 (DIR) diff --git a/web/Gemfile b/web/Gemfile
       @@ -1,33 +1,17 @@
        source 'http://rubygems.org'
        
        gem 'rails', '3.2.8'
       -
       -# Bundle edge Rails instead:
       -# gem 'rails', :git => 'git://github.com/rails/rails.git'
       -
        gem 'pg', '0.11'
       -# Use unicorn as the web server
       -# gem 'unicorn'
       -
       -# Deploy with Capistrano
       -# gem 'capistrano'
       -
       -# To use debugger
       -# gem 'ruby-debug'
       -
       -# Bundle the extra gems:
       -# gem 'bj'
       -# gem 'nokogiri'
       -# gem 'sqlite3-ruby', :require => 'sqlite3'
       -# gem 'aws-s3', :require => 'aws/s3'
       -
       -# Bundle gems for the local environment. Make sure to
       -# put test-only gems in this group so their generators
       -# and rake tasks are available in development mode:
       -# group :development, :test do
       -#   gem 'webrat'
       -# end
        
       +# Gems used only for assets and not required
       +# in production environments by default.
       +group :assets do
       +  gem 'sass-rails',   '~> 3.2.3'
       +  gem 'coffee-rails', '~> 3.2.1'
       +  gem 'therubyracer', :platforms => :ruby
       +  gem 'uglifier', '>= 1.0.3'
       +end
        
       +gem 'jquery-rails'
        gem 'will_paginate', '~> 3.0'
        gem 'dynamic_form'
 (DIR) diff --git a/web/Gemfile.lock b/web/Gemfile.lock
       @@ -30,12 +30,25 @@ GEM
              multi_json (~> 1.0)
            arel (3.0.2)
            builder (3.0.3)
       +    coffee-rails (3.2.2)
       +      coffee-script (>= 2.2.0)
       +      railties (~> 3.2.0)
       +    coffee-script (2.2.0)
       +      coffee-script-source
       +      execjs
       +    coffee-script-source (1.3.3)
            dynamic_form (1.1.4)
            erubis (2.7.0)
       +    execjs (1.4.0)
       +      multi_json (~> 1.0)
            hike (1.2.1)
            i18n (0.6.1)
            journey (1.0.4)
       +    jquery-rails (2.1.3)
       +      railties (>= 3.1.0, < 5.0)
       +      thor (~> 0.14)
            json (1.7.5)
       +    libv8 (3.3.10.4)
            mail (2.4.4)
              i18n (>= 0.4.0)
              mime-types (~> 1.16)
       @@ -69,23 +82,38 @@ GEM
            rake (0.9.2.2)
            rdoc (3.12)
              json (~> 1.4)
       +    sass (3.2.1)
       +    sass-rails (3.2.5)
       +      railties (~> 3.2.0)
       +      sass (>= 3.1.10)
       +      tilt (~> 1.3)
            sprockets (2.1.3)
              hike (~> 1.2)
              rack (~> 1.0)
              tilt (~> 1.1, != 1.3.0)
       +    therubyracer (0.10.1)
       +      libv8 (~> 3.3.10)
            thor (0.16.0)
            tilt (1.3.3)
            treetop (1.4.11)
              polyglot
              polyglot (>= 0.3.1)
            tzinfo (0.3.33)
       +    uglifier (1.3.0)
       +      execjs (>= 0.3.0)
       +      multi_json (~> 1.0, >= 1.0.2)
            will_paginate (3.0.3)
        
        PLATFORMS
          ruby
        
        DEPENDENCIES
       +  coffee-rails (~> 3.2.1)
          dynamic_form
       +  jquery-rails
          pg (= 0.11)
          rails (= 3.2.8)
       +  sass-rails (~> 3.2.3)
       +  therubyracer
       +  uglifier (>= 1.0.3)
          will_paginate (~> 3.0)
 (DIR) diff --git a/web/public/images/balloon.png b/web/app/assets/images/balloon.png
       Binary files differ.
 (DIR) diff --git a/web/public/images/bluefade.jpg b/web/app/assets/images/bluefade.jpg
       Binary files differ.
 (DIR) diff --git a/web/public/images/close.gif b/web/app/assets/images/close.gif
       Binary files differ.
 (DIR) diff --git a/web/public/images/left-round.png b/web/app/assets/images/left-round.png
       Binary files differ.
 (DIR) diff --git a/web/public/images/loading.gif b/web/app/assets/images/loading.gif
       Binary files differ.
 (DIR) diff --git a/web/public/images/logo.png b/web/app/assets/images/logo.png
       Binary files differ.
 (DIR) diff --git a/web/public/images/logo_raw.xcf b/web/app/assets/images/logo_raw.xcf
       Binary files differ.
 (DIR) diff --git a/web/public/images/musicplayer.swf b/web/app/assets/images/musicplayer.swf
       Binary files differ.
 (DIR) diff --git a/web/public/images/rails.png b/web/app/assets/images/rails.png
       Binary files differ.
 (DIR) diff --git a/web/public/images/right-round.png b/web/app/assets/images/right-round.png
       Binary files differ.
 (DIR) diff --git a/web/public/images/round_bot.png b/web/app/assets/images/round_bot.png
       Binary files differ.
 (DIR) diff --git a/web/public/images/round_top.png b/web/app/assets/images/round_top.png
       Binary files differ.
 (DIR) diff --git a/web/public/javascripts/FusionCharts.js b/web/app/assets/javascripts/FusionCharts.js
 (DIR) diff --git a/web/public/javascripts/application.js b/web/app/assets/javascripts/application.js
 (DIR) diff --git a/web/public/javascripts/controls.js b/web/app/assets/javascripts/controls.js
 (DIR) diff --git a/web/public/javascripts/custom.js b/web/app/assets/javascripts/custom.js
 (DIR) diff --git a/web/public/javascripts/dragdrop.js b/web/app/assets/javascripts/dragdrop.js
 (DIR) diff --git a/web/public/javascripts/effects.js b/web/app/assets/javascripts/effects.js
 (DIR) diff --git a/web/app/assets/javascripts/lightbox.js b/web/app/assets/javascripts/lightbox.js
       @@ -0,0 +1,426 @@
       +/*
       +        Lightbox JS: Fullsize Image Overlays 
       +        by Lokesh Dhakar - http://www.huddletogether.com
       +
       +        For more information on this script, visit:
       +        http://huddletogether.com/projects/lightbox/
       +
       +        Script featured on Dynamic Drive code library Jan 24th, 06':
       +        http://www.dynamicdrive.com
       +
       +        Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
       +        (basically, do anything you want, just leave my name and link)
       +        
       +        Table of Contents
       +        -----------------
       +        Configuration
       +        
       +        Functions
       +        - getPageScroll()
       +        - getPageSize()
       +        - pause()
       +        - getKey()
       +        - listenKey()
       +        - showLightbox()
       +        - hideLightbox()
       +        - initLightbox()
       +        - addLoadEvent()
       +        
       +        Function Calls
       +        - addLoadEvent(initLightbox)
       +
       +*/
       +
       +
       +
       +//
       +// Configuration
       +//
       +
       +// If you would like to use a custom loading image or close button reference them in the next two lines.
       +var loadingImage = '/assets/loading.gif';                
       +var closeButton = '/assets/close.gif';                
       +
       +
       +
       +
       +
       +//
       +// getPageScroll()
       +// Returns array with x,y page scroll values.
       +// Core code from - quirksmode.org
       +//
       +function getPageScroll(){
       +
       +        var yScroll;
       +
       +        if (self.pageYOffset) {
       +                yScroll = self.pageYOffset;
       +        } else if (document.documentElement && document.documentElement.scrollTop){         // Explorer 6 Strict
       +                yScroll = document.documentElement.scrollTop;
       +        } else if (document.body) {// all other Explorers
       +                yScroll = document.body.scrollTop;
       +        }
       +
       +        arrayPageScroll = new Array('',yScroll) 
       +        return arrayPageScroll;
       +}
       +
       +
       +
       +//
       +// getPageSize()
       +// Returns array with page width, height and window width, height
       +// Core code from - quirksmode.org
       +// Edit for Firefox by pHaez
       +//
       +function getPageSize(){
       +        
       +        var xScroll, yScroll;
       +        
       +        if (window.innerHeight && window.scrollMaxY) {        
       +                xScroll = document.body.scrollWidth;
       +                yScroll = window.innerHeight + window.scrollMaxY;
       +        } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
       +                xScroll = document.body.scrollWidth;
       +                yScroll = document.body.scrollHeight;
       +        } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
       +                xScroll = document.body.offsetWidth;
       +                yScroll = document.body.offsetHeight;
       +        }
       +        
       +        var windowWidth, windowHeight;
       +        if (self.innerHeight) {        // all except Explorer
       +                windowWidth = self.innerWidth;
       +                windowHeight = self.innerHeight;
       +        } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
       +                windowWidth = document.documentElement.clientWidth;
       +                windowHeight = document.documentElement.clientHeight;
       +        } else if (document.body) { // other Explorers
       +                windowWidth = document.body.clientWidth;
       +                windowHeight = document.body.clientHeight;
       +        }        
       +        
       +        // for small pages with total height less then height of the viewport
       +        if(yScroll < windowHeight){
       +                pageHeight = windowHeight;
       +        } else { 
       +                pageHeight = yScroll;
       +        }
       +
       +        // for small pages with total width less then width of the viewport
       +        if(xScroll < windowWidth){        
       +                pageWidth = windowWidth;
       +        } else {
       +                pageWidth = xScroll;
       +        }
       +
       +
       +        arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) 
       +        return arrayPageSize;
       +}
       +
       +
       +//
       +// pause(numberMillis)
       +// Pauses code execution for specified time. Uses busy code, not good.
       +// Code from http://www.faqts.com/knowledge_base/view.phtml/aid/1602
       +//
       +function pause(numberMillis) {
       +        var now = new Date();
       +        var exitTime = now.getTime() + numberMillis;
       +        while (true) {
       +                now = new Date();
       +                if (now.getTime() > exitTime)
       +                        return;
       +        }
       +}
       +
       +//
       +// getKey(key)
       +// Gets keycode. If 'x' is pressed then it hides the lightbox.
       +//
       +
       +function getKey(e){
       +        if (e == null) { // ie
       +                keycode = event.keyCode;
       +        } else { // mozilla
       +                keycode = e.which;
       +        }
       +        key = String.fromCharCode(keycode).toLowerCase();
       +        
       +        if(key == 'x'){ hideLightbox(); }
       +}
       +
       +
       +//
       +// listenKey()
       +//
       +function listenKey () {        document.onkeypress = getKey; }
       +        
       +
       +//
       +// showLightbox()
       +// Preloads images. Pleaces new image in lightbox then centers and displays.
       +//
       +function showLightbox(objLink)
       +{
       +        // prep objects
       +        var objOverlay = document.getElementById('overlay');
       +        var objLightbox = document.getElementById('lightbox');
       +        var objCaption = document.getElementById('lightboxCaption');
       +        var objImage = document.getElementById('lightboxImage');
       +        var objLoadingImage = document.getElementById('loadingImage');
       +        var objLightboxDetails = document.getElementById('lightboxDetails');
       +
       +        
       +        var arrayPageSize = getPageSize();
       +        var arrayPageScroll = getPageScroll();
       +
       +        // center loadingImage if it exists
       +        if (objLoadingImage) {
       +                objLoadingImage.style.top = (arrayPageScroll[1] + ((arrayPageSize[3] - 35 - objLoadingImage.height) / 2) + 'px');
       +                objLoadingImage.style.left = (((arrayPageSize[0] - 20 - objLoadingImage.width) / 2) + 'px');
       +                objLoadingImage.style.display = 'block';
       +        }
       +
       +        // set height of Overlay to take up whole page and show
       +        objOverlay.style.height = (arrayPageSize[1] + 'px');
       +        objOverlay.style.display = 'block';
       +
       +        // preload image
       +        imgPreload = new Image();
       +
       +        imgPreload.onload=function(){
       +                objImage.src = objLink.href;
       +
       +                // center lightbox and make sure that the top and left values are not negative
       +                // and the image placed outside the viewport
       +                var lightboxTop = arrayPageScroll[1] + ((arrayPageSize[3] - 35 - imgPreload.height) / 2);
       +                var lightboxLeft = ((arrayPageSize[0] - 20 - imgPreload.width) / 2);
       +                
       +                objLightbox.style.top = (lightboxTop < 0) ? "0px" : lightboxTop + "px";
       +                objLightbox.style.left = (lightboxLeft < 0) ? "0px" : lightboxLeft + "px";
       +
       +
       +                objLightboxDetails.style.width = imgPreload.width + 'px';
       +                
       +                if(objLink.getAttribute('title')){
       +                        objCaption.style.display = 'block';
       +                        //objCaption.style.width = imgPreload.width + 'px';
       +                        objCaption.innerHTML = objLink.getAttribute('title');
       +                } else {
       +                        objCaption.style.display = 'none';
       +                }
       +                
       +                // A small pause between the image loading and displaying is required with IE,
       +                // this prevents the previous image displaying for a short burst causing flicker.
       +                if (navigator.appVersion.indexOf("MSIE")!=-1){
       +                        pause(250);
       +                } 
       +
       +                if (objLoadingImage) {        objLoadingImage.style.display = 'none'; }
       +                objLightbox.style.display = 'block';
       +
       +                // After image is loaded, update the overlay height as the new image might have
       +                // increased the overall page height.
       +                arrayPageSize = getPageSize();
       +                objOverlay.style.height = (arrayPageSize[1] + 'px');
       +                
       +                // Check for 'x' keypress
       +                listenKey();
       +
       +                return false;
       +        }
       +
       +        imgPreload.src = objLink.href;
       +        
       +}
       +
       +
       +
       +
       +
       +//
       +// hideLightbox()
       +//
       +function hideLightbox()
       +{
       +        // get objects
       +        objOverlay = document.getElementById('overlay');
       +        objLightbox = document.getElementById('lightbox');
       +
       +        // hide lightbox and overlay
       +        objOverlay.style.display = 'none';
       +        objLightbox.style.display = 'none';
       +        
       +        // disable keypress listener
       +        document.onkeypress = '';
       +}
       +
       +
       +
       +
       +//
       +// initLightbox()
       +// Function runs on window load, going through link tags looking for rel="lightbox".
       +// These links receive onclick events that enable the lightbox display for their targets.
       +// The function also inserts html markup at the top of the page which will be used as a
       +// container for the overlay pattern and the inline image.
       +//
       +function initLightbox()
       +{
       +        
       +        if (!document.getElementsByTagName){ return; }
       +        var anchors = document.getElementsByTagName("a");
       +
       +        // loop through all anchor tags
       +        for (var i=0; i<anchors.length; i++){
       +                var anchor = anchors[i];
       +
       +                if (anchor.getAttribute("href") && (anchor.getAttribute("rel") == "lightbox")){
       +                        anchor.onclick = function () {showLightbox(this); return false;}
       +                }
       +        }
       +
       +        // the rest of this code inserts html at the top of the page that looks like this:
       +        //
       +        // <div id="overlay">
       +        //                <a href="#" onclick="hideLightbox(); return false;"><img id="loadingImage" /></a>
       +        //        </div>
       +        // <div id="lightbox">
       +        //                <a href="#" onclick="hideLightbox(); return false;" title="Click anywhere to close image">
       +        //                        <img id="closeButton" />                
       +        //                        <img id="lightboxImage" />
       +        //                </a>
       +        //                <div id="lightboxDetails">
       +        //                        <div id="lightboxCaption"></div>
       +        //                        <div id="keyboardMsg"></div>
       +        //                </div>
       +        // </div>
       +        
       +        var objBody = document.getElementsByTagName("body").item(0);
       +        
       +        // create overlay div and hardcode some functional styles (aesthetic styles are in CSS file)
       +        var objOverlay = document.createElement("div");
       +        objOverlay.setAttribute('id','overlay');
       +        objOverlay.onclick = function () {hideLightbox(); return false;}
       +        objOverlay.style.display = 'none';
       +        objOverlay.style.position = 'absolute';
       +        objOverlay.style.top = '0';
       +        objOverlay.style.left = '0';
       +        objOverlay.style.zIndex = '90';
       +         objOverlay.style.width = '100%';
       +        objBody.insertBefore(objOverlay, objBody.firstChild);
       +        
       +        var arrayPageSize = getPageSize();
       +        var arrayPageScroll = getPageScroll();
       +
       +        // preload and create loader image
       +        var imgPreloader = new Image();
       +        
       +        // if loader image found, create link to hide lightbox and create loadingimage
       +        imgPreloader.onload=function(){
       +
       +                var objLoadingImageLink = document.createElement("a");
       +                objLoadingImageLink.setAttribute('href','#');
       +                objLoadingImageLink.onclick = function () {hideLightbox(); return false;}
       +                objOverlay.appendChild(objLoadingImageLink);
       +                
       +                var objLoadingImage = document.createElement("img");
       +                objLoadingImage.src = loadingImage;
       +                objLoadingImage.setAttribute('id','loadingImage');
       +                objLoadingImage.style.position = 'absolute';
       +                objLoadingImage.style.zIndex = '150';
       +                objLoadingImageLink.appendChild(objLoadingImage);
       +
       +                imgPreloader.onload=function(){};        //        clear onLoad, as IE will flip out w/animated gifs
       +
       +                return false;
       +        }
       +
       +        imgPreloader.src = loadingImage;
       +
       +        // create lightbox div, same note about styles as above
       +        var objLightbox = document.createElement("div");
       +        objLightbox.setAttribute('id','lightbox');
       +        objLightbox.style.display = 'none';
       +        objLightbox.style.position = 'absolute';
       +        objLightbox.style.zIndex = '100';        
       +        objBody.insertBefore(objLightbox, objOverlay.nextSibling);
       +        
       +        // create link
       +        var objLink = document.createElement("a");
       +        objLink.setAttribute('href','#');
       +        objLink.setAttribute('title','Click to close');
       +        objLink.onclick = function () {hideLightbox(); return false;}
       +        objLightbox.appendChild(objLink);
       +
       +        // preload and create close button image
       +        var imgPreloadCloseButton = new Image();
       +
       +        // if close button image found, 
       +        imgPreloadCloseButton.onload=function(){
       +
       +                var objCloseButton = document.createElement("img");
       +                objCloseButton.src = closeButton;
       +                objCloseButton.setAttribute('id','closeButton');
       +                objCloseButton.style.position = 'absolute';
       +                objCloseButton.style.zIndex = '200';
       +                objLink.appendChild(objCloseButton);
       +
       +                return false;
       +        }
       +
       +        imgPreloadCloseButton.src = closeButton;
       +
       +        // create image
       +        var objImage = document.createElement("img");
       +        objImage.setAttribute('id','lightboxImage');
       +        objLink.appendChild(objImage);
       +        
       +        // create details div, a container for the caption and keyboard message
       +        var objLightboxDetails = document.createElement("div");
       +        objLightboxDetails.setAttribute('id','lightboxDetails');
       +        objLightbox.appendChild(objLightboxDetails);
       +
       +        // create caption
       +        var objCaption = document.createElement("div");
       +        objCaption.setAttribute('id','lightboxCaption');
       +        objCaption.style.display = 'none';
       +        objLightboxDetails.appendChild(objCaption);
       +
       +        // create keyboard message
       +        var objKeyboardMsg = document.createElement("div");
       +        objKeyboardMsg.setAttribute('id','keyboardMsg');
       +        objKeyboardMsg.innerHTML = 'press <kbd>x</kbd> to close';
       +        objLightboxDetails.appendChild(objKeyboardMsg);
       +
       +
       +}
       +
       +
       +
       +
       +//
       +// addLoadEvent()
       +// Adds event to window.onload without overwriting currently assigned onload functions.
       +// Function found at Simon Willison's weblog - http://simon.incutio.com/
       +//
       +function addLoadEvent(func)
       +{        
       +        var oldonload = window.onload;
       +        if (typeof window.onload != 'function'){
       +            window.onload = func;
       +        } else {
       +                window.onload = function(){
       +                oldonload();
       +                func();
       +                }
       +        }
       +
       +}
       +
       +
       +
       +addLoadEvent(initLightbox);        // run initLightbox onLoad
 (DIR) diff --git a/web/public/javascripts/prototype.js b/web/app/assets/javascripts/prototype.js
 (DIR) diff --git a/web/public/javascripts/rails.js b/web/app/assets/javascripts/rails.js
 (DIR) diff --git a/web/app/assets/stylesheets/global.css.erb b/web/app/assets/stylesheets/global.css.erb
       @@ -0,0 +1,556 @@
       +/* 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('<%= asset_path '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('<%= asset_path '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('<%= asset_path '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/web/public/stylesheets/ie7.css b/web/app/assets/stylesheets/ie7.css
 (DIR) diff --git a/web/public/stylesheets/lightbox.css b/web/app/assets/stylesheets/lightbox.css
 (DIR) diff --git a/web/public/stylesheets/overlay.png b/web/app/assets/stylesheets/overlay.png
       Binary files differ.
 (DIR) diff --git a/web/public/stylesheets/scaffold.css b/web/app/assets/stylesheets/scaffold.css
 (DIR) diff --git a/web/app/views/analyze/view.html.erb b/web/app/views/analyze/view.html.erb
       @@ -22,12 +22,12 @@
                
                        <object
                                type="application/x-shockwave-flash"
       -                        data="/images/musicplayer.swf?song_url=<%=resource_analyze_path(@job_id, dial_result.id, "mp3")%>" 
       +                        data="/assets/musicplayer.swf?song_url=<%=resource_analyze_path(@job_id, dial_result.id, "mp3")%>" 
                                width="20"
                                height="17"
                                style="margin-bottom: -5px;"
                                >
       -                        <param name="movie" value="/musicplayer.swf?song_url=<%=resource_analyze_path(@job_id, dial_result.id, "mp3")%>"></param>
       +                        <param name="movie" value="/assets/musicplayer.swf?song_url=<%=resource_analyze_path(@job_id, dial_result.id, "mp3")%>"></param>
                                <param name="wmode" value="transparent"></param>
                        </object>
                        <b><%= dial_result.number %></b>
 (DIR) diff --git a/web/app/views/analyze/view_matches.html.erb b/web/app/views/analyze/view_matches.html.erb
       @@ -13,12 +13,12 @@
                
                        <object
                                type="application/x-shockwave-flash"
       -                        data="/images/musicplayer.swf?song_url=<%=resource_analyze_path(@job_id, dial_result.id, "mp3")%>" 
       +                        data="/assets/musicplayer.swf?song_url=<%=resource_analyze_path(@job_id, dial_result.id, "mp3")%>" 
                                width="20"
                                height="17"
                                style="margin-bottom: -5px;"
                                >
       -                        <param name="movie" value="/musicplayer.swf?song_url=<%=resource_analyze_path(@job_id, dial_result.id, "mp3")%>"></param>
       +                        <param name="movie" value="/assets/musicplayer.swf?song_url=<%=resource_analyze_path(@job_id, dial_result.id, "mp3")%>"></param>
                                <param name="wmode" value="transparent"></param>
                        </object>
                        
       @@ -66,12 +66,12 @@
                        
                        <object
                                type="application/x-shockwave-flash"
       -                        data="/images/musicplayer.swf?song_url=<%=resource_analyze_path(@job_id, dial_result.id, "mp3")%>" 
       +                        data="/assets/musicplayer.swf?song_url=<%=resource_analyze_path(@job_id, dial_result.id, "mp3")%>" 
                                width="20"
                                height="17"
                                style="margin-bottom: -5px;"
                                >
       -                        <param name="movie" value="/musicplayer.swf?song_url=<%=resource_analyze_path(@job_id, dial_result.id, "mp3")%>"></param>
       +                        <param name="movie" value="/assets/musicplayer.swf?song_url=<%=resource_analyze_path(@job_id, dial_result.id, "mp3")%>"></param>
                                <param name="wmode" value="transparent"></param>
                        </object>
                        
 (DIR) diff --git a/web/app/views/layouts/warvox.html.erb b/web/app/views/layouts/warvox.html.erb
       @@ -2,12 +2,10 @@
        <html>
        <head>
          <title><%= @title || "WarVOX" %></title>
       -  <%= stylesheet_link_tag :all %>
       -  <%= javascript_include_tag :defaults %>
          <%= csrf_meta_tag %>
       -  <%= stylesheet_link_tag 'global', 'lightbox' %>
       +  <%= stylesheet_link_tag 'global' %>
          <!--[if IE 7]><%= stylesheet_link_tag 'ie7' %><![endif]-->                
       -  <%= javascript_include_tag 'custom', 'prototype', 'effects', 'FusionCharts', 'lightbox' %>  
       +  <%= javascript_include_tag 'jquery' %>  
        </head>
        <body>
        
       @@ -17,7 +15,7 @@
        
        <div id="content">
                <div class="box_full">
       -        <img src="/images/round_top.png" id="round_top" alt=""/>
       +        <img src="<%= asset_path('round_top.png') %>" id="round_top" alt=""/>
                <div id="main">
        <%= yield %>
                        <br/><br/>
       @@ -27,7 +25,7 @@
                        </div>
                
                </div>
       -        <img src="/images/round_bot.png" id="round_bot" alt=""/>
       +        <img src="<%= asset_path('round_bot.png') %>" id="round_bot" alt=""/>
                </div>
        </div>
        
 (DIR) diff --git a/web/app/views/shared/_header.html.erb b/web/app/views/shared/_header.html.erb
       @@ -1,7 +1,7 @@
        <div id="header">
                
                <span width='50%'>
       -                <a href="/"><img id="logo" src="/images/logo.png" alt="WarVOX v<%= WarVOX::VERSION %>" border="0"/></a>
       +                <a href="/"><img id="logo" src="/assets/logo.png" alt="WarVOX v<%= WarVOX::VERSION %>" border="0"/></a>
                </span>
                
                <span width='50%'>
 (DIR) diff --git a/web/config/application.rb b/web/config/application.rb
       @@ -1,14 +1,16 @@
        require File.expand_path('../boot', __FILE__)
       +require 'rails/all'
        
        # Bootstrap the WarVOX code base
        $:.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
        require 'warvox'
        
       -require 'rails/all'
       -
       -# If you have a Gemfile, require the gems listed there, including any gems
       -# you've limited to :test, :development, or :production.
       -Bundler.require(:default, Rails.env) if defined?(Bundler)
       +if defined?(Bundler)
       +  # If you precompile assets before deploying to production, use this line
       +  Bundler.require(*Rails.groups(:assets => %w(development test)))
       +  # If you want your assets lazily compiled in production, use this line
       +  # Bundler.require(:default, :assets, Rails.env)
       +end
        
        module Web
          class Application < Rails::Application
       @@ -34,13 +36,33 @@ module Web
            # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
            # config.i18n.default_locale = :de
        
       -    # JavaScript files you want as :defaults (application.js is always included).
       -    # config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
       -
            # Configure the default encoding used in templates for Ruby 1.9.
            config.encoding = "utf-8"
        
            # Configure sensitive parameters which will be filtered from the log file.
       +    config.filter_parameters += [:password, :pass]
       +
       +    # Enable escaping HTML in JSON.
       +    config.active_support.escape_html_entities_in_json = true
       +
       +    # Use SQL instead of Active Record's schema dumper when creating the database.
       +    # This is necessary if your schema can't be completely dumped by the schema dumper,
       +    # like if you have constraints or database-specific column types
       +    # config.active_record.schema_format = :sql
       +
       +    # Enforce whitelist mode for mass assignment.
       +    # This will create an empty whitelist of attributes available for mass-assignment for all models
       +    # in your app. As such, your models will need to explicitly whitelist or blacklist accessible
       +    # parameters by using an attr_accessible or attr_protected declaration.
       +    config.active_record.whitelist_attributes = true
       +
       +    # Enable the asset pipeline
       +    config.assets.enabled = true
       +
       +    # Version of your assets, change this if you want to expire all your assets
       +    config.assets.version = '1.0'
       +
       +    # Configure sensitive parameters which will be filtered from the log file.
                config.filter_parameters += [:password, :pass]
            
                config.session_store :cookie_store, :key => "_warvox"
 (DIR) diff --git a/web/config/boot.rb b/web/config/boot.rb
       @@ -1,13 +1,6 @@
        require 'rubygems'
        
        # Set up gems listed in the Gemfile.
       -gemfile = File.expand_path('../../Gemfile', __FILE__)
       -begin
       -  ENV['BUNDLE_GEMFILE'] = gemfile
       -  require 'bundler'
       -  Bundler.setup
       -rescue Bundler::GemNotFound => e
       -  STDERR.puts e.message
       -  STDERR.puts "Try running `bundle install`."
       -  exit!
       -end if File.exist?(gemfile)
       +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
       +
       +require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
 (DIR) diff --git a/web/config/database.yml b/web/config/database.yml
       @@ -8,3 +8,14 @@ production:
          pool: 100
          timeout: 5
        
       +development:
       +  adapter: postgresql
       +  database: warvox
       +  username: warvox
       +  password: "<yourpass>"
       +  host: 127.0.0.1
       +  port: 5433
       +  pool: 100
       +  timeout: 5
       +
       +
 (DIR) diff --git a/web/config/environments/development.rb b/web/config/environments/development.rb
       @@ -1,9 +1,9 @@
        Web::Application.configure do
       -  # Settings specified here will take precedence over those in config/environment.rb
       +  # Settings specified here will take precedence over those in config/application.rb
        
          # In the development environment your application's code is reloaded on
       -  # every request.  This slows down response time but is perfect for development
       -  # since you don't have to restart the webserver when you make code changes.
       +  # every request. This slows down response time but is perfect for development
       +  # since you don't have to restart the web server when you make code changes.
          config.cache_classes = false
        
          # Log error messages when you accidentally call methods on nil.
       @@ -11,7 +11,6 @@ Web::Application.configure do
        
          # Show full error reports and disable caching
          config.consider_all_requests_local       = true
       -  config.action_view.debug_rjs             = true
          config.action_controller.perform_caching = false
        
          # Don't care if the mailer can't send
       @@ -22,5 +21,17 @@ Web::Application.configure do
        
          # Only use best-standards-support built into browsers
          config.action_dispatch.best_standards_support = :builtin
       -end
        
       +  # Raise exception on mass assignment protection for Active Record models
       +  config.active_record.mass_assignment_sanitizer = :strict
       +
       +  # Log the query plan for queries taking more than this (works
       +  # with SQLite, MySQL, and PostgreSQL)
       +  config.active_record.auto_explain_threshold_in_seconds = 0.5
       +
       +  # Do not compress assets
       +  config.assets.compress = false
       +
       +  # Expands the lines which load the assets
       +  config.assets.debug = true
       +end
 (DIR) diff --git a/web/config/environments/production.rb b/web/config/environments/production.rb
       @@ -1,7 +1,6 @@
        Web::Application.configure do
       -  # Settings specified here will take precedence over those in config/environment.rb
       +  # Settings specified here will take precedence over those in config/application.rb
        
       -  # The production environment is meant for finished, "live" apps.
          # Code is not reloaded between requests
          config.cache_classes = true
        
       @@ -9,31 +8,46 @@ Web::Application.configure do
          config.consider_all_requests_local       = false
          config.action_controller.perform_caching = true
        
       -  # Specifies the header that your server uses for sending files
       -  config.action_dispatch.x_sendfile_header = "X-Sendfile"
       +  # Disable Rails's static asset server (Apache or nginx will already do this)
       +  config.serve_static_assets = true
       +
       +  # Compress JavaScripts and CSS
       +  config.assets.compress = false
       +
       +  # Don't fallback to assets pipeline if a precompiled asset is missed
       +  config.assets.compile = true
        
       -  # For nginx:
       -  # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'
       +  # Generate digests for assets URLs
       +  config.assets.digest = true
       +
       +  # Defaults to nil and saved in location specified by config.assets.prefix
       +  # config.assets.manifest = YOUR_PATH
       +
       +  # Specifies the header that your server uses for sending files
       +  # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
       +  # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
        
       -  # If you have no front-end server that supports something like X-Sendfile,
       -  # just comment this out and Rails will serve the files
       +  # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
       +  # config.force_ssl = true
        
          # See everything in the log (default is :info)
       -  config.log_level = :error
       +  config.log_level = :debug
       +
       +  # Prepend all log lines with the following tags
       +  # config.log_tags = [ :subdomain, :uuid ]
        
          # Use a different logger for distributed setups
       -  # config.logger = SyslogLogger.new
       +  # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
        
          # Use a different cache store in production
          # config.cache_store = :mem_cache_store
        
       -  # Disable Rails's static asset server
       -  # In production, Apache or nginx will already do this
       -  config.serve_static_assets = true
       -
       -  # Enable serving of images, stylesheets, and javascripts from an asset server
       +  # Enable serving of images, stylesheets, and JavaScripts from an asset server
          # config.action_controller.asset_host = "http://assets.example.com"
        
       +  # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
       +  config.assets.precompile += %w( jquery.js prototype.js effects.js FusionCharts.js lightbox.js )
       +
          # Disable delivery errors, bad email addresses will be ignored
          # config.action_mailer.raise_delivery_errors = false
        
       @@ -46,5 +60,8 @@ Web::Application.configure do
        
          # Send deprecation notices to registered listeners
          config.active_support.deprecation = :notify
       -end
        
       +  # Log the query plan for queries taking more than this (works
       +  # with SQLite, MySQL, and PostgreSQL)
       +  # config.active_record.auto_explain_threshold_in_seconds = 0.5
       +end
 (DIR) diff --git a/web/config/initializers/inflections.rb b/web/config/initializers/inflections.rb
       @@ -8,3 +8,8 @@
        #   inflect.irregular 'person', 'people'
        #   inflect.uncountable %w( fish sheep )
        # end
       +#
       +# These inflection rules are supported but not enabled by default:
       +# ActiveSupport::Inflector.inflections do |inflect|
       +#   inflect.acronym 'RESTful'
       +# end
 (DIR) diff --git a/web/config/initializers/secret_token.rb b/web/config/initializers/secret_token.rb
       @@ -1,7 +1 @@
       -# Be sure to restart your server when you modify this file.
       -
       -# Your secret key for verifying the integrity of signed cookies.
       -# If you change this key, all old signed cookies will become invalid!
       -# Make sure the secret is at least 30 characters and all random,
       -# no regular words or you'll be exposed to dictionary attacks.
        Web::Application.config.secret_token = WarVOX::Config.load_session_key
 (DIR) diff --git a/web/config/initializers/session_store.rb b/web/config/initializers/session_store.rb
       @@ -1,8 +1,8 @@
        # Be sure to restart your server when you modify this file.
        
       -Web::Application.config.session_store :cookie_store, :key => '_web_session'
       +Web::Application.config.session_store :cookie_store, key: '_warvox_session'
        
        # Use the database for sessions instead of the cookie-based default,
        # which shouldn't be used to store highly confidential information
       -# (create the session table with "rake db:sessions:create")
       -# Web::Application.config.session_store :active_record_store
       +# (create the session table with "rails generate session_migration")
       +# Ttt::Application.config.session_store :active_record_store
 (DIR) diff --git a/web/config/initializers/wrap_parameters.rb b/web/config/initializers/wrap_parameters.rb
       @@ -0,0 +1,14 @@
       +# Be sure to restart your server when you modify this file.
       +#
       +# This file contains settings for ActionController::ParamsWrapper which
       +# is enabled by default.
       +
       +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
       +ActiveSupport.on_load(:action_controller) do
       +  wrap_parameters format: [:json]
       +end
       +
       +# Disable root element in JSON by default.
       +ActiveSupport.on_load(:active_record) do
       +  self.include_root_in_json = false
       +end
 (DIR) diff --git a/web/db/schema.rb b/web/db/schema.rb
       @@ -1,3 +1,4 @@
       +# encoding: UTF-8
        # This file is auto-generated from the current state of the database. Instead
        # of editing this file, please use the migrations feature of Active Record to
        # incrementally modify your database, and then regenerate this schema definition.
       @@ -21,8 +22,8 @@ ActiveRecord::Schema.define(:version => 20110801000003) do
            t.datetime "started_at"
            t.datetime "completed_at"
            t.boolean  "processed"
       -    t.datetime "created_at"
       -    t.datetime "updated_at"
       +    t.datetime "created_at",   :null => false
       +    t.datetime "updated_at",   :null => false
            t.text     "cid_mask"
          end
        
       @@ -36,8 +37,8 @@ ActiveRecord::Schema.define(:version => 20110801000003) do
            t.integer  "ringtime"
            t.text     "rawfile"
            t.boolean  "processed"
       -    t.datetime "created_at"
       -    t.datetime "updated_at"
       +    t.datetime "created_at",                    :null => false
       +    t.datetime "updated_at",                    :null => false
            t.datetime "processed_at"
            t.text     "cid"
            t.float    "peak_freq"
       @@ -65,20 +66,9 @@ ActiveRecord::Schema.define(:version => 20110801000003) do
            t.text     "user"
            t.text     "pass"
            t.integer  "lines"
       -    t.datetime "created_at"
       -    t.datetime "updated_at"
       +    t.datetime "created_at", :null => false
       +    t.datetime "updated_at", :null => false
            t.boolean  "enabled"
          end
        
       -  create_table "signatures", :force => true do |t|
       -    t.datetime "created_at"
       -    t.datetime "updated_at"
       -    t.string   "name"
       -    t.string   "category"
       -    t.text     "description"
       -    t.string   "mode"
       -    t.string   "print",       :limit => nil
       -    t.text     "rules"
       -  end
       -
        end
 (DIR) diff --git a/web/public/javascripts/lightbox.js b/web/public/javascripts/lightbox.js
       @@ -1,426 +0,0 @@
       -/*
       -        Lightbox JS: Fullsize Image Overlays 
       -        by Lokesh Dhakar - http://www.huddletogether.com
       -
       -        For more information on this script, visit:
       -        http://huddletogether.com/projects/lightbox/
       -
       -        Script featured on Dynamic Drive code library Jan 24th, 06':
       -        http://www.dynamicdrive.com
       -
       -        Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
       -        (basically, do anything you want, just leave my name and link)
       -        
       -        Table of Contents
       -        -----------------
       -        Configuration
       -        
       -        Functions
       -        - getPageScroll()
       -        - getPageSize()
       -        - pause()
       -        - getKey()
       -        - listenKey()
       -        - showLightbox()
       -        - hideLightbox()
       -        - initLightbox()
       -        - addLoadEvent()
       -        
       -        Function Calls
       -        - addLoadEvent(initLightbox)
       -
       -*/
       -
       -
       -
       -//
       -// Configuration
       -//
       -
       -// If you would like to use a custom loading image or close button reference them in the next two lines.
       -var loadingImage = '/images/loading.gif';                
       -var closeButton = '/images/close.gif';                
       -
       -
       -
       -
       -
       -//
       -// getPageScroll()
       -// Returns array with x,y page scroll values.
       -// Core code from - quirksmode.org
       -//
       -function getPageScroll(){
       -
       -        var yScroll;
       -
       -        if (self.pageYOffset) {
       -                yScroll = self.pageYOffset;
       -        } else if (document.documentElement && document.documentElement.scrollTop){         // Explorer 6 Strict
       -                yScroll = document.documentElement.scrollTop;
       -        } else if (document.body) {// all other Explorers
       -                yScroll = document.body.scrollTop;
       -        }
       -
       -        arrayPageScroll = new Array('',yScroll) 
       -        return arrayPageScroll;
       -}
       -
       -
       -
       -//
       -// getPageSize()
       -// Returns array with page width, height and window width, height
       -// Core code from - quirksmode.org
       -// Edit for Firefox by pHaez
       -//
       -function getPageSize(){
       -        
       -        var xScroll, yScroll;
       -        
       -        if (window.innerHeight && window.scrollMaxY) {        
       -                xScroll = document.body.scrollWidth;
       -                yScroll = window.innerHeight + window.scrollMaxY;
       -        } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
       -                xScroll = document.body.scrollWidth;
       -                yScroll = document.body.scrollHeight;
       -        } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
       -                xScroll = document.body.offsetWidth;
       -                yScroll = document.body.offsetHeight;
       -        }
       -        
       -        var windowWidth, windowHeight;
       -        if (self.innerHeight) {        // all except Explorer
       -                windowWidth = self.innerWidth;
       -                windowHeight = self.innerHeight;
       -        } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
       -                windowWidth = document.documentElement.clientWidth;
       -                windowHeight = document.documentElement.clientHeight;
       -        } else if (document.body) { // other Explorers
       -                windowWidth = document.body.clientWidth;
       -                windowHeight = document.body.clientHeight;
       -        }        
       -        
       -        // for small pages with total height less then height of the viewport
       -        if(yScroll < windowHeight){
       -                pageHeight = windowHeight;
       -        } else { 
       -                pageHeight = yScroll;
       -        }
       -
       -        // for small pages with total width less then width of the viewport
       -        if(xScroll < windowWidth){        
       -                pageWidth = windowWidth;
       -        } else {
       -                pageWidth = xScroll;
       -        }
       -
       -
       -        arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) 
       -        return arrayPageSize;
       -}
       -
       -
       -//
       -// pause(numberMillis)
       -// Pauses code execution for specified time. Uses busy code, not good.
       -// Code from http://www.faqts.com/knowledge_base/view.phtml/aid/1602
       -//
       -function pause(numberMillis) {
       -        var now = new Date();
       -        var exitTime = now.getTime() + numberMillis;
       -        while (true) {
       -                now = new Date();
       -                if (now.getTime() > exitTime)
       -                        return;
       -        }
       -}
       -
       -//
       -// getKey(key)
       -// Gets keycode. If 'x' is pressed then it hides the lightbox.
       -//
       -
       -function getKey(e){
       -        if (e == null) { // ie
       -                keycode = event.keyCode;
       -        } else { // mozilla
       -                keycode = e.which;
       -        }
       -        key = String.fromCharCode(keycode).toLowerCase();
       -        
       -        if(key == 'x'){ hideLightbox(); }
       -}
       -
       -
       -//
       -// listenKey()
       -//
       -function listenKey () {        document.onkeypress = getKey; }
       -        
       -
       -//
       -// showLightbox()
       -// Preloads images. Pleaces new image in lightbox then centers and displays.
       -//
       -function showLightbox(objLink)
       -{
       -        // prep objects
       -        var objOverlay = document.getElementById('overlay');
       -        var objLightbox = document.getElementById('lightbox');
       -        var objCaption = document.getElementById('lightboxCaption');
       -        var objImage = document.getElementById('lightboxImage');
       -        var objLoadingImage = document.getElementById('loadingImage');
       -        var objLightboxDetails = document.getElementById('lightboxDetails');
       -
       -        
       -        var arrayPageSize = getPageSize();
       -        var arrayPageScroll = getPageScroll();
       -
       -        // center loadingImage if it exists
       -        if (objLoadingImage) {
       -                objLoadingImage.style.top = (arrayPageScroll[1] + ((arrayPageSize[3] - 35 - objLoadingImage.height) / 2) + 'px');
       -                objLoadingImage.style.left = (((arrayPageSize[0] - 20 - objLoadingImage.width) / 2) + 'px');
       -                objLoadingImage.style.display = 'block';
       -        }
       -
       -        // set height of Overlay to take up whole page and show
       -        objOverlay.style.height = (arrayPageSize[1] + 'px');
       -        objOverlay.style.display = 'block';
       -
       -        // preload image
       -        imgPreload = new Image();
       -
       -        imgPreload.onload=function(){
       -                objImage.src = objLink.href;
       -
       -                // center lightbox and make sure that the top and left values are not negative
       -                // and the image placed outside the viewport
       -                var lightboxTop = arrayPageScroll[1] + ((arrayPageSize[3] - 35 - imgPreload.height) / 2);
       -                var lightboxLeft = ((arrayPageSize[0] - 20 - imgPreload.width) / 2);
       -                
       -                objLightbox.style.top = (lightboxTop < 0) ? "0px" : lightboxTop + "px";
       -                objLightbox.style.left = (lightboxLeft < 0) ? "0px" : lightboxLeft + "px";
       -
       -
       -                objLightboxDetails.style.width = imgPreload.width + 'px';
       -                
       -                if(objLink.getAttribute('title')){
       -                        objCaption.style.display = 'block';
       -                        //objCaption.style.width = imgPreload.width + 'px';
       -                        objCaption.innerHTML = objLink.getAttribute('title');
       -                } else {
       -                        objCaption.style.display = 'none';
       -                }
       -                
       -                // A small pause between the image loading and displaying is required with IE,
       -                // this prevents the previous image displaying for a short burst causing flicker.
       -                if (navigator.appVersion.indexOf("MSIE")!=-1){
       -                        pause(250);
       -                } 
       -
       -                if (objLoadingImage) {        objLoadingImage.style.display = 'none'; }
       -                objLightbox.style.display = 'block';
       -
       -                // After image is loaded, update the overlay height as the new image might have
       -                // increased the overall page height.
       -                arrayPageSize = getPageSize();
       -                objOverlay.style.height = (arrayPageSize[1] + 'px');
       -                
       -                // Check for 'x' keypress
       -                listenKey();
       -
       -                return false;
       -        }
       -
       -        imgPreload.src = objLink.href;
       -        
       -}
       -
       -
       -
       -
       -
       -//
       -// hideLightbox()
       -//
       -function hideLightbox()
       -{
       -        // get objects
       -        objOverlay = document.getElementById('overlay');
       -        objLightbox = document.getElementById('lightbox');
       -
       -        // hide lightbox and overlay
       -        objOverlay.style.display = 'none';
       -        objLightbox.style.display = 'none';
       -        
       -        // disable keypress listener
       -        document.onkeypress = '';
       -}
       -
       -
       -
       -
       -//
       -// initLightbox()
       -// Function runs on window load, going through link tags looking for rel="lightbox".
       -// These links receive onclick events that enable the lightbox display for their targets.
       -// The function also inserts html markup at the top of the page which will be used as a
       -// container for the overlay pattern and the inline image.
       -//
       -function initLightbox()
       -{
       -        
       -        if (!document.getElementsByTagName){ return; }
       -        var anchors = document.getElementsByTagName("a");
       -
       -        // loop through all anchor tags
       -        for (var i=0; i<anchors.length; i++){
       -                var anchor = anchors[i];
       -
       -                if (anchor.getAttribute("href") && (anchor.getAttribute("rel") == "lightbox")){
       -                        anchor.onclick = function () {showLightbox(this); return false;}
       -                }
       -        }
       -
       -        // the rest of this code inserts html at the top of the page that looks like this:
       -        //
       -        // <div id="overlay">
       -        //                <a href="#" onclick="hideLightbox(); return false;"><img id="loadingImage" /></a>
       -        //        </div>
       -        // <div id="lightbox">
       -        //                <a href="#" onclick="hideLightbox(); return false;" title="Click anywhere to close image">
       -        //                        <img id="closeButton" />                
       -        //                        <img id="lightboxImage" />
       -        //                </a>
       -        //                <div id="lightboxDetails">
       -        //                        <div id="lightboxCaption"></div>
       -        //                        <div id="keyboardMsg"></div>
       -        //                </div>
       -        // </div>
       -        
       -        var objBody = document.getElementsByTagName("body").item(0);
       -        
       -        // create overlay div and hardcode some functional styles (aesthetic styles are in CSS file)
       -        var objOverlay = document.createElement("div");
       -        objOverlay.setAttribute('id','overlay');
       -        objOverlay.onclick = function () {hideLightbox(); return false;}
       -        objOverlay.style.display = 'none';
       -        objOverlay.style.position = 'absolute';
       -        objOverlay.style.top = '0';
       -        objOverlay.style.left = '0';
       -        objOverlay.style.zIndex = '90';
       -         objOverlay.style.width = '100%';
       -        objBody.insertBefore(objOverlay, objBody.firstChild);
       -        
       -        var arrayPageSize = getPageSize();
       -        var arrayPageScroll = getPageScroll();
       -
       -        // preload and create loader image
       -        var imgPreloader = new Image();
       -        
       -        // if loader image found, create link to hide lightbox and create loadingimage
       -        imgPreloader.onload=function(){
       -
       -                var objLoadingImageLink = document.createElement("a");
       -                objLoadingImageLink.setAttribute('href','#');
       -                objLoadingImageLink.onclick = function () {hideLightbox(); return false;}
       -                objOverlay.appendChild(objLoadingImageLink);
       -                
       -                var objLoadingImage = document.createElement("img");
       -                objLoadingImage.src = loadingImage;
       -                objLoadingImage.setAttribute('id','loadingImage');
       -                objLoadingImage.style.position = 'absolute';
       -                objLoadingImage.style.zIndex = '150';
       -                objLoadingImageLink.appendChild(objLoadingImage);
       -
       -                imgPreloader.onload=function(){};        //        clear onLoad, as IE will flip out w/animated gifs
       -
       -                return false;
       -        }
       -
       -        imgPreloader.src = loadingImage;
       -
       -        // create lightbox div, same note about styles as above
       -        var objLightbox = document.createElement("div");
       -        objLightbox.setAttribute('id','lightbox');
       -        objLightbox.style.display = 'none';
       -        objLightbox.style.position = 'absolute';
       -        objLightbox.style.zIndex = '100';        
       -        objBody.insertBefore(objLightbox, objOverlay.nextSibling);
       -        
       -        // create link
       -        var objLink = document.createElement("a");
       -        objLink.setAttribute('href','#');
       -        objLink.setAttribute('title','Click to close');
       -        objLink.onclick = function () {hideLightbox(); return false;}
       -        objLightbox.appendChild(objLink);
       -
       -        // preload and create close button image
       -        var imgPreloadCloseButton = new Image();
       -
       -        // if close button image found, 
       -        imgPreloadCloseButton.onload=function(){
       -
       -                var objCloseButton = document.createElement("img");
       -                objCloseButton.src = closeButton;
       -                objCloseButton.setAttribute('id','closeButton');
       -                objCloseButton.style.position = 'absolute';
       -                objCloseButton.style.zIndex = '200';
       -                objLink.appendChild(objCloseButton);
       -
       -                return false;
       -        }
       -
       -        imgPreloadCloseButton.src = closeButton;
       -
       -        // create image
       -        var objImage = document.createElement("img");
       -        objImage.setAttribute('id','lightboxImage');
       -        objLink.appendChild(objImage);
       -        
       -        // create details div, a container for the caption and keyboard message
       -        var objLightboxDetails = document.createElement("div");
       -        objLightboxDetails.setAttribute('id','lightboxDetails');
       -        objLightbox.appendChild(objLightboxDetails);
       -
       -        // create caption
       -        var objCaption = document.createElement("div");
       -        objCaption.setAttribute('id','lightboxCaption');
       -        objCaption.style.display = 'none';
       -        objLightboxDetails.appendChild(objCaption);
       -
       -        // create keyboard message
       -        var objKeyboardMsg = document.createElement("div");
       -        objKeyboardMsg.setAttribute('id','keyboardMsg');
       -        objKeyboardMsg.innerHTML = 'press <kbd>x</kbd> to close';
       -        objLightboxDetails.appendChild(objKeyboardMsg);
       -
       -
       -}
       -
       -
       -
       -
       -//
       -// addLoadEvent()
       -// Adds event to window.onload without overwriting currently assigned onload functions.
       -// Function found at Simon Willison's weblog - http://simon.incutio.com/
       -//
       -function addLoadEvent(func)
       -{        
       -        var oldonload = window.onload;
       -        if (typeof window.onload != 'function'){
       -            window.onload = func;
       -        } else {
       -                window.onload = function(){
       -                oldonload();
       -                func();
       -                }
       -        }
       -
       -}
       -
       -
       -
       -addLoadEvent(initLightbox);        // run initLightbox onLoad
 (DIR) diff --git a/web/public/stylesheets/global.css b/web/public/stylesheets/global.css
       @@ -1,556 +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('/images/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('/images/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('/images/balloon.png') 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;
       -}
       -