//  Copyright (c) 1999, 2000 Oracle Corporation.  All rights reserved.
//
//  NAME
//       webdisc.js.
//  FUNCTION
//       JavaScripts for use with the WebDiscoverer HTML pages.
//
//  NOTES
//
//  MODIFIED
//    adevi    - 06 Feb 03 - Bugfix 2487469
//    ncochran - 01 May 01 - Tweaked names of identifier parameters
//    ncochran - 16 Jan 01 - added support for supplying identifiers instead of names for worksheets, workbooks and parameters
//    kbaldwin - 14 Feb 00 - added default locale, modified ReadCookie to return null
//    kbaldwin - 11 Jan 00 - added Default* parameters.
//    kbaldwin - 05 Jan 00 - replaced regexp's
//    kbaldwin - 02 Dec 99 - added default parameters
//    kbaldwin - 01 Dec 99 - removed cookie functions except for ReadCookie
//                         - changed tagArray to behave like a hash to solve
//                           multiple params with the same name
//    kbaldwin - 30 Nov 99 - removed language functionality
//    kbaldwin - 25 Oct 99 - changed welcome_content.html to welcome.htm
//			   - added languages thai, turkish, greek,
//			     canadian french, slovak, and romanian
//    btsulliv - 07/20/99 -  Merge in UK Apps Invocation Changes
//    rchard   - 10/08/98 -  Creation
//

var COOKIE_LOCALE = "OracleDiscoverer4iLocale";

var debug = false;
var defaultParamName = new Array(0);
var defaultParamValue = new Array(0);
defaultParamName[0] = "WindowHeight";
defaultParamValue[0] = 600;
defaultParamName[1] = "Username";
defaultParamValue[1] = "";
defaultParamName[2] = "Connect";
defaultParamValue[2] = "";
defaultParamName[3] = "UseLocator";
defaultParamValue[3] = "YES";
defaultParamName[4] = "UseOSAgent";
defaultParamValue[4] = "YES";
defaultParamName[5] = "UseURLNaming";
defaultParamValue[5] = "YES";
defaultParamName[6] = "FrameDisplayStyle";
defaultParamValue[6] = "separate";
var lcl = ReadCookie(COOKIE_LOCALE);
if (lcl!=null)
{
  defaultParamName[7] = "Locale";
  defaultParamValue[7] = lcl;
}


function ReadCookie(pageTitle)
{
   var searchString = pageTitle + "=";
   var resultString = "";
   var start = 0;
   var end   = 0;

   if (document.cookie.length > 0)  // There are cookies
   {
      pos = document.cookie.indexOf(searchString);
      if (pos != -1)  // Our cookie is there
      {
         start = pos + searchString.length;
         end   = document.cookie.indexOf(";",start);

         if (end == -1)
         {
            end = document.cookie.length;
         }
         resultString = (document.cookie.substring(start,end));
         return resultString;
      }
   }
   return null;
}


// constructParamTags(paramstr, jinit)
//  
// Given a string containing a list of parameter pairs in standard URL format,
// construct a list of applet PARAM tags, and write them to the current HTML document.
// Also reads the cookie file for the Apps secure ticket and, if found, constructs a PARAM tag
// with name "Ticket" and value from cookie file. The default name of the cookie value is
// "ICX_SESSION_ID". See below for overriding this name.
// See below for a list of URL parameter names which cause special actions, otherwise a 
// standard PARAM tag pair of the format :
//    <PARAM NAME="xxx" VALUE="yyy">
// is constructed from a URL parameter pair of the format :
//    xxx=yyy
//
// INPUT :
//   paramstr - a string containing a list of parameter pairs in standard URL format
//   jinit - a boolean specifying the format of the param tag - if TRUE then construct in a format
//           for JInitiator :
//               <param name> = "<param value>"
// RETURNS :
//   nothing
//
// Special parameters
// ------------------
//
// Connect=<connect string>
//   - constructs PARAM tag of the type :
//     <PARAM NAME="AutoConnect" VALUE="<connect string>">
//
// DefaultUsername=<string>
//   - constructs PARAM tag of the type :
//     <PARAM NAME="Username" VALUE="<string>">
//
// DefaultPassword=<string>
//   - constructs PARAM tag of the type :
//     <PARAM NAME="Password" VALUE="<string>">
//
// DefaultConnect=<string>
//   - constructs PARAM tag of the type :
//     <PARAM NAME="Connect" VALUE="<string>">
//
// opendb=<worbook name>
//   - constructs 2 PARAM tag of the type :
//     <PARAM NAME="WorkbookName" VALUE="<worbook name>">
//     <PARAM NAME="WorkbookSource" VALUE="Database">
// 
// opendbid=<worbook id>
//   - constructs 2 PARAM tag of the type :
//     <PARAM NAME="WorkbookId" VALUE="<worbook id>">
//     <PARAM NAME="WorkbookSource" VALUE="Database">
//   - This will take precedence over opendb if both are present, the id is the developer key.
//     
// SessionCookieName=<cookie name>
//   - attempts to get value from the cookie file with name given by <cookie name>
//     and constructs PARAM tag of the type :
//     <PARAM NAME="Ticket" VALUE="<cookie value>">
//   - this provides a means of overriding the default name of the cookie value which contains
//     the secure "ticket"
//   - if not found, then the default name "ICX_SESSION_ID" is used.
//
// param_<sheet param name>=<sheet param value>
//   - constructs PARAM tag of the type :
//     <PARAM NAME="Parameter<x>" VALUE="<sheet param name>=<sheet param value>">
//     - where <x> is an integer > 0.
//
function constructParamTags(paramstr, jinit)
{
  var pName = new Array(0);
  var pValue = new Array(0);
  constructParamTagsOverride(paramstr, jinit, pName, pValue);
}

