// *************************************************************
//  
//  Licensed to the Apache Software Foundation (ASF) under one
//  or more contributor license agreements.  See the NOTICE file
//  distributed with this work for additional information
//  regarding copyright ownership.  The ASF licenses this file
//  to you under the Apache License, Version 2.0 (the
//  "License"); you may not use this file except in compliance
//  with the License.  You may obtain a copy of the License at
//  
//    http://www.apache.org/licenses/LICENSE-2.0
//  
//  Unless required by applicable law or agreed to in writing,
//  software distributed under the License is distributed on an
//  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//  KIND, either express or implied.  See the License for the
//  specific language governing permissions and limitations
//  under the License.
//  
// *************************************************************

// This script asks for variables, which are necessary for building the
// examples of the Office Development Kit. The script duplicates the template
// script and inserts the variables into the copied script.
// The Script was developed for the operating systems Microsoft Windows.
var regKeyOfficeCurrentUser6432Node = "HKEY_CURRENT_USER\\Software\\Wow6432Node\\OpenOffice\\UNO\\InstallPath\\";
var regKeyOfficeLocaleMachine6432Node = "HKEY_LOCAL_MACHINE\\Software\\Wow6432Node\\OpenOffice\\UNO\\InstallPath\\";
var regKeyOfficeCurrentUser = "HKEY_CURRENT_USER\\Software\\OpenOffice\\UNO\\InstallPath\\";
var regKeyOfficeLocaleMachine = "HKEY_LOCAL_MACHINE\\Software\\OpenOffice\\UNO\\InstallPath\\";
var regKeyDotNetInstallRoot = "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\.NETFramework\\InstallRoot";
var regKeyDotNet1_1 = "HKLM\\Software\\Microsoft\\.NETFramework\\policy\\v1.1\\4322";
var sDirDotNet1_1 = "v1.1.4322";
var regKeyDotNet2_0 = "HKLM\\Software\\Microsoft\\.NETFramework\\Policy\\v2.0\\50727";
var sDirDotNet2_0 = "v2.0.50727";

var regKeyJDK = "HKLM\\Software\\JavaSoft\\Java Development Kit\\";
//var regKeyVC70 = "HKLM\\SOFTWARE\\Microsoft\\VisualStudio\\7.0\\Setup\\VC\\ProductDir";
//var regKeyVC71 = "HKLM\\SOFTWARE\\Microsoft\\VisualStudio\\7.1\\Setup\\VC\\ProductDir";
var regKeyVC90 = "HKLM\\SOFTWARE\\Microsoft\\VisualStudio\\9.0\\Setup\\VC\\ProductDir";

//var regKeyVCExpress80 = "HKLM\\SOFTWARE\\Microsoft\\VCExpress\\8.0\\Setup\\VC\\ProductDir";
var regKeyVCExpress90 = "HKLM\\SOFTWARE\\Microsoft\\VCExpress\\9.0\\Setup\\VC\\ProductDir";
var regKeyVCExpress90_2 = "HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\VCExpress\\9.0\\Setup\\VC\\ProductDir";
var regKeyWindowsSDK = "HKLM\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\CurrentInstallFolder";

var WshShell = WScript.CreateObject("WScript.Shell");
var WshSysEnv = WshShell.Environment("process");
var aFileSystemObject =  new ActiveXObject("Scripting.FileSystemObject");
var stdin = WScript.StdIn;
var stdout = WScript.StdOut;

stdout.WriteLine("\n" +
" *** Configure your SDK environment ***\n\n" +
" NOTE: This script is working only for Windows 2000, Windows XP or newer versions!\n");

var oo_sdk_name=WshSysEnv("OO_SDK_NAME");
var stldebug="";
var oo_sdk_home=getSdkHome();
var oo_user_sdk_dir=WshSysEnv("APPDATA") + "\\" + oo_sdk_name;
var oo_user_sdk_env_script=oo_user_sdk_dir + "\\setsdkenv_windows.bat";

var office_home=getOfficeHome();
var office_base_home=getOfficeBaseHome();

var oo_sdk_make_home=getMakeHome();
var oo_sdk_zip_home=getZipHome();
var oo_sdk_cat_home=getCatHome();
var oo_sdk_sed_home=getSedHome();
var oo_sdk_manifest_used="";
var oo_sdk_windowssdk="";
var oo_sdk_cpp_home=getCppHome();
var oo_sdk_cli_home=getCliHome();
var oo_sdk_java_home=getJavaHome();
var oo_sdk_out=getOutputDir();
var sdk_auto_deployment=getAutoDeployment();

writeBatFile(oo_user_sdk_dir, oo_user_sdk_env_script);

stdout.Write(
	"\n ******************************************************************\n" +
    " * ... \"" + oo_user_sdk_env_script + "\"\n" +
    " * batch file has been prepared.\n" +
    " * This batch file will be used in the future to prepare your\n" +
	" * personal configured SDK environment.\n" +
	" ******************************************************************\n\n");
//    " * For each time you want to use this configured SDK environment,\n" +
//    " * you have to run the \"setsdkenv_windows.bat\" file in a new shell!\n" +

