//  gdash.js - Greg's Dashboard.
//  Provides extensive user-logging information for any website. Links with gdash.php.
//  REQUIRES: gjax.js, gdash.php, gdash_settings.php.
//  gdash_settings.php placed in dashboard client's server, contains database settings.
//  Written by Greg Bowler, Noverber 2009. www.g105b.com/gtools

/*  To use Gdash, simply call the inbuilt javascript function GdashAuto();
 *  You can then access the object globally from gdashObj.
 *  EXAMPLE PAGE:
 *
 *  <html>
 *  <head>
 *      <script type="text/javascript" src="http://g105b.com/gtools/gjax.js"></script>
 *      <script type="text/javascript" src="http://g105b.com/gtools/gdash.js"></script>
 *      <script type="text/javascript">
 *          GdashAuto("site/gdash_settings.php");
 *      </script>
 *  </head>
 *  <body>
 *  </body>
 *  </html>
 *
 *  Note there is no need for any more calls to functions, as GdashAuto handles everything.
 *  However, a forced hit can be made with gdashObj.Hit();
 */
 
var gdashObj;
var gjaxObj;

// Completely automatic function handles everything for Gdash to work.
function GdashAuto(settingsUrl, verbose)
{
    gjaxObj = new Gjax();
    gdashObj = new Gdash(gjaxObj, settingsUrl, verbose);
    window.onload = gdashObj.Hit();
}

