// // System.Web.UI.ClientScriptManager.cs // // Authors: // Duncan Mak (duncan@ximian.com) // Gonzalo Paniagua (gonzalo@ximian.com) // Andreas Nahr (ClassDevelopment@A-SoftTech.com) // Lluis Sanchez (lluis@novell.com) // // (C) 2002,2003 Ximian, Inc. (http://www.ximian.com) // (c) 2003 Novell, Inc. (http://www.novell.com) // // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using System.Text; namespace System.Web.UI { #if NET_2_0 public sealed #else internal #endif class ClientScriptManager { Hashtable registeredArrayDeclares; ScriptEntry clientScriptBlocks; ScriptEntry startupScriptBlocks; Hashtable hiddenFields; ScriptEntry submitStatements; ScriptEntry scriptIncludes; Page page; internal ClientScriptManager (Page page) { this.page = page; } #if !NET_2_0 public string GetPostBackClientEvent (Control control, string argument) { return GetPostBackEventReference (control, argument); } #endif public string GetPostBackClientHyperlink (Control control, string argument) { return "javascript:" + GetPostBackEventReference (control, argument); } public string GetPostBackEventReference (Control control, string argument) { page.RequiresPostBackScript (); return String.Format ("__doPostBack('{0}','{1}')", control.UniqueID, argument); } #if NET_2_0 public string GetPostBackEventReference (PostBackOptions options) { if (options.ActionUrl == null && options.ValidationGroup == null && !options.TrackFocus && !options.AutoPostBack && !options.PerformValidation) { if (!options.ClientSubmit) return null; if (options.RequiresJavaScriptProtocol) return GetPostBackClientHyperlink (options.TargetControl, options.Argument); else return GetPostBackEventReference (options.TargetControl, options.Argument); } if (!IsClientScriptIncludeRegistered (typeof(Page), "webform")) { RegisterClientScriptInclude (typeof(Page), "webform", GetWebResourceUrl (typeof(Page), "webform.js")); } if (options.ActionUrl != null) RegisterHiddenField (Page.PreviousPageID, page.Request.FilePath); if (options.ClientSubmit || options.ActionUrl != null) page.RequiresPostBackScript (); return String.Format ("{0}WebForm_DoPostback({1},{2},{3},{4},{5},{6},{7},{8})", options.RequiresJavaScriptProtocol ? "javascript:" : "", ClientScriptManager.GetScriptLiteral (options.TargetControl.UniqueID), ClientScriptManager.GetScriptLiteral (options.Argument), ClientScriptManager.GetScriptLiteral (options.ActionUrl), ClientScriptManager.GetScriptLiteral (options.AutoPostBack), ClientScriptManager.GetScriptLiteral (options.PerformValidation), ClientScriptManager.GetScriptLiteral (options.TrackFocus), ClientScriptManager.GetScriptLiteral (options.ClientSubmit), ClientScriptManager.GetScriptLiteral (options.ValidationGroup) ); } public string GetCallbackEventReference (Control control, string argument, string clientCallback, string context) { return GetCallbackEventReference (control.UniqueID, argument, clientCallback, context, null, false); } public string GetCallbackEventReference (Control control, string argument, string clientCallback, string context, bool useAsync) { return GetCallbackEventReference (control.UniqueID, argument, clientCallback, context, null, useAsync); } public string GetCallbackEventReference (Control control, string argument, string clientCallback, string context, string clientErrorCallback, bool useAsync) { return GetCallbackEventReference (control.UniqueID, argument, clientCallback, context, clientErrorCallback, useAsync); } public string GetCallbackEventReference (string target, string argument, string clientCallback, string context, string clientErrorCallback, bool useAsync) { page.RequiresPostBackScript (); if (!IsClientScriptIncludeRegistered (typeof(Page), "callback")) RegisterClientScriptInclude (typeof(Page), "callback", GetWebResourceUrl (typeof(Page), "callback.js")); return string.Format ("WebForm_DoCallback ('{0}', {1}, {2}, {3}, {4})", target, argument, clientCallback, context, clientErrorCallback); } #endif #if NET_2_0 public #else internal #endif string GetWebResourceUrl(Type type, string resourceName) { if (type == null) throw new ArgumentNullException ("type"); if (resourceName == null || resourceName.Length == 0) throw new ArgumentNullException ("type"); return System.Web.Handlers.AssemblyResourceLoader.GetResourceUrl (type, resourceName); } public bool IsClientScriptBlockRegistered (string key) { return IsScriptRegistered (clientScriptBlocks, GetType(), key); } public bool IsClientScriptBlockRegistered (Type type, string key) { return IsScriptRegistered (clientScriptBlocks, type, key); } public bool IsStartupScriptRegistered (string key) { return IsScriptRegistered (startupScriptBlocks, GetType(), key); } public bool IsStartupScriptRegistered (Type type, string key) { return IsScriptRegistered (startupScriptBlocks, type, key); } public bool IsOnSubmitStatementRegistered (string key) { return IsScriptRegistered (submitStatements, GetType(), key); } public bool IsOnSubmitStatementRegistered (Type type, string key) { return IsScriptRegistered (submitStatements, type, key); } public bool IsClientScriptIncludeRegistered (string key) { return IsScriptRegistered (scriptIncludes, GetType(), key); } public bool IsClientScriptIncludeRegistered (Type type, string key) { return IsScriptRegistered (scriptIncludes, type, key); } bool IsScriptRegistered (ScriptEntry scriptList, Type type, string key) { while (scriptList != null) { if (scriptList.Type == type && scriptList.Key == key) return true; scriptList = scriptList.Next; } return false; } public void RegisterArrayDeclaration (string arrayName, string arrayValue) { if (registeredArrayDeclares == null) registeredArrayDeclares = new Hashtable(); if (!registeredArrayDeclares.ContainsKey (arrayName)) registeredArrayDeclares.Add (arrayName, new ArrayList()); ((ArrayList) registeredArrayDeclares[arrayName]).Add(arrayValue); } void RegisterScript (ref ScriptEntry scriptList, Type type, string key, string script, bool addScriptTags) { ScriptEntry last = null; ScriptEntry entry = scriptList; while (entry != null) { if (entry.Type == type && entry.Key == key) return; last = entry; entry = entry.Next; } if (addScriptTags) script = ""; entry = new ScriptEntry (type, key, script); if (last != null) last.Next = entry; else scriptList = entry; } internal void RegisterClientScriptBlock (string key, string script) { RegisterScript (ref clientScriptBlocks, GetType(), key, script, false); } public void RegisterClientScriptBlock (Type type, string key, string script) { RegisterScript (ref clientScriptBlocks, type, key, script, false); } public void RegisterClientScriptBlock (Type type, string key, string script, bool addScriptTags) { RegisterScript (ref clientScriptBlocks, type, key, script, addScriptTags); } public void RegisterHiddenField (string hiddenFieldName, string hiddenFieldInitialValue) { if (hiddenFields == null) hiddenFields = new Hashtable (); if (!hiddenFields.ContainsKey (hiddenFieldName)) hiddenFields.Add (hiddenFieldName, hiddenFieldInitialValue); } internal void RegisterOnSubmitStatement (string key, string script) { RegisterScript (ref submitStatements, GetType (), key, script, false); } public void RegisterOnSubmitStatement (Type type, string key, string script) { RegisterScript (ref submitStatements, type, key, script, false); } internal void RegisterStartupScript (string key, string script) { RegisterScript (ref startupScriptBlocks, GetType(), key, script, false); } public void RegisterStartupScript (Type type, string key, string script) { RegisterScript (ref startupScriptBlocks, type, key, script, false); } public void RegisterStartupScript (Type type, string key, string script, bool addScriptTags) { RegisterScript (ref startupScriptBlocks, type, key, script, addScriptTags); } public void RegisterClientScriptInclude (string key, string url) { RegisterScript (ref scriptIncludes, GetType(), key, url, false); } public void RegisterClientScriptInclude (Type type, string key, string url) { RegisterScript (ref scriptIncludes, type, key, url, false); } #if NET_2_0 public void RegisterClientScriptResource (Type type, string resourceName) { RegisterScript (ref scriptIncludes, type, "resource-" + resourceName, GetWebResourceUrl (type, resourceName), false); } [MonoTODO] public void RegisterExpandoAttribute (string controlId, string name, string value) { throw new NotImplementedException (); } [MonoTODO] public void RegisterExpandoAttribute(string controlId, string attributeName, string attributeValue, bool encode) { throw new NotImplementedException (); } #endif void WriteScripts (HtmlTextWriter writer, ScriptEntry scriptList) { while (scriptList != null) { writer.WriteLine (scriptList.Script); scriptList = scriptList.Next; } } internal void WriteHiddenFields (HtmlTextWriter writer) { if (hiddenFields == null) return; foreach (string key in hiddenFields.Keys) { string value = hiddenFields [key] as string; writer.WriteLine ("\n", key, value); } hiddenFields = null; } internal void WriteClientScriptIncludes (HtmlTextWriter writer) { ScriptEntry entry = scriptIncludes; while (entry != null) { writer.WriteLine ("\n", entry.Script); entry = entry.Next; } } internal void WriteClientScriptBlocks (HtmlTextWriter writer) { WriteScripts (writer, clientScriptBlocks); } internal void WriteStartupScriptBlocks (HtmlTextWriter writer) { WriteScripts (writer, startupScriptBlocks); } internal void WriteArrayDeclares (HtmlTextWriter writer) { if (registeredArrayDeclares != null) { writer.WriteLine(); writer.WriteLine(""); writer.WriteLine(); } } #if NET_2_0 internal string GetClientValidationEvent (string validationGroup) { return "if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate('" + validationGroup + "');"; } #endif internal string GetClientValidationEvent () { return "if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate();"; } internal string WriteSubmitStatements () { if (submitStatements == null) return null; StringBuilder sb = new StringBuilder (); ScriptEntry entry = submitStatements; while (entry != null) { sb.Append (entry.Script); entry = entry.Next; } return sb.ToString (); } internal static string GetScriptLiteral (object ob) { if (ob == null) return "null"; else if (ob is string) { string s = (string)ob; s = s.Replace ("\"", "\\\""); return "\"" + s + "\""; } else if (ob is bool) { return ob.ToString().ToLower(); } else { return ob.ToString (); } } class ScriptEntry { public Type Type; public string Key; public string Script; public ScriptEntry Next; public ScriptEntry (Type type, string key, string script) { Key = key; Type = type; Script = script; } } #if NET_2_0 // helper method internal static string EnsureEndsWithSemicolon (string value) { if (value != null && value.Length > 0 && !value.EndsWith (";")) return value += ";"; return value; } #endif } }