<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.inetium.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Andrew Zimmer : CRM Offline Client, CRM 4.0</title><link>http://blogs.inetium.com/blogs/azimmer/archive/tags/CRM+Offline+Client/CRM+4.0/default.aspx</link><description>Tags: CRM Offline Client, CRM 4.0</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Using Custom Dialogs in CRM 4.0 with Offline Client and CRM Online Support</title><link>http://blogs.inetium.com/blogs/azimmer/archive/2009/12/22/using-modal-dialogs-crm-4-0-with-offline-client-crm-online-support.aspx</link><pubDate>Tue, 22 Dec 2009 12:41:00 GMT</pubDate><guid isPermaLink="false">7346ef18-9fb1-4a4e-be41-9add5078176c:28880</guid><dc:creator>Andrew Zimmer</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.inetium.com/blogs/azimmer/rsscomments.aspx?PostID=28880</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.inetium.com/blogs/azimmer/commentapi.aspx?PostID=28880</wfw:comment><comments>http://blogs.inetium.com/blogs/azimmer/archive/2009/12/22/using-modal-dialogs-crm-4-0-with-offline-client-crm-online-support.aspx#comments</comments><description>&lt;p&gt;When you think of CRM Online or clients that use the Offline Client, you may think that custom forms are off limits, at least without a lot of deployment hastles.&amp;nbsp; I wanted to show a simple JScript snippet that can help provide more user-friendly forms when an ASP.Net website isn&amp;#39;t an option... ...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Problem&lt;br /&gt;&lt;/strong&gt;When the user clicks the button on a parent record for &amp;quot;Reject All&amp;quot;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prompt the user for a rejection reason&lt;/li&gt;
&lt;li&gt;Set the rejection reason on the parent record&lt;/li&gt;
&lt;li&gt;Update a rejected flag on the parent record&lt;/li&gt;
&lt;li&gt;Set the rejection reason on all child records&lt;/li&gt;
&lt;li&gt;Deactivate all child records&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NOTE:&amp;nbsp; The forms must support the Offline Client (indirectly this would support CRM Online).&lt;/p&gt;
&lt;p&gt;Since the code needed to support the offline client, I developed the entire solution in JScript.&amp;nbsp; When the user clicks the toolbar button,&amp;nbsp;a modal dialog will prompt for the cancellation reason and JScript will do all&amp;nbsp;the work of updating the parent and child records.&amp;nbsp; No external ASP.Net forms are necessary.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Click Toolbar Button for Reject All&lt;br /&gt;&lt;/strong&gt;&lt;a href="http://blogs.inetium.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/azimmer/EventBudget1.gif"&gt;&lt;img border="0" src="http://blogs.inetium.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/azimmer/EventBudget1.gif" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enter Reject Reason &lt;br /&gt;&lt;/strong&gt;&lt;a href="http://blogs.inetium.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/azimmer/EventBudget3b.gif"&gt;&lt;img border="0" src="http://blogs.inetium.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/azimmer/EventBudget3b.gif" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before I talk about how I implemented it, I wanted to go over the less desirable options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When the user clicks the &amp;quot;Reject All&amp;quot; button, make the Cancel Reason field required on the form and prompt the user to enter it and click save.&amp;nbsp; While this will accomplish the goals, it isn&amp;#39;t as user friendly.&lt;/li&gt;
&lt;li&gt;Use a JScript prompt to retrieve the cancel reason from the user and then use JScript to update the parent and child record (i.e. var reply = prompt(&amp;quot;Please enter a reject comment.&amp;quot;, &amp;quot;&amp;quot;)).&amp;nbsp; As with the previous solution,&amp;nbsp;this will accomplish the goals, but it isn&amp;#39;t as user friendly. &lt;/li&gt;
&lt;li&gt;Use ASP.Net web forms to retrieve the cancel reason.&amp;nbsp; This will also accomplish the goal but it presents some deployment challenges for the offline client and CRM Online.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The Solution&lt;br /&gt;&lt;/strong&gt;Begin by adding the ISV button to the toolbar.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;First, ensure that your installation is configured to allow ISV buttons for web, Outlook Client, and Offline Client.&amp;nbsp; This is done from Settings --&amp;gt; System Settings.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.inetium.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/azimmer/EventBudget4.gif"&gt;&lt;/a&gt;&lt;a href="http://blogs.inetium.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/azimmer/EventBudget4.gif"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.inetium.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/azimmer/EventBudget4b.gif"&gt;&lt;/a&gt;&lt;a href="http://blogs.inetium.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/azimmer/EventBudget4c.gif"&gt;&lt;img border="0" src="http://blogs.inetium.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/azimmer/EventBudget4c.gif" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://blogs.inetium.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/azimmer/EventBudget5.gif"&gt;&lt;img border="0" src="http://blogs.inetium.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/azimmer/EventBudget5.gif" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Second, import the following XML to add the button.&lt;/p&gt;
&lt;p&gt;&amp;lt;ImportExportXml version=&amp;quot;4.0.0.0&amp;quot; languagecode=&amp;quot;1033&amp;quot; generatedBy=&amp;quot;OnPremise&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Entities&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/Entities&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Roles&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/Roles&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Workflows&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/Workflows&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;IsvConfig&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;configuration version=&amp;quot;3.0.0000.0&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Root&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;MenuBar&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Root&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Entities&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Entity name=&amp;quot;inet_budget&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ToolBar ValidForCreate=&amp;quot;0&amp;quot; ValidForUpdate=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Button Icon=&amp;quot;/_imgs/ico_18_role_x.gif&amp;quot; JavaScript=&amp;quot;document.RejectAll();&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Titles&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Title LCID=&amp;quot;1033&amp;quot; Text=&amp;quot;Reject All&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Titles&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ToolTips&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ToolTip LCID=&amp;quot;1033&amp;quot; Text=&amp;quot;Reject All&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ToolTips&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Button&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Entity&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Entities&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/IsvConfig&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;EntityMaps /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;EntityRelationships /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Languages&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Language&amp;gt;1033&amp;lt;/Language&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/Languages&amp;gt;&lt;br /&gt;&amp;lt;/ImportExportXml&amp;gt;&lt;/p&gt;
&lt;p&gt;Notice that the JScript attached to the button simply calls a function.&amp;nbsp; I like to&amp;nbsp;use functions,&amp;nbsp;so I don&amp;#39;t have to re-import the ISV Config customization every time I want to make a simple JScript change.&amp;nbsp; I can just update the On Load for the form.&lt;/p&gt;
&lt;p&gt;Next, add the following code to OnLoad to handle the button click event.&amp;nbsp; It begins by opening a modal dialog by using some hard-coded HTML.&amp;nbsp; As opposed to deploying an ASP.Net web page to your ISV folder on the CRM Server (as well as Offline Client user&amp;#39;s machine), you are able to deploy your entire solution by importing/exporting your CRM customizations.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;br /&gt;document.RejectAll = function()&lt;br /&gt;{&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;var childWindow = window.open(&amp;#39;&amp;#39;,&amp;#39;&amp;#39;,&amp;#39;menubar=no,statusbar=no,toolbar=no,width=285,height=175&amp;#39;);&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;// If its already been rejected before, take the reject comment from the form&lt;br /&gt;var currentRejectComment = &amp;quot;&amp;quot;;&lt;br /&gt;if(crmForm.all.inet_rejectcomment.DataValue != null)&lt;br /&gt;&amp;nbsp; currentRejectComment = crmForm.all.inet_rejectcomment.DataValue;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;br /&gt;var htmlText = &amp;quot;&amp;lt;html&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;lt;body background-color=&amp;#39;#6693CF&amp;#39;&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;table width=&amp;#39;265&amp;#39; height=&amp;#39;135&amp;#39; cellpadding=&amp;#39;0&amp;#39; cellspacing=&amp;#39;0&amp;#39;&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr align=&amp;#39;left&amp;#39; bgcolor=&amp;#39;#6693CF&amp;#39;&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td align=&amp;#39;left&amp;#39; colspan=&amp;#39;2&amp;#39;&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;font size=&amp;#39;2&amp;#39; color=&amp;#39;#FFFFFF&amp;#39;&amp;gt;&amp;lt;b&amp;gt;Please Enter Reject Reason&amp;lt;/font&amp;gt;&amp;lt;/b&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr align=&amp;#39;left&amp;#39; bgcolor=&amp;#39;#E3EFFF&amp;#39;&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td align=&amp;#39;left&amp;#39;&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;font size=&amp;#39;2&amp;#39;&amp;gt;Reason:&amp;lt;/font&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td align=&amp;#39;left&amp;#39;&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;textarea cols=&amp;#39;25&amp;#39; rows=&amp;#39;4&amp;#39; id=&amp;#39;txtRejectReason&amp;#39; textmode=&amp;#39;multiline&amp;#39;&amp;gt;&amp;quot; + currentRejectComment&amp;nbsp; + &amp;quot;&amp;lt;/textarea&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr width=&amp;#39;100%&amp;#39; align=&amp;#39;left&amp;#39; bgcolor=&amp;#39;#E3EFFF&amp;#39;&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td colspan=&amp;#39;2&amp;#39; align=&amp;#39;center&amp;#39;&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;button style=&amp;#39;width:50px&amp;#39;&amp;nbsp; id=&amp;#39;btnOk&amp;#39; title=&amp;#39;Ok&amp;#39; onclick=&amp;#39;BLOCKED SCRIPTwindow.opener.document.RejectAllWithReason(txtRejectReason.value);window.close();&amp;#39;&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ok&amp;lt;/button&amp;gt;&amp;amp;nbsp;&amp;lt;button style=&amp;#39;width:50px&amp;#39; id=&amp;#39;btnCancel&amp;#39; title=&amp;#39;Cancel&amp;#39; onclick=&amp;#39;BLOCKED SCRIPTwindow.close();&amp;#39;&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cancel&amp;lt;/button&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;lt;/body&amp;gt;&amp;quot;;&lt;br /&gt;htmlText += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;childWindow.document.write(htmlText);&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The HTML includes a text box for the cancel reason.&amp;nbsp; If you were to click cancel, it would simply give control back to the CRM Form.&amp;nbsp; If you click OK, it calls another function on the form to complete the rest of the save.&lt;/p&gt;
&lt;p&gt;On &amp;quot;OK&amp;quot; click, call this function which updates the cancel reason on the parent record along with the cancelled flag.&amp;nbsp; Update the cancel reason on all child records and deactivate the child records, all using JScript.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;document.RejectAllWithReason = function(rejectReason)&lt;br /&gt;{&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&amp;nbsp;// OMITTED - updating child entity fields and deactivating in JScript&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Update parent&amp;nbsp;record fields and save&lt;br /&gt;&amp;nbsp; crmForm.all.inet_rejectcomment.DataValue = rejectReason+ &amp;quot; &amp;quot;;&lt;br /&gt;&amp;nbsp; crmForm.all.inet_rejectallflag.ForceSubmit = true;&lt;br /&gt;&amp;nbsp; crmForm.all.inet_rejectallflag.DataValue = true;&amp;nbsp; &lt;br /&gt;&amp;nbsp; crmForm.Save();&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;You now have a solution that works in the Offline Client and CRM Online without introducing complex deployment scenarios!&lt;/p&gt;
&lt;p&gt;Enjoy,&lt;br /&gt;Andrew&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.inetium.com/aggbug.aspx?PostID=28880" width="1" height="1"&gt;</description><category domain="http://blogs.inetium.com/blogs/azimmer/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://blogs.inetium.com/blogs/azimmer/archive/tags/CRM+4.0/default.aspx">CRM 4.0</category><category domain="http://blogs.inetium.com/blogs/azimmer/archive/tags/CRM+Offline+Client/default.aspx">CRM Offline Client</category><category domain="http://blogs.inetium.com/blogs/azimmer/archive/tags/JScript/default.aspx">JScript</category><category domain="http://blogs.inetium.com/blogs/azimmer/archive/tags/CRM+Online/default.aspx">CRM Online</category></item></channel></rss>