// done -------------------------------------------------------------------------


function skipChoice(msg)
{
	stdout.Write("\n Do you want to skip the choice of " + msg + " (YES/NO) [YES]:");
	var sChoice = stdin.ReadLine();
    if (sChoice == "" || sChoice.toLowerCase() == "yes")
	   return true;

	return false;
}

function getSdkHome()
{
	var sSuggestedHome = WshSysEnv("OO_SDK_HOME");
    if (sSuggestedHome.length == 0) {
        var scriptname = WScript.ScriptFullName;
        sSuggestedHome = scriptname.substr(0,scriptname.length-10);
    }
    
    while(true)
    {
        stdout.Write("\n Enter the Office Software Development Kit directory [" +
                     sSuggestedHome + "]:");
        var sHome = stdin.ReadLine();
        if (sHome.length == 0)
        {
            //No user input, use default. 
            if ( ! aFileSystemObject.FolderExists(sSuggestedHome))
            {
                stdout.WriteLine("\n Error: Could not find directory \"" +
                                 sSuggestedHome + "\". An SDK is required, please" +
								 " specify the path to a valid installation.");
                continue;
            }       
            sHome = sSuggestedHome;
        }
        else
        {
            //validate the user input
            if ( ! aFileSystemObject.FolderExists(sHome))
            {
                stdout.WriteLine("\n Error: The directory \"" + sHome + 
                                 "\" does not exist. Please enter the path to a" +
								 "valid SDK installation.");
                continue;
            }
        }
        //Check if this is an sdk folder by looking for the idl sub - dir
        var idlDir = sHome + "\\idl";
        if (! aFileSystemObject.FolderExists(idlDir))
        {
            stdout.WriteLine("\n Error: Could not find directory \"" +
                             idlDir + "\". An SDK is required, please specify " +
                             "the path to a valid SDK installation.");
            continue;
        }

        if (aFileSystemObject.FileExists(sHome + "\\lib\\stlport_vc71_stldebug.lib")) {
		    stldebug="_stldebug";
		}

        return sHome;
    }   
}

function getOfficeOrUre()
{
    var suggestion = "Office";
    var choice;
    while (choice != "office" && choice != "ure") {
        stdout.Write(
            "\n Use an installed Office or an installed UNO Runtime"
            + " Environment (Office/URE) [" + suggestion + "]:");
        choice = stdin.ReadLine();
        if (choice == "") {
            choice = suggestion;
        }
        choice = choice.toLowerCase();
    }
    return choice;
}

function getOfficeHome()
{
    var sSuggestedHome = WshSysEnv("OFFICE_HOME");
    if (sSuggestedHome.length == 0)
    {
        try {   
            sSuggestedHome = WshShell.RegRead(regKeyOfficeCurrentUser6432Node);
	    //The registry entry points to the program folder but we need the 
	    //installation folder
        } catch(exc) {}
        if (sSuggestedHome.length == 0)
        {
            try {
                sSuggestedHome = WshShell.RegRead(regKeyOfficeLocaleMachine6432Node);
                //The registry entry points to the program folder but we need 
		//the installation folder
            } catch (exc) {}
        }
 	if (sSuggestedHome.length == 0)
        {
            try {
                sSuggestedHome = WshShell.RegRead(regKeyOfficeLocaleMachine);
                //The registry entry points to the program folder but we need 
		//the installation folder
            } catch (exc) {}
        }
 	if (sSuggestedHome.length == 0)
        {
            try {
                sSuggestedHome = WshShell.RegRead(regKeyOfficeLocaleMachine);
                //The registry entry points to the program folder but we need 
		//the installation folder
            } catch (exc) {}
        }

		var index=0;
        if ((index = sSuggestedHome.lastIndexOf("\\")) != -1)   
		   sSuggestedHome = sSuggestedHome.substr(0, index);

        if (sSuggestedHome.length == 0)
		   sSuggestedHome = searchOffice();
    }
    
    while(true)
    {
        stdout.Write("\n Enter the Office base installation directory [" +
                     sSuggestedHome + "]:");
        var sHome = stdin.ReadLine();
        if (sHome.length == 0)
        {
            //No user input, use default. 
            if ( ! aFileSystemObject.FolderExists(sSuggestedHome))
            {
                stdout.WriteLine("\n Error: Could not find directory \"" + 
                                 sSuggestedHome + "\" An office installation is " +
								 "required, please specify the path to a valid " +
								 "office installation.");
                sSuggestedHome = "";
                continue;
            }       
            sHome = sSuggestedHome;
        } else
        {
            //validate the user input
            if ( ! aFileSystemObject.FolderExists(sHome))
            {
                stdout.WriteLine("\n Error: The directory \"" + sHome + 
                                 "\" does not exist. Please specify the path to " +
								 "a valid office installation.");
                continue;
            }
        }
        //Check if this is a valid office installtion folder by looking for the 
		//program sub-directory
        var progDir = sHome + "\\program";
        if (! aFileSystemObject.FolderExists(progDir))
        {
            stdout.WriteLine("\n Error: Could not find directory \"" +
                             progDir + "\". An office installation is required, " +
							 "please specify the path to a valid office " +
							 "installation.");
            continue;
        }
        return sHome;
    }
}