function Gdash(gjaxObj, settingsUrl, verbose)
{
    var parent = this;
    this.gjaxObj = gjaxObj;                         // Holds the HTTP connection object 
    this.settingsUrl = (settingsUrl == undefined) ?
        null : settingsUrl;                         // URL of PHP file required to connect to database.
                                                    // Without file, gdash will only alert the log.
        
    this.verbose = (verbose == undefined) ?
        false : verbose;                            // Optional parameter: Should script trigger alerts?
    
    // Perform a 'hit' on the dashboard database. Returns true on success.
    this.Hit = function()
    {
        if(parent.gjaxObj != undefined)             // Ensures gjax object is defined, else returns false
        {
            parent.gjaxObj.MakePostRequest("http://g105b.com/gtools/gdash.php", parent.GetUserInfo());
        }
        else
        {
            // Only output error if in verbose mode
            if(parent.verbose)alert("Dashboard error:\ngjax object undefined.");
            return false;
        }
    }
    
    // Builds user info array.
    this.GetUserInfo = function()
    {
        var dashboard_info = "";                    // Initialise string.
        dashboard_info += parent.SettingsUrl();   
        dashboard_info += parent.CurrentUrl();
        dashboard_info += parent.Referrer();    
        dashboard_info += parent.ScreenInfo();
        dashboard_info += parent.BrowserInfo();
        dashboard_info += parent.Plugins();
        
        return dashboard_info;                      // Return built string.
    }
    
    this.SettingsUrl = function()
    {
        var dashboard_settings_info = "dashboard_settingsUrl=";
        dashboard_settings_info += parent.settingsUrl;

        return dashboard_settings_info;
    }
    
    this.CurrentUrl = function()
    {
        var dashboard_currentUrl_info = "&dashboard_currentUrl=";
        dashboard_currentUrl_info += window.location;
        
        return dashboard_currentUrl_info;
    }
    
    // Returns URL of where user was referred to this site (if any).
    this.Referrer = function()
    {
        var dashboard_referrer_info = "&dashboard_referrer=";
        dashboard_referrer_info += document.referrer != ""
                                    ? document.referrer : "NoRef";
        
        return dashboard_referrer_info;
    }
    
    // Returns screen size and browser viewport size.
    this.ScreenInfo = function()
    {
        var dashboard_screen_info = "";
        dashboard_screen_info += "&dashboard_screenWidth=" + screen.width;
        dashboard_screen_info += "&dashboard_screenHeight=" + screen.height;
        dashboard_screen_info += "&dashboard_innerWidth=" + window.innerWidth;
        dashboard_screen_info += "&dashboard_innerHeight=" + window.innerHeight;
        return dashboard_screen_info;
    }
    
    // Returns browser name and version.
    this.BrowserInfo = function()
    {
        var nVer = navigator.appVersion;
        var nAgt = navigator.userAgent;
        var browserName  = navigator.appName;
        var fullVersion  = '' + parseFloat(navigator.appVersion); 
        var majorVersion = parseInt(navigator.appVersion, 10);
        var nameOffset, verOffset, ix;
        
        // Detect Internet Explorer.
        if ((verOffset = nAgt.indexOf("MSIE")) != -1)
        {
            browserName = "Microsoft Internet Explorer";
            fullVersion = nAgt.substring(verOffset + 5);
        }
        // Detect Opera.
        else if ((verOffset = nAgt.indexOf("Opera")) != -1)
        {
            browserName = "Opera";
            fullVersion = nAgt.substring(verOffset + 6);
        }
        // Detect Chrome.
        else if ((verOffset = nAgt.indexOf("Chrome")) != -1)
        {
            browserName = "Chrome";
            fullVersion = nAgt.substring(verOffset + 7);
        }
        // Detect Safari.
        else if ((verOffset = nAgt.indexOf("Safari")) != -1)
        {
            browserName = "Safari";
            fullVersion = nAgt.substring(verOffset + 7);
        }
        // Detect Firefox.
        else if ((verOffset = nAgt.indexOf("Firefox")) != -1)
        {
            browserName = "Firefox";
            fullVersion = nAgt.substring(verOffset + 8);
        }
        // Detect iPhone.
        else if ((verOffset = nAgt.indexOf("iPhone")) != -1)
        {
            browserName = "iPhone";
            fullVersion = nAgt.substring(verOffset + 29);
        }
        // In most other browsers, "name/version" is at the end of userAgent 
        else if ( (nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/')) ) 
        {
            browserName = nAgt.substring(nameOffset, verOffset);
            fullVersion = nAgt.substring(verOffset + 1);
            if (browserName.toLowerCase() == browserName.toUpperCase())
            {
                browserName = navigator.appName;
            }
        }
        
        // Trim the fullVersion string at semicolon/space if present.
        if ((ix = fullVersion.indexOf(";")) != -1) fullVersion = fullVersion.substring(0, ix);
        if ((ix = fullVersion.indexOf(" ")) != -1) fullVersion = fullVersion.substring(0, ix);

        majorVersion = parseInt('' + fullVersion, 10);
        if (isNaN(majorVersion))
        {
            fullVersion  = '' + parseFloat(navigator.appVersion); 
            majorVersion = parseInt(navigator.appVersion, 10);
        }
        
        var osName = "Undetected";
        
        var osList =
        [['Windows 3.11', 'Win16'],
        ['Windows 95', 'Windows 95'],
        ['Windows 95', 'Win95'],
        ['Windows 95', 'Windows_95'],
        ['Windows 98', 'Windows 98'],
        ['Windows 98', 'Win98'],
        ['Windows 2000', 'Windows NT 5.0'],
        ['Windows 2000', 'Windows 2000'],
        ['Windows XP', 'Windows NT 5.1'],
        ['Windows XP', 'Windows XP'],
        ['Windows Server 2003', 'Windows NT 5.2'],
        ['Windows Vista', 'Windows NT 6.0'],
        ['Windows 7', 'Windows NT 6.1'],
        ['Windows NT 4.0', 'Windows NT 4.0'],
        ['Windows NT 4.0', 'WinNT4.0'],
        ['Windows NT 4.0', 'WinNT'],
        ['Windows ME', 'Windows ME'],
        ['Open BSD', 'OpenBSD'],
        ['Sun OS', 'SunOS'],
        ['Linux', 'Linux'],
        ['Linux', 'X11'],
        ['Mac OS', 'Mac_PowerPC'],
        ['Mac OS', 'Macintosh'],
        ['QNX', 'QNX'],
        ['BeOS', 'BeOS'],
        ['OS/2', 'OS/2'],
        ['iPhone', 'iPhone'],
        ['Search Bot', 'nuhk'],
        ['Search Bot', 'Googlebot'],
        ['Search Bot', 'Yammybot'],
        ['Search Bot', 'Openbot'],
        ['Search Bot', 'Slurp'],
        ['Search Bot', 'MSNBot'],
        ['Search Bot', 'Ask Jeeves'],
        ['Search Bot', 'ia_archiver']];

        for(i = 0; i < osList.length; i++)
        {
            var osMatch = osList[i][1].toLowerCase();
            var result = nAgt.toLowerCase().indexOf(osMatch);
            
            if(result >= 0)
            {
                osName = osList[i][0];
            }
        }

        // Build the string to return:
        var dashboard_browser_info = "";
        dashboard_browser_info += "&dashboard_browserName=" + browserName;
        dashboard_browser_info += "&dashboard_browserVersion=" + fullVersion;    
        dashboard_browser_info += "&dashboard_operatingSystem=" + osName;
        
        return dashboard_browser_info;
    }
    
    this.Plugins = function()
    {
        var dashboard_plugins_info = "&dashboard_plugins=[";
        numPlugins = navigator.plugins.length;              // Obtain number of installed plugins.
        if (numPlugins > 0)
        {
            // There are plugins installed, loop through each.
            for (i = 0; i < numPlugins; i++)
            {
                plugin = navigator.plugins[i];
                dashboard_plugins_info += plugin.name;
                dashboard_plugins_info += "; ";
            }
            dashboard_plugins_info += "]";
        }
        
        return dashboard_plugins_info;
    }
}