function constructParamTagsOverride(paramstr, jinit, pName, pValue)
{
  if (debug == true)
  {
    window.alert('in start of constructParamTags - paramstr :' + paramstr);
  }
  
  var paramHash = new Object;
  
  constructParamHash(paramstr, paramHash, pName, pValue);
  
  writeHTML(paramHash, jinit);

  if (debug == true)
  {
    window.alert('in end of constructParamTags');
  }
}

function constructParamHash(paramstr, paramHash, pName, pValue)
{
  if (debug == true)
  {
    window.alert('in constructParamTagArray - paramstr :' + paramstr);
  }
  
  // Because different browsers handle multiple parameters with the
  // same name differently we force behavior with the paramHash which
  // overrides previous entries
  addNamedParams(paramHash, defaultParamName, defaultParamValue);
  addNamedParams(paramHash, pName, pValue);
  
  if (paramstr.length > 0)
  {
    var htmlparamtagsobj = new Object;
    htmlparamtagsobj.paramHash = paramHash;
    htmlparamtagsobj.sheetparamcount = 0;
    htmlparamtagsobj.ticketParamexists = false;
    
    constructParamTagsfromURL(paramstr, htmlparamtagsobj);
    
    // construct Ticket tag
    if (htmlparamtagsobj.ticketParamexists == false)
    {
      var ticket = ReadCookie("ICX_SESSION_ID")
      if (ticket != null)
      {
        consParamTag(paramHash, "Ticket", ticket);
      }
    }
  }
  
  if (debug == true)
  {
    window.alert('in end of constructParamTagArray');
  }
}  


function addNamedParams(paramHash, pName, pValue)
{
  for (var i=0; i<pName.length; i++)
  {
    consParamTag(paramHash, pName[i], pValue[i]);
  }
}


function constructParamTagsfromURL(paramstr, htmlparamtagsobj)
{
  if (debug == true)
  {
    window.alert('in constructParamTagsfromURL - paramstr :' + paramstr);
  }
  
  var finished = false;
  
  var urlparamobj = new Object;
  urlparamobj.paramnamestr = "";
  urlparamobj.paramvalstr = "";
  urlparamobj.startpos = 0;
  
  //skip the opening '?' character (if there)
  if (paramstr.substring(0,1) == '?')
  {
    urlparamobj.startpos = 1;
  }
  
  while (finished == false)
  {
    finished = extractURLparampair(paramstr, urlparamobj);
    addToParamArray(urlparamobj, htmlparamtagsobj);
  }

  if (debug == true)
  {
    window.alert('in end of constructParamTagsfromURL');
  }
}


function extractURLparampair(paramstr, pairobj)
{
  if (debug == true)
  {
    window.alert('in start of extractURLparampair');
  }
  
  var finished = false;
  var endpos = 0;
  var parampairstr = "";
  var equalpos = 0;
  pairobj.paramnamestr = "";
  pairobj.paramvalstr = "";
  
  endpos = paramstr.indexOf("&", pairobj.startpos);
  
  if (endpos == -1)
  {
    parampairstr = paramstr.substring(pairobj.startpos, paramstr.length);
    finished = true;
  }
  else
  {
    parampairstr = paramstr.substring(pairobj.startpos, endpos);
    pairobj.startpos = endpos + 1;
  }
  
  if (parampairstr.length > 0)
  {
    equalpos = parampairstr.indexOf("=");
    
    if (equalpos  >= 0)
    {
      pairobj.paramnamestr = parampairstr.substring(0, equalpos);
      pairobj.paramvalstr =   parampairstr.substring(equalpos+1, parampairstr.length);  
    }
  }
  
  if (debug == true)
  {
    window.alert('in end of extractURLparampair, pairobj.paramnamestr : ' + pairobj.paramnamestr + ', pairobj.paramvalstr : ' + pairobj.paramvalstr);
  }
  
  return finished;
}


