﻿//-----------------------------------------------------------------------------
// XApp
//
// Copyright 2005-2010 - Xcential Group LLC.
//
//-----------------------------------------------------------------------------

//=============================================================================
// Constructor

function XApp()
{

   //--------------------------------------------------------------------------
   // Private Interface

   //--------------------------------------------------------------------------
   // Privileged Interface

   //--------------------------------------------------------------------------
   // Initialization

   var oMode = null;

}

XApp.objectClass = "XApp";

//=============================================================================
// Static Interface

XApp.APPLICATION_MODEL = "calm";

XApp.APPLICATION_NAME = "LegisWeb";
XApp.APPLICATION_NAME_TRADE = "LegisWeb&trade;";
XApp.APPLICATION_NAME_HTML = "<b class=\"Color0\">Legis</b>Web<span class=\"BannerApplicationNameTM Text5S\">&trade;</span>";

XApp.APPLICATION_LABELS = [
   "Know it all, from Bill to Law",
   "THE Source for California Legislation",
   "THE Place to go for California Legislation",
   "THE Low-Cost Bill Tracking Solution",
   "FREE California Bill Tracking",
   "California Bill Tracking for Everyone",
   "California Bill Tracking made Easy",
   "Your Eye on the Capitol",
   "Legislation, Now in Color",
   ""
];
XApp.APPLICATION_LABEL = XApp.APPLICATION_LABELS[7];

XApp.COPYRIGHT = "&#169; " + (new Date()).getFullYear() + ", Xcential Group LLC.";

XApp.DEFAULT_DOMAIN = "www.legisweb.com";
XApp.DEFAULT_SITE_PATH = "c:\\\\inetpub\\wwwroot";
XApp.DOMAIN_MATCH = "http\:\\/\\/(.*?legisweb\\.com|.*?legisweb\\.net|localhost|127\\.0\\.0\\.1|asterix)";

XApp.URL_APP                     = "/app/";
XApp.URL_MODEL                   = "/app/pkgs/";
XApp.URL_CACHE                   = "/cache/";
XApp.URL_MEDIA                   = "/mediaFiles/";
XApp.URL_REPORTING               = "/reporting/";
XApp.URL_DOCUMENTATION           = "/documentation/";
XApp.URL_THEEYE                  = "/theeye/";
XApp.URL_NEWS                    = "/theeye/";

XApp.URL_APP_CONFIG              = XApp.URL_APP + "config/Application.xml";
XApp.URL_MODEL_CONFIG            = XApp.URL_APP + "config/Properties.xml";

XApp.URL_LOCATION_MAP            = XApp.URL_APP + "config/LocationMap.xml";
XApp.URL_TRANSFORMS              = XApp.URL_APP + "config/Transforms.xml";
XApp.URL_OPEN_SEARCH_DESCRIPTION = XApp.URL_MODEL + "search/OpenSearchDescription.xml";
XApp.URL_ANNOUNCEMENTS           = XApp.URL_MODEL + "feeds/Announcements.atom";
XApp.URL_HELP                    = XApp.URL_DOCUMENTATION + "LegisWeb-Bill-Tracking-Guide-v2.4.0.htm";
XApp.URL_HELP_PDF                = XApp.URL_DOCUMENTATION + "LegisWeb-Bill-Tracking-Guide-v2.4.0.pdf";

XApp.URL_DASHBOARD               = XApp.URL_APP + "Dashboard.asp";
XApp.URL_FAVICON                 = XApp.URL_APP + "images/favicon.ico";
XApp.URL_LOGIN_FORM              = XApp.URL_APP + "pkgs/login/Login.Form.asp";
XApp.URL_MEMBER_INFO             = XApp.URL_APP + "pkgs/membership/MemberInfo.asp";
XApp.URL_LOGOUT                  = XApp.URL_APP + "pkgs/login/Logout.asp";

XApp.URL_FEEDS                   = XApp.URL_CACHE + "ca/feeds/";

XApp.DEBUG = false;

XApp.CACHE_VALID_SINCE_DATE = "3/10/2008";

XApp.ITEMS_PER_PAGE         = 20;

//-----------------------------------------------------------------------------