function searchOffice()
{
	var tmp = oo_sdk_home;
	var officepath ="";
	var index=-1;

	if ((index = tmp.lastIndexOf("\\sdk")) != -1) {
	   tmp = tmp.substr(0, index);
	}

	if (aFileSystemObject.FileExists(tmp + "\\program\\soffice.exe")) {
	   return tmp;
	}
  
	return "";
}


function getOfficeBaseHome()
{
	var officebase = oo_sdk_home;
	var index=officebase.lastIndexOf("\\");
	
	officebase = officebase.substr(0, index);

	return officebase;
}

function getMakeHome()
{
    var sSuggestedHome = WshSysEnv("OO_SDK_MAKE_HOME");
    
    while(true)
    {
        stdout.Write("\n Enter GNU make (3.79.1 or higher) tools directory [" +
                     sSuggestedHome + "]:");
        var sHome = stdin.ReadLine();
        if (sHome.length == 0)
        {
            //No user input, use default. 
            if ( ! aFileSystemObject.FolderExists(sSuggestedHome))
            {
                stdout.WriteLine("\n Error: Could not find directory \"" +
								 sSuggestedHome + "\". GNU make is required, " +
								 "please specify a GNU make tools directory.");
                sSuggestedHome = "";
                continue;
            }       
            sHome = sSuggestedHome;
        } else
        {
            //validate the user input
            if ( ! aFileSystemObject.FolderExists(sHome))
            {
                stdout.WriteLine("\n Error: The directory \"" + sHome + 
                                 "\" does not exist. GNU make is required, " +
								 "please specify a GNU make tools directory.");
                continue;
            }
        }
        //Check for the make executable
        var sMakePath = sHome + "\\make.exe";
        if (! aFileSystemObject.FileExists(sMakePath))
	{
		sMakePath = sHome + "\\mingw32-make.exe";
	}
        if (! aFileSystemObject.FileExists(sMakePath))
        {
            stdout.WriteLine("\n Error: Could not find \"" + sMakePath + 
							 "\". GNU make is required, please specify a GNU " +
							 "make tools directory.");
            continue;
        }
        return sHome;
    }   
}

function getZipHome()
{
    var sSuggestedHome = WshSysEnv("OO_SDK_ZIP_HOME");

    if (sSuggestedHome.length == 0 && oo_sdk_make_home.length > 0) {
       sSuggestedHome = oo_sdk_make_home;
    }
    
    while(true)
    {
        stdout.Write("\n Enter a zip (2.3 or higher) tools directory [" +
                     sSuggestedHome + "]:");
        var sHome = stdin.ReadLine();
        if (sHome.length == 0)
        {
            //No user input, use default. 
            if ( ! aFileSystemObject.FolderExists(sSuggestedHome))
            {
                stdout.WriteLine("\n Error: Could not find directory \"" + 
								 sSuggestedHome + "\". zip is required, please " +
								 "specify a zip tools directory.");
                sSuggestedHome = "";
                continue;
            }       
            sHome = sSuggestedHome;
        }
        else
        {
            //validate the user input
            if ( ! aFileSystemObject.FolderExists(sHome))
            {
                stdout.WriteLine("\n Error: The directory \"" + sHome + 
                                 "\" does not exist. zip is required, please " +
								 "specify a zip tools directory.");
                continue;
            }
        }
        //Check for the make executable
        var sZipPath = sHome + "\\zip.exe";
        if (! aFileSystemObject.FileExists(sZipPath))
        {
            stdout.WriteLine("\n Error: Could not find \"" + sZipPath + 
                             "\". zip is required, please specify a zip tools " +
							 "directory.");
            continue;
        }
        return sHome;
    }   
}

function getCatHome()
{
    var sSuggestedHome = WshSysEnv("OO_SDK_CAT_HOME");

    if (sSuggestedHome.length == 0 && oo_sdk_make_home.length > 0) {
       sSuggestedHome = oo_sdk_make_home;
    }

    while(true)
    {
        stdout.Write("\n Enter a cat (2.0 or higher) tools directory [" +
                     sSuggestedHome + "]:");
        var sHome = stdin.ReadLine();
        if (sHome.length == 0)
        {
            //No user input, use default.
            if ( ! aFileSystemObject.FolderExists(sSuggestedHome))
            {
                stdout.WriteLine("\n Error: Could not find directory \"" +
                                 sSuggestedHome + "\". cat is required, please " +
                                 "specify a cat tools directory." +
                                 "\nYou can get cat from " +
                                 "http://sourceforge.net/projects/unxutils/files/latest/download");
                sSuggestedHome = "";
                continue;
            }
            sHome = sSuggestedHome;
        }
        else
        {
            //validate the user input
            if ( ! aFileSystemObject.FolderExists(sHome))
            {
                stdout.WriteLine("\n Error: The directory \"" + sHome +
                                 "\" does not exist. cat is required, please " +
                                 "specify a cat tools directory." +
                                 "\nYou can get cat from " +
                                 "http://sourceforge.net/projects/unxutils/files/latest/download");
                continue;
            }
        }
        //Check for the make executable
        var sCatPath = sHome + "\\cat.exe";
        if (! aFileSystemObject.FileExists(sCatPath))
        {
            stdout.WriteLine("\n Error: Could not find \"" + sCatPath +
                             "\". cat is required, please specify a cat tools " +
                             "directory." +
                             "\nYou can get cat from " +
                             "http://sourceforge.net/projects/unxutils/files/latest/download");
            continue;
        }
        return sHome;
    }
}