function addToParamArray(urlparaobj, htmlparatagsobj)
{
  if (debug == true)
  {
    window.alert('in start of addToParamArray ');
  }
  
  if (urlparaobj.paramnamestr.toLowerCase() == "opendb")
  {
    consParamTag(htmlparatagsobj.paramHash, "WorkbookName", urlparaobj.paramvalstr);
    consParamTag(htmlparatagsobj.paramHash, "WorkbookSource", "Database");
  }
  else if (urlparaobj.paramnamestr.toLowerCase() == "opendbid")
  {
    consParamTag(htmlparatagsobj.paramHash, "WorkbookId", urlparaobj.paramvalstr);
    consParamTag(htmlparatagsobj.paramHash, "WorkbookSource", "Database");
  }
  else if (urlparaobj.paramnamestr.toLowerCase() == "connect")
  {
    consParamTag(htmlparatagsobj.paramHash, "AutoConnect", urlparaobj.paramvalstr);
  }
  else if (urlparaobj.paramnamestr.toLowerCase() == "defaultusername")
  {
    consParamTag(htmlparatagsobj.paramHash, "Username", urlparaobj.paramvalstr);
  }
  else if (urlparaobj.paramnamestr.toLowerCase() == "defaultpassword")
  {
    consParamTag(htmlparatagsobj.paramHash, "Password", urlparaobj.paramvalstr);
  }
  else if (urlparaobj.paramnamestr.toLowerCase() == "defaultconnect")
  {
    consParamTag(htmlparatagsobj.paramHash, "Connect", urlparaobj.paramvalstr);
  }
  else if (urlparaobj.paramnamestr.toLowerCase() == "responsibility")
  {
    consParamTag(htmlparatagsobj.paramHash, "Responsibility", urlparaobj.paramvalstr);
  }
  else if (urlparaobj.paramnamestr.toLowerCase() == "sheet")
  {
    consParamTag(htmlparatagsobj.paramHash, "WorksheetName", urlparaobj.paramvalstr);
  }
  else if (urlparaobj.paramnamestr.toLowerCase() == "sheetid")
  {
    consParamTag(htmlparatagsobj.paramHash, "WorksheetId", urlparaobj.paramvalstr);
  }
  else if (urlparaobj.paramnamestr.toLowerCase() == "eul")
  {
    consParamTag(htmlparatagsobj.paramHash, "EUL", urlparaobj.paramvalstr);
  }
  else if (urlparaobj.paramnamestr.toLowerCase() == "windowwidth")
  {
    consParamTag(htmlparatagsobj.paramHash, "WindowWidth", urlparaobj.paramvalstr);
  }
  else if (urlparaobj.paramnamestr.toLowerCase() == "windowheight")
  {
    consParamTag(htmlparatagsobj.paramHash, "WindowHeight", urlparaobj.paramvalstr);
  }
  else if (urlparaobj.paramnamestr.toLowerCase() == "framedisplaystyle")
  {
    consParamTag(htmlparatagsobj.paramHash, "FrameDisplayStyle", urlparaobj.paramvalstr);
  }
  else if (urlparaobj.paramnamestr.toLowerCase() == "sessioncookiename")
  {
    // construct Ticket tag
    var ticket = ReadCookie(urlparaobj.paramvalstr)
    if (ticket != null)
    {
      consParamTag(htmlparatagsobj.paramHash, "Ticket", ticket);
      htmlparatagsobj.ticketParamexists = true;
    }
  }    
  else if (urlparaobj.paramnamestr.substring(0,6).toLowerCase() == "param_")
  {
    htmlparatagsobj.sheetparamcount++;
    var htmlparamname = "Parameter" + htmlparatagsobj.sheetparamcount;
    
    var htmlparamval = urlparaobj.paramnamestr.substring(6,urlparaobj.paramnamestr.length);
    htmlparamval = htmlparamval + "=";
    htmlparamval = htmlparamval + urlparaobj.paramvalstr;
    
    consParamTag(htmlparatagsobj.paramHash, htmlparamname, htmlparamval);
  } 
  // New NLS parameters as required by Apps
  else if (urlparaobj.paramnamestr.toLowerCase() == "nls_lang")
  {
    consParamTag(htmlparatagsobj.paramHash, "NLSLang", urlparaobj.paramvalstr);
  }
  else if (urlparaobj.paramnamestr.toLowerCase() == "nls_sort")
  {
    consParamTag(htmlparatagsobj.paramHash, "NLSSort", urlparaobj.paramvalstr);
  }
  else if (urlparaobj.paramnamestr.toLowerCase() == "nls_date_format")
  {
    consParamTag(htmlparatagsobj.paramHash, "NLSDateFormat", urlparaobj.paramvalstr);
  }
  else if (urlparaobj.paramnamestr.toLowerCase() == "nls_numeric_characters")
  {
    consParamTag(htmlparatagsobj.paramHash, "NLSNumericCharacters", urlparaobj.paramvalstr);
  }
  else if (urlparaobj.paramnamestr.toLowerCase() == "nls_date_language")
  {
    consParamTag(htmlparatagsobj.paramHash, "NLSDateLanguage", urlparaobj.paramvalstr);
  }
  else if (urlparaobj.paramnamestr.length > 0)
  {
    consParamTag(htmlparatagsobj.paramHash, urlparaobj.paramnamestr, urlparaobj.paramvalstr);
  }

  if (debug == true)
  {
    window.alert('in end of addToParamArray ');
  }
}