XApp.ACCOUNT_INFO_DISPLAY   = "none";
XApp.ACCOUNT_LOGOUT_DISPLAY = "none";
XApp.ACCOUNT_LOGIN_DISPLAY  = "none";
XApp.ACCOUNT_HOME_DISPLAY   = "inline";
XApp.ACCOUNT_NEW_DISPLAY    = "inline";

XApp.URL_AUTO               = "auto";

XApp.MODE_SERVER            = "server";
XApp.MODE_CLIENT            = "client";
XApp.MODE_STANDALONE        = "standalone";

XApp.EVENT_UNKNOWN          = "unknown";
XApp.EVENT_RETRIEVE         = "retrieve";
XApp.EVENT_CACHING          = "caching";
XApp.EVENT_SET_COOKIE       = "set_cookie";
XApp.EVENT_GET_COOKIE       = "get_cookie";
XApp.EVENT_ERROR            = "error";

XApp.LOCATION_SESSION_CACHE = "session_cache";
XApp.LOCATION_FILE_CACHE    = "file_cache";
XApp.LOCATION_HTTP          = "http";
XApp.LOCATION_FILE_SYSTEM   = "file_system";

XApp.SERVICE_LEGISWEB       = 0;
XApp.SERVICE_TWITTER        = 1;
XApp.SERVICE_FACEBOOK       = 2;
XApp.SERVICE_DELICIOUS      = 3;
XApp.SERVICE_BLOGGER        = 4;
XApp.SERVICE_GOOGLE         = 5;
XApp.SERVICE_YAHOO          = 6;
XApp.SERVICE_MICROSOFT      = 7;
XApp.SERVICE_NEWS           = 8;

XApp.SERVICE = [];
XApp.SERVICE[XApp.SERVICE_LEGISWEB]  = "LegisWeb";
XApp.SERVICE[XApp.SERVICE_TWITTER]   = "Twitter";
XApp.SERVICE[XApp.SERVICE_FACEBOOK]  = "FaceBook";
XApp.SERVICE[XApp.SERVICE_DELICIOUS] = "Delicious";
XApp.SERVICE[XApp.SERVICE_BLOGGER]   = "Blogger";
XApp.SERVICE[XApp.SERVICE_GOOGLE]    = "Google";
XApp.SERVICE[XApp.SERVICE_YAHOO]     = "Yahoo";
XApp.SERVICE[XApp.SERVICE_MICROSOFT] = "Microsoft";
XApp.SERVICE[XApp.SERVICE_NEWS]      = "News";

//-----------------------------------------------------------------------------

XApp.FORMAT = new Array();
XApp.MEDIA_TYPE = new Array();

XApp.define = function(format, mediaType)
{
   XApp.FORMAT[format] = []; XApp.FORMAT[format].mediaType = mediaType;
   XApp.MEDIA_TYPE[mediaType] = []; XApp.MEDIA_TYPE[mediaType].format = format;
}

XApp.define("xml",  "text/xml");
XApp.define("html", "text/html");
XApp.define("pdf",  "application/pdf");
XApp.define("rss",  "application/rss+xml");
XApp.define("rss1", "application/rss1+xml");
XApp.define("atom", "application/atom+xml");
XApp.define("rdf",  "application/rdf+xml");
XApp.define("slim", "application/slim+xml");

XApp.getFormat = function(mediaType)
{
   try
   {
      var format = XApp.MEDIA_TYPE[mediaType].format;
   }
   catch (error)
   {
      format = null;
   }

   return (format) ? format : "text/" + format;
}

XApp.getMediaType = function(format)
{
   try
   {
      var mediaType = XApp.FORMAT[format].mediaType;
   }
   catch (error)
   {
      mediaType = null;
   }

   return (mediaType) ? mediaType : format.replace(/^[^\/]*\/([^\+]+).*$/, "$1");
}

//-----------------------------------------------------------------------------

XApp.valueOf = function()
{

   return XApp.APPLICATION_NAME;
}

//-----------------------------------------------------------------------------

