Windows Setup gives an error message that the Product Key is not valid (invalid) if you attempt an upgrade or repair Microsoft Windows XP Media Center Edition with Microsoft Windows XP Home Edition or with Microsoft Windows XP Professional.
Programmable Key Restrictor
This script blocks the input of characters by using a Javascript function attached an input box which is called with the event onkeydown="" . This allows me to prevent input issues with end users because they cannot enter the wrong charcters in the first place. This script is standalone but works well with HTML5 input box validation rules.
I wrote this after I could not get any scripts I found online to work reliable across browsers. I also wanted to be able to make it programmable to account for different types of key restriction I wanted to do. I have use the onkeydown="" event because I believe the the onkeypress="" event only handles printable characters.
The following validators are basically the same with different options and can be programmed for any type of character validation you want including special characters. This script is using the new standard of event.key which with a few tweaks is usable across all of the different browsers. event.key outputs the character that is pressed on the keyboard and not some charcode which varies from browser to browser and platform to platform. event.key is the recommended way of getting key presses in browsers.
As you can see I have used feeder functions to supply the event, you do not need to use them you can create your own and the process is very straight forward. Allowed Characters and whether space is allowed. This prevents a lot of duplicate code as the common function is quite long. You could use the function as a stndalone is you remove the feeder functions and replace them with variables as needed.
Function Call in HTML
<input class="olotd5" value="123456" name="zip" type="text" onkeydown="return onlyAlphaNumeric(event);"/>
The Script
/** Key Input Restrictions - Using event.key **/ // Allows Only Letters function onlyAlpha(e) { return keyRestriction(e, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", true); } // Allow Only Numbers and Letters function onlyAlphaNumeric(e) { return keyRestriction(e, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", true); } // Allow Only Numbers and Letters - Including Comma, Backslash, Minus, Single Quote function onlyAlphaNumericExtra(e) { return keyRestriction(e, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,/-'", true); } // Allows Only Numbers function onlyNumbers(e) { return keyRestriction(e, "0123456789", false); } // Allows Only Numbers and Period function onlyNumbersPeriod(e) { return keyRestriction(e, "0123456789.", false); } // Allow Only Phone Numbers - Including Period, Brackets, Plus, Minus function onlyPhoneNumber(e) { return keyRestriction(e, "0123456789.()-+", true); } // Allow Only valid characters for URL function onlyURL(e) { return keyRestriction(e, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~:/?#[]@!$&'()*+,;=`%", false); } // Allow Only valid characters for Email function onlyEmail(e) { return keyRestriction(e, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@", false); } // Common Function for Key Input Restriction function keyRestriction(e, allowedCharacters, spacesAllowed) { // Grab the character from the pressed key var key = e.key; // Are Spaces Allowed? if (key === ' ' && spacesAllowed === true) return true; // Are Spaces Allowed (IE fix) if (key === 'Spacebar' && spacesAllowed === true) return true; // Control Keys (Backspace, End, Home, Left Arrow, Up Arrow, Right Arrow, Down Arrow, Delete) if (key === 'Backspace' || key === 'End' || key === 'Home' || key === 'ArrowLeft' || key === 'ArrowUp' || key === 'ArrowRight' || key === 'ArrowDown' || key === 'Delete') return true; // Control Keys (IE and Edge fix) if (key === 'Left' || key === 'Up' || key === 'Right' || key === 'Down' || key === 'Del') return true; // Allowed Characters else if (allowedCharacters.indexOf(key) > -1) return true; else return false; }
Notes
These javascript events have different roles and can have different outcomes with different browsers. In newer browsers the behavious seems a lot more standard.
Links
These are some basic key restrictors that some people use but they are not very cross browser compatible. According to Mottie (CSS-TRICKS) e.which and e.keycode are getting discontinued. I have included these here for reference to see how it was done in the past.
Function Call in HTML
<input class="olotd5" value="123456" name="zip" type="text" onkeydown="return onlyAlphaNumeric(event);"/>
Allows Only Uppercase and Lowercase Letters to be entered - Including Space
// Allows Only Uppercase and Lowercase Letters to be entered - Including Space function onlyAlpha(e) { var charCode = e.which || e.keyCode; if ((charCode === 32 || charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122)){ return true; } return false; }
Allows Only Numbers to be entered - Including Backspace and some other keys
// Allows Only Numbers to be entered - Including Backspace and some other keys function onlyNumbers(e) { var charCode = e.which || e.keyCode; if (charCode > 31 && (charCode < 48 || charCode > 57)){ return false; } return true; }
Links
use single quotes unless escaping characters
Article 1
I don’t write about PHP very often — this is the first time since the launch one year ago. However, I do quite a lot of work with PHP and relational databases such as MySQL. Almost every single time I review someone else’s work a common error related to using strings in PHP is made. Misunderstanding the way of defining strings in PHP is often the cause of many hours of debugging as well. If you are relatively new to programming and PHP you’ll most likely recognize this situation.
PHP lets you define strings using single quote, double quotes or heredoc. There’s a crucial difference between the first two and for some reason many people new to PHP start using double quotes. Hopefully the following explanation will save a couple of hours debugging for the starters among us.
The most important difference between the two is that a string enclosed in double quotes is parsed by PHP. This means that any variable in it will be expanded.
echo $var; // Results in the value of $var being printed
echo '$var'; // Results in the word '$var'
echo "$var"; // Results in the value of $var being printed
This means that concatenating strings can be done in two different ways as well.
$var = 'Ipsum';
echo 'Lorem ' . $var; // Results in 'Lorem Ipsum'
echo "Lorem $var"; // Results in 'Lorem Ipsum'
This possibly isn’t anything new to you, but if you are working with HTML you can output valid markup while keeping your code readable. Using double quotes in a string enclosed with single quotes requires no escaping and vica versa. Using a double quote in a string enclosed in double quotes (idem for single quotes) does require escaping, which —in my opinion— degrades readability tremendously.
$text = 'Lorem Ipsum';
$uri = 'http://www.lipsum.com';
echo '<a href="' . $uri . '">' . $text . '</a>';
echo "<a href=\"$uri\">$text</a>";
Personally, I always stick to using single quotes and the dot syntax to concatenate strings, unless I need special characters such as new lines. Whatever you use is up to you, but hopefully this heads-up cleared a lot of confusion and puts an end to unreadible code and markup using single quotes.
Not to mention... using " " where not needed, is just wasting processing, potentially even slowing down your website, if it's as big as say deviantART =P, since PHP has to try to parse something that does not need parsing...
Using single quotes where possible results in nominally faster execution, but we're talking fractions of milliseconds.
As with double quotes, you can escape single quotes in a string enclosed in single quotes as well. I agree that backlashes make it unreadable, but in a rare occassion I use it.
echo 'Hi, how are you? I\'m fine.'; // Single quotes
echo "Hi, how are you? I'm fine."; // Double quotes
Depending on the situation I might deviate and opt to use double quotes instead.
Article 2
The advantage to using single quotes is that you don't need to escape any double quotes in your code, which makes it neater.
However, using double quotes would allow you to place variables inside without having to escape them.
$variable = 'moo'; // This will work. echo "Double Quotes. $variable"; // This wont. echo 'Single Quotes. $variable';
I prefer using single quotes, as it makes echo'd HTML (the php code) look neater. My opinion, of course. :P
$var = $_POST['name'];
is 7 times faster than
$var = $_POST[name];
Which method you choose is entirely personal, but I use 'apostrophes' to mark my strings instead of "quotes". The downside is that I must break my string in order to include a variable in it.
I do this for two reason. First, my code editor makes variables inserted in a string bold only if I break the string around them. This makes them easier to spot when I'm troubleshooting or testing. Secondly, it allows me to paste properly validated HTML into my echos and prints without having to escape all of the quotations.
You face a small inconvenience either way, but with my method, they are fewer in number.
Single quotes versus double quotes is a huge issue in PHP. Nobody seems to understand what sort of problems they run in to using double-quotes when they arn't needed.
When you use double quotes, you are asking PHP to parse through the string and search for possible variable matches and escaping characters (like \n).
This is obviously a slow process. Do you think it'd be faster to read a book looking for a secret clue in every 4 words, or to simply read it straight through? Same difference.
If you arn't using escaping characters, it is pointless to use double quotes unless your goal is to make your application slower. Here are a few examples to demonstrate:
$wtf = 'is'; $output = "My name $wtf monokrome"; // This is SLOW. $output = 'My name ' . $wtf . ' monokrome'; // This is much more efficient. $wtf = 'google'; // This is the only sort of time where you ever really need double quoted strings. $output = '<a href="http://google.com">' . $wtf . "</a>\n"; // Notice the newline(\n)?
As for the array keys being used as $_POST[name], of course that's slow. When you do that, PHP is trying to determine name as a keyword. Since that keyword doesn't exist, it automatically assumes that you are wanting 'name'. Obviously it's faster to not make PHP make that assumption.
Generally, for most scripts, you aren't going to see the script running slower with double quotes. However, when you get to the point where your code is getting more advanced and doing more things, or if you're deploying the script in a real world environment, that is when you need to cut back on double quotes.
Personally I use single quotes everywhere. Using single quotes plus concatenation is faster than double quotes every time.
This applies to xampp-1.5.3a:
(don’t know about other versions since I only have this one. It works also for xampplite)
Yes, after a fresh install of a xampp program you are welcomed with a xampp pseudo website which is located in <path of xampp installation>/htdocs/xampp/. Clicking security you are given some important points to secure your website. That includes changing the root password. But alas, after changing it you’ll not be given a chance to use the ever-friendly phpMyAdmin.
Find <path of xampp installation>/htdocs/xampp/phpmyadmin/config.inc.php
$cfg['Servers'][$i]['password'] = ”; // MySQL password
Change this so that it’ll reflect your current mysql password.
$cfg['Servers'][$i]['password'] = ‘your_password_here‘; // MySQL password
Don’t forget to save it aight?!
Date created: ~1999
There are several strategies you can use to insert page breaks within an HTML document, thus ensuring that the printed document does not break over lines, graphics, etc. There are limitations, however, and these are listed below.
Limitations
When you paste from Microsoft Word 2010 page break are represented by
<br style="page-break-before: always;" />
<style> .break { page-break-before: always; } </style> <body> content on page 1... <h1 class="break">text of Heading 1 on page 2</h1> content on page 2... <h1 class="break">text of Heading 1 on page 3</h1> content on page 3... <p class="break">content on top of page 4</p> content on page 4... </body>
Notes about Strategy 1
This example can be part of an external (CSS) or internal style.
Using a class such as .break and not prefacing it with any form of formatting, means that you can add the information wherever you want a page break to occur - including the middle of the text.
Examples:
<style> h6 {page-break-before: always;} </style>
Notes about Strategy 2
The reason I used H6 here is that it is a little-used heading for most web pages. By emulating a H1 in font, font size, etc., then adding this code to H6 in addition to the page break information, you can substitute H6 for H1 wherever you want a page break to occur. You can still keep H1 for sections where you don't want to force a page break. Naturally if you want to force a page break at EVERY H1, then you would include the page break information within the H1 style. This strategy can be used with both CSS and internal styles.
<div style="page-break-before: always">blah blah</div>
Notes about Strategy 3
Make sure you include some text between the <div> opening and closing tags, otherwise this may not work.
<p style="page-break-before: always">blah blah</p>
<style> p.page { page-break-after: always; } </style> <body> content on page 1 <p class="page"></p> content on page 2 </body>
Notes about Strategy 5
This example can be part of an external (CSS) or internal style.
...... </tr> </table> </center> </div> <p class="break"><!--Appendix 2 (continued)--></p> <div align="center"><center> [start next table here...]
Notes about Strategy 6
Tables need to be broken in order to force a page break.
In the code in this example, the table has been "chopped" where the break is to occur, a <p> tag inserted with the class attribute added, then the table restarted.
A comment has also been added to alert anybody dealing with the code at a later date that the table is continued.
All the files required are now on the laptop but they require a new catalog file to be able to extract them, this is like an index file. Please follow the instructions below.
Tutorial to rebuild Retrospect Catalog file
This tutorial will walk you through the process of completely rebuilding your Retrospect Catalog File |
|
|
||||
|
||||||
|
||||||
Figure 1a: Retrospect Navigation Bar – Tools |
|
|
||||
|
||||||
|
||||||
Figure 1b: Tools Overview |
|
|
||||
Step 2 of 7: Select a Catalog Repair Function |
|
|
||||
|
||||||
|
||||||
Figure 2: Catalog Repair Selection |
|
|
||||
|
|
|
||||
|
||||||
|
||||||
Figure 3a: Media Selection |
|
|
||||
|
|
|
||||
|
||||||
|
||||||
Figure 3b: The Storage Media |
|
|
||||
Choose the hard disk (storage media) where the data from your backup was stored and click OK (Figure 3b). When browsing select the ‘Backup Transfer’ Folder and click open. If you try and select the files in the folder it will not work. |
|
|
||||
|
||||||
|
||||||
Figure 3c: Select a Backup Set |
|
|
||||
|
|
|
||||
Select No There might be occasions where Retrospect believes there are missing files, in actuality it is the rest of the backup set we have not copied over. Click Continue Figure 3d: Forget |
|
|
||||
|
||||||
|
||||||
Figure 4a: Save Catalog Window |
|
|
||||
|
|
|
||||
|
||||||
|
||||||
Figure 4b: Replace Catalog Window |
|
|
||||
Step 5 of 7: The Catalog Rebuild Starts |
|
|
||||
|
||||||
|
||||||
Figure 5: Building Catalog |
|
|
||||
This might not be applicable at the moment |
|
|
||||
|
||||||
|
||||||
Figure 6: More Members Window |
|
|
||||
|
|
|
||||
|
||||||
|
||||||
Figure 7: Recatalog Finished |
|
|
||||
|
||||||
- Make sure c:\Shared Files folder exists using My computer etc.. if it does not exist create it
It is important to leave the top option selected and click next, for obvious reasons.
click on the empty box next to shared files, this should now select all files in the backup to be restored and should look like
click OK
Click Start and the files will now be restored to the selected location, c:\Shared Files
Using Windows XP
(© 2008 Lancastrian IT)
The Desktop:
Sending and Receiving Email:
Starting from the Desktop, click on the Start Button.When the Start Menu pops up click on the Email icon. This will make Outlook Express load and you will see the following window, shown below.
Once Outlook Express is open it will either appear in a small window as above or as a full screen window, below, where you can only see that program. The other windows will still be there but they will be underneath the full screen window.
To send an email you first have to write it, to do this click on Create Email button shown below (Number 1).
After clicking the Create email button a further window will appear to write your email with, as shown below.
So type your email message and enter the recipient’s address, then you are ready to send your first email.
Click the send button at the top left of the Email Window, which will now disappear. This will put the email in to the outbox ready to send over the Internet when a connection is available. This allows you to compose emails without being connected through your telephone line to the Internet when it is not necessary.
Once you have finished composing your emails you need to click on the Send/Receive button, which you will find in the toolbar of the main window of Outlook Express. The computer will now start to send and receive your emails. If you are prompted for a response by a new window, just click ok. When you have sent your emails and the computer has finished doing this task, check and make sure that you are no longer connected to the internet by checking in the bottom right of the desktop to see if two ‘flashing TVs’ are present as shown below.
If the TVs are present, you are still connected to the Internet. If this is the case, too disconnect from the Internet right click on the TVs icon and a hidden menu will appear. One of the options is ‘Disconnect’ left click this and you will turn your Internet connection off.
And that’s it, you have now moved round the XP desktop and sent emails. Keep this handout nearby so if you get stuck you can reference too it easily and make using your computer enjoyable rather than a chore.
** currently not working for new versions of jckeditor, possibly because the config.js is not getting read **
This prevents code stripping or manipulation of code between the geshibot tags (using curly braces) in CKeditor WYSIWYG. (or anyother specified tag)
{code class="brush: text"}CKEDITOR.config.protectedSource.push( /<\?[\s\S]*?\?>/g ); // PHP Code CKEDITOR.config.protectedSource.push( //g ); // ASP Code CKEDITOR.config.protectedSource.push( /(]+>[\s|\S]*?<\/asp:[^\>]+>)|(]+\/>)/gi ); // ASP.Net Code{/code}
Firstly make sure you have set Joomla's whitelist/blacklist thing properly as descibed in this article.
j1.5 http://docs.joomla.org/Why_does_some_HTML_get_removed_from_articles_in_version_1.5.8%3F
j2.5
The easiest way of checking this is to turn off your editor, paste some code in, save the article and see if joomla has stripped the code out.
Next choose CKditor as your WYSIWYG, install if needed.
To prevent any code in between the geshibot tags being stripped out we need to add some code to
/plugins/editors/jckeditor/config.js - if it does not exist create one
The config.js by default is very empty and will probably look like the following:
{code class="brush: text"}/* Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.editorConfig = function( config ) { // Define changes to default configuration here. For example: // config.language = 'fr'; // config.uiColor = '#AADC6E'; };{/code}Add these following lines:
These 2 lines will prevent the html entities being escaped or altered. I have added them because someone else thought it would be a good idea and in the CKeditor plugin config these cannot be set. These might not be required to prevent code stripping.
{code class="brush: text"}config.htmlEncodeOutput = false; config.entities = false;{/code}
These lines prevent anything that matches their RegEx being touched. In this case anything in between geshibot or code tags using curly braces.
{code class="brush: text"}config.protectedsource.push( /{code[\s\S]*?}[\s\S]*?{\/code}/g ) ; // Protects all code between code tag config.protectedsource.push( /{geshibot[\s\S]*?}[\s\S]*?{\/geshibot}/g ) ; // Protects all code between GESHI tags {/code}
The final code should look like:
{code class="brush: text"}/* Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.editorConfig = function( config ) { // Define changes to default configuration here. For example: // config.language = 'fr'; // config.uiColor = '#AADC6E'; // The following work outside this function config.htmlEncodeOutput = false; config.entities = false; config.protectedsource.push( /{code[\s\S]*?}[\s\S]*?{\/code}/g ) ; // Protects all code between code tag config.protectedsource.push( /{geshibot[\s\S]*?}[\s\S]*?{\/geshibot}/g ) ; // Protects all code between GESHI tags };{/code}
NB: The following examples and the addtional lines above apear to work outside of the config function.
{code class="brush: text"}config.protectedSource.push( /<\?[\s\S]*?\?>/g ); // PHP Code config.protectedSource.push( //g ); // ASP Code config.protectedSource.push( /(]+>[\s|\S]*?<\/asp:[^\>]+>)|(]+\/>)/gi ); // ASP.Net Code{/code}
and possibly this syntax variation might work:
{code class="brush: text"}CKEDITOR.config.protectedSource.push( /<\?[\s\S]*?\?>/g ); // PHP Code CKEDITOR.config.protectedSource.push( //g ); // ASP Code CKEDITOR.config.protectedSource.push( /(]+>[\s|\S]*?<\/asp:[^\>]+>)|(]+\/>)/gi ); // ASP.Net Code{/code}
Save file, empty you browser cache to make sure nothing is left. CKeditor will now leave all code between the geshibot tags alone.
This code will allow you to specify the parameters of Geshibot in the first bracket aswell.
Please note, when you uninstall or upgrade this change will dissapear and will have to mod the file again. Also, the geshibot tags and the code between it will only be visible on the source page.
This technique can be used to protect other needed tags for CKeditor.
My sample config.js that i am using
{code class="brush: text"}/* Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.editorConfig = function( config ) { // Define changes to default configuration here. For example: // config.language = 'fr'; // config.uiColor = '#AADC6E'; // spell check as you type // config.scayt_autoStartup = true; // Whether the editor must output an empty value, if it's contents is made by an empty paragraph only. default is true // config.ignoreEmptyParagraph = false; // Whether to escape HTML when the editor updates the original input element, default value false config.htmlEncodeOutput = false; // Note: option now available in version 3.4.1 and will override this setting - does not affect protected storage config.entities = false; // Protects all code between code tag config.protectedSource.push( /{code[\s\S]*?}[\s\S]*?{\/code}/g ); // Protects all code between GESHI tags config.protectedSource.push( /{geshibot[\s\S]*?}[\s\S]*?{\/geshibot}/g ); // Whether to escape basic HTML entities in the document, default value true config.basicEntities = false; };{/code}
When you try to install Vista SP1 from windows update you may receive the error code 0x80073712
Getting the error code 80073712 when running Windows Update on a Vista Home Premium 32 bit system.
Option 1
So far have followed steps in this MS Support Article
also tried this other suggestion:
1. Click the Start icon and in the search field type "winsxs".
2. Double click this folder and scroll down to the file "pending.xml".
3. Right click it and select "Properties".
4. Under the "Security" tab, select "Advanced"
5. Highlight your User Account name from the list and click "Edit..."
6. Repeat 5.
7. Check the box marked "Full control". Then "OK" (x4).
8. You can now delete the file "pending.xml". Make a back up copy if
you wish and paste it somewhere else just in case!
9. Restart your PC (on boot up it should no longer say "Configuring
Updates..." any more).
10. Download the 'Windows Update Installer'
(»download.windowsupdate.com/v7/wi···ndalone/...).
Once downloaded, you may want to move it from your download folder to
somewhere else. Such as where the Windows Update File (wuapp.exe)
was to start with (C:\Windows\System32). Double click it
to install.
Option 2
This issue can be caused by the following factors:
1. The Windows Update service has been stopped.
2. Corrupted Windows Update Temporary folder.
In order to narrow down the cause of this issue and resolve it, please refer to the following steps. After finishing each step, please check the result again on the Windows Update website.
NOTE: Some third party programs can affect the Windows Update service. If you are running any third party applications such as Spyblocker, Internet or web accelerators (programs designed to boost the speed of the Internet connection), security or anti-virus programs (Norton, McAfee, etc.), I recommend we temporarily disable or shut them down and then try accessing Windows Update later. Please understand that we are disabling these programs only for the purpose of troubleshooting and we can re-enable these programs after we finish troubleshooting.
Step 1: Verify the relevant Windows Update services
=======================================
1. Click the Start Button, in Start Search box, type: "services.msc" (without quotes) and press Enter. If you are prompted for an administrator password or confirmation, type the password or provide confirmation.
2. Double click the service "Windows Update".
3. Click on the "General" tab; make sure the "Startup Type" is "Automatic" or "Manual". Then please click the "Start" button under "Service Status" to start the service.
4. Please repeat the above steps with the "Background Intelligent Transfer Service" service.
You can also temporarily stop these services, restart the computer, and then start these services again. If any service is missing or cannot be stopped or restarted, please let me know.
Step 2: Rename the Windows Update Softwaredistribution folder
================================================
This problem may occur if the Windows Update Software distribution folder has been corrupted. We can refer to the following steps to rename this folder. Please note that the folder will be re-created the next time we visit the Windows Update site.
1. Close all the open windows.
2. Click the Start Button, click "All programs", and click "Accessories".
3. Right-click "Command Prompt", and click "Run as administrator".
4. In "Administrator: Command Prompt" window, type in "net stop WuAuServ" (without the quotes) and press Enter.
Note: Please look at the cmd window and make sure it says that it was successfully stopped before we try to rename the folder. However, if it fails, please let me know before performing any further steps and include any error messages you may have received when it failed.
5. Click the Start Button, in the "Start Search" box, type in "%windir%" (without the quotes) and press Enter.
6. In the opened folder, look for the folder named "SoftwareDistribution".
7. Right-click on the folder, select Rename and type "SDold" (without the quotes) to rename this folder.
8. While still in the "Administrator: Command Prompt" window, type the command "net start WuAuServ" (without the quotes) in the opened window to restart the Windows Updates service.
Note: Please look at the cmd window and make sure it says that it was successfully started. However, if it failed, please let me know before performing any further steps and include any error messages you may have received when it failed.
Option 3 - original link
Use 'Save As' and save message as HTML.