function firstWord(str)
{
	var newstr="";
	var currchar;
	for (i=0; i<str.length; i++)
	{
		currchar = str.substring(i,i+1);
		if ((currchar >= "a" && currchar <= "z") ||
		    (currchar >= "A" && currchar <= "Z") ||
		    (currchar >= "0" && currchar <= "9") ||
		    currchar == "_")
		{
		  newstr = newstr + currchar;
		}
		else
		{
			break;
		}
	}
	return newstr;
}
      
// adds a hash entry 
// NOTE: overrides previous value if it exists
function consParamTag(tagHash, paramname, paramval)
{
  if (debug == true)
  {
    window.alert('in start of consParamTag ');
  }
  
  var paramobj = new Object;
  paramobj.name = paramname;
  paramobj.value = paramval;


  // since parameters come in from the URL string and
  // we use eval(), do serious error checking
  
  // kmb: re's don't work in older browsers
  //hashRE = /^(\w+)/;
  //if (hashRE.test(paramname))
  //{
  //  hasharr = paramname.match(hashRE);
  //  var evalstr = "tagHash."+hasharr[0]+"=paramobj;";
  //  eval(evalstr);
  //}

  if (firstWord(paramname)!="")
  {
    var evalstr = "tagHash."+firstWord(paramname)+"=paramobj;";
    eval(evalstr);
  }

  if (debug == true)
  {
    window.alert('in end of consParamTag ');
  }

  return paramobj;
}
  
          

function writeHTML(paramHash, jinit)
{
  for (paramobj in paramHash)
  {
    var paramtag = '';
  
    if (jinit == false)
    {  
      paramtag = '<PARAM NAME="';
      
      paramtag  = paramtag + eval("paramHash."+paramobj+".name");
      paramtag = paramtag + '" VALUE="';
      paramtag = paramtag + eval("paramHash."+paramobj+".value");
      paramtag = paramtag + '">';
    }
    else
    {
      paramtag  = eval("paramHash."+paramobj+".name");
      paramtag = paramtag + ' = "';
      paramtag = paramtag + eval("paramHash."+paramobj+".value");
      paramtag = paramtag + '"';
    }
    
    if (debug == true)
    {
      window.alert('param:= ' + paramtag);
    }

    var newtagstr = replaceSpecialChars(paramtag);
		
    if (debug == true)
    {
      window.alert('in writeHTML - newtagstr :' + newtagstr);
    }
  
    document.writeln(newtagstr);
  }
}

  
function replaceSpecialChars(str)
{
  var index;
  var length = str.length;
  
  while ((index = str.indexOf("+"))>-1)
  {
    str = str.substring(0,index)+" "+str.substring(index+1, length);
  }
  
  // now replace URL-encoded special chars of the form "%hh" to the character
  // itself, where hh is the ASCII hex value of the character
  // Bugfix 2487469
  while ((index = str.indexOf("%")) > -1) 
  { 
      length = str.length; 
      var str1 = str.substring(0, index); 
      var str2 = str.substring(index + 3, length); 
      str = str1 + unescape(str.substring(index, index + 3)) + str2; 
  } 
  return str; 
}