XApp.getMode = function()
{

   if (this.oMode == null)
   {
      try
      {
         var document = window.document;
         this.oMode = XApp.MODE_CLIENT;
      }
      catch (error)
      {
         try
         {
            var request = Request;
            this.oMode = XApp.MODE_SERVER;
         }
         catch (error)
         {
            // Do not log this as an error
            this.oMode = XApp.MODE_STANDALONE;
         }
      }
   }

   return this.oMode;
}

//-----------------------------------------------------------------------------

XApp.getUserAgent = function()
{

   try // Client-Side
   {
      var userAgent = window.navigator.userAgent;
   }
   catch (error) // Server-Side
   {
      try
      {
         var userAgent = XString(Request.ServerVariables("HTTP_USER_AGENT") + "").trim();
      }
      catch (error)
      {
         var userAgent = "Unknown";
      }
   }

   return userAgent;
}

XApp.userAgent = XApp.getUserAgent();

//-----------------------------------------------------------------------------

XApp.getBrowserName = function()
{

   // NOTE: While sniffing the user agent string is unreliable, what better
   //       alternative is there?

   var userAgent = XApp.userAgent;

   // NOTE: The order of these is important. For instance, Opera tries to fake
   //       out IE and newer versions of Netscape build upon Firefox.

   // Opera
   //   Opera/8.5 (Macintosh; PPC Mac OS X; U; en)
   //   Mozilla/4.0 (compatible; MSIE 6.0; Mac_PowerPC Mac OS X; en) Opera 8.5

   if ((/Opera[\/\s]/).test(userAgent))
      return "Opera";

   // Chrome
   //   Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.X.Y.Z Safari/525.13.

   if ((/Chrome[\/\s]/).test(userAgent)) // Be careful to not be mistaken for Safari
      return "Chrome";

   // Safari
   //   Mozilla/5.0 (Windows; U; Windows NT 5.1; bg) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1
   //   Mozilla/5.0 (Windows; U; Windows NT 5.1; ru) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3
   //   Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8

   if ((/Safari[\/\s]/).test(userAgent))
      return "Safari";

   // Camino
   //   Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.5b) Gecko/20030917 Camino/0.7+

   if ((/Camino[\/\s]/).test(userAgent))
      return "Camino";

   // Internet Explorer
   //   Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 1.1.4322; .NET CLR 3.5.21022; InfoPath.2)
   //   Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506; Alexa Toolbar)
   //   Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)
   //   Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; NeosBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)

   if ((/MSIE\s/).test(userAgent))
      return "MSIE"

   // Netscape
   //   Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.5pre) Gecko/20070712 Firefox/2.0.0.4 Navigator/9.0b2
   //   Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax)
   //   Mozilla/5.0 (Windows; U; WinNT4.0; en-CA; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1
   //   Mozilla/4.8 [en] (X11; U; Linux 2.4.20-8 i686) Mozilla/3.01 (WinNT; I) [AXP]

   if ((/Navigator[\/\s]/).test(userAgent) || (/Netscape[0-9\/\s]/).test(userAgent))
      return "Netscape"

   // Firefox
   //   Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9a7) Gecko/2007080210 GranParadiso/3.0a7
   //   Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9a4pre) Gecko/20070402 Minefield/3.0a4pre
   //   Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6
   //   Mozilla/5.0 (X11; U; Darwin Power Macintosh; en-US; rv:1.8.0.12) Gecko/20070803 Firefox/1.5.0.12 Fink Community Edition
   //   Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.10) Gecko/20050716 Thunderbird/1.0.6

   if ((/Firefox[\/\s/]/).test(userAgent) || (/GranParadiso[\/\s/]/).test(userAgent) || (/Minefield[\/\s/]/).test(userAgent) || (/Thunderbird[\/\s/]/).test(userAgent))
      return "Firefox"

   return "Unsupported";
}