function getSedHome()
{
    var sSuggestedHome = WshSysEnv("OO_SDK_SED_HOME");

    if (sSuggestedHome.length == 0 && oo_sdk_make_home.length > 0) {
       sSuggestedHome = oo_sdk_make_home;
    }

    while(true)
    {
        stdout.Write("\n Enter a sed (3.02 or higher) tools directory [" +
                     sSuggestedHome + "]:");
        var sHome = stdin.ReadLine();
        if (sHome.length == 0)
        {
            //No user input, use default.
            if ( ! aFileSystemObject.FolderExists(sSuggestedHome))
            {
                stdout.WriteLine("\n Error: Could not find directory \"" +
                                 sSuggestedHome + "\". sed is required, please " +
                                 "specify a sed tools directory." +
                                 "\nYou can get sed from " +
                                 "http://sourceforge.net/projects/unxutils/files/latest/download");
                sSuggestedHome = "";
                continue;
            }
            sHome = sSuggestedHome;
        }
        else
        {
            //validate the user input
            if ( ! aFileSystemObject.FolderExists(sHome))
            {
                stdout.WriteLine("\n Error: The directory \"" + sHome +
                                 "\" does not exist. sed is required, please " +
                                 "specify a sed tools directory." +
                                 "\nYou can get sed from " +
                                 "http://sourceforge.net/projects/unxutils/files/latest/download");
                continue;
            }
        }
        //Check for the make executable
        var sSedPath = sHome + "\\sed.exe";
        if (! aFileSystemObject.FileExists(sSedPath))
        {
            stdout.WriteLine("\n Error: Could not find \"" + sSedPath +
                             "\". sed is required, please specify a sed tools " +
                             "directory." +
                             "\nYou can get sed from " +
                             "http://sourceforge.net/projects/unxutils/files/latest/download");
            continue;
        }
        return sHome;
    }
}

function getCppHome()
{
    var sSuggestedHome = WshSysEnv("OO_SDK_CPP_HOME");
    if (sSuggestedHome.length == 0)
    {       
        var sVC="";
        try {
            sVC = WshShell.RegRead(regKeyVCExpress90);
        }catch (exc) {}
        if (sVC.length == 0)
        {
	   try {
	       sVC = WshShell.RegRead(regKeyVCExpress90_2);
	   }catch (exc) {}
	}
	if (sVC.length == 0)
        {
	   try {
	       sVC = WshShell.RegRead(regKeyVC90);
	   }catch (exc) {}
	}        
	// check Windows SDK if VC 9
        if (sVC.length > 0)
        {
		    oo_sdk_manifest_used="true";	
			try {
				oo_sdk_windowssdk = WshShell.RegRead(regKeyWindowsSDK);
			}catch (exc) {}
		}
        if (sVC.length == 0)
        {
	        try {
				sVC = WshShell.RegRead(regKeyVCExpress80);
			}catch (exc) {}
	        if (sVC.length > 0)
			   oo_sdk_manifest_used="true";
		}        
        if (sVC.length == 0)
        {
	        try {
				sVC = WshShell.RegRead(regKeyVC80);
			}catch (exc) {}
	        if (sVC.length > 0)
			   oo_sdk_manifest_used="true";
		}        
        if (sVC.length == 0)
        {
	        try {
				sVC = WshShell.RegRead(regKeyVC71);
			}catch (exc) {}
		}        
        if (sVC.length > 0)
        {
            sVC += "bin";
            if (aFileSystemObject.FileExists(sVC + "\\cl.exe"))
                sSuggestedHome = sVC;			
        }
    }

    var bSkip = false;       
    while(true)
    {
        stdout.Write("\n Enter the directory of the C++ compiler (optional) [" +
                     sSuggestedHome + "]:");
        var sHome = stdin.ReadLine();
        if (sHome.length == 0)
        {
            //No user input, check OO_SDK_CPP_HOME or suggested value
	    if ( sSuggestedHome.length == 0 ) {
		bSkip = true;
	    } else {
	        if ( !aFileSystemObject.FolderExists(sSuggestedHome) )
		{
		    stdout.WriteLine("\n Error: Could not find directory \"" +
				     sSuggestedHome + "\".");
		    sSuggestedHome = "";
		    bSkip = true;
		}
	    }
       
            sHome = sSuggestedHome;
        } else
        {
            //validate the user input
            if ( ! aFileSystemObject.FolderExists(sHome))
            {
                stdout.WriteLine("\n Error: Could not find directory \"" +
                                 sHome + "\".");
                bSkip = true;
            }
        }

		if ( !bSkip) {
		    //Check if the C++ compiler exist
		    var cl = sHome + "\\cl.exe";
		    var mt = sHome + "\\mt.exe";
        
			if (! aFileSystemObject.FileExists(cl))
			{
				stdout.WriteLine("\n Error: Could not find the C++ compiler \"" 
								 + cl + "\".");
				sHome = "";
				bSkip = true;
			} else {
			    if (aFileSystemObject.FileExists(mt)) {
				    oo_sdk_vc8_used="true";				   
				}
			}
		}

		if ( bSkip ) { 
		   if ( skipChoice("the C++ compiler") ) {
			   return "";
		   } else {
			   bSkip = false;
			   continue;
		   }
		}

        return sHome;
    }   
}

