// ============================================================== // Microsoft Server Appliance // Page-level JavaScript functions // // Copyright (c) Microsoft Corporation. All rights reserved. // // ============================================================== var blnOkayToLeavePage = true; function SetOkayToLeavePage() { blnOkayToLeavePage = true; } function ClearOkayToLeavePage() { blnOkayToLeavePage = false; } function SetPageChanged(valChanged) { if ( valChanged ) { ClearOkayToLeavePage(); } else { SetOkayToLeavePage(); SA_StoreInitialState(); } } function SA_IsOkToChangePage() { if ( SA_HasStateChanged() ) return false; else return true; } //------------------------------------------------------------------------- // // Function : GetCurrentTabURL // // Synopsis : Get the URL of the currently active tab // // Arguments: None // // Returns : None // //------------------------------------------------------------------------- function GetCurrentTabURL() { var strReturnURL; var strStart; var strEnd; var intTab; strReturnURL = document.location.search; strStart = strReturnURL.indexOf("Tab="); if (strStart != -1) { strEnd = strReturnURL.indexOf("&", strStart+4); if (strEnd != -1) { intTab = strReturnURL.substring(strStart+4, strEnd); } else { intTab = strReturnURL.substring(strStart+4, strReturnURL.length); } } if (intTab==null) { intTab=0; } return GetTabURL(intTab); } //------------------------------------------------------------------------- // // Function : OpenNewPage // // Synopsis : Opens a new browser window for the specified URL // // Arguments: VirtualRoot(IN) - current virtual root // TaskURL(IN) - URL to open // // Returns : None // //------------------------------------------------------------------------- function OpenNewPage(VirtualRoot, TaskURL, WindowFeatures) { var strURL; strURL = VirtualRoot + TaskURL; if ( WindowFeatures != 'undefined' && WindowFeatures.length > 0 ) { window.open(strURL, '_blank', WindowFeatures) } else { window.open(strURL, '_blank') } return true; } //------------------------------------------------------------------------- // // Function : OpenRawPageEx // // Synopsis : Opens a new browser window for the specified URL // // Arguments: TaskURL(IN) - URL to open // WindowFeatures - parameters for window features in window.open call // // Returns : None // //------------------------------------------------------------------------- function OpenRawPageEx(TaskURL, WindowFeatures) { if ( WindowFeatures != 'undefined' && WindowFeatures.length > 0 ) { window.open(TaskURL, '_blank', WindowFeatures) } else { window.open(TaskURL, '_blank') } return true; } //------------------------------------------------------------------------- // // Function : OpenRawPage // // Synopsis : Opens a new browser window for the specified URL // // Arguments: VirtualRoot(IN) - current virtual root // TaskURL(IN) - URL to open // // Returns : None // //------------------------------------------------------------------------- function OpenRawPage(TaskURL) { return OpenRawPageEx(TaskURL, ''); } //------------------------------------------------------------------------- // // Function : OpenNormalPage // // Synopsis : , // and sets the current window to open it. // // Arguments: VirtualRoot(IN) - current virtual root // TaskURL(IN) - URL to open // // Returns : None // //------------------------------------------------------------------------- function OpenNormalPage(VirtualRoot, TaskURL) { var strURL; // This section will check to see if the user has made any changes to the page // which might be lost if we leave. Ask the user if this is the case. if (!SA_IsOkToChangePage() ) { if (!confirm(GetUnsavedChangesMessage()) ) { return false; } } strURL = VirtualRoot + TaskURL; strURL = SA_MungeURL(strURL, SAI_FLD_PAGEKEY, g_strSAIPageKey); top.location = strURL; } function SA_OnOpenNormalPage(sRoot, sURL, sReturnURL) { if ( sReturnURL.length <= 0 ) { sReturnURL = top.location.href; } sReturnURL = SA_MungeURL(sReturnURL, "R", ""+Math.random()); sURL = SA_MungeURL(sURL, "ReturnURL", sReturnURL); OpenNormalPage(sRoot, sURL) return true; } function SA_OnOpenPropertyPage(sRoot, sURL, sReturnURL, sTaskTitle) { if ( sReturnURL.length <= 0 ) { sReturnURL = top.location.href; } sReturnURL = SA_MungeURL(sReturnURL, "R", ""+Math.random()); OpenPage(sRoot, sURL, sReturnURL, sTaskTitle) return true; } //------------------------------------------------------------------------- // // Function : OpenPage // // Synopsis : Builds a URL, adding a ReturnURL and a random number(R), // and sets the current window to open it. // // Arguments: VirtualRoot(IN) - current virtual root // TaskURL(IN) - URL to open // ReturnURL(IN) - URL to mark as return URL for the TaskURL // strTitle(IN) - title of wizard // // Returns : None // //------------------------------------------------------------------------- function OpenPage(VirtualRoot, TaskURL, ReturnURL, strTitle) { var strURL; var strQueryString; var strCurrentURL; var i; var intReturnURLIndex; //alert("TaskURL: " + TaskURL); //alert("ReturnURL: " + ReturnURL); //alert("top.location: " + top.location); if (!SA_IsOkToChangePage() ) { if (!confirm(GetUnsavedChangesMessage()) ) { return false; } } // // Remove Random number param from ReturnURL // //alert("Before removing R param ReturnURL: " + ReturnURL); ReturnURL = SA_MungeURL(ReturnURL, "R", ""+Math.random()); //alert("After ReturnURL: " + ReturnURL); //i = ReturnURL.indexOf('&R='); //if (i != -1) //{ // ReturnURL = ReturnURL.substring(0, i); //} //else //{ // i = ReturnURL.indexOf('?R='); // if (i != -1) // { // ReturnURL = ReturnURL.substring(0, i); // } //} //i = ReturnURL.indexOf('?') //if ( i != -1 ) //{ //ReturnURL = ReturnURL + "&R=" + Math.random(); //} //else //{ //ReturnURL = ReturnURL + "?R=" + Math.random(); //} i = TaskURL.indexOf('&ReturnURL=') if (i != -1) { strURL = TaskURL.substring(0, i); } // JK 1-16-01 // Strip TaskURL of the Random number parameter //strURL = SA_MungeURL(TaskURL, "R", ""); i = TaskURL.indexOf('&R='); if (i != -1) { strURL = TaskURL.substring(0, i); } else { i = TaskURL.indexOf('?R='); if (i != -1) { strURL = TaskURL.substring(0, i); } else { strURL = TaskURL; } } strURL = '&URL=' + EscapeArg(strURL); if (TaskURL.indexOf('ReturnURL') == -1) { if ( (ReturnURL == null) || (ReturnURL == '') ) { strQueryString = window.location.search; i = strQueryString.indexOf('&R='); if (i != -1) { strQueryString = strQueryString.substring(0, i); } else { i = strQueryString.indexOf('?R='); if (i != -1) { strQueryString = strQueryString.substring(0, i); } } intReturnURLIndex = strQueryString.indexOf('ReturnURL'); if (intReturnURLIndex != -1) { strQueryString = strQueryString.substring(0, intReturnURLIndex); } strCurrentURL = window.location.pathname + strQueryString; } else { // JK 1-16-01 // Do not remove returnURL parameter contained within returnURL // //i = ReturnURL.indexOf('&ReturnURL='); //if (i != -1) //{ // ReturnURL = ReturnURL.substring(0,i); //} strCurrentURL = EscapeArg(ReturnURL); } strURL += "&ReturnURL="; if (strCurrentURL.indexOf('/', 1) != -1 && strCurrentURL.substr('..', 0, 2) == -1) { strURL += ".."; } strURL += strCurrentURL; } strURL += "&R=" + Math.random(); strURL += "&" + SAI_FLD_PAGEKEY + "=" + g_strSAIPageKey; strURL = 'Title=' + EscapeArg(strTitle) + strURL; strURL = VirtualRoot + 'sh_taskframes.asp?' + strURL; top.location = strURL; } //------------------------------------------------------------------------- // // Function : GetServerName // // Synopsis : Return server name as specified in browser address bar // // Arguments: None // // Returns : server name object // //------------------------------------------------------------------------- function GetServerName() { return window.location.host; } //------------------------------------------------------------------------- // // Function : IsIE // // Synopsis : Is browser IE // // Arguments: None // // Returns : true/false // //------------------------------------------------------------------------- function IsIE() { if (navigator.userAgent.indexOf('MSIE')>-1) return true; else return false; } //------------------------------------------------------------------------- // // Function : Trim // // Synopsis : remove all spaces from a string // // Arguments: str(IN) - string to modify // // Returns : modified string // //------------------------------------------------------------------------- function Trim(str) { var res="", i, ch; for (i=0; i < str.length; i++) { ch = str.charAt(i); if (ch != ' '){ res = res + ch; } } return res; } //------------------------------------------------------------------------- // // Function : BlurLayer // // Synopsis : hide layer // // Arguments: None // // Returns : None // //------------------------------------------------------------------------- function BlurLayer() { document.menu.visibility = "hide"; } //--------------------------------------------------------------- // Confirm tab change support global variables //--------------------------------------------------------------- var aCSAFormFields = null; //------------------------------------------------------------------------- // // Object: CSAFormField // // Synopsis: This object is used to track form field state changes // // Arguments: [in] nameIn name of form field // [in] valueIn initial value of form field // [in] statusIn initial status of form field // // Returns: Nothing // //------------------------------------------------------------------------- function CSAFormField(formNameIn, nameIn, valueIn, statusIn ) { this.FormName = formNameIn; this.Name = nameIn; this.Value = valueIn; this.Status = statusIn; } //------------------------------------------------------------------------- // // Function: SA_StoreInitialState // // Synopsis: Store the initial state of all form fields on this page. // // Arguments: None // // Returns: Nothing // //------------------------------------------------------------------------- function SA_StoreInitialState() { var x; var y; var z; var formFieldCount; formFieldCount = 0; for( x = 0; x < document.forms.length; x++ ) { formFieldCount += document.forms[x].elements.length; } aCSAFormFields = new Array(formFieldCount); z = 0; for( x = 0; x < document.forms.length; x++ ) { for ( y = 0; y < document.forms[x].elements.length; y++) { aCSAFormFields[z] = new CSAFormField( document.forms[x].name, document.forms[x].elements[y].name, document.forms[x].elements[y].value, document.forms[x].elements[y].status ); z++; } } } //------------------------------------------------------------------------- // // Function: SA_HasStateChanged // // Synopsis: Check to see if any of the form fields on this page have // changed from their initial state. // // Arguments: None // // Returns: True if changes were made, False if form is unchanged. // //------------------------------------------------------------------------- function SA_HasStateChanged() { var x; var y; var z; if ( aCSAFormFields == null ) return false; z = 0; for( x = 0; x < document.forms.length; x++ ) { for ( y = 0; y < document.forms[x].elements.length; y++) { var ff = aCSAFormFields[z]; if ( ff.Name != document.forms[x].elements[y].name ) { SA_TraceOut("SA_HasStateChanged", "Field " + ff.Name + "\r\nUnexpected error, form field name changed."); return true; } if ( ff.Value != document.forms[x].elements[y].value ) { //SA_TraceOut("SA_HasStateChanged", "Form:" + ff.FormName + "\r\nField:" + ff.Name + "\r\nStarting Value:" + ff.Value + " Ending Value:" + document.forms[x].elements[y].value); return true; } if ( ff.Status != document.forms[x].elements[y].status) { //SA_TraceOut("SA_HasStateChanged", "Form:" + ff.FormName + "\r\nField:" + ff.Name + "\r\nValue:" + ff.Value+ "\r\nStarting Status:" + ff.Status + " Ending Status:" + document.forms[x].elements[y].status); return true; } z++; } } return false; } //--------------------------------------------------------------- // Client side script debugging //--------------------------------------------------------------- var sa_bDebugEnabled = true; //------------------------------------------------------------------------- // // Function: // // Synopsis: // // Arguments: // // Returns: // //------------------------------------------------------------------------- function SA_IsDebugEnabled() { //return sa_bDebugEnabled; return GetIsDebugEnabled(); } //------------------------------------------------------------------------- // // Function: // // Synopsis: // // Arguments: // // Returns: // //------------------------------------------------------------------------- function SA_TraceOut(fn, msg) { if ( SA_IsDebugEnabled() ) { objForm = SA_FindForm("frmDebug"); if ( null == objForm ) { //alert("Function: " + fn + "\r\n\r\n" + msg ); } else { if ( objForm.txtDebugOut.value.length > 1 ) objForm.txtDebugOut.value += "\r\nFunction: " + fn + " " + msg; else objForm.txtDebugOut.value = "Function: " + fn + " " + msg; } } } function SA_FindForm(formName) { var x; if ( top.document.forms.length > 0 ) { for( x = 0; x < top.document.forms.length; x++ ) { //alert( "Found form: " + top.document.forms[x].name ); if ( formName == top.document.forms[x].name ) { return top.document.forms[x]; } } } else { //alert( "Form count: " + parent.main.document.forms.length ); for( x = 0; x < parent.main.document.forms.length; x++ ) { //alert( "Found form: " + parent.main.document.forms[x].name ); if ( formName == parent.main.document.forms[x].name ) { return parent.main.document.forms[x]; } } } return null; } //--------------------------------------------------------------------------------- // Function: // SA_MungeURL(var sURL, var sParamName, var sParamValue ) // // Synopsis: // Add, Update, or Delete parameters to a query string URL. If the parameter is not in // the URL it is added. If it exists, it's value is updated. If the parameter value is blank // then the parameter is removed from the URL. // // The URL must be non-blank on input. If a blank URL is passed an error message is // displayed and a empty string is returned. // // Arguments: // sURL - Non blank URL that is to be changed. // sParamName - Name of QueryString parameter // sParamValue - Value of the parameter // // Returns: // Updated query string URL, empty string if an error occurs. // //--------------------------------------------------------------------------------- function SA_MungeURL(sURL, sParamName, sParamValue) { var i; var oException; // // Validate arguments // if ( sURL == null ) { sURL = ""; } if ( (typeof sURL) != "string" ) { sURL = "" + sURL; } if ( sParamName == null ) { SA_TraceOut("SA_MungeURL", "Invalid argument: sParamName is null"); return ""; } if ( (typeof sParamName) != "string" ) { sParamName = "" + sParamName; } if ( sParamValue == null ) { sParamValue = ""; } if ( (typeof sParamValue) != "string" ) { sParamValue = "" + sParamValue; } if ( sURL.length <= 0 ) { SA_TraceOut("SA_MungeURL", "Invalid argument: sURL is empty"); return ""; } if ( sParamName.length <= 0 ) { SA_TraceOut("SA_MungeURL", "Invalid argument: sParamName is empty"); return ""; } // // Munge the URL // try { i = sURL.indexOf("?"+sParamName+"="); if ( i < 0 ) { i = sURL.indexOf("&"+sParamName+"="); } if ( i > 0 ) { //SA_TraceOut("SA_MungeURL","Found parameter: " + sParamName ); var sURL1 = sURL.substring(0, i); var sURL2 = sURL.substring(i+1); //SA_TraceOut("SA_MungeURL", "sURL1: " + sURL1); //SA_TraceOut("SA_MungeURL", "sURL2: " + sURL2); i = sURL2.indexOf("&"); if ( i > 0 ) { sURL2 = sURL2.substring(i); } else { sURL2 = ""; } if (sParamValue.length > 0) { //SA_TraceOut("SA_MungeURL","Value: " + sParamValue); if (sURL1.indexOf("?") > 0 ) { sURL = sURL1 + "&" + sParamName + "=" + EscapeArg(sParamValue) + sURL2; } else { sURL = sURL1 + "?" + sParamName + "=" + EscapeArg(sParamValue) + sURL2; } } else { if (sURL1.indexOf("?") > 0) { sURL = sURL1 + sURL2; } else { sURL = sURL1 + "?" + sURL2.substring(1); } } } else { if ( sParamValue.length > 0 ) { if ( 0 > sURL.indexOf("?") ) { sURL += '?' + sParamName + '=' + EscapeArg(sParamValue); } else { sURL += '&' + sParamName + '=' + EscapeArg(sParamValue); } } } } catch(oException) { SA_TraceOut("SA_MungeURL", "SA_MungeURL encountered exception: " + oException.number + " " + oException.description); } return sURL; } //--------------------------------------------------------------------------------- // Function: // SA_MungeExtractURLParameter(var sURL, var sParamName) // // Synopsis: // Extract the value of a query string parameter. If the parameter does not exist an empty // string is returned. // // The URL must be non-blank on input. If a blank URL is passed an error message is // displayed and a empty string is returned. // // Arguments: // sURL - Non blank URL that is to be changed. // sParamName - Name of QueryString parameter // // Returns: // Value of query string parameter, empty string if an error occurs. // //--------------------------------------------------------------------------------- function SA_MungeExtractURLParameter(sURL, sParamName) { var i; var oException; var sParamValue = ""; // // Validate arguments // if ( sURL == null ) { sURL = ""; } if ( (typeof sURL) != "string" ) { sURL = "" + sURL; } if ( sParamName == null ) { SA_TraceOut("SA_MungeURL", "Invalid argument: sParamName is null"); return ""; } if ( (typeof sParamName) != "string" ) { sParamName = "" + sParamName; } if ( sURL.length <= 0 ) { SA_TraceOut("SA_MungeExtractURLParameter", "Invalid argument: sURL is empty"); return ""; } if ( sParamName.length <= 0 ) { SA_TraceOut("SA_MungeExtractURLParameter", "Invalid argument: sParamName is empty"); return ""; } // // Scan for the Parameter // try { var sParamToken = "?"+sParamName+"="; i = sURL.indexOf(sParamToken); if ( i < 0 ) { sParamToken = "&"+sParamName+"="; i = sURL.indexOf(sParamToken); } if ( i > 0 ) { sParamValue = sURL.substring(i+sParamToken.length); i = sParamValue.indexOf("&"); if ( i > 0 ) { sParamValue = sParamValue.substring(0, i); } } } catch(oException) { SA_TraceOut("SA_MungeExtractURLParameter", "SA_MungeExtractURLParameter encountered exception: " + oException.number + " " + oException.description); } return sParamValue; } //--------------------------------------------------------------------------------- // Function: // SA_EnableButton(var oButton, var bEnabled) // // Synopsis: // Change the enabled state for a button. oButton must be a DOM reference to a object // of type='button'. // // Arguments: // oButton - DOM Reference object ot a button // bEnabled - boolean flag indicating if the button should be enabled (true) or disabled(false) // // Returns: // true to indicate success, false to indicate errors. // //--------------------------------------------------------------------------------- function SA_EnableButton(oButton, bEnable) { var oException; try { // // Validate arguments if ( oButton == null ) { SA_TraceOut("SA_EnableButton", "oButton argument was null."); return false; } if ( oButton.type != "button" ) { SA_TraceOut("SA_EnableButton", "oButton.type is invalid, requires oButton.type='button'. Type was: " +oButton.type); return false; } if ( bEnable != true && bEnable != false ) { SA_TraceOut("SA_EnableButton", "bEnable argument was invalid, required to be either true or false"); return false; } // // Set the button disabled state, the inverse of the bEnabled argument oButton.disabled = ( (bEnable) ? false : true ); oButton.value = oButton.value; return true; } catch(oException) { SA_TraceOut("SA_EnableButton", "Encountered exception: " + oException.number + " " + oException.description); return false; } } /////////////////////////////////////////////////////////////////////////////////////////////////// // EscapeArg( // // @jfunc This function escapes (i.e., legalize) the specified argument. // // @rdesc Newly formatted argument // // @ex Usage: strShow = EscapeArg("Is <> : * \" this?"); /////////////////////////////////////////////////////////////////////////////////////////////////// function EscapeArg( strArg ) { return EncodeHttpURL(strArg, 1); // Validate input. if (null == strArg) return null; // Convert %xx to %u00xx var strEscArg = escape( strArg ); strEscArg = strEscArg.replace(/(%)([0-9A-F])/gi, "%u00$2"); strEscArg = strEscArg.replace(/\+/g, "%u002B"); // Else + becomes space. return strEscArg; } /////////////////////////////////////////////////////////////////////////////////////////////////// // UnicodeToUTF8 // // @jfunc This function converts a string from Unicode to UTF-8 encoding. // // @rdesc Newly formatted string // // @ex Usage: strShow = UnicodeToUTF8("\u33C2\u7575\u8763"); /////////////////////////////////////////////////////////////////////////////////////////////////// function UnicodeToUTF8( strInUni // @parm The string in Unicode encoding ) { // Validate input. if (null == strInUni) return null; // The following line fixes a problem when the input is not a valid java script string object. // This can happen, for example, if the caller passes the output of QueryString() to this // function; InterDev pops up the following error message if this happen: the error code is // object doesn't support this property or method. This line of code makes sure we use a valid // java script string object. var strUni = ""+strInUni; // Map string. var strUTF8 = ""; // Destination (UTF8 encoded string) // Convert Unicode to UTF-8 for(var i=0; i 110y yyxx 10xx xxxx var chr1 = wchr & 0xff; // low byte. var chr2 = (wchr >> 8) & 0xff; // high byte. strUTF8 += String.fromCharCode(0xC0 | (chr2 << 2) | ((chr1 >> 6) & 0x3)); strUTF8 += String.fromCharCode(0x80 | (chr1 & 0x3F)); } else { // A char in range 0x800-0xffff is converted to 3 bytes as follows: // yyyy yyyy xxxx xxxx -> 1110 yyyy 10yy yyxx 10xx xxxx var chr1 = wchr & 0xff; // low byte. var chr2 = (wchr >> 8) & 0xff; // high byte. strUTF8 += String.fromCharCode(0xE0 | (chr2 >> 4)); strUTF8 += String.fromCharCode(0x80 | ((chr2 << 2) & 0x3C) | ((chr1 >> 6) & 0x3)); strUTF8 += String.fromCharCode(0x80 | (chr1 & 0x3F)); } } return strUTF8; } /////////////////////////////////////////////////////////////////////////////////////////////////// // EscapeHttpURL // // @jfunc This function escapes the illigal http chars. // // @rdesc Newly formatted string // // @ex Usage: strShow = EscapeHttpURL("Is <> \" this a / folder \ name?"); /////////////////////////////////////////////////////////////////////////////////////////////////// function EscapeHttpURL( strHttpURL, // @parm URL to escape nFlags // @parm Encoding flags. ) { // Validate input. if (null == strHttpURL) return null; // Init default argument. if (null == nFlags) nFlags = 0; // The following line fixes a problem when the input is not a valid java script string object. // This can happen, for example, if the caller passes the output of QueryString() to this // function; InterDev pops up the following error message if this happen: the error code is // object doesn't support this property or method. This line of code makes sure we use a valid // java script string object. var strURL = ""+strHttpURL; // Unescape string. var strEsc = ""; for(var i=0; i': case '\\': bEscape = true; break; case '%': if (nFlags & 0x1) bEscape = true; break; default: if ((chrCode > 0x00 && chrCode <= 0x20) || (chrCode > 0x7f && chrCode <= 0xff)) bEscape = true; break; } // escape() doesn't escape the '+' sign. if ('+' == chr) strEsc += "%2B"; else if (bEscape) strEsc += escape(chr); else strEsc += chr; } // All done. return strEsc; } /////////////////////////////////////////////////////////////////////////////////////////////////// // EncodeHttpURL( // // @jfunc This function legalizes an http url. // // @rdesc Newly formatted name // // @ex Usage: strShow = EncodeHttpURL("Is [] {} $24 $22 it a folder$3F"); /////////////////////////////////////////////////////////////////////////////////////////////////// function EncodeHttpURL( strHttpURL, // @parm File folder name to be encode. nFlags // @parm Encoding flags. ) { // Validate input. if (null == strHttpURL) return null; // Init default argument. if (null == nFlags) nFlags = 0; // The following line fixes a problem when the input is not a valid java script string object. // This can happen, for example, if the caller passes the output of QueryString() to this // function; InterDev pops up the following error message if this happen: the error code is // object doesn't support this property or method. This line of code makes sure we use a valid // java script string object. var strURL = ""+strHttpURL; // Convert to UTF-8 strURL = UnicodeToUTF8( strURL ); // Percent escape. strURL = EscapeHttpURL( strURL, nFlags ); // All done. return strURL; }