XApp.getBrowserVersion = function()
{

   var browserName = XApp.getBrowserName();
   var browserVersion = "";

   switch (browserName)
   {
      case "Opera":
         if (XMatch(XApp.userAgent, /Opera[\/\s]([0-9\.]+)/))
            browserVersion = XMatch.matches[1];
         break;
      case "Chrome":
         if (XMatch(XApp.userAgent, /Chrome[\/\s]([0-9\.]+)/))
            browserVersion = XMatch.matches[1];
         break;
      case "Safari":
         if (XMatch(XApp.userAgent, /Safari[\/\s]([0-9\.]+)/))
            browserVersion = XMatch.matches[1];
         break;
      case "Camino":
         if (XMatch(XApp.userAgent, /Camino[\/\s]([0-9\.]+)/))
            browserVersion = XMatch.matches[1];
         break;
      case "MSIE":
         if (XMatch(XApp.userAgent, /MSIE[\/\s]([0-9\.]+)/))
            browserVersion = XMatch.matches[1];
         //browserVersion = "8.0";
         break;
      case "Netscape":
         if (XMatch(XApp.userAgent, /Navigator[\/\s]([0-9\.]+)/) || XMatch(XApp.userAgent, /Netscape[0-9]*[\/\s]([0-9\.]+)/))
            browserVersion = XMatch.matches[1];
         break;
      case "Firefox":
         if (XMatch(XApp.userAgent, /Firefox[\/\s]([0-9\.]+)/) || XMatch(XApp.userAgent, /GranParadiso[0-9]*[\/\s]([0-9\.]+)/)  || XMatch(XApp.userAgent, /Minefield[0-9]*[\/\s]([0-9\.]+)/) || XMatch(XApp.userAgent, /Thunderbird[0-9]*[\/\s]([0-9\.]+)/))
            browserVersion = XMatch.matches[1];
         break;
   }

   return browserName + " " + browserVersion;
}

XApp.isBrowser = function(
   browserName,
   minVersion,
   maxVersion
)
{
   minVersion = (minVersion == null) ? 0 : minVersion;
   maxVersion = (maxVersion == null) ? 10000 : maxVersion;

   if (browserName != XApp.browserName)
      return false;

   var version = Number(XApp.browserVersion.replace(/^[^\s]*\s*/,"").replace(/[^0-9\.]/,"").replace(/^([0-9]+\.[0-9]+).*$/, "$1"));

   if (version < minVersion)
      return false;
   if (version > maxVersion)
      return false;

   return true;
}

XApp.browserName = XApp.getBrowserName();
XApp.browserVersion = XApp.getBrowserVersion();

//-----------------------------------------------------------------------------

XApp.getXmlHttpRequest = function()
{

   if (XApp.getMode() == XApp.MODE_STANDALONE)
      return new ActiveXObject("MSXML2.ServerXMLHTTP");
   else if (XApp.getMode() == XApp.MODE_SERVER)
      return new ActiveXObject("MSXML2.ServerXMLHTTP");
   else if (window.XMLHttpRequest)
      return new XMLHttpRequest();
   else
      return new ActiveXObject("MSXML2.XMLHTTP");

}

//-----------------------------------------------------------------------------

XApp.getResponseText = function(
   httpRequest,
   charSet
)
{
   charSet = (charSet == null) ? "utf-8" : charSet.toLowerCase();

   if (charSet == "utf-8")
      return httpRequest.responseText;

   var stream = new ActiveXObject("ADODB.Stream");
   stream.type = 1; // adTypeBinary
   stream.open ();
   stream.write(httpRequest.responseBody);
   stream.position = 0;
   stream.type = 2; // adTypeText;
   stream.charSet = charSet;
   return stream.readText(stream.size);
}

//-----------------------------------------------------------------------------

XApp.localhostURL = "http://127.0.0.1";

XApp.setDomainURL = function(
   domainURL
)
{
   domainURL = (domainURL == null) ? null : domainURL;

   XApp.domainURL = domainURL;
   XApp.localhostURL = domainURL;

   return domainURL;
}

//-----------------------------------------------------------------------------

XApp.getDomainURL = function(
   localhost
)
{
   localhost = (localhost == null) ? ((XApp.getMode() == XApp.MODE_STANDALONE) ? true : false) : localhost;

   if (localhost)
      return XApp.localhostURL;

   if (XApp.domainURL)
      return XApp.domainURL;

   var serverName = null;
   var serverPort = 80;

   try // Client-Side
   {
      serverName = window.location.hostname;
      serverPort = window.location.port;
   }
   catch (error) // Server-Side
   {
      try
      {
         serverName = XServer.getVariable("SERVER_NAME");
         serverPort = Number(XServer.getVariable("SERVER_PORT"));
      }
      catch (error)
      {
         return null;
      }
   }

   var domainURL = "http://";
   domainURL += ((XString(serverName).isSomething()) ? serverName : XApp.DEFAULT_DOMAIN);
   domainURL += (!serverPort || serverPort == 80 || serverPort == 443) ? "" : ":" + serverPort;

   return domainURL;
}