function getCliHome()
{
    var sSuggestedHome = WshSysEnv("OO_SDK_CLI_HOME");
    
    if (sSuggestedHome.length == 0)
    {
        try {
            var _ver = WshShell.RegRead(regKeyDotNet2_0);
            if (_ver.length > 0)
            {
                sSuggestedHome = WshShell.RegRead(regKeyDotNetInstallRoot);
                sSuggestedHome += sDirDotNet2_0;
                if ( ! aFileSystemObject.FolderExists(sSuggestedHome))
                    sSuggestedHome = "";
            }

			if (sSuggestedHome.length == 0) 
			{
				_ver = WshShell.RegRead(regKeyDotNet1_1);
				if (_ver.length > 0)
				{
					sSuggestedHome = WshShell.RegRead(regKeyDotNetInstallRoot);
					sSuggestedHome += sDirDotNet1_1;
					if ( ! aFileSystemObject.FolderExists(sSuggestedHome))
					   sSuggestedHome = "";
				}
			}				
		} catch (exc) {}
    }
    
    var bSkip = false;       
    while(true)
    {
        stdout.Write("\n Enter the directory of the C# and VB.NET compilers (optional) [" + sSuggestedHome + "]:");
        var sHome = stdin.ReadLine();
        if (sHome.length == 0)
        {
            //No user input, check OO_SDK_CLI_HOME or suggested value
			if ( sSuggestedHome.length == 0 ) {
			    bSkip = true;
			} else {
			    if ( !aFileSystemObject.FolderExists(sSuggestedHome) )
				{
					stdout.WriteLine("\n Error: Could not find directory \"" + 
									 sSuggestedHome + "\".");
					sSuggestedHome = "";
					bSkip = true;
				} 
			}

		    sHome = sSuggestedHome;
        }
        else
        {
            //validate the user input
            if ( ! aFileSystemObject.FolderExists(sHome))
            {
                stdout.WriteLine("\n Error: The directory \"" + sHome + 
                                 "\" does not exist.");
                bSkip = true;
            }
        }

		if ( !bSkip ) {
		    //Check if the C# and VB.NET compiler exist
		    var csc = sHome + "\\csc.exe";
		    var vbc = sHome + "\\vbc.exe";
        
			if (! aFileSystemObject.FileExists(csc)) 
			{
				stdout.WriteLine("\n Error: Could not find the C# compiler \"" + 
								 csc + "\".");
				bSkip = true;
			}
			if (! aFileSystemObject.FileExists(vbc))
			{
				stdout.WriteLine("\n Error: Could not find the VB.NET compiler \"" +
								 vbc + "\".");
				bSkip = true;
			}
		}

		if ( bSkip ) { 
		   if ( skipChoice("the C# and VB.NET compilers") ) {
			   return "";
		   } else {
			   bSkip = false;
			   continue;
		   }
		}

        return sHome;
    }   
}

function getJavaHome()
{
    var sSuggestedHome = WshSysEnv("OO_SDK_JAVA_HOME");
    if (sSuggestedHome.length == 0)
    {
        try {
            var currentVersion = WshShell.RegRead(regKeyJDK + "CurrentVersion");
            if (currentVersion.length > 0)
            {
                sSuggestedHome = WshShell.RegRead(regKeyJDK + currentVersion + 
												  "\\JavaHome");           
                if ( ! aFileSystemObject.FolderExists(sSuggestedHome) )
                    sSuggestedHome = "";
            }
        } catch (exc) {}
    }
    
    var bSkip = false;       
    while(true)
    {
        stdout.Write("\n Enter JAVA SDK (1.4.1_01 or higher) installation directory (optional) [" + sSuggestedHome + "]:");
        var sHome = stdin.ReadLine();
        if (sHome.length == 0)
        {
            //No user input, check OO_SDK_JAVA_HOME or suggested value
			if ( sSuggestedHome.length == 0 ) {
			    bSkip = true;
			} else {
			    if ( !aFileSystemObject.FolderExists(sSuggestedHome) )
				{
					stdout.WriteLine("\n Error: Could not find directory \"" + 
									 sSuggestedHome + "\".");
					sSuggestedHome = "";
					bSkip=true;
				}
			}	
			
			sHome = sSuggestedHome;
        } else
        {
            //validate the user input
            if ( ! aFileSystemObject.FolderExists(sHome))
            {
                stdout.WriteLine("\n Error: The directory \"" + sHome + 
                                 "\" does not exist.");
				bSkip = true;
            }
        }

		if ( !bSkip) {
		    //Check if this is an sdk folder by looking for the javac compiler
			var javacompiler = sHome + "\\bin\\javac.exe";
			if (! aFileSystemObject.FileExists(javacompiler))
			{
				stdout.WriteLine("\n Error: Could not find \"" +
								 javacompiler + "\".");
				bSkip = true;
			}
        }

		if ( bSkip ) { 
		   if ( skipChoice("the Java SDK") ) {
			   return "";
		   } else {
			   bSkip = false;
			   continue;
		   }
		}

        return sHome;
    }   
}