//-----------------------------------------------------------------------------

XApp.getStdURL = function(
   url
)
{
   url = (url == null) ? null : url;

   if (!url || url == "")
      return url;

   url = url.replace(RegExp(XApp.DOMAIN_MATCH), "http://" + XApp.DEFAULT_DOMAIN);

   return url;
}

//-----------------------------------------------------------------------------

XApp.getCurrentURL = function(
   url
)
{
   url = (url == null) ? null : url;

   if (!url || url == "")
      return url;

   url = url.replace(RegExp(XApp.DOMAIN_MATCH), XApp.getDomainURL());

   return url;
}

//-----------------------------------------------------------------------------

XApp.setSitePath = function(
   sitePath
)
{
   sitePath = (sitePath == null) ? XApp.DEFAULT_SITE_PATH : sitePath;

   XApp.sitePath = sitePath.replace(/\\$/,"");

   return XApp.sitePath;
}

//-----------------------------------------------------------------------------

XApp.getSitePath = function()
{

   return (XApp.sitePath) ? XApp.sitePath : XApp.DEFAULT_SITE_PATH;
}

//-----------------------------------------------------------------------------

XApp.isApplication = function(
   model
)
{

   return (model == XApp.APPLICATION_MODEL) ? true : false;
}

//-----------------------------------------------------------------------------

XApp.getCallingContext = function()
{

   var caller = XApp.getCallingContext.caller;
   if (caller == null)
      return null;

   caller = caller.caller;
   if (caller == null)
      return null;

   var callingContext = "";
   var callCount = 0;
   var callLimit = 3;
   while (caller)
   {
      var callerText = caller.toString();
      if (XMatch(callerText, /^function\s+([^\(]+)/))
      {
         var callerName = XMatch.matches[1];
         if (callerName == "anonymous" && XApp.getMode() == XApp.MODE_CLIENT)
            callerName = window.document.URLUnencoded;
         else if (callerName == "anonymous" && XApp.getMode() == XApp.MODE_SERVER)
            callerName = XServer.getVariable("URL")
         else
            callerName = callerName + "()";
         callingContext = callerName + ((callingContext.length > 0) ? ">" + callingContext : "");
      }
      caller = caller.caller;
      callCount++;
      if (callCount > callLimit)
      {
         callingContext = "...>" + callingContext;
         break;
      }
   }

   return callingContext;
}

//-----------------------------------------------------------------------------

XApp.openDashboard = function(
   ref
)
{
   ref = (ref == null) ? null : ref;

   if (XApp.getMode() == XApp.MODE_CLIENT)
   {
      args = (XString(ref).isSomething()) ? "?ref=" + encodeURIComponent(ref) : "";
      // XUI.openWindow("/app/Dashboard.asp" + args, "legisWeb", "toolbar=no,menubar=no,scrollbars=no,titlebar=no,status=no,resizable=yes");
      XUI.openWindow("/app/Dashboard.asp" + args, "_top", "toolbar=no,menubar=no,scrollbars=no,titlebar=no,status=no,resizable=yes");
   }

}

//-----------------------------------------------------------------------------

XApp.logEvent = function(
   eventName,
   data1,
   data2,
   context
)
{
   eventName = (eventName == null) ? XApp.EVENT_UNKNOWN : eventName;
   data1 = (data1 == null) ? null : data1;
   data2 = (data2 == null) ? null : data2;
   context = (context == null) ? XApp.getCallingContext() : context;

   if (XApp.getMode() == XApp.MODE_SERVER)
      XServer.logEvent(eventName, data1, data2, context);
   else if (XApp.getMode() == XApp.MODE_CLIENT)
      XClient.logEvent(eventName, data1, data2, context);

}

//=============================================================================