function getOutputDir()
{
	var defaultdir = "c:\\" + oo_sdk_name;
    var sSuggestedDir = WshSysEnv("OO_SDK_OUT");
	if (sSuggestedDir.length == 0)
	   sSuggestedDir = defaultdir;

    var bSkip = false;       
    while(true)
    {
        stdout.Write(
			"\n Default output directory is the \"c:\\" + oo_sdk_name + "\".\n" +
            " Enter an existent directory if you prefer a different one. But note" +
			" that only\n a path without spaces is allowed because of a" +
			" limitation of gnu make. (optional) [" + sSuggestedDir + "]:");    
        var sDir = stdin.ReadLine();
        if (sDir.length == 0)
        {
            //No user input, check OO_SDK_OUT or suggested value
			if ( sSuggestedDir.length == 0 ) {
			    bSkip = true;
			} else {
				if (sSuggestedDir == oo_user_sdk_dir || sSuggestedDir == defaultdir) {
				    var fso = new ActiveXObject("Scripting.FileSystemObject");
					if ( !fso.FolderExists(sSuggestedDir) )
						fso.CreateFolder(sSuggestedDir);
				}				
			    if ( !aFileSystemObject.FolderExists(sSuggestedDir) )
				{
					stdout.WriteLine("\n Error: Could not find directory \"" +
									 sSuggestedDir + "\".");
					sSuggestedDir = "";
					bSkip = true;
				}
			}
       
            sDir = sSuggestedDir;
        }
        else
        {
			if (sDir.indexOf(' ') != -1) {
				stdout.WriteLine("\n Error: your specified output directory " +
								 "\"" + sDir + "\" " +	 
								 "contains one or more spaces.\n        That " +
								 "causes problems with gnu make. Please specifiy" +
								 " a directory without spaces.");
				bSkip = true;
			}
            //validate the user input
            if ( ! aFileSystemObject.FolderExists(sDir))
            {
                stdout.WriteLine("\n Error: Could not find directory \"" +
                                 sDir + "\".");
                bSkip = true;
            }
        }

		if ( bSkip ) { 
		   if ( skipChoice("a special output directory") ) {
			   return "";
		   } else {
			   bSkip = false;
			   continue;
		   }
		}
        
        return sDir;
    }   
}

function getAutoDeployment()
{
    var sSuggestedAuto = WshSysEnv("SDK_AUTO_DEPLOYMENT");
    if (sSuggestedAuto.length == 0)
        sSuggestedAuto = "YES";
    
    while(true)
    {
        stdout.Write("\n Automatic deployment of UNO components (YES/NO) ["+
                     sSuggestedAuto + "]:");   
        var sAuto = stdin.ReadLine();
        if (sAuto.length == 0)
            sAuto = sSuggestedAuto;
        else
        {
            sAutoU = sAuto.toUpperCase();
            if (sAutoU != "YES" && sAutoU != "NO")
            {
                stdout.WriteLine("\n Error: The value \"" + sAuto + "\" is " +
								 "invalid. Please answer YES or NO.")
                    continue;
            }
            sAuto = sAutoU;
        }
        return sAuto;
    }   
}

//The function uses sp2bv.exe to obtain a file URL from a
//system path. The URL is already escaped for use as bootstrap variable.
//($ -> \$). Then the resulting string is escaped for use in a bat file.
//That is % signs are made to double % (% -> %%);
function makeBootstrapFileUrl(systemPath)
{
    var oExec = WshShell.Exec("sp2bv.exe \"" + systemPath + "\"");
    var output="";
    while (true)
    {
        if (!oExec.StdOut.AtEndOfStream)
        {
            var next = oExec.StdOut.Read(1);
            if (next == '%')
                output += "%%";
            else
                output += next;
        }
        else
            break;
    }
    return output;
}

function writeBatFile(fdir, file)
{
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    if ( !fso.FolderExists(fdir) )
       fso.CreateFolder(fdir);
    var newFile = fso.CreateTextFile(file, true);

    newFile.Write(
        "@echo off\n" +
        "REM This script sets all environment variables, which\n" +
        "REM are necessary for building the examples of the Office Development Kit.\n" +
        "REM The Script was developed for the operating systems Windows.\n" +
        "REM The SDK name\n" +
        "REM Example: @set \"OO_SDK_NAME=openoffice4.0_sdk\"\n" +
        "@set \"OO_SDK_NAME=" + oo_sdk_name  +
        "\"\n\n" +
        "REM Installation directory of the Software Development Kit.\n" +
        "REM Example: @set \"OO_SDK_HOME=C:\\Program Files\\OpenOffice\\4\\sdk\"\n" +
        "@set \"OO_SDK_HOME=" + oo_sdk_home  +
        "\"\n\n" +
        "REM Office installation directory.\n" +
        "REM Example: @set \"OFFICE_HOME=C:\\Program Files\\OpenOffice 4\"\n" +
        "@set \"OFFICE_HOME=" + office_home +
        "\"\n\n" +
        "REM Directory of the make command.\n" +
        "REM Example: @set \"OO_SDK_MAKE_HOME=C:\\UnxUtils\\usr\\local\\wbin\"\n" + 
        "@set \"OO_SDK_MAKE_HOME=" + oo_sdk_make_home + 
        "\"\n\n" +
	"REM Directory of the zip tool.\n" +
	"REM Example: @set \"OO_SDK_ZIP_HOME=C:\\UnxUtils\\usr\\local\\wbin\"\n" +
	"@set \"OO_SDK_ZIP_HOME=" + oo_sdk_zip_home + 
        "\"\n\n" +
        "REM Directory of the cat tool.\n" +
        "REM Example: @set \"OO_SDK_CAT_HOME=C:\\UnxUtils\\usr\\local\\wbin\"\n" +
        "@set \"OO_SDK_CAT_HOME=" + oo_sdk_cat_home +
        "\"\n\n" +
        "REM Directory of the sed tool.\n" +
        "REM Example: @set \"OO_SDK_SED_HOME=C:\\UnxUtils\\usr\\local\\wbin\"\n" +
        "@set \"OO_SDK_SED_HOME=" + oo_sdk_sed_home +
        "\"\n\n" +
        "REM Directory of the C++ compiler.\n" + 
        "REM Example: @set \"OO_SDK_CPP_HOME=C:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\bin\"\n" + 
        "@set \"OO_SDK_CPP_HOME=" + oo_sdk_cpp_home + 
	"\"\n@set \"CPP_MANIFEST=" + oo_sdk_manifest_used +
	"\"\n@set \"CPP_WINDOWS_SDK=" + oo_sdk_windowssdk +
        "\"\n\n" + 
        "REM Directory of the C# and VB.NET compilers.\n" + 
        "REM Example: @set \"OO_SDK_CLI_HOME=C:\\WINXP\\Microsoft.NET\\Framework\\v1.0.3705\"\n" +
        "@set \"OO_SDK_CLI_HOME=" + oo_sdk_cli_home + 
        "\"\n\n" +
        "REM Java SDK installation directory.\n" + 
        "REM Example: @set \"OO_SDK_JAVA_HOME=C:\\Program Files\\Java\\jdk1.6.0_05\"\n" + 
        "@set \"OO_SDK_JAVA_HOME=" + oo_sdk_java_home + 
        "\"\n\n" + 
        "REM Special output directory\n" + 
        "REM Example: @set \"OO_SDK_OUT=C:\\" + oo_sdk_name + "\"\n" +
        "@set \"OO_SDK_OUT=" + oo_sdk_out + 
        "\"\n\n" +
        "REM Automatic deployment\n" + 
        "REM Example: @set \"SDK_AUTO_DEPLOYMENT=YES\"\n" +
        "@set \"SDK_AUTO_DEPLOYMENT=" + sdk_auto_deployment +
        "\"\n\n" +
	"REM Check installation path for the Office Development Kit.\n" +
        "if not defined OO_SDK_HOME (\n" +
        "   echo Error: the variable OO_SDK_HOME is missing!\n" +
        "   goto :error\n" +
        " )\n" + 
        "\n\n" +
        "REM Check installation path for GNU make.\n" + 
        "if not defined OO_SDK_MAKE_HOME (\n" + 
        "   echo Error: the variable OO_SDK_MAKE_HOME is missing!\n" +
        "   goto :error\n" +
        " )\n" + 
        "\n" +
        "REM Check installation path for the zip tool.\n" + 
        "if not defined OO_SDK_ZIP_HOME (\n" +
        "   echo Error: the variable OO_SDK_ZIP_HOME is missing!\n" + 
        "   goto :error\n" +
        " )\n" +
        "\n" +
        "REM Check installation path for the cat tool.\n" +
        "if not defined OO_SDK_CAT_HOME (\n" +
        "   echo Error: the variable OO_SDK_CAT_HOME is missing!\n" +
        "   goto :error\n" +
        " )\n" +
        "\n" +
        "REM Check installation path for the sed tool.\n" +
        "if not defined OO_SDK_SED_HOME (\n" +
        "   echo Error: the variable OO_SDK_SED_HOME is missing!\n" +
        "   goto :error\n" +
        " )\n" +
        "\n" +
        "REM Set library path. \n" + 
        "@set \"LIB=%OO_SDK_HOME%\\lib;%LIB%\"\n" +
        "if defined CPP_WINDOWS_SDK (\n" +
        "   @set \"LIB=%LIB%;%CPP_WINDOWS_SDK%\\lib\"\n" +
        " )\n" +
        "\n" +
        "REM Set office program path.\n" +
        "if defined OFFICE_HOME (\n" +
        "   @set \"OFFICE_PROGRAM_PATH=%OFFICE_HOME%\\program\"\n" +
        " )" +
        "\n" +
        "REM Set UNO path, necessary to ensure that the cpp examples using the\n" +
	"REM new UNO bootstrap mechanism use the configured office installation\n" +
	 "REM (only set when using an Office).\n" +
	"if defined OFFICE_HOME (\n" +
	"   @set \"UNO_PATH=%OFFICE_PROGRAM_PATH%\"\n" +
	" )\n" +
        "\n\n" +
        "@set \"OO_SDK_OFFICE_BIN_DIR=%OFFICE_PROGRAM_PATH%\"\n" +
        "@set \"OO_SDK_OFFICE_LIB_DIR=%OFFICE_PROGRAM_PATH%\"\n" +
        "@set \"OO_SDK_OFFICE_JAVA_DIR=%OFFICE_PROGRAM_PATH%\\classes\"\n" +
        "\n" +
        "REM Set classpath\n" +
        "@set \"CLASSPATH=%OO_SDK_OFFICE_JAVA_DIR%\\juh.jar;%OO_SDK_OFFICE_JAVA_DIR%\\jurt.jar;%OO_SDK_OFFICE_JAVA_DIR%\\ridl.jar;%OO_SDK_OFFICE_JAVA_DIR%\\unoloader.jar;%OO_SDK_OFFICE_JAVA_DIR%\\unoil.jar\"\n" +
        "\n" +
        "REM Add directory of the SDK tools to the path.\n" +
        "set \"PATH=%OO_SDK_HOME%\\bin;%OO_SDK_OFFICE_BIN_DIR%;%OO_SDK_OFFICE_BIN_DIR%;%OO_SDK_HOME%\\WINexample.out\\bin;%OO_SDK_MAKE_HOME%;%OO_SDK_ZIP_HOME%;%OO_SDK_CAT_HOME%;%OO_SDK_SED_HOME%;%PATH%\"\n" +
        "\n" +
        "REM Set PATH appropriate to the output directory\n" +
        "if defined OO_SDK_OUT (\n" + 
        "   @set \"PATH=%OO_SDK_OUT%\\WINexample.out\\bin;%PATH%\"\n" + 
        " ) else (\n" + 
        "   @set \"PATH=%OO_SDK_HOME%\\WINexample.out\\bin;%PATH%\"\n" + 
        " )\n" + 
        "\n" +
        "REM Add directory of the Win SDK to the path, if necessary.\n" +
        "if defined CPP_WINDOWS_SDK (\n" +
	"   @set \"PATH=%CPP_WINDOWS_SDK\\bin%;%PATH%\"\n" + 
	"   @set \"INCLUDE=%CPP_WINDOWS_SDK\\Include%;%INCLUDE%\"\n" + 
        ")\n" +
        "REM Add directory of the C# and VB.NET compilers to the path, if necessary.\n" + 
        "if defined OO_SDK_CLI_HOME @set \"PATH=%OO_SDK_CLI_HOME%;%PATH%\"\n" + 
        "\n" + 
        "REM Add directory of the Java tools to the path, if necessary.\n" + 
        "if defined OO_SDK_JAVA_HOME @set \"PATH=%OO_SDK_JAVA_HOME%\\bin;%OO_SDK_JAVA_HOME%\\jre\\bin;%PATH%\"\n" +
        "\n" +
        "REM Set environment for C++ compiler tools, if necessary.\n" + 
        "if defined OO_SDK_CPP_HOME call \"%OO_SDK_CPP_HOME%\\VCVARS32.bat\"\n" +
        "\n" +
        "REM Set tilte to identify the prepared shell.\n" + 
        "title Shell prepared for SDK\n" + 
        "\nREM Prepare shell with all necessary environment variables.\n" +
        "echo.\n" +
        "echo  ******************************************************************\n" +
        "echo  *\n" + 
        "echo  * SDK environment is prepared for Windows\n" +
        "echo  *\n" +       
        "echo  * SDK = %OO_SDK_HOME%\n" +
        "echo  * Office = %OFFICE_HOME%\n" +
        "echo  * Make = %OO_SDK_MAKE_HOME%\n" +
        "echo  * Zip = %OO_SDK_ZIP_HOME%\n" +
        "echo  * cat = %OO_SDK_CAT_HOME%\n" +
        "echo  * sed = %OO_SDK_SED_HOME%\n" +
        "echo  * C++ Compiler = %OO_SDK_CPP_HOME%\n" +
        "echo  * C# and VB.NET compilers = %OO_SDK_CLI_HOME%\n" +
        "echo  * Java = %OO_SDK_JAVA_HOME%\n" +
        "echo  * Special Output directory = %OO_SDK_OUT%\n" +
        "echo  * Auto deployment = %SDK_AUTO_DEPLOYMENT%\n" +
        "echo  *\n" +
        "echo  ******************************************************************\n" +
        "echo.\n" +
        "goto end\n" + 
        "\n" +
        " :error\n" +
        "Error: Please insert the necessary environment variables into the batch file.\n" + 
        "\n" + 
        " :end\n" 
        );
        newFile.Close();        
}
