<<RemoteContent "/ac/asGenProjList.asp" "" "" "raw">>
<html>\n<body>\n<form>\n <table class="noBorder" style="border:0;margin-left:0">\n <tr>\n <td>Variable Name:</td>\n <td colspan="2"><input type="text" name="Namen" id="aav_nam" size="12" value=""></td>\n <td>Chart Title:</td>\n <td colspan="2"><input type="text" name="Title" id="aav_title" size="12" value=""></td>\n <td>FOV (arcmin):</td>\n <td colspan="2"><input type="text" name="Field" id="aav_fov" size="12" value=""></td>\n <td>Mag limit:</td>\n <td colspan="2"><input type="text" name="Maglim" id="aav_limit" size="12" value=""></td>\n </tr>\n </table>\n</form>\n</body>\n</html><<slider "" "AAVSOHelpSlider" Info>>\n\n<<PersistentForm>><<PostForm "" "/ac/aaavso.asp" "Create Chart" "Fill in the blanks above and push the button to generate the chart.">><<RefreshTiddler "Erase Chart" "Do this before generating another chart">>
\nFill in the four blank fields above. For the name field, only the conventional variable star designations are accepted. Examples are "ZZ Cam" or "V0435 Cyg". "V435 Cyg" is equivalent to "V0435 Cyg". Other designations for names, like "lambda Orionis" or "Algol", will generate an error. Do not use quotation marks. Push the button below to generate the chart. The chart can be copied to paper using a screen grab. \n\nIf you change any input and push the {{{Create Chart}}} button again, the next chart will appear below the first. Or you can push the {{{Erase Chart}}} button first before generating another chart in a clean window.\n\nThe executable .asp file included here builds a specifically formatted URL that is sent to the AAVSO Variable Star Plotter website. It may take 5-10 seconds or so to generate and return the chart image.\n\nThanks to [[ACP wizard Dick Berg|http://www.brightskies.us/]] who developed and provided this tool.\nReference: http://www.aavso.org/accessing-variable-star-plotter-get-method ~~^^(Opens in a new tab.)^^~~
<<slider "" "Single Object Help" Help "Helpful information">>\n<html>\n<form>\n <table class="noBorder" style="border:0;margin-left:0">\n <tr>\n <td>Target Name:</td>\n <td colspan="2"><input type="text" name="Target" id="simg_tgt" size="14" value="" validate="required">\n <input type="hidden" name="visOnly" id="simg_visOnly" value="true">\n <input type="text" name="isOrb" id="simg_isOrb"></td>\n <td>\n <a id="simg_getCoords" href="javascript:;" \n onClick="DC3.CatSearch.lookup(DC3.Lib.getPlace(this),\n // Trigger event from a change in the isOrb field which DC3.CatSearch fills in\n (function(msg) { $('#simg_isOrb').trigger(jQuery.Event('change')) }));"\n title="Look up coordinates or calculate planetary ephemeris"> Get Coordinates or Ephemeris</a>\n <a id="simg_getTheSky" style="display:none;" href="javascript:;" onClick="DC3.TheSky.fillFormInfo(DC3.Lib.getPlace(this));" \n title="Fill in the coordinates from the current target in TheSky"> Get Coordinates From TheSky</a>\n </td>\n </tr>\n <tr>\n <td>Right Asc. (hrs):</td>\n <td colspan="2"><input type="text" name="RA" id="simg_ra" size="12" value="" validate="sexanum[0:24],required"></td>\n <td><a id="simg_catSearch" href="javascript:;" onClick="story.displayTiddler(this,'Deep Sky Catalog Search',null,config.options.chkAnimate,false)" title="Open the Deep Sky Catalog Search Item"> Deep Sky Catalog Search</a></td>\n </tr>\n <tr>\n <td>Declination (deg):</td>\n <td colspan="2"><input type="text" name="Dec" id="simg_dec" size="12" value="" validate="sexanum[-90:90],required"></td>\n <td> <i>(coordinates in J2000)</i></td>\n </tr>\n <!--<% if(rotAvail) { %>-->\n <tr>\n <td>Pos. Angle (deg):</td>\n <td colspan="2"><input type="text" name="PA" id="simg_pa" size="5" value="" validate="number,between[0:360],required"></td>\n <td> <i>(true/sky PA, required)</i></td>\n </tr>\n <!--<% } %>-->\n <tr id="simg_orbTrackRow">\n <td>Orbital Tracking:</td>\n <td colspan="2"><input type="checkbox" name="orbTrack" id="simg_orbTrack" value="yes"></td>\n <td> <i>(follow body, if mount supports it)</i></td>\n </tr>\n <!-- Mimics one row of the Color Series' expando form -->\n <tr>\n <td>Duration (sec):</td>\n <td><input type="text" name="ColorExposure1" id="ColorExposure1" size="5" value="" validate="number, required"></td>\n <!--<% if(filtNames) { %>-->\n <td> Filter: \n <select name="ColorFilter1" id="ColorFilter1">\n <%= filterNameOptions() %>\n </select></td>\n <!--<% } %>-->\n <td> Binning: \n <select name="ColorBinning1" id="ColorBinning1">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <input type="hidden" name="ColorCount1" id="ColorCount1" value="1">\n <input type="hidden" name="ColorUse1" id="ColorUse1" value="yes">\n <input type="hidden" name="Dither" id="Dither" value="0.0">\n </table>\n <div style="margin-top:0px;margin-bottom:8px"> \n <!--<% if(Prefs.Autofocus.Enabled) { %>-->\n <input type="checkbox" name="AF" value="yes" title="Focus the system before acquiring the image">\n Auto focus before imaging\n </input>\n <!--<% } %>-->\n \n <!--<% if(Prefs.CameraPrefs.AutoCalibrate) { %>-->\n <input type="checkbox" checked disabled name="Cal" value="yes" title="Observatory calibrates all images">Auto calibrate</input>\n <!--<% } else { %>-->\n <input type="checkbox" name="Cal" value="yes" title="Apply calibration frames after imaging">Auto calibrate</input>\n <!--<% } %>-->\n </div>\n</form>\n</html><<PersistentForm>><<PostForm "" "/ac/aacqform.asp" "Acquire Image" "Starts the image acquisition process">><<ValidateForm "" "postit">><script>\n// DC3.TheSky.setTargetInfo() and DC3.TheSky.switchLink() depend on the link IDs!\nif(DC3.TheSky.theSkyInfoAvailable()) DC3.TheSky.switchLink("simg");\n\n$('#simg_isOrb').change(function() {\n if($('#simg_isOrb').val() == 'orb') {\n $('#simg_ra').fadeTo('slow', 0.2);\n $('#simg_ra').prop('disabled', true);\n $('#simg_dec').fadeTo('slow', 0.2);\n $('#simg_dec').prop('disabled', true);\n $('#simg_orbTrackRow').fadeIn('slow');\n } else {\n $('#simg_ra').fadeTo('slow', 1.0);\n $('#simg_ra').prop('disabled', false);\n $('#simg_dec').fadeTo('slow', 1.0);\n $('#simg_dec').prop('disabled', false);\n $('#simg_orbTrack').prop('checked', false); // Force tracking checkbox off, and for persisted forms\n var e = { target: null };\n e.target = $('#simg_orbTrack')[0];\n config.macros.PersistentForm.onChange(e);\n $('#simg_orbTrackRow').fadeOut('slow');\n }\n });\n$('#simg_orbTrackRow').fadeOut(0);\n$('#simg_isOrb').hide(); // Can't be input type="hidden", must persist\n$('#simg_isOrb').trigger(jQuery.Event('change')); // We don't have the catSearch result yet, so...\n\n</script>\n
If you have lots of images this could take a long time to appear.\n\n<<RemoteContent '/images/<%= User.Username %>/aindex.asp' Refresh 'Refresh the file list'>>
<<option chkOpenInNewWindow>> OpenLinksInNewWindow\n<<option chkToggleLinks>> Clicking on links to items that are already open causes them to close\n^^(override with Control or other modifier key)^^\n<<option chkForceMinorUpdate>> Treat edits as MinorChanges by preserving date and time\n^^(override with Shift key when clicking 'done' or by pressing Ctrl-Shift-Enter^^\n<<option chkConfirmDelete>> ConfirmBeforeDeleting\nMaximum number of lines in an item edit box: <<option txtMaxEditRows>>\n<<option chkInsertTabs>> Use tab key to insert tab characters instead of jumping to next field\n<<option chkSinglePageMode>> Display one item at a time\n<<option chkTopOfPageMode>> Always open items at the top of the page
/***\n|''Name:''|allTagsExPlugin|\n|''Description:''|Post from form, wikify response|\n|''Date:''|Sept 20, 2006|\n|''Source:''|[[allTagsExPlugin]]|\n|''Author:''|Bob Denny ~DC-3 Dreams, SP|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''Version:''|1.0.1|\n|''~CoreVersion:''|2.0.11|\n|''Browser:''|Firefox 1.5; Internet Explorer 6.0; Safari|\n|''Require:''|//none//|\nThis macro replaces the 'allTags' macro used in the tags tab of the sidebar, etc. \n!!Revision History\n<<<\n''2006.09.23 [1.0.1]'' Initial creation\n<<<\n!!Code\n***/\n//{{{\nversion.extensions.allTagsEx = {\n major: 1, minor: 0, revision: 1,\n date: new Date(2006, 9, 23), \n type: 'macro',\n source: "#allTagsExPlugin"\n};\n\nconfig.macros.allTagsEx = \n{\n handler: function(place, macroName, params, wikifier, paramString, tiddler) \n {\n var tags = store.getTags();\n var theDateList = createTiddlyElement(place,"ul", null, null, null);\n if(tags.length === 0)\n createTiddlyElement(theDateList,"li", null, "listTitle", config.macros.allTags.noTags);\n for(var t = 0; t < tags.length; t++)\n {\n var tagTiddler = store.fetchTiddler(tags[t][0]);\n if(!tagTiddler || !tagTiddler.isTagged("excludeLists"))\n {\n var theListItem = createTiddlyElement(theDateList, "li", null, null, null);\n var theTag = createTiddlyButton(theListItem,tags[t][0] + " (" + tags[t][1] + ")", \n config.macros.allTags.tooltip.format([tags[t][0]]), onClickTag);\n theTag.setAttribute("tag", tags[t][0]);\n }\n }\n }\n};\n//}}}\n
Your "real" name for signing edits, for example Joe Author. The observatory users won't see the edit names and dates. They are for your reference.
''Tag'': Items which belong solely to the authoring environment. These items always have the [[deleteUser]] tag as well, causing them to be removed when building the final content.
We're going to assume that you've figured out the general layout of this web interface and how to navigate the items. See [[Using This Web Site]].\n\nThis web interface uses TiddlyWiki as a framework. As you author, you'll see micro-content items referred to as //tiddlers//, but don't be confused. A tiddler is just an item. You are reading a tiddler right now.\n!!Authoring Process\nWe'll soon see how to make changes and additions to the web interface, but first it's important to know how the process works! All server web content is kept in the ACP ''~WebDocs'' folder and subfolders below it. There are two files on the server, ''author.html'' (the authoring document you see now) and ''index.asp'' (the file that generates the interface that your observers see).\n\nAll authoring is done using this (author.html) document. Once you have made your changes, just click the ''save to web'' link in the right sidebar. This will upload the changed author.html to the server and save the previous version to the ACP ''~WebDocs\sauthor-backup'' backup subfolder. Be sure to see [[Recovering from Editing Mistakes]].\n\nBut there's more. After the interface is uploaded, the server creates a new end-user document ''index.asp''. A lot goes on during this process, most of which you needn't be concerned about. There are a few things, though, that you'll need to know and we'll cover them later. Anyway, all you have to do is ''save to web'' and your changes are ready for your observers.\n!!Editing an Existing Item\nThis is really easy. Click the ''edit'' link in the toolbar or just double-click anywhere in the item. Make your changes, then click the ''done'' link in the toolbar. Of course ''cancel'' will discard any changes you made. @@Don't click ''delete'' on any existing tiddler@@, you will probably break something. Now its time to play in the [[Sandbox]]. This is never saved to the observers' interface, so feel free to do anything you want. The [[Authoring System]] item has links to formatting reference information.\n\nDouble-click this item and see how I formatted it!\n!!Real Work: [[Contact Info]]\nIf you haven't yet made any changes, the [[Contact Info]] item will contain some boilerplate info. If you click [[Contact Info]] in the Observatory Info menu on the left (or one of the links right here), you'll see it. Time to put something useful into it so your observers will have something to see. Click its ''edit'' link in the toolbar. Delete everything that is there, leaving it completely empty. Now use your newly learned wikitext skills to put whatever information you wish into it. Include your name, email address, phone number, or whatever you want your observers to know. Now click ''done''.\n\n@@IMPORTANT!@@ We'll explain tags later, but this is important. Using the ''tags'' link in the [[Contact Info]] item, position the mouse over the [] for UserContent. Then repeat this for the [] for [[Help]], and again for Custom. @@It's VITAL that you tag all items you change as Custom@@. That's how we'll preserve your changes through updates to the web content. Now click the ''tags'' link one more time and verify that [[UserContent]], [[Help]], and [[Custom]] are set as tags.\n\nNow click ''save to web''. The new content is now available to your observers. You can quickly test the observers' interface by clicking ''Test Live''. Do it now. It will open a new browser tab or window with the interface that your observers see. Open the Observatory Info menu on the left and click [[Contact Info]]. You should see the info you entered.\n!!Creating New Items\nThis is easy. Click ''new tiddler'' in the right sidebar. A new item will open for editing. Once you're finished, again use the ''tags'' link in the toolbar to set (at least) [[UserContent]], [[Custom]](!), and maybe [[Help]].\n\nIf you create a brand new item, how will your observers find it? It will appear in the Items tab of the right sidebar, but the sidebar is initially hidden! Changing the menus in the left sidebar is only for the advanced user (hint: they're in the MainMenu item, but be careful!). Of course you can link to your new item(s) from other items that //are// accessible.\n\nThe [[Welcome]] item normally appears just below the [[System Status]] item whenever observers first log in. That's a __perfect place__ for you to put site-specific news, links to items you have created, etc. Feel free to put anything you want there. You can also change the items that appear at login and have your new content appear at that time. See the next section.\n!!Changing Items That Show at Login\nYou can change the items that appear when a user first logs in. Edit the [[StartupItems]] item. It is a list of item links, one per line, that tell the system which items to display on user login. \n!!Next Steps\nOnce you "get it", you'll see the possibilities... well, at least //some// of them! You should now think about customizing the [[Welcome]], [[Observatory Location]] and [[Common Questions]] items. You'll see things enclosed in {{{<% ... %>}}}. These are Active Server Page blocks, their contents will be replaced with some dynamic/generated content by the server. That's how the title and subtitle of browser display end up containing the site name and the login user's name!\n\nFinally, if there's something you want to do and can't figure out how, post a note to the [[DC-3 Dreams Communication Center|http://forums.dc3.com/]] and I'll try to help.
Before you can make changes and successfully save them, you need to set a few things up. Make sure you can see the right sidebar. If not, click the ''side-barยป'' link on the toolbar to show the sidebar. Now click the ''optionsยป'' link on the sidebar to expose the options area.\n\nThere are three things you need to set up:\n# Your real name (only authors can see this)\n# Your server username (must have Administrator privileges on the server!)\n# Your server password\nThe last two are needed (again) because the authoring system itself needs to authenticate itself in order to upload changes.\n\n@@We highly recommend the [[Google Chrome browser|https://www.google.com/intl/en/chrome/browser/]] for authoring and debugging ACP web content.@@ The integrated client-side debugging and inspection tools are extremely powerful.[[Mozilla FireFox|https://www.mozilla.org/en-US/firefox/new/]] is OK as well as long as you have a reasonably current version. It's debugging and inspection tools are also very good. ''NOTE:'' If you are using a very old ~FireFox note that there is a bug in the HTTP engine that forms the core of ACP's web server which prevents ~FireFox from working for ACP authoring. Please update your ~FireFox to the current version 48.0.1 (as of August 2016). Internet Explorer is not recommended because editing items causes all of the line endings and indentation to be removed, making subsequent edits very difficult.\n\nNow click the ''save to web'' link on the sidebar. If all is well, you'll see a popup box in the upper right corner of the browser and it should indicate that the content was successfully saved. If not, re-check the username and password.\n\nOk, you're ready to start. See [[Authoring Roadmap]].
Welcome to the Share Your Sky! authoring environment. Yes, the title is supposed to look like that!\n\nReference information is available on:\n* [[Authoring Setup]] (read this first!)\n* [[Authoring Roadmap]] (important to understand the process, seriously!)\n* [[Recovering from Editing Mistakes]] (what if the UI won't start?)\n* [[Basic Formatting]]\n* [[Item Level Structure]]\n* [[Formatting Tables]]\n* [[Periodic Refresh Image in Item]]\n* [[Tag Usage]]\n* [[Macros]]\n* [[Using jQuery]]\n* [[Importing and Exporting Items]]\nThere is also a [[Sandbox]] in which you can practice editing and formatting text.\n<script>DC3.LightBox.showAlert('warning', 'Refresh your browser before authoring!');</script>
Asks for a filter name then focuses the optical system for the selected filter. You need to supply the filter name. If you don't know the names of the filters, see [[Instruments & Equipment]].
\nCopyright (c) 2005-2006, ~DC-3 Dreams, SP, Mesa, AZ\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n*Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. \n*Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. \n*Neither the name of ~DC-3 Dreams nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n
Here are the markups that you can use in item text. \n|!Format|!Markup|!Example|\n|Bold|{{{''Bold''}}} (2 single quotes)|''Bold''|\n|Highlight|{{{@@Highlight@@}}}|@@Highlight@@|\n|CSS Extended Highlights|{{{@@some css;Text@@}}}|@@background-color:#ff0000;color:#ffffff;red coloured@@<<br>>{{{@@background-color:#ff0000;color:#ffffff;red coloured@@}}}|\n|Custom CSS Class|<html><code>{{wrappingClass{Text that is now accentuated}}}</code></html><<br>>By default, the text is placed in a <span>. To use a <div> instead, insert a line break before the text (after the single {)<<br>>In the CSS: {{{.wrappingClass {color: red;} }}}|Add .wrappingClass to StyleSheet|\n|Italic|{{{//Italic//}}}|//Italic//|\n|Monospaced text|<html><code>{{{ ... }}}</code></html>|{{{Monospaced text}}}|\n|Monospaced block multiline|Put <html><code>{{{</code></html> and <html><code>}}}</code></html> on their own lines|<html><pre>{{{<br/>Monospaced<br/>Multi-line<br/>Block<br/>}}}</pre></html>|\n|Strikethough|{{{--Strikethrough--}}}|--Strikethrough--|\n|Subscript|{{{~~Subscript~~}}}|Text~~Subscript~~|\n|Superscript|{{{^^Superscript^^}}}|Text^^Superscript^^|\n|Underlined|{{{__Underline__}}}(2 underscores)|__Underscored__|\n|Any HTML|{{{<html><span>any</span><br /><b>valid</b> <em>xhtml</em></html>}}}|<html><span>any</span><br /><b>valid</b> <em>xhtml</em></html>|\n|Comment|{{{/% This will not appear in the tiddler %/}}}||\n|Supress Wikifying|For example, WikiWord {{{~WikiWord}}} (prefix with tilde)|~WikiWord|
<div class='header' macro='gradient vert #18f #04b'>\n<div class='headerShadow'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div class='headerForeground'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n</div>\n<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>\n<div id='sidebar'>\n<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n</div>
/***\nStyles used in Share Your Sky! adaptation of ~TiddlyWiki. These must be completely overridden in other themes, as this style sheet is used only with the Default TW styles (StyleSheetLayout and StyleSheetColors).\n!!Revision History\n<<<\n''2006.10.08 [rbd]'' Begin version control\n''2006.10.23 [rbd]'' Remove height from <input> and <select>, was scrunching buttons.\n''2006.10.24 [rbd]'' Complete telemetry colors\n''2006.11.07 [rbd]'' Faint border for sysmon thumbnail, add light tiddler borders (with Checketts fix), use new TW 2.1.x ColorPalette color specs.\n''2006.11.21 [rbd]'' Add .collapsedTitle for folded tiddlers\n''2009 01 09 [rbd]'' Firefox 3 compatibility. ~HeaderForeground needed width 100%\n''2010.11.17 [rbd]'' ~ACP-490 Add border style for #sm_guideBox\n<<<\n!Overrides for Standard TW styles\n***/\n/*{{{*/\nbody {\n position: static; /*Clint's IE fix part 1 (part 2 in TW now) */\n}\n/** LOSER ON IE6 without Clint's IE fix (see body section at top!) **/\n.tiddler {\n border: 1px solid [[ColorPalette::TertiaryLight]];\n padding-bottom: 8px;\n margin-left: 8px; /* Vastly different on IE vs FireFox! */\n margin-bottom: 12px;\n}\n.headerForeground {\n width: 100%; /* Firefox 3 suddenly needed this but not on HeaderShadow */\n padding: 2.5em 0em 1em 1em;\n}\n.headerShadow {\n padding: 2.5em 0em 1em 1em;\n}\n.viewer input {\n font-family: "Lucida Console", "Courier New", Courier, monospace;\n font-size: 1.0em;\n}\n.viewer select {\n font-family: "Lucida Console", "Courier New", Courier, monospace;\n font-size: 1.0em;\n}\n.viewer .sortheader {\n font-weight: normal;\n}\n.viewer .filelist table {\n margin_bottom: 0px;\n}\n.viewer .fileList tr {\n border: none;\n}\n.viewer .fileList td, .viewer .fileList th {\n border: 0;\n padding: 2px 8px 2px 8px;\n}\n.viewer .noBorder table, .viewer .noBorder th, .viewer .noBorder tr, .viewer .noBorder td {\n border: 0;\n}\n.viewer .noBorder #sm_thumb { /* For sysmon thumbnail */\n border: 1px solid #eee;\n padding: 0px;\n}\n.viewer .noBorder #sm_guideBox { /* For sysmon guider trackbox image */\n border: 1px solid #eee;\n padding: 0px;\n}\n.viewer iframe {\n border: 1px dashed blue;\n}\ntextarea {\n font-family:courier !important;\n}\n/*}}}*/\n/***\n!Special style for folded tiddlers\n***/\n/*{{{*/\n.collapsedTitle {\n color: #888;\n font-size: 1.3em;\n font-weight: bold;\n}\n/*}}}*/\n/***\n!System Status Display Styles\n***/\n/*{{{*/\ndiv.progBarBg {\n position:relative;\n height:0.75em;\n background-color: [[ColorPalette::SecondaryPale]];\n}\ndiv.progBarFg {\n position:absolute;\n overflow: hidden;\n height: 0.75em;\n width:0px;\n background-color: [[ColorPalette::SecondaryDark]];\n}\ntd.telemetry {\n font-family: "Lucida Console", "Courier New", Courier, monospace;\n font-size: 1em;\n background-color: [[ColorPalette::SecondaryPale]];\n white-space: pre;\n color: [[ColorPalette::TertiaryLight]]; /* "off" state overridden by inner <span> tags */\n}\nspan.telemActive {\ncolor: [[ColorPalette::Foreground]];\n}\nspan.telemWarn {\n color: red;\n}\nspan.telemOff {\ncolor: [[ColorPalette::TertiaryLight]];\n} /* Match color in td.telemetry */\ntd.telemlabel {\n white-space: nowrap;\n}\ntextarea.scriptlog {\n border: 1px solid #18f;\n margin: 0;\n padding: 0.5em;\n background: [[ColorPalette::SecondaryPale]];\n color: black;\n font-family: "Lucida Console", "Courier New", Courier, monospace !important;\n font-size: 8pt !important;\n white-space: pre;\n line-height: 110%;\n}\n\n/*}}}*/\n
The web content is optimized for [[W3C|http://www.w3.org/]] standards compatibility. As of 2011, the situation with [[browser quirks|http://www.quirksmode.org/]] has improved considerably. As far as we know, this web site is compatible with recent versions of Google Chrome, Firefox, Safari, Internet Explorer, and Opera. @@If you have display problems with this web site, update your browser!@@\n!!!Touch Browsers\nThe last few years has also seen the advent of //touch// browsers in the iPhone, Android, and iPad. The early bugs in these ~WebKit based browsers have been overcome, allowing them to be used for Share Your Sky! Older Android phones will likely have problems, but any Android 2.2 (2010) or later phone will work fine.\n!!!Authoring with ~FireFox\nThe embedded server engine that powers ACP's web services has a bug that prevents FireFox from saving authored web content (authoring mode). We recommend you use [[Google Chrome|http://www.google.com/chrome]] for authoring. [[Switch to Authoring Mode|author.html]] to learn more.\n
\nIf you want cal frames at a specific temperature, enable Require cooler temp and fill in the required temperature. Look at the [[System Status]] display to see the current cooler temperature. If you do this, the cal run will start with a {{{#chill}}} command, which will turn on the cooler if needed, then set the temperature and wait for up to 15 minutes. To succeed, the temperature must stay within plus/minus 2 degrees of the setpoint continuously for 60 seconds.
Calibrates the auto-guider. You should //not// have to do this unless you change your optical train. If you are not the observatory operator, you probably don't have to do this either!
<<slider "" "Cal Frame Help" Help "Helpful information">>\n\nUse this to acquire dark and bias calibration frames. To request a __bias frame__, simply set the exposure duration to zero. The system will automatically recognize that as a request for a bias frame. \n<html><form>\n <table class="noBorder" style="border:0;margin-left:0">\n <tr>\n <th>Use</th>\n <th>Count</th>\n <th>Duration</th>\n <th>Binning</th>\n </tr>\n <tr id="CalRow1">\n <td><input type="checkbox" name="CalUse1" id="CalUse1" value="yes"></td>\n <td><input type="text" name="CalCount1" id="CalCount1" size="4" value=""></td>\n <td><input type="text" name="CalExposure1" id="CalExposure1" size="5" value=""></td>\n <td><select name="CalBinning1" id="CalBinning1"><%= binningOptions() %></select></td>\n </tr>\n <tr id="CalRow2" style="display:none;">\n <td><input type="checkbox" name="CalUse2" id="CalUse2" value="yes"></td>\n <td><input type="text" name="CalCount2" id="CalCount2" size="4" value=""></td>\n <td><input type="text" name="CalExposure2" id="CalExposure2" size="5" value=""></td>\n <td><select name="CalBinning2" id="CalBinning2"><%= binningOptions() %></select></td>\n </tr>\n <tr id="CalRow3" style="display:none;">\n <td><input type="checkbox" name="CalUse3" id="CalUse3" value="yes"></td>\n <td><input type="text" name="CalCount3" id="CalCount3" size="4" value=""></td>\n <td><input type="text" name="CalExposure3" id="CalExposure3" size="5" value=""></td>\n <td><select name="CalBinning3" id="CalBinning3"><%= binningOptions() %></select></td>\n </tr>\n <tr id="CalRow4" style="display:none;">\n <td><input type="checkbox" name="CalUse4" id="CalUse4" value="yes"></td>\n <td><input type="text" name="CalCount4" id="CalCount4" size="4" value=""></td>\n <td><input type="text" name="CalExposure4" id="CalExposure4" size="5" value=""></td>\n <td><select name="CalBinning4" id="CalBinning4"><%= binningOptions() %></select></td>\n </tr>\n <tr id="CalRow5" style="display:none;">\n <td><input type="checkbox" name="CalUse5" id="CalUse5" value="yes"></td>\n <td><input type="text" name="CalCount5" id="CalCount5" size="4" value=""></td>\n <td><input type="text" name="CalExposure5" id="CalExposure5" size="5" value=""></td>\n <td><select name="CalBinning5" id="CalBinning5"><%= binningOptions() %></select></td>\n </tr>\n <tr id="CalRow6" style="display:none;">\n <td><input type="checkbox" name="CalUse6" id="CalUse6" value="yes"></td>\n <td><input type="text" name="CalCount6" id="CalCount6" size="4" value=""></td>\n <td><input type="text" name="CalExposure6" id="CalExposure6" size="5" value=""></td>\n <td><select name="CalBinning6" id="CalBinning6"><%= binningOptions() %></select></td>\n </tr>\n <tr id="CalRow7" style="display:none;">\n <td><input type="checkbox" name="CalUse7" id="CalUse7" value="yes"></td>\n <td><input type="text" name="CalCount7" id="CalCount7" size="4" value=""></td>\n <td><input type="text" name="CalExposure7" id="CalExposure7" size="5" value=""></td>\n <td><select name="CalBinning7" id="CalBinning7"><%= binningOptions() %></select></td>\n </tr>\n <tr id="CalRow8" style="display:none;">\n <td><input type="checkbox" name="CalUse8" id="CalUse8" value="yes"></td>\n <td><input type="text" name="CalCount8" id="CalCount8" size="4" value=""></td>\n <td><input type="text" name="CalExposure8" id="CalExposure8" size="5" value=""></td>\n <td><select name="CalBinning8" id="CalBinning8"><%= binningOptions() %></select></td>\n </tr>\n <tr id="CalRow9" style="display:none;">\n <td><input type="checkbox" name="CalUse9" id="CalUse9" value="yes"></td>\n <td><input type="text" name="CalCount9" id="CalCount9" size="4" value=""></td>\n <td><input type="text" name="CalExposure9" id="CalExposure9" size="5" value=""></td>\n <td><select name="CalBinning9" id="CalBinning9"><%= binningOptions() %></select></td>\n </tr>\n <tr id="CalRow10" style="display:none;">\n <td><input type="checkbox" name="CalUse10" id="CalUse10" value="yes"></td>\n <td><input type="text" name="CalCount10" id="CalCount10" size="4" value=""></td>\n <td><input type="text" name="CalExposure10" id="CalExposure10" size="5" value=""></td>\n <td><select name="CalBinning10" id="CalBinning10"><%= binningOptions() %></select></td>\n </tr>\n <tr id="CalRow11" style="display:none;">\n <td><input type="checkbox" name="CalUse11" id="CalUse11" value="yes"></td>\n <td><input type="text" name="CalCount11" id="CalCount11" size="4" value=""></td>\n <td><input type="text" name="CalExposure11" id="CalExposure11" size="5" value=""></td>\n <td><select name="CalBinning11" id="CalBinning11"><%= binningOptions() %></select></td>\n </tr>\n <tr id="CalRow12" style="display:none;">\n <td><input type="checkbox" name="CalUse12" id="CalUse12" value="yes"></td>\n <td><input type="text" name="CalCount12" id="CalCount12" size="4" value=""></td>\n <td><input type="text" name="CalExposure12" id="CalExposure12" size="5" value=""></td>\n <td><select name="CalBinning12" id="CalBinning12"><%= binningOptions() %></select></td>\n </tr>\n <tr id="CalRow13" style="display:none;">\n <td><input type="checkbox" name="CalUse13" id="CalUse13" value="yes"></td>\n <td><input type="text" name="CalCount13" id="CalCount13" size="4" value=""></td>\n <td><input type="text" name="CalExposure13" id="CalExposure13" size="5" value=""></td>\n <td><select name="CalBinning13" id="CalBinning13"><%= binningOptions() %></select></td>\n </tr>\n <tr id="CalRow14" style="display:none;">\n <td><input type="checkbox" name="CalUse14" id="CalUse14" value="yes"></td>\n <td><input type="text" name="CalCount14" id="CalCount14" size="4" value=""></td>\n <td><input type="text" name="CalExposure14" id="CalExposure14" size="5" value=""></td>\n <td><select name="CalBinning14" id="CalBinning14"><%= binningOptions() %></select></td>\n </tr>\n <tr id="CalRow15" style="display:none;">\n <td><input type="checkbox" name="CalUse15" id="CalUse15" value="yes"></td>\n <td><input type="text" name="CalCount15" id="CalCount15" size="4" value=""></td>\n <td><input type="text" name="CalExposure15" id="CalExposure15" size="5" value=""></td>\n <td><select name="CalBinning15" id="CalBinning15"><%= binningOptions() %></select></td>\n </tr>\n <tr id="CalRow16" style="display:none;">\n <td><input type="checkbox" name="CalUse16" id="CalUse16" value="yes"></td>\n <td><input type="text" name="CalCount16" id="CalCount16" size="4" value=""></td>\n <td><input type="text" name="CalExposure16" id="CalExposure16" size="5" value=""></td>\n <td><select name="CalBinning16" id="CalBinning16"><%= binningOptions() %></select></td>\n </tr>\n <tr>\n <td colspan="4"><a href="javascript:;" class="button" title="Click to add another row" onclick="DC3.Lib.expandoAddRow('Cal');">More</a></td>\n </tr>\n </table>\n <input type="checkbox" name="CalReqTemp" value="yes" />Require cooler temp\n<input type="text" name="CalTemp" size="4" value="-20" /> deg C<br><br>\n</form></html><<PersistentForm>><<PostForm "" "/ac/aacqcal.asp" "Acquire Cal Frames" "Starts the cal frame acquisition process">><<ValidateForm "" "postit">>\n<script>DC3.Lib.expandoInitializeForm("Cal");</script>\n
Turn this on to cause searching to be case-sensitive.
Use this to perfect the pointing of your scope. It does a standard ACP pointing update. It takes an image, plate solves, then <% if(Util.PointingCorrectionEnabled) { %>adds a new mapping point to the pointing corrector, improving the accuracy in the area where the scope is currently pointed<% } else { %>syncs or centers the scope with the hyper-accurate coordinates thus obtained<% }%>.<% if(Prefs.EnableAllSkySolving) { %> All-sky plate solving is available on this observatory, so if the basic plate solution fails after being tried at two closely spaced locations, it will try to do an all-sky plate solution using [[Astrometry.net|http://astrometry.net]]. This often succeeds, and if the telescope supports syncing, will result in the telescope being re-synced to recover its pointing.<% } %>
<<slider "" "Check Observing Plan Help" Help "Helpful information">>\n\n<html><table width="96%" style="border:none;margin:1px;background:transparent"><iframe id="acheckplan" src="/ac/acheckplan.asp" width="100%" height="0" frameborder="0" scrolling="no" allowtransparency style="border:none;"></iframe></table></html><script>\n// This is for lost refresh on IE6\nif(document.all) { // IE\nvar iFrame = place.getElementsByTagName("iframe")[0];\niFrame .src = iFrame .src;\n}\n</script>
\nThis item provides you with a way to check an [[Observing Plan|Making Observing Plans]] before uploading it to your [[Plans Area|Observing Plans]] for running. Virtually any plan error will be detected, but there are a few things that can't be checked because it's designed to be used with the imager and telescope offline. The following things are not checked:\n*Filter requested but imager has no filters\n*Filter not specified but imager has filters\n*Filter name matches one of the imager's filters\n*Rotator PA given but imager has no rotator\n*Rotator PA not given, but imager has a rotator\n*#Orbital tracking (#trackon) specified but the mount doesn't support it\n*#Dome control directives (#domeopen/#domeclose) given but there is no dome controller\n*Errors in the syntax of orbital elements for solar system objects or NEOCP ephemerides\n*Explicit flat plan file specifications are not checked for existence.\nAnd of course, target visibility can't be checked because the plan will be run at a different time. All of the above will be checked at the start of an actual run, so be sure to look at the system console after starting a plan to make sure that one of these errors isn't detected. The plan checker is designed to eliminate almost all sources of errors before uploading the plan.
/***\n|''Name:''|CheckboxPlugin|\n|''Source:''|http://www.TiddlyTools.com/#CheckboxPlugin|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nAdd checkboxes to your tiddler content. Checkbox states can be preserved in the document by either automatically modifying the tiddler content or setting/removing tags on specified tiddlers, or they may be saved as local cookies by assigning an optional 'chkID' to the checkbox. Add custom javascript for programmatic initialization and onClick handling for any checkbox. Also provides access to checkbox DOM element data and tracks the checkbox state in TiddlyWiki's config.options[] internal data.\n\n!!!!!Usage\n<<<\nThe checkbox syntax, including all optional parameters, is contained inside a matched set of [ and ] brackets.\n{{{ [x=id(title|tag){init_script}{onclick_script}] }}}\n\nAn alternative syntax lets you place the optional parameters ''outside'' the [ and ] brackets, and is provided for backward-compatibility with existing content that may include checkbox definitions based on earlier releases of this plugin:\n{{{ [x]=id(title|tag){init_script}{onclick_script} }}}\n\n//{{{\n[ ]or[_] and [x]or[X]\n//}}}\nSimple checkboxes. The current unchecked/checked state is indicated by the character between the {{{[}}} and {{{]}}} brackets ("_" means unchecked, "X" means checked). When you click on a checkbox, the current state is retained by directly modifying the tiddler content to place the corresponding "_" or "X" character in between the brackets\n//{{{\n[x=id]\n//}}}\nAssign an optional ID to the checkbox so you can use {{{document.getElementByID("id")}}} to manipulate the checkbox DOM element, as well as tracking the current checkbox state in {{{config.options["id"]}}}. If the ID starts with "chk" the checkbox state will also be saved in a cookie, so it can be automatically restored whenever the checkbox is re-rendered (overrides any default {{{[x]}}} or {{{[_]}}} value). If a cookie value is kept, the "_" or "X" character in the tiddler content remains unchanged, and is only applied as the default when a cookie-based value is not currently defined.\n//{{{\n[x(title|tag)] or [x(title:tag)]\n//}}}\nInitializes and tracks the current checkbox state by setting or removing ("TogglyTagging") a particular tag value from a specified tiddler. If you omit the tiddler title (and the | or : separator), the specified tag is assigned to the current tiddler. If you omit the tag value, as in {{{(title|)}}}, the default tag, {{{checked}}}, is assumed. Omitting both the title and tag, {{{()}}}, tracks the checkbox state by setting the "checked" tag on the current tiddler. When tag tracking is used, the "_" or "X" character in the tiddler content remains unchanged, and is not used to set or track the checkbox state. If a tiddler title named in the tag does not exist, the checkbox state defaults to //unselected//. When the checkbox is subsequently changed to //selected//, it will automatically (and silently) create the missing tiddler and then add the tag to it. //''NOTE: beginning with version 2.1.2 of this plugin, the "|" separator is the preferred separator between the title and tag name, as it avoids syntactic ambiguity when ":" is used within tiddler titles or tag names.''//\n//{{{\n[x{javascript}{javascript}]\n//}}}\nYou can define optional javascript code segments to add custom initialization and/or 'onClick' handling to a checkbox. The current checkbox state (and it's other DOM attributes) can be set or read from within these code segments by reference to the default context-object, 'this'.\n\nThe first code segment will be executed when the checkbox is initially displayed, so that you can programmatically determine it's starting checked/unchecked state. The second code segment (if present) is executed whenever the checkbox is clicked, so that you can perform programmed responses or intercept and override the checkbox state based on complex logic using the TW core API or custom functions defined in plugins (e.g. testing a particular tiddler title to see if certain tags are set or setting some tags when the checkbox is clicked).\n\nNote: if you want to use the default checkbox initialization processing with a custom onclick function, use this syntax: {{{ [x=id{}{javascript}] }}} \n<<<\n!!!!!Configuration\n<<<\nNormally, when a checkbox state is changed, the affected tiddlers are automatically re-rendered, so that any checkbox-dependent dynamic content can be updated. There are three possible tiddlers to be re-rendered, depending upon where the checkbox is placed, and what kind of storage method it is using.\n*''container'': the tiddler in which the checkbox is displayed. (e.g., this tiddler)\n*''tagged'': the tiddler that is being tagged (e.g., "~MyTask" when tagging "~MyTask:done")\n*''tagging'': the "tag tiddler" (e.g., "~done" when tagging "~MyTask:done")\nYou can set the default refresh handling for all checkboxes in your document by using the following javascript syntax either in a systemConfig plugin, or as an inline script. (Substitute true/false values as desired):\n{{{config.checkbox.refresh = { tagged:true, tagging:true, container:true };}}}\n\nYou can also override these defaults for any given checkbox by using an initialization function to set one or more of the refresh options. For example:\n{{{[_{this.refresh.container=false}]}}}\n<<<\n!!!!!Examples\n<<<\n//{{{\n[X] label\n[_] label\n//}}}\n>checked and unchecked static default values\n>[X] label\n>[_] label\n//{{{\n[_=demo] label\n//}}}\n>document-based value (id='demo', no cookie)\n>[_=demo] label\n//{{{\n[_=chkDemo] label\n//}}}\n>cookie-based value (id='chkDemo')\n>[_=chkDemo] label\n//{{{\n[_(CheckboxPlugin|demotag)]\n[_(CheckboxPlugin|demotag){this.refresh.tagged=this.refresh.container=false}]\n//}}}\n>tag-based value (TogglyTagging)\n>[_(CheckboxPlugin|demotag)] toggle 'demotag' (and refresh tiddler display)\n>[_(CheckboxPlugin|demotag){this.refresh.tagged=this.refresh.container=false}] toggle 'demotag' (no refresh)\n>current tags: <script>return store.getTiddler(story.findContainingTiddler(place).id.substr(7)).tags.toString();</script>\n><script label="click to view current tags">alert(store.getTiddler(story.findContainingTiddler(place).id.substr(7)).tags.toString());return false</script>\n//{{{\n[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state\n//}}}\n>custom init and onClick functions\n>[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state\nRetrieving option values:\nconfig.options['demo']=<script>return config.options['demo']?"true":"false";</script>\nconfig.options['chkDemo']=<script>return config.options['chkDemo']?"true":"false";</script>\n\n!!!!!Installation\nimport (or copy/paste) the following tiddlers into your document:\n''CheckboxPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n2006.05.04 - 2.1.3 fix use of findContainingTiddler() to check for a non-null return value, so that checkboxes won't crash when used outside of tiddler display context (such as in header, sidebar or mainmenu)\n2006.03.11 - 2.1.2 added "|" as delimiter to tag-based storage syntax (e.g. "tiddler|tag") to avoid parsing ambiguity when tiddler titles or tag names contain ":". Using ":" as a delimiter is still supported but is deprecated in favor of the new "|" usage. Based on a problem reported by JeffMason.\n2006.02.25 - 2.1.0 added configuration options to enable/disable forced refresh of tiddlers when toggling tags\n2006.02.23 - 2.0.4 when toggling tags, force refresh of the tiddler containing the checkbox.\n2006.02.23 - 2.0.3 when toggling tags, force refresh of the 'tagged tiddler' so that tag-related tiddler content (such as "to-do" lists) can be re-rendered.\n2006.02.23 - 2.0.2 when using tag-based storage, allow use [[ and ]] to quote tiddler or tag names that contain spaces:\n{{{[x([[Tiddler with spaces]]:[[tag with spaces]])]}}}\n2006.01.10 - 2.0.1 when toggling tags, force refresh of the 'tagging tiddler'. For example, if you toggle the "systemConfig" tag on a plugin, the corresponding "systemConfig" TIDDLER will be automatically refreshed (if currently displayed), so that the 'tagged' list in that tiddler will remain up-to-date.\n2006.01.04 - 2.0.0 update for ~TW2.0\n2005.12.27 - 1.1.2 Fix lookAhead regExp handling for {{{[x=id]}}}, which had been including the "]" in the extracted ID. \nAdded check for "chk" prefix on ID before calling saveOptionCookie()\n2005.12.26 - 1.1.2 Corrected use of toUpperCase() in tiddler re-write code when comparing {{{[X]}}} in tiddler content with checkbox state. Fixes a problem where simple checkboxes could be set, but never cleared.\n2005.12.26 - 1.1.0 Revise syntax so all optional parameters are included INSIDE the [ and ] brackets. Backward compatibility with older syntax is supported, so content changes are not required when upgrading to the current version of this plugin. Based on a suggestion by GeoffSlocock\n2005.12.25 - 1.0.0 added support for tracking checkbox state using tags ("TogglyTagging")\nRevised version number for official post-beta release.\n2005.12.08 - 0.9.3 support separate 'init' and 'onclick' function definitions.\n2005.12.08 - 0.9.2 clean up lookahead pattern\n2005.12.07 - 0.9.1 only update tiddler source content if checkbox state is actually different. Eliminates unnecessary tiddler changes (and 'unsaved changes' warnings)\n2005.12.07 - 0.9.0 initial BETA release\n<<<\n!!!!!Credits\n<<<\nThis feature was created by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.CheckboxPlugin = {major: 2, minor: 1, revision:3 , date: new Date(2006,5,4)};\n//}}}\n\n// // 1.2.x compatibility\n//{{{\nif (!window.story) window.story=window;\nif (!store.getTiddler) store.getTiddler=function(title){return store.tiddlers[title]}\nif (!store.addTiddler) store.addTiddler=function(tiddler){store.tiddlers[tiddler.title]=tiddler}\nif (!store.deleteTiddler) store.deleteTiddler=function(title){delete store.tiddlers[title]}\n//}}}\n\n//{{{\nconfig.checkbox = { refresh: { tagged:true, tagging:true, container:true } };\nconfig.formatters.push( {\n name: "checkbox",\n match: "\s\s[[xX_ ][\s\s]\s\s=\s\s(\s\s{]",\n lookahead: "\s\s[([xX_ ])(\s\s])?(=[^\s\ss\s\s(\s\s]{]+)?(\s\s([^\s\s)]*\s\s))?({[^}]*})?({[^}]*})?(\s\s])?",\n handler: function(w)\n {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n // get params\n var checked=lookaheadMatch[1];\n var id=lookaheadMatch[3];\n var tag=lookaheadMatch[4];\n var fn_init=lookaheadMatch[5];\n var fn_click=lookaheadMatch[6];\n // create checkbox element\n var c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick=onClickCheckbox;\n c.srcpos=w.matchStart+1; // remember location of "X"\n c.container=story.findContainingTiddler(w.output); if (c.container) c.container=c.container.id.substr(7); // tiddler containing checkbox\n c.refresh = { };\n c.refresh.container=config.checkbox.refresh.container;\n c.refresh.tagged=config.checkbox.refresh.tagged;\n c.refresh.tagging=config.checkbox.refresh.tagging;\n w.output.appendChild(c);\n // set default state\n c.checked=(checked.toUpperCase()=="X");\n // get/set state by ID\n if (id) {\n c.id=id.substr(1); // trim off leading "="\n if (config.options[c.id]!=undefined)\n c.checked=config.options[c.id];\n else\n config.options[c.id]=c.checked;\n }\n // get/set state by tag\n if (tag) {\n c.tiddler=c.container;\n c.tag=tag.substr(1,tag.length-2).trim(); // trim off parentheses\n var pos=c.tag.indexOf("|"); if (pos==-1) var pos=c.tag.indexOf(":");\n if (pos==0) { c.tag=tag.substr(1); }\n if (pos>0) { c.tiddler=c.tag.substr(0,pos).replace(/\s[\s[/g,"").replace(/\s]\s]/g,""); c.tag=c.tag.substr(pos+1); }\n c.tag.replace(/\s[\s[/g,"").replace(/\s]\s]/g,"");\n if (!c.tag.length) c.tag="checked";\n var t=store.getTiddler(c.tiddler);\n c.checked = (t && t.tags)?(t.tags.find(c.tag)!=null):false;\n }\n if (fn_init) c.fn_init=fn_init.trim().substr(1,fn_init.length-2); // trim off surrounding { and } delimiters\n if (fn_click) c.fn_click=fn_click.trim().substr(1,fn_click.length-2);\n c.init=true; c.onclick(); c.init=false; // compute initial state and save in tiddler/config/cookie\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n }\n)\n//}}}\n\n//{{{\nfunction onClickCheckbox()\n{\n if (this.fn_init)\n // custom function hook to set initial state (run only once)\n { try { eval(this.fn_init); this.fn_init=null; } catch(e) { displayMessage("Checkbox init error: "+e.toString()); } }\n else if (this.fn_click)\n // custom function hook to override or react to changes in checkbox state\n { try { eval(this.fn_click) } catch(e) { displayMessage("Checkbox click error: "+e.toString()); } }\n if (this.id)\n // save state in config AND cookie (only when ID starts with 'chk')\n { config.options[this.id]=this.checked; if (this.id.substr(0,3)=="chk") saveOptionCookie(this.id); }\n if ((!this.id || this.id.substr(0,3)!="chk") && !this.tag) {\n // save state in tiddler content only if not using cookie or tag tracking\n var t=story.findContainingTiddler(this); if (t) {\n var t=store.getTiddler(t.id.substr(7));\n if (this.checked!=(t.text.substr(this.srcpos,1).toUpperCase()=="X")) { // if changed\n t.set(null,t.text.substr(0,this.srcpos)+(this.checked?"X":"_")+t.text.substr(this.srcpos+1),null,null,t.tags);\n store.setDirty(true);\n }\n }\n }\n if (this.tag) {\n var t=store.getTiddler(this.tiddler);\n if (!t) { t=(new Tiddler()); t.set(this.tiddler,"",config.options.txtUserName,(new Date()),null); store.addTiddler(t); } \n var tagged=(t.tags && t.tags.find(this.tag)!=null);\n if (this.checked && !tagged) { t.tags.push(this.tag); store.setDirty(true); }\n if (!this.checked && tagged) { t.tags.splice(t.tags.find(this.tag),1); store.setDirty(true); }\n // if tag state has been changed, force a display update\n if (this.checked!=tagged) {\n if (this.refresh.tagged) story.refreshTiddler(this.tiddler,null,true); // the TAGGED tiddler\n if (this.refresh.tagging) story.refreshTiddler(this.tag,null,true); // the TAGGING tiddler\n }\n }\n // refresh containing tiddler (but not during initial rendering, or we get an infinite loop!)\n if (!this.init && this.refresh.container && this.container!=this.tiddler)\n story.refreshTiddler(this.container,null,true); // the tiddler CONTAINING the checkbox\n return true;\n}\n//}}}
<div class='header'>\n<div class='titleLine'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n</div>\n<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>\n<div id='sidebar'>\n<div macro='gradient vert #ffffff #cc9900'>\n<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n</div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n</div>
/***\n!TiddlyWiki Classic Color Scheme\nDesigned by Jeremy Ruston\nModified by Bob Denny for Share Your Sky! (add pale b/g to items, added .viewer {...} style def.)\n\n!!Revision History\n<<<\n''2006.09.19 [rbd]'' Initial adaptation, add pale b/g to items, added .viewer {...} style def.\n''2006.10.08 [rbd]'' Much more work over last 21 days, add styles for System Monitor, clean up XP bar styles.\n''2006.10.23 [rbd]'' Remove height from <input> and <select>, was scrunching buttons.\n''2006.10.26 [rbd]'' Reduce height of header, indent title 0.5em more to 1em, complete telemetry colors.\n''2006.11.07 [rbd]'' Faint border for thumbnail, make progbars match rest of display,\n''2006.11.21 [rbd]'' Add .collapsedTitle for folded tiddlers\n''2010.11.17 [rbd]'' ~ACP-490 Add border style for #sm_guideBox\n''2015.05.19 [rbd]'' ~ACP-1303 Text alignment in main menu top bars\n<<<\n!Colors Used\n*@@bgcolor(#630):color(#fff): #630@@\n*@@bgcolor(#930): #930@@\n*@@bgcolor(#996633): #963@@\n*@@bgcolor(#c90): #c90@@\n*@@bgcolor(#cf6): #cf6@@\n*@@bgcolor(#cc9): #cc9@@\n*@@bgcolor(#ba9): #ba9@@\n*@@bgcolor(#996): #996@@\n*@@bgcolor(#300):color(#fff): #300@@\n*@@bgcolor(#000000):color(#fff): #000@@\n*@@bgcolor(#666): #666@@\n*@@bgcolor(#888): #888@@\n*@@bgcolor(#aaa): #aaa@@\n*@@bgcolor(#ddd): #ddd@@\n*@@bgcolor(#eee): #eee@@\n*@@bgcolor(#ffffff): #fff@@\n*@@bgcolor(#f00): #f00@@\n*@@bgcolor(#ff3): #ff3@@\n!Generic Rules /%==============================================%/\n***/\n/*{{{*/\nbody {\n background: #fff;\n color: #000;\n position: static; /*Clint's IE fix part 1 (part 2 in TW now) */\n}\ntextarea {\n font-family:courier !important;\n}\na {\n color: #963;\n}\na:hover {\n background: #963;\n color: #fff;\n}\na img {\n border: 0;\n}\n.collapsedTitle {\n color: #888;\n font-size: 1.3em;\n font-weight: bold;\n}\nh1, h2, h3, h4, h5 {\n background: #cc9;\n}\n/*}}}*/\n/***\n!Header /%==================================================%/\n***/\n/*{{{*/\n.header {\n background: #300;\n}\n.titleLine {\n color: #fff;\n padding: 2.5em 0em 1em 1em;\n}\n.titleLine a {\n color: #cf6;\n}\n.titleLine a:hover {\n background: transparent;\n}\n/*}}}*/\n/***\n!Main Menu /%=================================================%/\n***/\n/*{{{*/\n#mainMenu .button {\n color: #930;\n}\n#mainMenu .button:hover {\n color: #cf6;\n background: #930;\n}\n#mainMenu li {\n list-style: none;\n}\n/*}}}*/\n/***\n!Sidebar options /%=================================================%/\n~TiddlyLinks and buttons are treated identically in the sidebar and slider panel\n***/\n/*{{{*/\n#sidebar {\n background: #c90;\n right: 0;\n}\n#sidebarOptions a {\n color: #930;\n border: 0;\n margin: 0;\n padding: .25em .5em;\n}\n#sidebarOptions a:hover {\n color: #cf6;\n background: #930;\n}\n#sidebarOptions a:active {\n color: #930;\n background: #cf6;\n}\n#sidebarOptions .sliderPanel {\n background: #eea;\n margin: 0;\n}\n#sidebarOptions .sliderPanel a {\n color: #930;\n}\n#sidebarOptions .sliderPanel a:hover {\n color: #cf6;\n background: #930;\n}\n#sidebarOptions .sliderPanel a:active {\n color: #930;\n background: #cf6;\n}\n/*}}}*/\n/***\n!Sidebar tabs /%=================================================%/\n***/\n/*{{{*/\n.tabSelected, .tabContents {\n background: #eea;\n border: 0;\n}\n.tabUnselected {\n background: #c90;\n}\n#sidebarTabs {\n background: #c90;\n}\n#sidebarTabs .tabSelected {\n color: #cf6;\n background: #963;\n}\n#sidebarTabs .tabUnselected {\n color: #cf6;\n background: #930;\n}\n#sidebarTabs .tabContents {\n background: #963;\n}\n#sidebarTabs .txtMoreTab .tabSelected, #sidebarTabs .txtMoreTab .tabSelected:hover {\n background: #930;\n color: #cf6;\n}\n#sidebarTabs .txtMoreTab .tabUnselected, #sidebarTabs .txtMoreTab .tabUnselected:hover {\n background: #300;\n color: #cf6;\n}\n#sidebarTabs .txtMoreTab .tabContents {\n background: #930;\n}\n#sidebarTabs .tabContents a {\n color: #cf6;\n border: 0;\n}\n#sidebarTabs .button.highlight, #sidebarTabs .tabContents a:hover {\n background: #cf6;\n color: #300;\n}\n/*}}}*/\n/***\n!Message Area /%=================================================%/\n***/\n/*{{{*/\n#messageArea {\n background: #930;\n color: #fff;\n}\n#messageArea a:link, #messageArea a:visited {\n color: #c90;\n}\n#messageArea a:hover {\n color: #963;\n background: transparent;\n}\n#messageArea a:active {\n color: #fff;\n}\n/*}}}*/\n/***\n!Popup /%=================================================%/\n***/\n/*{{{*/\n.popup {\n background: #eea;\n border: 1px solid #930;\n}\n.popup hr {\n color: #963;\n background: #963;\n border-bottom: 1px;\n}\n.popup li.disabled {\n color: #ba9;\n}\n.popup li a, .popup li a:visited {\n color: #300;\n}\n.popup li a:hover {\n background: #930;\n color: #eea;\n}\n/*}}}*/\n/***\n!Tiddler Display /%=================================================%/\n***/\n/*{{{*/\n/** LOSER ON IE6 without Clint's IE fix (see body section at top!) **/\n.tiddler {\n border: 1px solid #eee;\n padding-bottom: 8px;\n margin-left: 8px; /* Vastly different on IE vs FireFox! */\n margin-bottom: 12px;\n}\n.tiddler .button {\n color: #930;\n}\n.tiddler .button:hover {\n color: #cf6;\n background: #930;\n}\n.tiddler .button:active {\n color: #fff;\n background: #c90;\n}\n.shadow .title {\n color: #888;\n}\n.title {\n color: #422;\n}\n.subtitle {\n color: #866;\n}\n.toolbar {\n color: #aaa;\n}\n.toolbar a, .toolbar a:hover {\n border: 0;\n}\n.tagging, .tagged {\n border: 1px solid #fff;\n background-color: #ffc;\n}\n.selected .tagging, .selected .tagged {\n border: 1px solid #aa6;\n background-color: #ffc;\n}\n.tagging .listTitle, .tagged .listTitle {\n color: #999999;\n}\n.footer {\n color: #ddd;\n}\n.selected .footer {\n color: #888;\n}\n.sparkline {\n background: #eea;\n border: 0;\n}\n.sparktick {\n background: #930;\n}\n.errorButton {\n color: #ff0;\n background: #f00;\n}\n.zoomer {\n color: #963;\n border: 1px solid #963;\n}\n/*}}}*/\n/***\n''The viewer is where the tiddler content is displayed'' /%------------------------------------------------%/\n***/\n/*{{{*/\n.viewer .button {\n background: #c90;\n color: #300;\n border-right: 1px solid #300;\n border-bottom: 1px solid #300;\n}\n.viewer .button:hover {\n background: #eea;\n color: #c90;\n}\n.viewer .imageLink {\n background: transparent;\n}\n.viewer blockquote {\n border-left: 3px solid #666;\n}\n.viewer input {\n font-family: "Lucida Console", "Courier New", Courier, monospace;\n font-size: 1.0em;\n}\n.viewer select {\n font-family: "Lucida Console", "Courier New", Courier, monospace;\n font-size: 1.0em;\n}\n.viewer table {\n border: 2px solid #303030;\n}\n.viewer th, thead td {\n background: #996;\n border: 1px solid #606060;\n color: #fff;\n}\n.viewer td, .viewer tr {\n border: 1px solid #606060;\n}\n.viewer .sortheader {\n font-weight: normal;\n}\n.viewer .fileList table {\n border-color: #ff7f00;\n margin-bottom: 0px;\n}\n.viewer .fileList tr {\n border: none;\n}\n.viewer .fileList td, .viewer .fileList th {\n border: 0;\n padding: 2px 8px 2px 8px;\n}\n.viewer .noBorder table, .viewer .noBorder th, .viewer .noBorder tr, .viewer .noBorder td {\n border: 0;\n}\n.viewer .noBorder #sm_thumb { /* For sysmon thumbnail */\n border: 1px solid #eee;\n padding: 0px;\n}\n.viewer .noBorder #sm_guideBox { /* For sysmon guider trackbox image */\n border: 1px solid #eee;\n padding: 0px;\n}\n.viewer pre {\n border: 1px solid #963;\n background: #eea;\n}\n.viewer code {\n color: #630;\n}\n.viewer hr {\n border: 0;\n border-top: dashed 1px #606060;\n color: #666;\n}\n.viewer iframe {\n border: 1px solid #963;\n}\n.highlight, .marked {\n background: #ff3;\n}\n/*}}}*/\n/***\n''The editor replaces the viewer in the tiddler'' /%------------------------------------------------%/\n***/\n/*{{{*/\n.editor input {\n border: 1px solid #000;\n}\n.editor textarea {\n border: 1px solid #000;\n width: 100%;\n}\n.editorFooter {\n color: #aaa;\n}\n.editorFooter a {\n color: #930;\n}\n.editorFooter a:hover {\n color: #cf6;\n background: #930;\n}\n.editorFooter a:active {\n color: #fff;\n background: #c90;\n}\n/*}}}*/\n/***\n!XP ~NavBar Style Overrides\n***/\n/*{{{*/\n\n.topItem {\n display: table-cell;\n vertical-align: middle;\n background: url("im/bar-classic-up.png") no-repeat 0 0;\n color:#cf6;\n}\n.topItemOver {\n display: table-cell;\n vertical-align: middle;\n background: url("im/bar-classic-up-on.png") no-repeat 0 0;\n color: #fff;\n}\n.topItemClose {\n display: table-cell;\n vertical-align: middle;\n background: url("im/bar-classic-down.png") no-repeat 0 0;\n color:#cf6;\n}\n.topItemCloseOver {\n display: table-cell;\n vertical-align: middle;\n background: url("im/bar-classic-down-on.png") no-repeat 0 0;\n color: #fff;\n}\n.dropMenu {\n background-color: #963;\n color: #fff;\n}\n.subItem, .subSubItem {\n color: #fff;\n}\n.subItemOver, .subSubItemOver {\n color: #fff;\n}\n.subItem a, .subSubItem a {\n color: #cf6;\n}\n.subItemOver a, .subSubItemOver a {\n color: #000;\n background-color: #cf6;\n}\n/*}}}*/\n/***\n!System Status Display Styles\n***/\n/*{{{*/\ndiv.progBarBg {\n position:relative;\n height:0.75em;\n background-color: #cf6;\n}\ndiv.progBarFg {\n position:absolute;\n overflow: hidden;\n height: 0.75em;\n width:0px;\n background-color: #963;\n}\ntd.telemetry {\n font-family: Lucida Console, Courier New, Courier, monospace;\n font-size: 1em;\n background-color: #cf6;\n white-space: pre;\n color: #c0c0c0;\n// "off" state overridden by inner <span> tags\n}\nspan.telemActive {\n color: black;\n}\nspan.telemWarn {\n color: #ff0000;\n}\nspan.telemOff {\n color: #c0c0c0;\n} /* Match color in td.telemetry */\ntd.telemlabel {\n white-space: nowrap;\n}\ntextarea.scriptlog {\n border: 1px solid #963;\n margin: 0;\n padding: 0.5em;\n background: #cf6;\n color: black;\n font-family: Lucida Console, Courier New, Courier, monospace !important;\n font-size: 8pt !important;\n white-space: pre;\n line-height: 110%;\n}\ntd.trackGraph {\n background-color: #cf6;\n}\n\n/*}}}*/\n
<<RemoteContent '/ac/aclarity2.asp' Refresh 'Refresh the Clarity info'>>
/***\n|''Name:''|CollapseTiddlersPlugin|\n|''Description:''|Command to collapse/restore tiddler display like WindowBlinds|\n|''Date:''|November 21, 2006|\n|''Source:''|[[CollapseTiddlerPlugin]]|\n|''Author:''|Bradley Meck, Eric Schulman, Bob Denny|\n|''License:''|unknown|\n|''Version:''|1.0.1|\n|''~CoreVersion:''|2.0.10/2.1.x|\n|''Browser:''|Firefox 1.5; Internet Explorer 6.0; Safari|\n|''Require:''|[[CollapsedTemplate]] and optionally [[WebCollapsedTemplate]]|\nThis contains 3 commands for use in the toolbar. \n!!Revision History\n<<<\n''????.??.?? [?.?.?]'' Initial creation\n''2006.02.06 [?.?.?]'' ELS - Added check for readOnly flag to use alternative WebCollapsedTemplate\n''2006.02.24 [?.?.?]'' ELS - Added fallback to CollapsedTemplate if WebCollapsedTemplate is not found\n''2006.11.21 [1.0.1]'' RBD - Reformat, add complete info, describe, validate on TW 2.1.x, remove 'all' macros, change toooltip 'tiddler' to 'item'\n<<<\n!!Code\n***/\n//{{{\n//{{{\nversion.extensions.collapseTiddler = {\n major: 1, minor: 0, revision: 1,\n date: new Date(2006, 11, 21), \n type: 'commands',\n source: "#CollapseTiddlerPlugin"\n};\n\nconfig.commands.collapseTiddler = {\n \n text: "fold",\n tooltip: "Collapse this tiddler",\n \n //\n // Common function, refactored (rbd)\n //\n findTemplate: function()\n {\n var t = (readOnly && store.tiddlerExists("WebCollapsedTemplate")) ? "WebCollapsedTemplate" : "CollapsedTemplate";\n if (!store.tiddlerExists(t)) { \n alert("Can't find 'CollapsedTemplate'"); \n return null; \n }\n return t;\n },\n \n //\n // Collapse handler\n //\n handler: function(event, src, title)\n {\n var tid = story.findContainingTiddler(src);\n if(tid.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE]) {\n var t = this.findTemplate();\n if(t === null) return;\n if(tid.getAttribute("template") != t ) {\n tid.setAttribute("oldTemplate", tid.getAttribute("template"));\n story.displayTiddler(null, title, t);\n }\n }\n }\n};\n\nconfig.commands.expandTiddler = {\n \n text: "unfold",\n tooltip: "Restore this tiddler",\n \n handler: function(event, src, title)\n {\n var tid = story.findContainingTiddler(src);\n story.displayTiddler(null, title, tid.getAttribute("oldTemplate"));\n }\n};\n\nconfig.commands.collapseOthers = {\n \n text: "focus",\n tooltip: "Restore this tiddler and collapse all others",\n \n handler: function(event, src, title)\n {\n var tid = story.findContainingTiddler(src);\n story.forEachTiddler(\n function(title, tiddler) {\n if(tiddler.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE]) {\n var t = config.commands.collapseTiddler.findTemplate();\n if(t === null) return;\n if (tid == tiddler) \n t = tid.getAttribute("oldTemplate"); // If this is null, wasn't collapsed anyway\n story.displayTiddler(null, title, t); // null here uses current template!\n }\n }\n );\n }\n};\n//}}}\n
<div class='toolbar'>\n<span macro='toolbar expandTiddler collapseOthers -closeTiddler'></span>\n</div>\n<div class='collapsedTitle' macro='view title'></div>
!File Access and Usage\n#__Where are my Plan, Image and Log Files__? <% if(User.Username == "localweb") { %>You are running the web browser locally in the observatory, via the Use Web Browser button (localhost). Therefore, your documents are where they are usually stored when using the ACP console, in your Windows ''My Documents'' area, under ''ACP Observing''.<% } else { %>Open the My Documents menu bar on the left to see the Acquired Images, Observing Plans, and Run Logs selections. At the observatory, these documents are stored in the web browser's file storage area, set by the system administrator.<% } %>\n#__How do I upload an ACP observing plan__? <% if(User.Username == "localweb") { %>You are running the web browser locally in the observatory, via the Use Web Browser button (localhost). Therefore you just store the plan in your local ''My Documents\sACP Observing\sPlans folder''.<% } else { %>Open the My Documents menu bar on the left to see the Observing Plans selection. In that item is an uploading form.<% } %>\n!Browser Issues\n#__I clicked the back arrow and everything disappeared! What happened__? This site uses advanced web techniques designed to avoid page changes. Things are displayed in bits within one page, and data is updated dynamically behind the scenes. This means you don't change web pages, ever. Leave the back and forward buttons alone. For more info, see [[Using This Web Site]].\n#__The display looks terrible, very old fashioned, and lots of things just don't work. What's going on__? You are using an old browser. This site was developed for the ~W3C standards in effect 10 years ago, and uses extensive Javascript and cookie services. Upgrade your browser to the latest version. Your browsing experience will be improved in all areas.\n#__Why does the display act crazy and look bad on my mobile phone or pad__? Only the most recent (as of 2011) iPhone, iPad, and Android browsers are good enough to handle the ACP web content. If your older phone or pad doesn't work well with our web site, there's not much we can do, sorry.\n
/% INSTRUCTIONS: Using Basic Formatting, Item Level Formatting, or other advanced features, customize this for your users. Once you have this working feel free to erase everything before the "Information about..." below %/<% if(User.IsAdministrator) { %>\n@@''You can customize this in the [[Authoring Environment|/author.html]]''@@<% } %>\nHere you can put the phone numbers, email addresses, etc. for the person responsible for the observatory, or maybe the organization that runs it. Whatever you want.
''Tag'': Items which provide the user with control features. Always considered to be UserContent.
''Tag'': Items which have been created after installation. __It's vital that any new items that you create be tagged Custom__. It allows you to identify any items which you have added or changed. It also allows ACP installers to preserve your custom content on updates that may require replacement of author.html and index.asp. See [[Importing and Exporting Items]] for tools that you can use to manage custom(ized) items.
//{{{\n// Customizations that apply to both normal and ASP mode\n// Bob Denny 07-Oct-2006\n// 27-Oct-2006 Use unicode escapes for drop chars to can edit in (e.g.) PrimalScript.\n//\n// Shorten/clarify command names and add drop-down icons on appropriate commands\nconfig.commands.references.text = "refs" + (document.all?"\su25BC":"\su25BE"); // UTF8 default is "references"\nconfig.commands.permalink.text = "link"; // default is "permalink"\nconfig.commands.closeOthers.text = "close-others"; // default is "close others"\nconfig.commands.jump.text = "jump" + (document.all?" ":" ");\n// Override default options\nconfig.options.chkHttpReadOnly = false\nconfig.options.txtUploadStoreUrl = "twstore.asp"\nconfig.options.txtUploadBackupDir = "author-backup"\n//}}}
/***\n|''Name:''|DC3.Ajax|\n|''Description:''|General purpose Ajax class|\n|''Date:''|April 12, 2015|\n|''Source:''|http://solo.dc3.com/tw/index.html#DC3.Ajax|\n|''Author:''|Bob Denny ~DC-3 Dreams, SP|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''Version:''|1.0.6|\n|''~CoreVersion:''|2.0.11, 2.1.0|\n|''Require:''|//none//|\n!!Description\nAjax library\n!!Usage\nTBD\n!!Revision History\n<<<\n''2006.09.16 [1.0.1]'' Initial creation, loosely patterned after BidiX Ajax\n''2006.09.20 [1.0.2]'' Add POST to core, refactor massively, now object can contain multiple methods. Add postForm() method.\n''2006.09.22 [1.0.3]'' Support posting hidden fields in postForm()\n''2006.09.26 [1.0.4]'' Change error reporting to popups. Include status code, status text and any body text in error popup.\n''2006.10.03 [1.0.5]'' Refactor post code, lowercase element type strings for tests, check out on TW 2.1.0\n''2015.04.12 [1.0.6]'' POST requests now include a header Cache-Control: no-cache to prevent caching of results.\n<<<\n!!Code\n***/\n//{{{\nif (!window.DC3) window.DC3 = {};\nDC3.Ajax = \n{\n sendRequest: function(method, url, postData, onComplete, clientParams)\n {\n var xmlhttp;\n \n try { \n xmlhttp = new XMLHttpRequest(); \n } catch (e) {\n try { \n xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); \n } catch (e) {\n try { \n xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); \n } catch (e) { \n alert(e.description?e.description:e.toString()); \n }\n }\n }\n if (!xmlhttp) {\n alert("Can't support AJAX: Update your browser!");\n return;\n }\n if (window.netscape) {\n try {\n if (document.location.protocol.indexOf("http") == -1) {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n }\n } catch (e) { \n alert(e.description ? e.description : e.toString()); \n }\n }\n \n xmlhttp.onreadystatechange = function () // Completion event\n {\n if (xmlhttp.readyState == 4) {\n if (xmlhttp.status == 200 || xmlhttp.status === 0) {\n onComplete(xmlhttp.responseText, clientParams);\n } else {\n alert(xmlhttp.status + " " + xmlhttp.statusText + ":\sn" + xmlhttp.responseText);\n }\n }\n };\n \n try {\n xmlhttp.open(method, url, true);\n if(method.toLowerCase() == 'post') {\n xmlhttp.setRequestHeader("Content-Type",\n "application/x-www-form-urlencoded");\n xmlhttp.setRequestHeader("Cache-Control", "no-cache");\n xmlhttp.send(postData);\n } else if (config.browser.isIE) { // Pathetic!\n xmlhttp.send(); \n } else { \n xmlhttp.send(null); \n }\n } catch (e) { \n alert(url + "failed: " + e.toString()); \n }\n },\n \n postForm: function(form, url, onComplete, clientParams)\n {\n var encode = function(name, val, last) {\n return encodeURIComponent(name) + "=" + encodeURIComponent(val) + (last ? "" : "&");\n };\n var nElem = form.elements.length;\n var fData = "";\n // Must hand-construct query string according to rules\n for(var i = 0; i < nElem; i++) {\n var elem = form.elements[i];\n var last = (i == nElem - 1);\n switch(elem.type.toLowerCase()) {\n case "text":\n case "password":\n case "textarea":\n case "select-one":\n case "hidden":\n fData += encode(elem.name, elem.value, last); // Encode even if empty\n break;\n case "checkbox":\n case "radio":\n if(elem.checked)\n fData += encode(elem.name, elem.value, last);\n break;\n case "select-multiple":\n for(var j = 0; j < elem.options.length; j++) {\n if(elem.options[j].selected) // Encode only selected (may be none!)\n fData += encode(elem.name, elem.options[j].value);\n }\n break;\n default: // Others unsupported \n displayMessage("Ajax.postForm: " + elem.type + " form elements not supported.");\n return; // BAIL OUT!\n }\n }\n this.sendRequest("POST", url, fData, onComplete, clientParams);\n }\n};\n//}}}\n \n
/***\n|''Name:''|DC3.CatSearch|\n|''Description:''|Special purpose Ajax class for searching catalogs|\n|''Date:''|June 03, 2021|\n|''Source:''|private|\n|''Author:''|Bob Denny ~DC-3 Dreams, SP|\n|''License:''|Copyright (C) 2006-2021, Robert B. Denny, Mesa, AZ|\n|''Version:''|1.5.1|\n|''~CoreVersion:''|2.1.3|\n|''Require:''|DC3.Ajax|\n!!Description\nLibrary of Javascript called from an observing form to fill in the "RA" and "Dec" fields of a form via an AJAX call to a remote ASP page. The remote ASP page takes the contents of the "Target" field of the form, tries to find a match in the catalog(s) and if a unique match is found, returns the coordinates. If no match or multiple matches are found, returns advisory message (TBD!).\n!!Usage\nTotally dependent on the HTML form and its fields/names for operation. This takes the form data and does the lookups using MiniSAC, MPCORB, or MPCCOMET depending, then updates the form accordingly. \n\nThe lookup() call writes the body type ({{{dsky}}} or {{{orb}}}) to a form field id=SPhotIsOrb (normally hidden) to be used for UI styling. In addition, if a second parameter is given to lookup(), it is assumed to be a function which is called with one parameter, again either {{{dsky}}} or {{{orb}}}. Use this for UI styling etc.\n\n@@WARNING: KLUDGE ALERT!@@ The response handler looks for onchange() handlers in the RA and Dec form fields, but instead of calling them, it assumes that they are there because of a {{{<<PersistentForm>>}}} macro call, and calls that macro's onChange() method instead. I could not get it to let me call the onkeyup() methods. \n\n@@WARNING:@@ The events passed in the above calls to persistent-form are manufactured, and have only a target property. That's all that onChange() needs. I told you this was special purpose.\n!!Revision History\n<<<\n''2006.10.03 [1.0.1]'' Initial creation, coordinate lookup from MiniSAC only\n''2006.10.04 [1.0.2]'' Add MiniSAC searching (Deep Sky Catalog Search tiddler)\n''2006.10.10 [1.0.3]'' Lookup now contains additional info. Display it.\n''2006.10.26 [1.0.4]'' Lookup now contains target name, display it instead of "J2000". Comment out send/receive displayMessage() calls.\n''2006.11.04 [1.0.5]'' Server now sends error messages, only 'ok' code is tested. Add support for "short form" returns, used for solar system bodies (ephemerides).\n''2011.08.30 [1.1.1]'' ACP:693 Support for ValidateFormPlugin acting on the client form. Remove 'ephemeris' logic, Was never used and can't be validated.\n''2011.09.29 [1.1.2]'' ACP:713 On ephemeris targets, put 0 into RA/Dec so will form-validate\n''2012.08.26 [1.2.1]'' ACP:788 lookup() now also looks for (hidden) visOnly form field (for Scheduler input forms).\n''2014.07.10 [1.3.1]'' ACP:966 Change lookup field delimiters to '|' to avoid tripping on commas in decimal numbers on Euro systems.\n''2018.07.13 [1.4.1]'' ACP:1610 Add support for hidden field 'isOrb' for hiding/showing the Orbital Tracking checkbox, as well as a function parameter onCompl that will be called on completion with the body type as a parameter.\n''2021.06-03 [1.5.1]'' ACP:1833 Encode {{{+}}} as {{{2B}}} in search string to avoid it being converted toblank in query string. encodeURI() doesn't do this. \n<<<\n!!Code\n***/\n//{{{\nif (!window.DC3) window.DC3 = {};\nDC3.CatSearch = \n{\n _findForm: function(place)\n {\n var forms = place.getElementsByTagName("form");\n if(forms.length === 0) throw("No form in tiddler");\n return forms[0]; // Return first form\n },\n \n _findFormField: function(place, name) // Private\n {\n var form = this._findForm(place);\n var fields = form.getElementsByTagName("input"); // Search <input> fields first\n for(var i = 0; i < fields.length; i++) {\n if(fields[i].name.toLowerCase() == name.toLowerCase()) {\n switch(fields[i].type) {\n case "text":\n case "checkbox":\n case "hidden":\n return fields[i]; // Return found field\n break; // (for lint)\n case "radio": // Return only checked rb field\n if(fields[i].checked) return fields[i];\n break;\n default: // Silence JSLint\n break;\n }\n }\n }\n fields = form.getElementsByTagName("select"); // Nope, look for <select>\n if(fields.length === 0) throw("No fields in form");\n for(i = 0; i < fields.length; i++) {\n if(fields[i].name.toLowerCase() == name.toLowerCase())\n return fields[i];\n }\n throw("field " + name + " not found");\n },\n \n onLookupComplete: function(text, params) // 'text' is what's sent back by remote\n {\n var res = "";\n var e = { target: null }; // Phoney event for onkeyup calls (specific to us!)\n text = text.replace(/(^\ss*)|(\ss*$)/g, ""); // Trim off l/t junk!\n if(text.substr(0, 2) == "ok") { // Found: "ok,target[,hh:mm:ss.s,dd:mm:ss.ss,info"]\n var bits = text.split("|");\n if(bits.length > 2) { // If have coords (deep sky)\n params.raField.value = bits[2];\n params.decField.value = bits[3];\n params.isOrb.value = "dsky";\n res = "dsky"; // Hidden field for OrbTrack checkbox visibility (typ)\n } else { // Solar system target, ephemeris\n params.raField.value = "0"; // Zeroes, allow passing validation\n params.decField.value = "0";\n params.isOrb.value = "orb";\n res = "orb";\n }\n e.target = params.raField; // Persist only if valid coordinates\n config.macros.PersistentForm.onChange(e);\n e.target = params.decField;\n config.macros.PersistentForm.onChange(e);\n if(params.form.bValidator) { // If there's a validator attached (<<ValidateForm>> plugin)\n params.form.bValidator.validate(false, $(params.raField)); // Revalidate the RA and Dec fields (always validated!)\n params.form.bValidator.validate(false, $(params.decField));\n }\n wikify("\sn----\snOK! ", params.place);\n if(bits.length > 2) {\n wikify(bits[1] + " coordinates set... " + bits[4], params.place);\n } else {\n wikify(bits[1] + " found, ephemeris will be calculated at image time", params.place);\n }\n } else {\n params.raField.value = "?"; // Indicate error - Do not presist!\n params.decField.value = "?";\n params.isOrb.value = "err";\n wikify("\sn----\sn" + text, params.place); // Wikify some error message\n }\n // Always persist the isOrb field, and always call the form's responsive function\n e.target = params.isOrb;\n config.macros.PersistentForm.onChange(e);\n if(params.onCompl) {\n params.onCompl("err");\n }\n //displayMessage("Received response.");\n },\n \n lookup: function(place, onCompl) // Used in Acquire form pages for coordinate lookup\n {\n var form = this._findForm(place);\n var tgtField = this._findFormField(place, "Target");\n var raField = this._findFormField(place, "RA");\n var decField = this._findFormField(place, "Dec");\n var visOnly = this._findFormField(place, "visOnly");\n var isOrb = this._findFormField(place, "isOrb");\n\n raField.value = ""; // Clear the RA/Dec fields\n decField.value = "";\n var e = { target: null };\n if(raField.onkeyup) { // (safety) Clear the persist cookies too\n e.target = raField;\n //??params.raField.onkeyup(e);\n config.macros.PersistentForm.onChange(e); // KLUDGE!\n }\n if(decField.onkeyup) {\n e.target = decField;\n //???params.decField.onkeyup(e);\n config.macros.PersistentForm.onChange(e); // KLUDGE!\n }\n \n var complParams = {\n form: form,\n place: place,\n raField: raField,\n decField: decField,\n visOnly: visOnly,\n isOrb: isOrb,\n onCompl: onCompl\n };\n //displayMessage("Sending request...");\n DC3.Ajax.sendRequest("post", \n "/ac/acatlookup.asp", \n "target=" + escape(tgtField.value).replace("\s+", "%2B") + \n "&visOnly=" + escape(visOnly.value),\n DC3.CatSearch.onLookupComplete,\n complParams);\n },\n \n onSearchComplete: function(text, params)\n {\n text = text.replace(/(^\ss*)|(\ss*$)/g, ""); // Trim off l/t junk!\n if(text == "nm") {\n wikify("\sn----\snNo matches. Click the Help button for hints.", params.place);\n } else if(text.substr(0, 2) == "er") {\n wikify("\sn----\snCatalog error: " + text.substr(3), params.place);\n } else {\n var results = text.split(","); // results[0] is 'mx' or count\n for(var i = 1; i < results.length; i++) // For the rest of the items\n params.resListField.options[i - 1] = new Option(results[i], results[i]);\n if(results[0] == "mx")\n wikify("\sn----\snToo many matches, only the first 100 were returned.", params.place);\n else\n wikify("\sn----\sn" + results[0] + " matches found.", params.place);\n }\n //displayMessage("Received response.");\n },\n \n search: function(place)\n {\n var patField = this._findFormField(place, "pattern");\n var matTypField = this._findFormField(place, "matType");\n var visField = this._findFormField(place, "visOnly");\n var resListField = this._findFormField(place, "resList");\n resListField.options.length = 0; // Clear the list\n var complParams = { \n place: place,\n resListField: resListField\n };\n var postData = "pattern=" + escape(patField.value) + "&" +\n "type=" + matTypField.value + "&" + \n "visible=" + (visField.checked ? "true" : "false");\n //displayMessage("Sending request...");\n DC3.Ajax.sendRequest("post", \n "/ac/adscatsearch.asp", \n postData,\n DC3.CatSearch.onSearchComplete,\n complParams);\n }\n\n};\n//}}}\n \n
/***\n|''Name:''|~DC3.Lib|\n|''Description:''|ACP Browser UI Support Library|\n|''Date:''|May 28, 2016|\n|''Source:''|private|\n|''Author:''|Bob Denny ~DC-3 Dreams, SP|\n|''License:''|Copyright (C) 2006-2016, Robert B. Denny, Mesa, AZ|\n|''Version:''|1.3.0|\n|''~CoreVersion:''|2.1.3|\n|''Require:''|//none//|\n!Description\nLibrary of misc. support code for the ACP Share Your Sky! web UI operating within the ~TiddlyWiki framework.\n!!Revision History\n<<<\n''2006.10.04 [1.0.1]'' Initial creation\n''2006.10.05 [1.0.2]'' Use story.displayTiddler(), displayTiddler() deprecated in 2.1.0.\n''2006.10.07 [1.0.3]'' Add global for managing timer in system monitor tiddler\n''2006.10.10 [1.0.4]'' Add another global for system monitor flasher timer\n''2006.10.24 [1.0.5]'' Add postMkDir() and completion methods\n''2006.10.26 [1.0.6]'' Add postChdir() and completion methods\n''2006.11.17 [1.0.7]'' Add xxxAddRow() and xxxShowUsedRows() for expandable Color Series, Sky Flat, and Cal Frames items.\n''2007.11.18 [1.0.8]'' xxxAddRow() now pre-set and persist the 'use' checkbox on revealing a new row.\n''2006.11.28 [1.0.9]'' Add logOff and event proc for same. Shared by main menu and system status. Also now available anywhere you want a Release the Obs link.\n''2011.08.30 [1.1.1]'' GEM:693 Additional function for validation and behavior of Color Series expando rows.\n''2011.08.31 [1.1.1]'' GEM:693 More work. Reorganize, comment inline with code, divide code blocks for reading in UI, add functionality to support the flat and cal frams expandi forms similar to that for the color series form.\n''2011.08.31 [1.1.1]'' GEM:693 and GEM:695 Refactored expando form support to use one shared function for all forms by using unique prefixes in the name and id attributes.\n''2011.08.31 [1.1.1]'' GEM 693 Changing any expando row input field now auto-checks the Use box and arms validation.\n''2011.09.08 [1.1.1]'' GEM:693 Validation for expando rows >= 10 fixed. \n''2011.09.11 [1.1.1]'' GEM:693 Oops, fix auto-check logic of expando rows that was broken by previous validation fix.\n''2014.01.21 [1.2.1]'' New function fillInnerHTML() and completion function. This was added in GEM:1084. Used in the "Single Series" form of Scheduler.\n''2016.05.28 [1.3.0]'' GEM:1467 Generalize postChdir() to take url like postMkdir().\n<<<\n!!Miscellaneous Functions\n***/\n//{{{\nif (!window.DC3) window.DC3 = {};\nDC3.Lib = \n{\n sysMonRefreshTimerID: null, // Global for system monitor refresh timer\n sysMonFlashTimerID: null, // Same for system monitor flasher timer\n expandoFieldPats: ['Count', 'Exposure', 'Filter', 'Binning', 'PA'],\n \n //\n // getPlace() - Find the enclosing viewer or tiddler div.\n //\n // This finds the enclosing viewer div, and if there is not one, it finds the parent \n // tiddler div. Useful for (e.g.) calling wikify() to add stuff to the bottom of a \n // tiddler. Note the (e.g.) the MainMenu is within a viewer div when it's being shown \n // as a tiddler, but not when it is the 'real' main menu. Thus the 'catch'. This also \n // applies to Javascript running in other than the viewer div of the tiddler (title/subtitle).\n //\n getPlace: function(node) // Different than story.findContainingTiddler()\n {\n if(!node) throw("DC3.Lib.getPlace(): place not found.");\n if((node.attributes["class"] && node.attributes["class"].nodeValue == "viewer") || node.attributes["tiddler"]) {\n return node;\n } else {\n return this.getPlace(node.parentNode);\n }\n },\n //\n // openTiddler() - Open a tiddler, animate from viewer div\n //\n // Normally, calling displayTiddler() from a Javascript onClick() event of a hyperlink \n // would pass "this" as the "place" argument, causing the animation to emanate from \n // the link. But you may want it to emanate from the whole viewer or tiddler. \n // Calling this method uses getPlace() to find the enclosure and use that place. \n // NOTE: Tiddlers will be opened at the bottom!\n //\n openTiddler: function(node, title)\n {\n story.displayTiddler(this.getPlace(node), title, null, config.options.chkAnimate, false);\n },\n \n //\n // logOff()/_logOffOnComplete() - Specialized AJAX call\n //\n // Used by links which want to provide logging off the observatory. At present this \n // is Main Menu and System Status.\n //\n _logOffOnComplete: function(text, params) {\n displayMessage(text);\n },\n \n logOff: function() {\n DC3.Ajax.sendRequest("GET", "/ac/aunlockobs.asp", "", DC3.Lib._logOffOnComplete, null);\n },\n//}}}\n/***\n!!Remote sourcing\n***/\n//{{{\n //\n // Insert remote HTML generated by the remote URL into the \n // DOM node with the given nodeID. This is as low-level as it gets.\n //\n _onFillInnerHTMLComplete: function(text, node) // Private\n {\n node.innerHTML = text;\n },\n \n fillInnerHTML: function(url, nodeID)\n {\n DC3.Ajax.sendRequest('GET', url, "", this._onFillInnerHTMLComplete, document.getElementById(nodeID));\n },\n//}}}\n/***\n!!Remote File Support Functions\n***/\n//{{{\n //\n // postMkdir()/_postMkdirOnComplete() - Specialized AJAX call\n //\n // Used by the My Documents file manager tiddlers to post a create directory call from \n // an a-button onClick() javascript call. See (e.g.) tiddler [[Observing Plans]] for \n // usage of this.\n //\n _postMkdirOnComplete: function(text, params)\n {\n if(text.trim() != "ok")\n alert(text);\n else\n story.refreshTiddler(params.title, null, true); // Always refresh, avoid confusion\n },\n \n postMkdir: function(url, node)\n {\n var ans = prompt("Name the new folder:");\n if(!ans) return;\n var complParams = { \n title: story.findContainingTiddler(node).id.replace(story.idPrefix, "") // KLUDGE?\n };\n DC3.Ajax.sendRequest('POST', url, "dir=" + escape(ans), \n DC3.Lib._postMkdirOnComplete, complParams);\n },\n //\n // postChdir()/_postChdirOnComplete() - Specialized AJAX call\n //\n // Used in the Multiple Objects (plan) tiddler to change (sub) folders from \n // an onChange() event of the folder selector droplist.\n //\n _postChdirOnComplete: function(text, params)\n {\n if(text.trim() != "ok")\n alert(text);\n else\n story.refreshTiddler(params.title, null, true); // Always refresh, avoid confusion\n },\n \n postChdir: function(url, node)\n {\n var complParams = { \n title: story.findContainingTiddler(node).id.replace(story.idPrefix, "") // KLUDGE?\n };\n DC3.Ajax.sendRequest('POST', url, "chdir=" + escape(node.value), \n DC3.Lib._postChdirOnComplete, complParams);\n },\n//}}}\n/***\n!!Validation and Activation of Expando Rows in Forms\n***/\n//{{{\n //\n // expandoAddRow() - Reveal another row of image specs in the expando form\n //\n // Parameter 'pfx' is the prefix of the name/id attributes of the HTML elements\n // that make up the expando part of the form.\n //\n expandoAddRow: function(pfx)\n {\n for(var i = 2; i <= 16; i++)\n {\n var r = document.getElementById(pfx + "Row" + i);\n if(r && r.style.display == "none") {\n var u = document.getElementById(pfx + "Use" + i);\n if(u) u.checked = true;\n var e = { target: u };\n config.macros.PersistentForm.onChange(e);\n r.style.display = "";\n var ev = { target: u };\n this.expandoControlRowValidation(ev); // Initialize validation, see below!\n break;\n }\n }\n },\n \n //\n // This is called from onChange events of the data controls in an expando\n // row. The idea is to check the Use box and arm validation (as though the\n // user checked the box). This helps prevent entering specs and forgetting\n // to check the Use box.\n //\n expandoCheckUse: function(ev)\n {\n var pats = DC3.Lib.expandoFieldPats; // (need fully resolved name here, typ.)\n var n = ev.target.name; // Control name prefix-name-number\n var pfx, row, pat;\n for(var i = 0; i < pats.length; i++)\n {\n pat = pats[i];\n var j = n.search(pat)\n if(pfx = n.substr(0, j))\n {\n row = n.substr(j + pat.length); // This has to namele 1 or 2 digit row numbers\n break;\n }\n }\n if(!pfx) return; // Forget it\n if(ev.target.value !== "") // If data in this field (now)\n {\n var u = document.getElementById(pfx + "Use" + row); // The corresponding Use checkbox \n if(!u.checked)\n {\n u.checked = true; // Check it\n var ev2 = { target: u }; // Fake "click" event\n DC3.Lib.expandoControlRowValidation(ev2);\n }\n }\n //\n // Extreme sleaze! The PersistentFormPlugin uses the onChange event for \n // select type elements. So we'll chain to that. There are several places\n // where this expando code assumes that both validation and persistence is\n // being used for expando row forms.\n //\n if(ev.target.type == "select-one" || ev.target.type == "select-multiple")\n config.macros.PersistentForm.onChange(ev);\n },\n \n //\n // expandoInitializeForm() - Initialize expando rows of a form\n //\n // Initialize the expando rows. Make any of them which have their Use checkboxes set.\n // All active rows must be initialized for validation, and any active rows which\n // are hidden (due to original form construction) are made visible. The inactive rows\n // do not need the services of expandoControlRowValidation() below.\n //\n // Parameter 'pfx' is the prefix of the name/id attributes of the HTML elements\n // that make up the expando part of the form.\n //\n expandoInitializeForm: function(pfx)\n {\n for(var i = 1; i <= 16; i++)\n {\n var u = document.getElementById(pfx + "Use" + i);\n// u.onclick = this.expandoControlRowValidation;\n u.onchange = this.expandoControlRowValidation;\n if(u && u.checked)\n {\n var r = document.getElementById(pfx + "Row" + i);\n if(r && r.style.display == "none") {\n r.style.display = "";\n }\n var ev = { target: u };\n this.expandoControlRowValidation(ev);\n }\n //\n // Arm the "auto-check" events\n //\n var e = document.getElementById(pfx + "Count" + i);\n if(e) e.onchange = this.expandoCheckUse;\n var e = document.getElementById(pfx + "Exposure" + i);\n if(e) e.onchange = this.expandoCheckUse;\n var e = document.getElementById(pfx + "Filter" + i);\n if(e) e.onchange = this.expandoCheckUse;\n var e = document.getElementById(pfx + "Binning" + i);\n if(e) e.onchange = this.expandoCheckUse;\n var e = document.getElementById(pfx + "PA" + i);\n if(e) e.onchange = this.expandoCheckUse;\n }\n },\n \n //\n // expandoControlRowValidation() - Control validation of expando rows\n //\n // This deserves special mention. It's called when the Color Series form is first opened\n // (with a manufactured event object) as well as whenever one of the xxUsen checkboxes is\n // toggled (via the onclick event). Note that onclick is used by the PersistentForm macro\n // and we're hijacking that event for the management of validation in the image spec rows.\n // Thus we must call PersistentForm.onChange() ourselves (again with manufactured event\n // objects). \n //\n // The objective is to enable validation for the Count, Exposure, and PA fields of each image\n // or flat info row, depending on whether the Use checkbox is on or off. This is really crazy\n // and took me an entire day to get right. But it's worth it!!\n //\n // This is called via the onClick events of the Use checkboxes, and also by the initializer\n // function above (but only for active rows).\n // \n expandoControlRowValidation: function(ev)\n {\n config.macros.PersistentForm.onChange(ev); // Remember our state\n var _this = ev.target; // Called outside of real events (initializing form)\n var form = DC3.Lib.getPlace(_this).getElementsByTagName('form')[0]; \n var validator = form.bValidator; // Only if ValidateForm macro invoked\n if(validator) // Only if validation\n {\n var n = ev.target.name;\n var lu = n.search(/Use/);\n var row = n.substr(lu + 3); // 'xxxUse<n> -> 'n'\n var pfx = n.substr(0, lu); // Prefix of form containing expando rows\n var count = document.getElementById(pfx + 'Count' + row);\n var exposure = document.getElementById(pfx + 'Exposure' + row);\n var pa = document.getElementById(pfx + 'PA' + row);\n if(_this.checked) {\n // The different forms have different sets of fields\n count.setAttribute('validate', 'number, required');\n if(exposure) exposure.setAttribute('validate', 'number, required');\n if(pa) pa.setAttribute('validate', 'number, required');\n validator.reset(); // Required for validator to see the new fields\n } else {\n var ex;\n count.value = "";\n ex = { target: count };\n config.macros.PersistentForm.onChange(ex);\n if(exposure) {\n exposure.value = "";\n ex = { target: exposure };\n config.macros.PersistentForm.onChange(ex);\n }\n if(pa) {\n pa.value = "";\n ex = { target: pa };\n config.macros.PersistentForm.onChange(ex);\n }\n validator.reset(); // This clears any visible error indications, then\n count.removeAttribute('validate'); // The validate attributes are removed\n if(exposure) exposure.removeAttribute('validate'); // (the events are left wired but are harmless)\n if(pa) pa.removeAttribute('validate');\n }\n }\n },\n\n};\n//}}}\n
/***\n|''Name:''|~DC3.LightBox|\n|''Description:''|LightBox support library|\n|''Date:''|Aug 09, 2011|\n|''Author:''|Bob Denny ~DC-3 Dreams, SP|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''Version:''|1.1.0|\n|''~CoreVersion:''|2.1.3|\n|''Browser:''|Most modern browsers|\n|''Require:''|jQuery 1.6.2 or later, LightBoxCSS (see below), support HTML in MarkupPreBody (see below), access to icon images in subdir ''im'' (showAlert() only)|\n!Description\nThis plugin implements a lightbox widget for ~TiddlyWiki. Via Javascript, you can display any HTML div in the lightbox, or use "canned" divs for displaying HTML message in a box or an alert with icon. The lightbox is closed by either clicking the X-icon or anywhere outside the lightbox. Only one lightbox can be active at a time. See the usage section below.\n!!Usage\nThis plugin is a __library__, not a macro. Thus, it must be tagged {{{systemConfig}}}, but it does not support macro invocation. It is callable only from Javascript so the [[InlineJavascriptPlugin|http://www.tiddlytools.com/#InlineJavascriptPlugin]] is a virtual necessity!\n|!Usage|!Sample Javascript|\n|Display HTML message|{{{DC3.LightBox.showContent("Some <i>message</i>");}}}|\n|Display alert|{{{DC3.LightBox.showAlert("ok", "All is well");}}}|\n|Display any DIV in a lightbox|{{{DC3.LightBox.showBox("myLightBox");}}}|\n|Close current lightbox|{{{DC3.LightBox.hideBox()}}}|\n*The frame for the showContent() and showAlert() methods should expand to enclose text, but this happens only on IE and not FireFox. To be safe, just keep your messages short and use showBox() and your own HTML div for "big" messages etc.\n*The first parameter to showAlert() is the icon name. This is simply translated to {{{im/icon.png}}}. The standard icon image files (below) are used with icon strings of "error, "info", "ok", "question", and "warning". \n*The generalized showBox() method can be used to display images, media players, whatever you want! Just make up the HTML div, give it an id, then pass that ID to showBox().\n!!Advanced Usage - onClose\nAll three of the above methods support an optional parameter onClose, supplied as the last parameter in a call. It must evaluate to a function which is called (with no parameters) when the lightbox is about to close. If the onClose() function returns false, the lightbox will not be closed. For example \n{{{\nDC3.LightBox.showAlert("warning", "Something <em>bad</em> is about to happen", soundBuzzer);\n}}}\n!Installation\n#Paste this entire tiddler into a tiddler called DC3.LightBox and tag it {{{systemConfig}}}.\n#Paste the Required CSS (below) into a tiddler called LightBoxCSS and tag it {{{systemContent}}}.\n#Paste the content for MarkupPreBody (below) into MarkupPreBody.\n#Put the image files (below) into a subfolder ''im'' relative to the location of the TiddlyWiki. \n!!!Required CSS\nPaste into a tiddler called LightBoxCSS.\n{{{\n#lightBoxOverlay {\n position:absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 90; \n background-color: #000;\n -moz-opacity: 0.6;\n opacity: .60;\n filter: alpha(opacity=60);\n}\n#lightBoxOverlay[id]{ \n position: fixed;\n}\n\ndiv.lightBox {\n background: #2d2d2d;\n color: #fff;\n border: 2px solid #eee;\n}\n\nimg.lightBoxClose {\n position: absolute;\n top: -5px;\n right: -5px;\n margin: 0px;\n cursor: pointer;\n}\n\ndiv.lightBoxAlert {\n background: #2d2d2d;\n color: #fff;\n padding: 10px;\n border: 2px solid #eee;\n}\n\ndiv.lightBoxAlertIcon {\n position: absolute;\n top: 8px;\n left: 8px;\n width: 48px;\n height: 48px;\n}\n\ndiv.lightBoxAlertMessage {\n margin-left: 56px;\n margin-top: 14px;\n}\n}}}\n!!!Content for MarkupPreBody\n{{{\n<!-- LightBox translucent overlay -->\n<div id="lightBoxOverlay" onclick="DC3.LightBox.hideBox()" style="display:none"></div>\n<!-- General use simple LightBox -->\n<div class="lightBox" id="lightBox" style="display:none">\n <img class="lightBoxClose" src="im/close.gif" onclick="DC3.LightBox.hideBox()" alt="Close" title="Close this window" />\n <div id="lightBoxContent"></div>\n</div>\n<!-- General use Alert LightBox -->\n<div class="lightBoxAlert" id="lightBoxAlert" style="display:none">\n <img class="lightBoxClose" src="im/close.gif" onclick="DC3.LightBox.hideBox()" alt="Close" title="Close this window" />\n <div class="lightBoxAlertIcon"><img id="lightBoxAlertIcon" src="runtime" alt="runtime" title="runtime"></div>\n <div class="lightBoxAlertMessage" id="lightBoxAlertMessage">runtime</div>\n</div>\n<!-- End of LightBox -->\n}}}\n!!!Images (close box and alert icons)\nThese must be in a subfolder ''im'' below the ~TiddlyWiki. You can get the images by right clicking on the links and //save target/link//, or right clicking on the images and //save image//. @@Note: The images below will display ugly in IE6, but they will display nice (with transparency) in the lightbox alerts, owing to the use of the DXFilters for transparency in the code.@@\n|[[close.gif|im/close.gif]]|[img[im/close.gif]]|[[error.png|im/error.png]]|[img[im/error.png]]|\n|[[info.png|im/info.png]]|[img[im/info.png]]|[[ok.png|im/ok.png]]|[img[im/ok.png]]|\n|[[question.png|im/question.png]]|[img[im/question.png]]|[[warning.png|im/warning.png]]|[img[im/warning.png]]|\n!!Credits\nThis TiddlyWiki library and CSS is an amalgamation of the techniques and code described in the following: \n* [[Original LightBox|http://www.huddletogether.com/projects/lightbox/]] by Lokesh Dhakar\n* [[Lightweight LightBox|http://www.pjhyett.com/posts/190-the-lightbox-effect-without-lightbox]] that can show any DIV by PJ Hyett\n* [[Better Modal Windows with LightBox|http://blog.feedmarker.com/2006/02/12/how-to-make-better-modal-windows-with-lightbox/]] by Bruno\nBruno's CSS for the overlay is much better than the first two, it is independent of any PNG image(s) and does not have CSS quirk-hacks for IE, nor does it use IE's DXFilters for PNG transparency. Of course for IE6, the DXFilters are used in the Javascript!\n!!Revision History\n<<<\n''2006.12.02 [1.0.1]'' Initial creation\n''2006.12.03 [1.0.1]'' hideBox() no longer takes //id// just closes currently open box. Needed for overlay click/close.\n''2006.12.03 [1.0.1]'' Add support for special Alert type LightBox with switchable icon. Hack IE for alpha transparency. See inline comments. Add showContent(html), showAlert(icon, message)\n''2006.12.04 [1.0.1]'' Ignore show calls if box is already displayed. Optional callback for hideBox(), can prevent hiding. Allows modal box to be set up by caller.\n''2006.12.25 [1.0.1]'' Documentation and installation instructions\n''2007.01.11 [1.0.2]'' Add showing() function\n''2011.09.09 [1.1.0]'' Dynamically size the alert boxes (any with class 'lightBoxAlert'). @@Now requires jQuery.@@\n<<<\n!!Code\n***/\n//{{{\n\n// Initialize style sheet from tiddler\nrefreshStyles("LightBoxCSS");\n\nif (!window.DC3) window.DC3 = {};\nwindow.DC3.LightBox = \n{\n //\n //Internal proterties\n //\n _curBox: null, // [sentinel]\n _onClose: null, // [sentinel]\n _alertImgDiv: null, // [sentinel]\n _alertImgHTML: null, // [sentinel]\n \n //\n // Public interface\n //\n showing: function() { // True if box showing\n return (this._curBox !== null);\n },\n \n showContent: function(content, onClose) { // Uses generic LightBox in MarkupPreBody\n if(this._curBox) return; // Ignore if box already showing (typ.)\n document.getElementById("lightBoxContent").innerHTML = content;\n this.showBox("lightBox", onClose);\n },\n \n showAlert: function(icon, message, onClose) { // Uses standard alert LightBox in MarkupPreBody\n if(this._curBox) return;\n var icoElem = document.getElementById("lightBoxAlertIcon");\n icoElem.src = "im/" + icon + ".png"; // Requires icon.png (48 x 48)\n icoElem.title = icon;\n icoElem.alt = icon;\n document.getElementById("lightBoxAlertMessage").innerHTML = message;\n// var box = document.getElementById("lightBoxAlert");\n// var boxDims = this._getDimensions(box);\n// box.style.width = Math.min(240, boxDims.width) + 'px';\n// box.style.width = Math.min(boxDims.width, 480) + 'px';\n// box.style.height = Math.min(42, boxDims.height) + 'px';\n// //box.style.height = Math.max(box.style.height, 480) + 'px';\n DC3.LightBox.showBox("lightBoxAlert", onClose);\n },\n \n showBox: function(id, onClose) \n {\n if(this._curBox) return;\n this._onClose = onClose; // If valid, call this in hideBox. See comments there!\n //\n // Surprise! In IE, the height:100% in the #overlay CSS definition does\n // not honor the z-order, and calculates the height to be the top margin!\n // So, for IE, I have added this imperfect hack which ,forces the overlay\n // size to the scroll size. This causes funny scrollbar behavior, but the\n // alternatives I tried were really complex. \n //\n // Surprise #2! IE6 doesn't support alpha transparency in PNG images, and \n // I use same for the icons in the LightBox Alert. Another hack needed.\n // We can't just change the DIV from containing an IMG tag to using the\n // bloody MS AlphaImageLoader, we also have to save the original IMG tag\n // because the alert is multi-use: the image to be shown can be changed \n // dynamically. When closing the Lightbox, we restore the original inner\n // IMG tag and clear the filter style. On showing the box, we grab the path\n // to the image file then zap the IMG tag, using the image file path in\n // the filter/AlphaImageLoader. Egad!!!\n //\n var ovly = document.getElementById('lightBoxOverlay');\n if(config.browser.isIE) {\n var h1 = document.documentElement.scrollHeight;\n var h2 = document.documentElement.offsetHeight;\n ovly.style.height = Math.max(h1, h2);\n ovly.style.width = document.documentElement.scrollWidth;\n // Change icon div for IE proprietary\n var alertDivs = document.getElementById(id).getElementsByTagName("div");\n this._alertImgDiv = null;\n for(var i in alertDivs) {\n if(alertDivs[i].className && alertDivs[i].className == "lightBoxAlertIcon") {\n this._alertImgDiv = alertDivs[i];\n break;\n }\n }\n if(this._alertImgDiv) {\n var imgFile = this._alertImgDiv.firstChild.src;\n this._alertImgHTML = this._alertImgDiv.innerHTML; // Saved to allow dynamic change of image file\n this._alertImgDiv.innerHTML = "";\n this._alertImgDiv.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\s"" + imgFile + "\s", sizingMethod=\s"scale\s")";\n }\n }\n ovly.style.display = 'block';\n this._center(id);\n this._curBox = id;\n return false;\n },\n \n hideBox: function()\n {\n if(!this._curBox) return;\n if(this._onClose && this._onClose() === false) // If onClose() returns false, refuse to close\n return false;\n document.getElementById(this._curBox).style.display = 'none';\n document.getElementById('lightBoxOverlay').style.display = 'none';\n this._curBox = null; // Allow show calls once again\n // Restore original non-IE image. Code may dynamically change image file!\n if(this._alertImgDiv) {\n this._alertImgDiv.innerHTML = this._alertImgHTML;\n this._alertImgDiv.style.filter = "";\n }\n return false;\n },\n \n //\n // Internal methods\n //\n _getDimensions: function(elem) // Lifted from Prototype and made independent\n {\n if(elem.style.display != 'none')\n return { width: elem.offsetWidth, height: elem.offsetHeight};\n \n // All *Width and *Height properties give 0 on elements with display none,\n // so enable the elem temporarily\n var els = elem.style;\n var origVis = els.visibility;\n var origPos = els.position;\n els.visibility = 'hidden';\n els.position = 'absolute';\n els.display = '';\n var origW = elem.clientWidth;\n var origH = elem.clientHeight;\n els.display = 'none';\n els.position = origPos;\n els.visibility = origVis;\n return {width: origW, height: origH};\n },\n \n //\n // This is rather big. I'll have to look at more elegant way(s)\n // of doing this... some day! :-)\n //\n _center: function(id)\n {\n var elem;\n \n try{\n elem = document.getElementById(id);\n }catch(e){\n return;\n }\n \n var my_width = 0;\n var my_height = 0;\n \n if ( typeof( window.innerWidth ) == 'number' ){\n my_width = window.innerWidth;\n my_height = window.innerHeight;\n } else if ( document.documentElement && \n ( document.documentElement.clientWidth ||\n document.documentElement.clientHeight ) ){\n my_width = document.documentElement.clientWidth;\n my_height = document.documentElement.clientHeight;\n }\n else if ( document.body &&\n ( document.body.clientWidth || document.body.clientHeight ) ){\n my_width = document.body.clientWidth;\n my_height = document.body.clientHeight;\n }\n \n elem.style.position = 'absolute';\n elem.style.zIndex = 99;\n \n var scrollY = 0;\n \n if ( document.documentElement && document.documentElement.scrollTop ){\n scrollY = document.documentElement.scrollTop;\n }else if ( document.body && document.body.scrollTop ){\n scrollY = document.body.scrollTop;\n }else if ( window.pageYOffset ){\n scrollY = window.pageYOffset;\n }else if ( window.scrollY ){\n scrollY = window.scrollY;\n }\n \n var elementDimensions = this._getDimensions(elem); // Measure box with message\n \n if(elem.className == "lightBoxAlert") { // Constrain width\n elem.style.width = ""; // Free box to be natural dimensions\n elem.style.height = "";\n var hPad, vPad;\n try { // In case jQuery not available\n var je = $(elem); // Use almighty jQuery to get these dims\n hPad = je.innerWidth() - je.width();\n vPad = je.innerHeight() - je.height();\n } catch(ex) {\n hPad = vPad = 10; // MUST BE SAME IN STYLE SHEET\n }\n var w = Math.max(240, elementDimensions.width - hPad);\n w = Math.min(480, w);\n elem.style.width = w + 'px';\n elementDimensions = this._getDimensions(elem); // Re-measure resized box\n elem.style.height = Math.max(42, elementDimensions.height - vPad) + 'px'; // Assumre minimum height\n elementDimensions = this._getDimensions(elem); // Re-measure resized box\n }\n \n var setX = ( my_width - elementDimensions.width ) / 2;\n var setY = ( my_height - elementDimensions.height ) / 2 + scrollY;\n \n setX = ( setX < 0 ) ? 0 : setX;\n setY = ( setY < 0 ) ? 0 : setY;\n \n elem.style.left = setX + "px";\n elem.style.top = setY + "px";\n \n elem.style.display = 'block';\n }\n};\n//}}}\n
/***\n|''Name:''|DC3.~TheSky|\n|''Description:''|Support for embedded browser in iOS version of Software Bisque's ~TheSky|\n|''Date:''|January 13, 2014|\n|''Source:''|private|\n|''Author:''|Bob Denny ~DC-3 Dreams, SP|\n|''License:''|Copyright (C) 2014, Robert B. Denny, Mesa, AZ|\n|''Version:''|1.1.0|\n|''~CoreVersion:''|2.1.3|\n|''Require:''|?????|\n!!Description\nLibrary of functions that support ~TheSky for iOS allowing the Field of View Indicator (FOVI) or a touched target to be used as the source of data to populate the target name, RA, Dec, and PA in the ACP web UI forms from the FOVI.\n!!Usage\nTO BE WRITTEN!\n!!Revision History\n<<<\n''2014.01.13 [1.0.0]'' Initial creation\n''2014.01.30 [1.1.0]'' Format RA and Dec into sexagesimal, dynamic link switching, popup alert.\n<<<\n!!Code\n***/\n//{{{\nif (!window.DC3) window.DC3 = {};\nDC3.TheSky = \n{\n _findForm: function(place)\n {\n var forms = place.getElementsByTagName("form");\n if(forms.length === 0) throw("No form in tiddler");\n return forms[0]; // Return first form\n },\n \n _findFormField: function(place, name) // Private\n {\n var form = this._findForm(place);\n var fields = form.getElementsByTagName("input"); // Search <input> fields first\n for(var i = 0; i < fields.length; i++) {\n if(fields[i].name.toLowerCase() == name.toLowerCase()) {\n switch(fields[i].type) {\n case "text":\n case "checkbox":\n case "hidden":\n return fields[i]; // Return found field\n break; // (for lint)\n case "radio": // Return only checked rb field\n if(fields[i].checked) return fields[i];\n break;\n default: // Silence JSLint\n break;\n }\n }\n }\n fields = form.getElementsByTagName("select"); // Nope, look for <select>\n if(fields.length === 0) throw("No fields in form");\n for(i = 0; i < fields.length; i++) {\n if(fields[i].name.toLowerCase() == name.toLowerCase())\n return fields[i];\n }\n throw("field " + name + " not found");\n },\n \n //\n // Convert to sexagesimal with ':' and prec decimals on seconds\n //\n _toSexa: function (num, prec) {\n var neg = (num < 0);\n num = Math.abs(num);\n var hours = Math.floor(num);\n var minutes = Math.floor((num - hours) * 60);\n var seconds = ((num - hours - (minutes / 60)) * 3600).toFixed(prec);\n \n if (hours < 10) { hours = "0" + hours; }\n if (neg) { hours = "-" + hours; }\n if (minutes < 10) { minutes = "0" + minutes; }\n if (seconds < 10) { seconds = "0" + seconds; }\n return hours + ':' + minutes + ':' + seconds;\n },\n \n //\n // Switch the "get" link in a form from Catalog Search to TheSky.\n // Safely do this by checking if form is visible. The form itself\n // has a call for when it opens. THe form if the link IDs is the \n // same for all of the forms.\n //\n switchLink: function (pfx) {\n var elc = document.getElementById(pfx + "_getCoords");\n var els = document.getElementById(pfx + "_getTheSky");\n var eld = document.getElementById(pfx + "_catSearch");\n if (elc && els) {\n elc.style.display = "none"; // Hide "Catalog lookup"\n els.style.display = ""; // Show "Get from TheSky"\n eld.style.display = "none"; // Hide "Deep Sky Catalog"\n }\n },\n\n theSkyTarget: "", // [sentinel] (typ.)\n theSkyRightAscension: "",\n theSkyDeclination: "",\n theSkyPositionAngle: "",\n \n //\n // Called by TheSky via the UIWebView:stringByEvaluatingJavaScriptFromString as\n // stringByEvaluatingJavaScriptFromString("DC3.TheSky.setTargetInfo(name, ra, dec, pa)"). \n // This sets the above variables which will populate the ACP UI forms when requested.\n //\n // DC3.TheSky.setTargetInfo(name, ra, dec, pa);\n //\n setTargetInfo: function(name, ra, dec, pa)\n {\n this.theSkyTarget = name;\n this.theSkyRightAscension = this._toSexa(Number(ra), 2);\n this.theSkyDeclination = this._toSexa(Number(dec), 1);\n this.theSkyPositionAngle = (Number(pa).toFixed(1)).toString();\n //\n // Switch the links in the already open form tiddlers \n // to the "Get from TheSky" links. Safe for closed tiddlers.\n //\n this.switchLink("simg");\n this.switchLink("clr");\n this.switchLink("sast");\n this.switchLink("sphot");\n //\n DC3.LightBox.showAlert("info", "Selected coordinates for <span class=\s"marked\s">" + \n name + "</span> are available from TheSky.");\n },\n \n //\n // The forms use this to tell if they should display the Deep Sky Catalog\n // lookup link or the Get Coordinates from in the various acquisition forma.\n //\n theSkyInfoAvailable: function() \n {\n return this.theSkyTarget !== "";\n },\n \n //\n // This call will fill in the coordinate into and also set the \n // persistemt form cookies so other forms will show the coordinates.\n // Called from the "Get from TheSKy" links in the input forms.\n //\n fillFormInfo: function(place)\n {\n if(this.theSkyTarget === "") return; // No-op if no data (UI should prevent this)\n var e = { target: null }; // Phoney event for validation\n var tgtField = this._findFormField(place, "Target");\n tgtField.value = this.theSkyTarget;\n if(tgtField.onkeyup) { // Trigger any <PersistentForm> (typ.)\n e.target = tgtField;\n config.macros.PersistentForm.onChange(e); // KLUDGE! (typ.)\n }\n var raField = this._findFormField(place, "RA");\n raField.value = this.theSkyRightAscension;\n if(raField.onkeyup) { // Trigger any <PersistentForm> (typ.)\n e.target = raField;\n config.macros.PersistentForm.onChange(e); // KLUDGE! (typ.)\n }\n var decField = this._findFormField(place, "Dec");\n decField.value = this.theSkyDeclination;\n if(decField.onkeyup) { // Trigger any <PersistentForm> (typ.)\n e.target = decField;\n config.macros.PersistentForm.onChange(e); // KLUDGE! (typ.)\n }\n var paField = this._findFormField(place, "PA");\n paField.value = this.theSkyPositionAngle;\n if(paField.onkeyup) { // Trigger any <PersistentForm> (typ.)\n e.target = paField;\n config.macros.PersistentForm.onChange(e); // KLUDGE! (typ.)\n }\n }\n};\n//}}}\n
It's <<today>>\n\n<<RemoteContent '/ac/dawndusk.asp'>>
<<slider "" "Deep Sky Catalog Search Help" Help "Helpful information">>\n<html><form>\n<table class="noBorder" style="border:0;margin-left:0;">\n <tr valign="top">\n <td height="100%">Search pattern:</td>\n <td><input type="text" name="pattern" id="pattern" size="10" /></td>\n <td rowspan="3"><select name="resList" id="resList" size="10" style="width:12em" /></td>\n </tr>\n <tr valign="top">\n <td height="100%"> </td>\n <td><input type="radio" name="matType" id="matType" value="startsWith" checked>Starts with</input><br><input type="radio" name="matType" id="matType" value="contains">Contains</input><br><input type="radio" name="matType" id="matType" value="regExp">Regular Exp.</input></td>\n </tr>\n <tr valign="bottom">\n <td align="center"><a class="button" href="javascript:;" onClick="DC3.CatSearch.search(DC3.Lib.getPlace(this))" title="Search the catalogs">Search</a></td>\n <td><input name="visOnly" type="checkbox" id="visOnly" value="true" style="margin:0;" checked> Visible only</td>\n </tr>\n</table>\n</form></html><script>\nvar tgtName;\nvar origPlace = place;\nfunction setTargetInfo(title, place) {\n var pfx = "";\n switch(title) {\n case "Acquire a Single Image":\n pfx = "simg_i";\n break;\n case "Single Object Color Series":\n pfx = "clr_i";\n break;\n case "Schedule Astro-Imaging":\n pfx = "SAstI";\n break;\n case "Schedule Image Series":\n pfx = "SPhotI";\n break;\n default:\n return;\n }\n //\n // One of the submission forms\n //\n var tgtField = DC3.CatSearch._findFormField(place, "Target");\n place = DC3.Lib.getPlace(tgtField); // assure in .viewer for wikify()!!!\n tgtField.value = tgtName;\n var e = { target: tgtField };\n config.macros.PersistentForm.onChange(e);\n // The callback function runs the responsive code for deep sky vs orbital on the submission form\n DC3.CatSearch.lookup(place, (function(msg) { $('#' + pfx + 'sOrb').trigger(jQuery.Event('change')); }));\n\n\n}\nfunction listSel(e) {\n if(!e) e = window.event;\n var tgt = resolveTarget(e);\n tgtName = tgt.value;\n if(tgtName !== "") {\n wikify("\sn----\snOK! Target name and coordinates remembered and sent to open forms.", origPlace);\n // MAGIC!\n story.forEachTiddler(setTargetInfo);\n }\n}\ndocument.getElementById("resList").onclick = listSel;</script>\n
To search, enter part of the object name into the field below. A list of catalog entries whose names contain your text will be returned. @@Clicking on a name in the list will send the name and coordinates to any open image acquisition forms.@@\n\nOur facility has a file of J2000 coordinates for over 70,000 designations of deep sky objects. The catalog is a combination of the [[Saguaro Astronomy Club (SAC) V7.9 catalog|http://www.saguaroastro.org/content/downloads.htm]] and the [[Third Reference Catalog of Bright Galaxies (RC3)|http://cdsweb.u-strasbg.fr/cgi-bin/Cat?VII/155]]. If the same object exists in both, coordinates from RC3 are used.\n\nAlmost all objects are listed by the catalog abbreviation, @@followed by a space@@, followed by the number in that catalog. Examples:\n{{{\n M 51 MCG -03-01-01 Bochum 15\n NGC 2100 vdB 150 Ced 122\n PGC 63008 PK 26-11.1 LBN 623\n UGC 11670 Abell 347 ESO 350-23\n}}}\n
[[Authoring System]]
<<RemoteContent '/files/aindex.asp' Refresh 'Refresh the file list'>>
Turn this off to disable the animations when opening items and slider panels. The task bars on the left will always animate.
Runs the observatory's bright star locator. When it completes, a suitable "bright" star within a 5 degree distance of the starting telescope position will be in the center of the telescope's field of view. This is an engineering test procedure, unless you are the observatory owner working through teething pains you should expect that this will work.
Most useful when you change you optical train. This task will measure the exact focal length of your optics. <% if(User.IsAdministrator) { %>If this is significantly different than the focal length in ACP's telescope preferences, be sure to update the ACP value.<% } else { %>This value is always put into your images' FITS headers, so you can see it there without making this measurement.<% } %>
Measures the limiting magnitude of the observatory and current skies. @@This is not an exact measurement@@, it is intended to be a rough guide to the capabilities of the observatory //and the current skies.// If you need a science-grade limiting magnitude measurement, take your own images and use a science-grade tool to reduce the data.
<div class='header' macro='gradient vert #390108 #900'>\n<div class='headerShadow'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div class='headerForeground'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n</div>\n<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>\n<div id='sidebar'>\n<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n</div>
/***\nAuthor: //unknown// - originally retrieved from Clint Checketts (http://www.checkettsweb.com) \n!!Revision History\n<<<\n''2006.09.17 [rbd]'' Get rid of ghost blue borders on <input> and <textarea> elements within both the editor and the viewer content. Mute the background of <input> and <textarea> to reduce the glare of them against the dark background. Change highlighting color to match the style. Fix table cell borders so they show. Fix buttons so they don't display dotted underline hyperlink when clicked or hovered, brighten the normal text within buttons, perceptually it was too dark! Reformat rules to multi-line with tabs.\n''2006.09.18 [rbd]'' Add overrides for ~XP-style navbar used on Share Your Sky! main page.\n''2006.09.19 [rbd]'' More work on styles, improved bar graphics, tweaks for boxing, non-hyperlinked fonts. Looking good now.\n''2006.09.20 [rbd]'' Add background and border to tiddlers, adjust padding and bottom margin for same. Remove rbd marks and dead styles. Reduce header and sidebar borders to 1px. Added Clint Checketts' IE CSS hack to permit the .tiddler CSS to work correctly. How'd he EVER figure that out?\n''2006.09.30 [rbd]'' Fix "dotted-line removal" change above so buttons in viewer don't change size when highlighted. This made flickering buttons! Improve table colors in general, fix appearance of sortable table headers, add custom fileList class for the file list tables used in ~SyS.\n''2006.10.08 [rbd]'' Much more work over last 10 days, add styles for System Monitor.\n''2006.10.23 [rbd]'' Remove height from <input> and <select>, was scrunching buttons. Style <input> and <select> colors to match the rest. OOPS, looks like hell on IE.\n''2006.10.27 [rbd]'' Fix colors of SelectThemePlugin button and popup highlight. See inline comments for location.\n''2006.10.31 [rbd]'' Reorganize.\n''2006.11.07 [rbd]'' Faint border for sysmon thumbnail\n''2006.11.21 [rbd]'' Add .collapsedTitle for folded tiddlers\n''2009 01 09 [rbd]'' Firefox 3 compatibility. ~HeaderForeground needed width 100%\n''2010.11.17 [rbd]'' ~ACP-490 Add border style for #sm_guideBox\n''2010.11.21 [rbd]'' ~ACP-502 Explicitly color file <input> black on white so you can see the "No file chosen" or the selected file on ~WebKit browsers.\n''2011.09.29 [rbd]'' Dim tiddler and table text to #ddd, the bright white was annoying\n''2015.05.19 [rbd]'' ~ACP-1303 Alignment of text in MainMenu top bar\n<<<\n!Colors Used\n*@@bgcolor(#ff7f00):color(#000): #ff7f00@@\n*@@bgcolor(#ffbf00):color(#000): #ffbf00@@\n*@@bgcolor(#fff):color(#000): #fff@@\n*@@bgcolor(#4c4c4c):color(#fff): #4c4c4c@@\n*@@bgcolor(#5f5f5f):color(#fff): #5f5f5f@@\n*@@bgcolor(#333):color(#fff): #333@@\n*@@bgcolor(#666):color(#fff): #666@@\n*@@bgcolor(#000030):color(#fff): #000030@@\n*@@bgcolor(#000080):color(#fff): #000080@@\n*@@bgcolor(#000):color(#fff): #000@@\n*@@bgcolor(#000040):color(#fff): #000040@@\n*@@bgcolor(#888):color(#fff): #888@@\n*@@bgcolor(#ddd):color(#000): #ddd@@\n*@@bgcolor(#ffe72f):color(#000): #ffe72f@@\n*@@bgcolor(#300000):color(#fff): #300000@@\n*@@bgcolor(#600000):color(#fff): #600000@@\n*@@bgcolor(#ffffcc):color(#000): #ffffcc@@\n*@@bgcolor(#fffacd):color(#000): #fffacd@@\n\n!Generic Layout Rules \n***/\n/*{{{*/\nbody {\n background: #000;\n position: static; /*Clint's IE fix part 1 (part 2 in TW now) */\n}\ntextarea {\n font-family: courier !important; /* Fixed point font for editing */\n}\n.title {\n color: #fffacd;\n border-bottom: 1px dashed #333;\n}\n.subtitle {\n color: #666;\n}\n.collapsedTitle {\n color: #888;\n font-size: 1.3em;\n font-weight: bold;\n}\nh1, h2, h3, h4, h5 {\n color: #fffacd;\n background-color: #000040;\n border-top: 1px solid #333;\n border-bottom: 1px solid #333;\n}\n/*}}}*/\n/***\n!Link styles\n***/\n/*{{{*/\na, a.button, #mainMenu a.button, #sidebarOptions .sliderPanel a {\n color: #ffbf00;\n border: 0;\n}\na:hover, a.button:hover, #mainMenu a.button:hover, #sidebarOptions .sliderPanel a:hover #sidebarOptions .sliderPanel a:active {\n color: #ff7f00;\n border: 0;\n border-bottom: #ff7f00 1px dashed;\n background: transparent;\n text-decoration: none;\n}\n#sidebarOptions a {\n margin: 0;\n color: #ffbf00;\n border: 0;\n}\n#sidebarOptions a:active {\n color: #ffbf00;\n background-color: transparent;\n}\n#sidebarOptions a:hover {\n color: #4c4c4c;\n background-color: #ffbf00;\n}\n#sidebarTabs .tabContents a, #popup a {\n color: #ffbf00;\n}\n#messageArea a:link, #messageArea a:visited {\n color: #ffbf00;\n text-decoration: none;\n}\n#messageArea a:hover, #messageArea a:active {\n color: #ff7f00;\n}\n#messageArea .messageToolbar a {\n border: 1px solid #ffbf00;\n background: #4c4c4c;\n}\n.headerForeground a {\n color: #fff;\n}\n.toolbar a.button {\n border: 0;\n}\n.editorFooter a {\n border: 0;\n}\n/*}}}*/\n/***\n!Header styles\n***/\n/*{{{*/\n.header {\n border-bottom: 1px solid #ffbf00;\n color: #fff;\n}\n.header a:hover {\n border-bottom: 1px dashed #fff;\n}\n.headerForeground {\n width: 100%; /* Firefox 3 suddenly needed this but not on HeaderShadow */\n padding: 2.5em 0em 1em 1em;\n}\n.headerShadow {\n padding: 2.5em 0em 1em 1em;\n}\n/*}}}*/\n/***\n!Main menu styles\n***/\n/*{{{*/\n#mainMenu {\n color: #fff;\n}\n#mainMenu h1 {\n font-size: 1.1em;\n}\n#mainMenu li, #mainMenu ul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n/*}}}*/\n/***\n!Sidebar styles \n***/\n/*{{{*/\n#sidebar {\n right: 0;\n color: #fff;\n border: 1px solid #ffbf00;\n border-width: 0 0 1px 1px;\n}\n#sidebarOptions {\n background-color: #4c4c4c;\n padding: 0;\n}\n#sidebarOptions .sliderPanel {\n background-color: #333;\n margin: 0;\n}\n#sidebarOptions input {\n border: 1px solid #ffbf00;\n background-color: #ffffcc;\n}\n#sidebarTabs .tabUnselected:hover, #sidebarTabs .tabContents {\n background-color: #666;\n}\n#sidebarOptions .highlight {\n color: #4c4c4c;\n background-color: #ffbf00;\n}\n.listTitle {\n color: #fff;\n}\n/* Special for SelectThemePlugin when \n leaving popup open and mousing away*/\n#sidebarTabs {\n background-color: #4c4c4c;\n}\n#sidebarTabs .tabSelected {\n padding: 3px 3px;\n cursor: default;\n color: #ffbf00;\n background-color: #666;\n}\n#sidebarTabs .tabUnselected {\n color: #ffbf00;\n background-color: #5f5f5f;\n padding: 0 4px;\n}\n#sidebarTabs .tabContents a:hover {\n color: #ff7f00;\n background: transparent;\n}\n#sidebarTabs .txtMoreTab .tabUnselected {\n color: #ffbf00;\n background: #5f5f5f;\n}\n#sidebarTabs .txtMoreTab .tabSelected, #sidebarTabs .txtMoreTab .tab:hover, #sidebarTabs .txtMoreTab .tabContents {\n color: #ffbf00;\n background: #4c4c4c;\n}\n/*}}}*/\n/***\n!General tab styles\n***/\n/*{{{*/\n\n.tab.tabUnselected {\n background-color: #666;\n}\n.tab.tabSelected, .tab.tabSelected:hover {\n color: #ffbf00;\n border: 0;\n background-color: #4c4c4c;\n cursor: default;\n}\n.tab.tabUnselected:hover {\n color: #ffbf00;\n border: 0;\n background-color: #4c4c4c;\n}\n.tabContents {\n background-color: #4c4c4c;\n border: 0;\n}\n.tabContents .tabUnselected {\n background: #5f5f5f;\n}\n.tabContents .tab:hover, .tabContents .tabContents, .tabContents .tabSelected {\n background: #666;\n}\n/*}}}*/\n/***\n!Message area styles\n***/\n/*{{{*/\n#messageArea {\n background-color: #666;\n color: #fff;\n border: 2px solid #ffbf00;\n}\n/*}}}*/\n/***\n!Popup styles \n***/\n/*{{{*/\n#popup {\n color: #fff;\n background-color: #4c4c4c;\n border: 1px solid #ffbf00;\n}\n#popup a:hover {\n background: transparent;\n color: #ff7f00;\n border: 0;\n}\n#popup hr {\n color: #ffbf00;\n background: #ffbf00;\n}\n/* Special for SelectTheme popmenu */\n#popup .currentlySelected {\n color: #4c4c4c;\n background: #ffbf00;\n}\n/*}}}*/\n/***\n!Tiddler Display styles\n***/\n/*{{{*/\n/** LOSER ON IE6 without Clint's IE fix (see body section at top!) **/\n.tiddler {\n background: #000030;\n border: 1px solid #000080;\n padding-bottom: 8px;\n margin-left: 8px; /* Vastly different on IE vs FireFox! */\n margin-bottom: 12px;\n}\n#displayArea .button.highlight {\n color: #ffbf00;\n background: #4c4c4c;\n}\n.tiddler .button {\n color: #888;\n}\n.tiddler .button:hover, .tiddler .button:active {\n color: #ffbf00;\n background-color: #4c4c4c;\n border-bottom: 1px solid #4c4c4c; /* No dotted line in buttons */\n}\n.viewer {\n color: #ddd;\n}\n.viewer table {\n background: transparent;\n color: #ddd;\n border: 1px solid;\n}\n.viewer th {\n background-color: #4c4c4c;\n color: #fff;\n}\n.viewer hr {\n color: #666;\n}\n.viewer input, .viewer select {\n font-family: "Lucida Console", "Courier New", Courier, monospace;\n font-size: 1.0em;\n}\n.viewer input.upload {\n font-family: "Lucida Console", "Courier New", Courier, monospace;\n font-size: 1.0em;\n /* For WebKit's label style feedback */\n color:#000;\n background:#fff;\n}\n.viewer .sortheader {\n font-weight: normal;\n}\n.viewer pre, .viewer code {\n color: #ddd;\n background-color: #4c4c4c;\n border: 1px solid #ffbf00;\n}\n.viewer .button:hover, .viewer .button:active {\n border: 1px solid #4c4c4c; /* Needed to avoid button size changing */\n}\n.viewer .fileList table {\n border-color: #ff7f00;\n margin-bottom: 0px;\n}\n/* For Share your Sky only */\n.viewer .fileList tr {\n border: none;\n}\n.viewer .fileList td, .viewer .fileList th {\n border: 0;\n padding: 2px 8px 2px 8px;\n}\n.viewer .noBorder table, .viewer .noBorder th, .viewer .noBorder tr, .viewer .noBorder td, .viewer iframe {\n border: 0;\n}\n.viewer .noBorder #sm_thumb { /* For sysmon thumbnail */\n border: 1px solid #000080;\n padding: 0px;\n}\n.viewer .noBorder #sm_guideBox { /* For sysmon guider trackbox image */\n border: 1px solid #000080;\n padding: 0px;\n}\n/* End Share Your Sky */\n\n.toolbar {\n color: #4c4c4c;\n}\n.footer {\n color: #ddd;\n}\n.selectedTiddler .footer {\n color: #888;\n}\n.editor textarea, .editor input {\n border: 1px solid #ffbf00;\n background-color: #ffffcc;\n}\n.editorFooter {\n color: #aaa;\n}\n.tab {\n -moz-border-radius-topleft: 3px;\n -moz-border-radius-topright: 3px;\n}\n.tagging, .tagged {\n background: #4c4c4c;\n border: 1px solid #4c4c4c;\n}\n.selected .tagging, .selected .tagged {\n background: #000;\n border: 1px solid #ffbf00;\n}\n.tagging .button, .tagged .button {\n color: #ffbf00;\n border: 0;\n padding: 0;\n}\n.tagging .button:hover, .tagged .button:hover {\n background: transparent;\n}\n.tagging .listTitle, .tagged .listTitle, {\n color: #fff;\n}\n.tagClear {\n margin-top: 1em; /* clear: both; Clint's IE fix part 2 now in TW 2.1.2 */\n}\n.highlight, .marked {\n background-color: #000080;\n color: #ffffff;\n}\n.cascade {\n background: #4c4c4c;\n color: #ddd;\n border: 1px solid #ffbf00;\n}\n/*}}}*/\n/***\n!XP ~NavBar Style Overrides\n***/\n/*{{{*/\n.topItem {\n display: table-cell;\n vertical-align: middle;\n background: url("im/fire-classic-up.png") no-repeat 0 0;\n color: #ffbf00;\n}\n.topItemOver {\n display: table-cell;\n vertical-align: middle;\n background: url("im/fire-classic-up-on.png") no-repeat 0 0;\n color: #ffffff;\n}\n.topItemClose {\n display: table-cell;\n vertical-align: middle;\n background: url("im/fire-classic-down.png") no-repeat 0 0;\n color: #ffbf00;\n}\n.topItemCloseOver {\n display: table-cell;\n vertical-align: middle;\n background: url("im/fire-classic-down-on.png") no-repeat 0 0;\n color: #ffffff;\n}\n.subItem, .subSubItem, .subItemOver, .subSubItemOver {\n color: #ffffff;\n}\n.dropMenu {\n background-color: #4c4c4c;\n color: #000;\n border: 1px solid;\n border-color: #4c4c4c #ff7f00 #ff7f00 #ff7f00;\n}\n/*}}}*/\n/***\n!System Status Display Styles\n***/\n/*{{{*/\ndiv.progBarBg {\n position: relative;\n height: 0.75em;\n background-color: #300000;\n}\ndiv.progBarFg {\n position: absolute;\n overflow: hidden;\n height: 0.75em;\n width: 0px;\n background-color: #ff7f00;\n}\ntd.telemetry {\n font-family: "Lucida Console", "Courier New", Courier, monospace;\n font-size: 1em;\n background-color: #300000;\n white-space: pre;\n color: #600000;\n}\nspan.telemActive {\n color: #ccccff;\n}\nspan.telemWarn {\n color: #ff0000;\n}\nspan.telemOff {\n color: #600000; /* Match color in td.telemetry */\n}\ntd.telemlabel {\n white-space: nowrap;\n}\ntextarea.scriptlog {\n border: 1px solid #ffbf00;\n margin: 0;\n padding: 0.5em;\n background: #300000;\n color: #ffffff;\n font-family: "Lucida Console", "Courier New", Courier, monospace !important;\n font-size: 1em !important;\n white-space: pre;\n line-height: 110%;\n}\ntd.trackGraph {\n background-color: #300000;\n}\n\n/*}}}*/\n
Measures the focus offsets from a //reference filter// that you specify. This will tell you how close to par-focal the observatory filters are. If you need to, look at the [[Instruments & Equipment]] item to see the names of the filters. \n\nYou may optionally have the new focus offset info made available to the observatory for observations. Please consider carefully whether the sky conditions warrant updating the permanent focus offsets for the observatory. Your decision affects the results others will get henceforth!
/***\n|Name|FontSizePlugin|\n|Created by|SaqImtiaz|\n|Location|http://lewcid.googlepages.com/lewcid.html#FontSizePlugin|\n|Version|1.0|\n|Requires|~TW2.x|\n!Description:\nResize tiddler text on the fly. The text size is remembered between sessions by use of a cookie.\nYou can customize the maximum and minimum allowed sizes.\n(only affects tiddler content text, not any other text)\n\nAlso, you can load a TW file with a font-size specified in the url.\nEg: http://lewcid.googlepages.com/lewcid.html#font:110\n\n!Demo:\nTry using the font-size buttons in the sidebar, or in the MainMenu above.\n\n!Installation:\nCopy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.\nThen put {{{<<fontSize "font-size:">>}}} in your SideBarOptions tiddler, or anywhere else that you might like.\n\n!Usage\n{{{<<fontSize>>}}} results in <<fontSize>>\n{{{<<fontSize font-size: >>}}} results in <<fontSize font-size:>>\n\n!Customizing:\nThe buttons and prefix text are wrapped in a span with class fontResizer, for easy css styling.\nTo change the default font-size, and the maximum and minimum font-size allowed, edit the config.fontSize.settings section of the code below.\n\n!Notes:\nThis plugin assumes that the initial font-size is 100% and then increases or decreases the size by 10%. This stepsize of 10% can also be customized.\n\n!History:\n*27-07-06, version 1.0 : prevented double clicks from triggering editing of containing tiddler.\n*25-07-06, version 0.9\n\n!Code\n***/\n\n//{{{\nconfig.fontSize={};\n\n//configuration settings\nconfig.fontSize.settings =\n{\n defaultSize : 100, // all sizes in %\n maxSize : 200,\n minSize : 40,\n stepSize : 10\n};\n\n//startup code\nvar fontSettings = config.fontSize.settings;\n\nif (!config.options.txtFontSize)\n {config.options.txtFontSize = fontSettings.defaultSize;\n saveOptionCookie("txtFontSize");}\nsetStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\sn","fontResizerStyles");\nsetStylesheet("#contentWrapper .fontResizer .button {display:inline;font-size:105%; font-weight:bold; margin:0 1px; padding: 0 3px; text-align:center !important;}\sn .fontResizer {margin:0 0.5em;}","fontResizerButtonStyles");\n\n//macro\nconfig.macros.fontSize={};\nconfig.macros.fontSize.handler = function (place,macroName,params,wikifier,paramString,tiddler)\n{\n\n var sp = createTiddlyElement(place,"span",null,"fontResizer");\n sp.ondblclick=this.onDblClick;\n if (params[0])\n createTiddlyText(sp,params[0]);\n createTiddlyButton(sp,"+","increase font-size",this.incFont);\n createTiddlyButton(sp,"=","reset font-size",this.resetFont);\n createTiddlyButton(sp,"โ","decrease font-size",this.decFont);\n}\n\nconfig.macros.fontSize.onDblClick = function (e)\n{\n if (!e) var e = window.event;\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return false;\n}\n\nconfig.macros.fontSize.setFont = function ()\n{\n saveOptionCookie("txtFontSize");\n setStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\sn","fontResizerStyles");\n}\n\nconfig.macros.fontSize.incFont=function()\n{\n if (config.options.txtFontSize < fontSettings.maxSize)\n config.options.txtFontSize = (config.options.txtFontSize*1)+fontSettings.stepSize;\n config.macros.fontSize.setFont();\n}\n\nconfig.macros.fontSize.decFont=function()\n{\n\n if (config.options.txtFontSize > fontSettings.minSize)\n config.options.txtFontSize = (config.options.txtFontSize*1) - fontSettings.stepSize;\n config.macros.fontSize.setFont();\n}\n\nconfig.macros.fontSize.resetFont=function()\n{\n\n config.options.txtFontSize=fontSettings.defaultSize;\n config.macros.fontSize.setFont();\n}\n\nconfig.paramifiers.font =\n{\n onstart: function(v)\n {\n config.options.txtFontSize = v;\n config.macros.fontSize.setFont();\n }\n};\n//}}}
Table formatting is both powerful and (at first) intimidating. Actually, it's pretty easy once you get the knack. See the sample tables after the reference info. Note that all [[Basic Formatting]] can be used within the cells. \n|!Markup|!Meaning|\n| {{{|}}} |Column Seperator |\n| {{{!}}} |Header (Row or Column) |\n| {{{>}}} |Column Span (picks up the followinng column) |\n| {{{~}}} |Row Span (picks up the row above)|\n| {{{|Left |}}} |Left Align |\n| {{{| Right|}}} |Right Align|\n| {{{| Center |}}} |Center Align |\n| {{{|Caption|c}}} |Table Caption (Can be at top or bottom)|\n| {{{|Footer|f}}} |Marks the row as being a footer row (will be wrapped with a {{{<tfoot>}}}, no special formatting is pre-defined for this but can be added to your own CSS)|\n| {{{|Header|h}}} |Marks the entire table as a [[Sortable Grid|SortableGridPlugin]]. @@No spanning columns allowed!@@ Please see the documentation in the SortableGridPlugin.|\n|>|Note that the additional CSS classes evenRow and oddRow are automatically applied to all rows of the table. But evenRow is applied to the "first" row as per ~JavaScript convention (it is the zero'th row).|\n!!Simple Table\n{{{\n|!Heading 1|!Heading 2|\n|Item 11|Item 21|\n|Item 12|Item 22|\n}}}\n|!Heading 1|!Heading 2|\n|Item 11|Item 21|\n|Item 12|Item 22|\n!!Alignment Demo\n{{{\n|!Heading 1 xxxx|!Heading 2 xxx|\n|Default| Centered |\n|Left | Right|\n}}}\n|!Heading 1 xxxx|!Heading 2 xxx|\n|Default| Centered |\n|Left | Right|\n!!Spanning Demo\n{{{\n|!heading 1|!heading 2|\n|>|colspan=2|\n|rowspan|left align |\n|~| center |\n}}}\n|!heading 1|!heading 2|\n|>|colspan=2|\n|rowspan|left align |\n|~| center |\n
\nIt's a good idea to first become a bit familiar with the browser layout and how the controls work. See [[Using This Web Site]]. You can't hurt anything, so explore! Hints:\n*Use the slideout {{{Help}}} buttons! \n*To close an item, hover the mouse over it and use the close control that appears along top right.\n*The {{{Help Resources}}} menu bar on the left is your friend! Open it now.\n*__You can log off while your run is going__ and rejoin it later, or just let it complete on its own.\n\n<html><iframe width="640" height="360" src="//www.youtube.com/embed/uTcyKvQrLio?rel=0" frameborder="0" allowfullscreen></iframe></html>\n\n[[View the rest of the videos in a separate tab now|http://www.youtube.com/user/DC3Dreams]]
''Tag'': Items that observers can use for help. Some are available only as sliders, accessible via a Help button in another item. Always tagged as UserContent as well.
[>img[/im/tgtform.png]]Forms for submitting live observing and scheduled requests share a common set of controls for specifying targets. There are a few things to be aware of:\n#Coordinates are __always J2000__ and can be entered in either sexagesimal or decimal. The sexagesimal translator is very adaptable, most anything for delimiters will work.<% if(rotAvail) { %>\n#This observatory has an imager rotator so you must also supply the sky position angle (PA).<% } %>\n#You can supply coordinates, use the deep sky catalog to fill in the coordinates, or supply a minor planet spec and have the __ephemeris calculated at observation time__.\n!!Deep Sky Objects\nThe catalog has over 70,000 objects. They are indexed with the abbreviated name of the catalog, __a space__, then the object name/number in the catalog. For example, Messier object 104 is M 104. Note the space! \n\nIf you know the name, but don't know the coordinates, enter the name and click "Get Coordinates or Ephemeris". If the object is found, the coordinates will appear in the fields.\n\nTo browse the catalog, you can use the [[Deep Sky Catalog|Deep Sky Catalog Search]] to search our databases. Of course, the object you want must be visible (above the low-horizon limit), the higher the better. The best way to pick a target is with a planetarium program like Starry Night or ~TheSky. Also, by default, only visible targets will be returned from a search of the [[Deep Sky Catalog|Deep Sky Catalog Search]].\n!!Minor Planets and Comets\nACP has automatic ephemeris calculation based on the Minor Planet Center's orbital elements database. To specify a minor planet, enter {{{MP}}} followed by a space, then the name or number (for numbered minor planets) or the MPC designation (packed or full, for unnumbered minor planets). For example, the following are equivalent:\n*Numbered minor planet: {{{MP 23257}}} or {{{MP Denny}}}\n*Unnumbered minor planet: {{{MP 2004 LB6}}} or {{{MP K04L06B}}}\nTo specify a comet, enter {{{CT}}} followed by a space, then the number, designation, or name of the comet. For example, the following are equivalent:\n*Numbered comet: {{{CT 00244P}}} or {{{CT 244P/Scotti}}}\n*Unnumbered comet: {{{CT CK12J010}}} or {{{C/2012 J1}}}\nNOTE: For the unnumbered comet by name, do not include the discoverer name in parentheses. In the above, the {{{(Catalina)}}} is omitted from {{{C/2012 J1}}}. \n\nTo check your target, click "Get Coordinates or Ephemeris". The message that appears at the bottom of the item will tell you if it was found or not. The RA/Dec will fade out and be zeroes; the real coordinates are calculated at the time the image is taken. The Orbital Tracking checkbox will appear, you can use this to cause the scope to follow the body instead of the stars.\n\n!!Additional Features for Minor Planets and Comets\n*If you wish your target to be orbitally tracked, after entering the request use the Schedule Browser to open the Observation for your target. Then put {{{#TRACKON}}} somewhere in the Description field. \n*You can add text to the target name (and thus the Observation name in Scheduler) by appending # and whatever youi want after that. As long as the Description field //begins// with {{{CT}}} or {{{MP}}} and a minor planet name, number, or designation, the system will detect the planetary target.
A set of command line tools is provided with which you can export individual items into their own files, then later import them into author.html. These tools (scripts) were originally developed so that updates to ACP's web content could be done without replacing the entire ''author.html'' and ''index.asp'' files. You may find them useful as well. There are four tools, all of which must be used from a command shell (e.g. cmd.exe). Usage info will be displayed if you just type the name of the script with no arguments.\n<<<\nThe easiest way to use these and other Windows scripts at the command line is to configure Windows (once) for command line scripting. At the command prompt, type \n{{{ cscript //NoLogo //H:CScript //S }}}\n(yes, double slashes!)\n<<<\n!expi - Export an item\nThe source file can be any ACP content file, not just author.html. __Suggestion__: Don't include the name of the export file, let expi name it for you. It will have a file name of the item name and an extension of .item.\n{{{\n> expi\nexpi.js V1.0: Export an item by name for later importing by impi.js\n\nUsage: > expi author.html "Item Name" [expitem.item]\n\nIf [expitem.item] not given, creates file "Item Name.item"\nItem and file names with spaces in them must be quoted.\n}}}\nDon't attempt to edit the .item files.\n!impi - Import an item\nThe item contained in the export file is imported into the source (author.html) or a copy of it. You can import it directly into the source file (with a backup copy of the file saved before importing) or have the source file copied to a new content file with the imported item in it, leaving the source file unchanged. The source file can be any ACP content file, not just author.html.\n{{{\n> impi\nimpi.js v1.2: Import an item from a file created by expi.js\n\nUsage: > impi author.html "Item Name.item" [newauthor.html]\n\nIf newauthor.html not given, imports directly into author.html\nand saves original as author.html.bak.\n\nIf original item in author.html is tagged Custom it will be \nsaved to Item Name.author.orig.item.\n\nFiles with spaces in their names must be quoted.\n}}}\nNote that, if the source item to be replaced is tagged Custom, impi copies it out to a file before replacing it with the imported item. \n!cust - List items with [[Custom]] tag\nLists the items in the source file that are tagged [[Custom]], namely those that you have modified or added. Use this to identify the items you may want to export for safekeeping.\n{{{\n> cust\ncust V1.0: List items with Custom tag.\n\nUsage: > cust author.html\nItem and file names with spaces in them must be quoted.\n}}}\nThe item name, author, creation date, and last modification date are listed for each item tagged as [[Custom]].\n!deli - Delete an item\nDeletes an item from a source file. This is of limited use for authors as items can be deleted in the authoring environment as well. Info is included here for completeness.\n{{{\n> deli\ndeli.js v1.0: Delete an item\n\nUsage: > deli author.html "Item Name"\n\nHarmless if item does not exist.\nSaves original as author.html.bak.\n\nIf item in author.html is tagged Custom, it will be\nsaved to Item Name.author.orig.item before deletion.\n\nFiles with spaces in their names must be quoted.\n}}}
/***\n|''Name:''|InlineJavascriptPlugin|\n|''Source:''|http://solo.dc3.com/tw/index.html#InlineJavascriptPlugin|\n|''Authors:''|Eric Shulman - ELS Design Studios|\n|~|Bob Denny - DC-3 Dreams, SP|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nInsert Javascript executable code directly into your tiddler content. Lets you call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated ~TiddlyWiki-formatted output into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.\n\n!Usage\nWhen installed, this plugin adds new wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be treated as embedded javascript and executed each time the tiddler is rendered.\n\n''Deferred execution from an 'onClick' link''\nBy including a label="..." parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered.\n\n''External script source files:''\nYou can also load javascript from an external source URL, by including a src="..." parameter in the initial {{{<script>}}} marker (e.g., {{{<script src="demo.js"></script>}}}). This is particularly useful when incorporating third-party javascript libraries for use in custom extensions and plugins. The 'foreign' javascript code remains isolated in a separate file that can be easily replaced whenever an updated library file becomes available.\n\n''Display script source in tiddler output''\nBy including the keyword parameter "show", in the initial {{{<script>}}} marker, the plugin will include the script source code in the output that it displays in the tiddler.\n\n''Defining javascript functions and libraries:''\nAlthough the external javascript file is loaded while the tiddler content is being rendered, any functions it defines will not be available for use until //after// the rendering has been completed. Thus, you cannot load a library and //immediately// use it's functions within the same tiddler. However, once that tiddler has been loaded, the library functions can be freely used in any tiddler (even the one in which it was initially loaded).\n\nTo ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that will be rendered as soon as your TiddlyWiki document is opened. For example, you could put your {{{<script src="..."></script>}}} syntax into a tiddler called LoadScripts, and then add {{{<<tiddler LoadScripts>>}}} in your MainMenu tiddler.\n\nSince the MainMenu is always rendered immediately upon opening your document, the library will always be loaded before any other tiddlers that rely upon the functions it defines. Loading an external javascript library does not produce any direct output in the tiddler, so these definitions should have no impact on the appearance of your MainMenu.\n\n''Creating dynamic tiddler content''\nAn important difference between this implementation of embedded scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document:\n* In a typical web document, you use the document.write() function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.\n* However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and completely replaces the entire ~TiddlyWiki document in your browser window.\n* To allow these scripts to work unmodified, the plugin automatically converts all occurences of document.write() so that the output is inserted into the tiddler content instead of replacing the entire ~TiddlyWiki document.\n\nIf your script does not use document.write() to create dynamically embedded content within a tiddler, your javascript can, as an alternative, explicitly return a text value that the plugin can then pass through the wikify() rendering engine to insert into the tiddler display. For example, using {{{return "thistext"}}} will produce the same output as {{{document.write("thistext")}}}.\n\n//Note: your script code is automatically 'wrapped' inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler. To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.//\n\n''Accessing the ~TiddlyWiki DOM''\nThe plugin provides one pre-defined variable, 'place', that is passed in to your javascript code so that it can have direct access to the containing DOM element into which the tiddler output is currently being rendered.\n\nAccess to this DOM element allows you to create scripts that can:\n* vary their actions based upon the specific location in which they are embedded\n* access 'tiddler-relative' information (use findContainingTiddler(place))\n* perform direct DOM manipulations (when returning wikified text is not enough)\n\n!Examples\nan "alert" message box:\n><script show>\n alert('InlineJavascriptPlugin: this is a demonstration message');\n</script>\ndynamic output:\n><script show>\n return (new Date()).toString();\n</script>\nwikified dynamic output:\n><script show>\n return "link to current user: [["+config.options.txtUserName+"]]";\n</script>\ndynamic output using 'place' to get size information for current tiddler:\n><script show>\n if (!window.story) window.story=window;\n var title=story.findContainingTiddler(place).id.substr(7);\n return title+" is using "+store.getTiddlerText(title).length+" bytes";\n</script>\ncreating an 'onclick' button/link that runs a script:\n><script label="click here" show>\n if (!window.story) window.story=window;\n alert("Hello World!\snlinktext='"+place.firstChild.data+"'\sntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");\n</script>\nloading a script from a source url:\n>http://solo.dc3.com/tw/demo.js contains:\n>>{{{function demo() { alert('this output is from demo(), defined in demo.js') } }}}\n>>{{{alert('InlineJavascriptPlugin: demo.js has been loaded'); }}}\n><script src="http://solo.dc3.com/tw/demo.js" show>\n return "loading demo.js..."\n</script>\n><script label="click to execute demo() function" show>\n demo()\n</script>\n\n!Installation\nimport (or copy/paste) the following tiddlers into your document:\n''InlineJavascriptPlugin'' (tagged with <<tag systemConfig>>)\n\n!Revision History\n<<<\n''2011.07.05 [1.5.2]'' Fix remote script demo. Also document 16-Sep-2006 fix for IE (see comments in code). Reformat documentation to make it clearer.\n''2006.06.01 [1.5.1]'' when calling wikify() on script return value, pass hightlightRegExp and tiddler params so macros that rely on these values can render properly\n''2006.04.19 [1.5.0]'' added 'show' parameter to force display of javascript source code in tiddler output\n''2006.01.05 [1.4.0]'' added support 'onclick' scripts. When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked. 'place' value is set to match the clicked button/link element.\n''2005.12.13 [1.3.1]'' when catching eval error in IE, e.description contains the error text, instead of e.toString(). Fixed error reporting so IE shows the correct response text. Based on a suggestion by UdoBorkowski\n''2005.11.09 [1.3.0]'' for 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content. Based on a suggestion by BradleyMeck\n''2005.11.08 [1.2.0]'' handle loading of javascript from an external URL via src="..." syntax\n''2005.11.08 [1.1.0]'' pass 'place' param into scripts to provide direct DOM access \n''2005.11.08 [1.0.0]'' initial release\n<<<\n!Credits\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] and is now maintained by Bob Denny of DC-3 Dreams, SP for the ACP Observatory Control Software web interface.\n\n!Code\n***/\n//{{{\nversion.extensions.inlineJavascript= {major: 1, minor: 5, revision: 2, date: new Date(2011,7,5)};\n\nconfig.formatters.push( {\n name: "inlineJavascript",\n match: "\s\s<script",\n lookahead: "\s\s<script(?: src=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?(?: label=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?( show)?\s\s>((?:.|\s\sn)*?)\s\s</script\s\s>",\n\n handler: function(w) {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n if (lookaheadMatch[1]) { // load a script library\n // make script tag, set src, add to body to execute, then remove for cleanup\n //var script = document.createElement("script"); script.src = lookaheadMatch[1];\n //document.body.appendChild(script); document.body.removeChild(script);\n // [rbd] Above n/g on IE. Cannot immediately remove. Give script\n // an ID, remove if there, then make new one and add it. This assures\n // it will get executed when the tiddler is rendered.\n var script = document.getElementById(lookaheadMatch[1]); //**KLUDGE**\n if(script) script = document.body.removeChild(script);\n script = document.createElement("script"); \n script.src = lookaheadMatch[1];\n script.id = lookaheadMatch[1];\n document.body.appendChild(script);\n }\n if (lookaheadMatch[4]) { // there is script code\n if (lookaheadMatch[3]) // show inline script code in tiddler output\n wikify("{{{\sn"+lookaheadMatch[0]+"\sn}}}\sn",w.output);\n if (lookaheadMatch[2]) { // create a link to an 'onclick' script\n // add a link, define click handler, save code in link (pass 'place'), set link attributes\n var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",lookaheadMatch[2]);\n link.onclick=function(){try{return(eval(this.code))}catch(e){alert(e.description?e.description:e.toString())}}\n link.code="function _out(place){"+lookaheadMatch[4]+"};_out(this);"\n link.setAttribute("href","javascript:;"); link.setAttribute("title",""); link.style.cursor="pointer";\n }\n else { // run inline script code\n var code="function _out(place){"+lookaheadMatch[4]+"};_out(w.output);"\n code=code.replace(/document.write\s(/gi,'place.innerHTML+=(');\n try { var out = eval(code); } catch(e) { out = e.description?e.description:e.toString(); }\n if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);\n }\n }\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n} )\n//}}}\n
<<RemoteContent '/ac/aequip.asp'>>
!"Document" Structure\n|!Format|!Markup|!Example|\n|Headings|{{{!Heading 1}}}<<br>><<br>>{{{!!Heading 2}}}|<html><h1>Heading 1</h1><h2>Heading 2</h2></html>|\n|Any HTML|{{{<html><p>any valid xhtml</p></html>}}}|<html><p>any valid xhtml</p></html>|\n|Block quotes|{{{>Blockquote}}}<<br>>Can be nested using multiple '>'<<br>>{{{>>Nested-Blockquote}}}|<html><blockquote>Blockquote<blockquote>Nested-Blockquote</blockquote></blockquote></html>|\n|Blockquotes - Multiline|<html><code><<<</code><br/><code>multi-line</code><code><br/>blockquote</code><br/><code><<<</code></html><<br>>Note this uses the other angle bracket '<'|<html><blockquote>multi-line<br/>blockquote</blockquote></html>|\n|Horizontal Rule|{{{----}}} (4 dashes on a line of their own)|<html><hr></html>|\n|Images|{{{[img[favicon.ico]]}}}<<br>>Note that image files are always external to the TW file. To align the image to the right, add a '>' after the initial '['<<br>>{{{[>img[favicon.ico]]}}}|[img[favicon.ico]]<<br>>[>img[favicon.ico]]|\n|Inline Comments|{{{/% .... %/}}}<<br>>Text between the markers will not be shown in view mode|Not shown: /% Not Shown %/|\n|Links|Any WikiWord (creates a link to a tiddler whether it exists or not).<<br>>Note that a WikiWord has to start with a capital letter and have a further mix of upper and lower case.|PageTemplate|\n|~|{{{[[Manual Link]]}}} (Especially for tiddlers with spaces in their titles)|[[Table of Contents]]|\n|~|{{{[[Pretty Link|Some Crafty Link]]}}}<<br>>Note: Makes an external link if the target does not yet exist (e.g. {{{[[Not Yet A Tiddler|NotYetATiddler]]}}})|[[Pretty Link|MainMenu]]<<br>>[[Not Yet A Tiddler|NotYetATiddler]]|\n|~|Automatic external link {{{http://acp.dc3.com/}}}|http://acp.dc3.com/|\n|~|Pretty external link<<br>>{{{[[ACP Home Page|http://acp.dc3.com/]]}}}|[[ACP Home Page|http://acp.dc3.com/]]|\n|List - Bulleted|{{{*Bullet List}}}|<html><ul><li>Bullet List</li></ul></html>|\n|List - Numbered|{{{#Numbered List}}}|<html><ol><li>Numbered List</li></ol></html>|\n|List - Nested|Both list types can be nested by using multiple * or #<<br>>Note that * and # must be the first character of the line as with all block format markup.<<br>>{{{*1st level}}}<<br>>{{{**2nd level}}}|<html><ul><li>1st level</li><ul><li>2nd level</li></ul></ul></html>|\n!Notes\nYou can use the custom CSS formatter in combination with headers and lists to allow new lines within the entry. e.g.:\n{{{\n#{{block{\nBullet 1\nSome text in the same bullet\n(Note that "block" can be anything, it is the formatters CSS class name)\n }}}\n# Bullet 2 \n}}}\n#{{block{\nBullet 1\nSome text in the same bullet\n}}}\n# Bullet 2
/*{{{*/\n \n#lightBoxOverlay {\n position:absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 90;\n background-color: #000;\n -moz-opacity: 0.6;\n opacity: .60;\n filter: alpha(opacity=60);\n}\n#lightBoxOverlay[id] { /* IE6 and below Can't See This */\n position: fixed;\n}\ndiv.lightBox {\n background: #2d2d2d;\n color: #fff;\n border: 2px solid #eee;\n}\nimg.lightBoxClose {\n position: absolute;\n top: -5px;\n right: -5px;\n margin: 0px;\n cursor: pointer;\n}\ndiv.lightBoxAlert {\n /* Dynamically Sized */\n background: #2d2d2d;\n color: #fff;\n padding: 10px;\n border: 2px solid #eee;\n}\ndiv.lightBoxAlertIcon {\n position: absolute;\n top: 8px;\n left: 8px;\n width: 48px;\n height: 48px;\n}\ndiv.lightBoxAlertMessage {\n margin: 14px 10px 10px 56px;\n}\n\n/*}}}*/\n
<html>\n<div class="lightBox" id="myLB" style="display:none">\n <img class="lightBoxClose" src="im/close.gif" onclick="DC3.LightBox.hideBox()" alt="Close" title="Close this window" />\n<div style="padding: 10px">This is myLB</div>\n</div>\n\n\n<div class="lightBox" id="anotherLB" style="display:none">\n <img class="lightBoxClose" src="im/close.gif" onclick="DC3.LightBox.hideBox()" alt="Close" title="Close this window" />\n<div style="padding:10px; width:300px; height: 80px;">This is anotherLB<br>\nIt has multiple lines<br>\nSee?</div>\n</div>\n\n<div class="lightBoxAlert" id="myBigAlert" style="display:none">\n <img class="lightBoxClose" src="im/close.gif" onclick="DC3.LightBox.hideBox()" alt="Close" title="Close this window" />\n\n <div class="lightBoxAlertIcon"><img src="im/info.png" alt="info"></div>\n <div class="lightBoxAlertMessage">This is a test message for the LightBox alert. This is a test message for the LightBox alert. This is a test message for the LightBox alert. This is a test message for the LightBox alert. This is a test message for the LightBox alert. This is a test message for the LightBox alert. This is a test message for the LightBox alert. This is a test message for the LightBox alert. This is a test message for the LightBox alert. This is a test message for the LightBox alert.</div>\n</div>\n\n<div class="lightBoxAlert" id="mySmallAlert" style="display:none">\n <img class="lightBoxClose" src="im/close.gif" onclick="DC3.LightBox.hideBox()" alt="Close" title="Close this window" />\n\n <div class="lightBoxAlertIcon"><img src="im/info.png" alt="info"></div>\n <div class="lightBoxAlertMessage">This is a test message.</div>\n</div>\n\n\n<a href="javascript:;" onclick="DC3.LightBox.showBox('myLB')">Show myLB</a><br>\n<a href="javascript:;" onclick="DC3.LightBox.showBox('anotherLB')">Show anotherLB</a><br>\n<a href="javascript:;" onclick="DC3.LightBox.showBox('myBigAlert')">Show myBigAlert</a><br>\n<a href="javascript:;" onclick="DC3.LightBox.showBox('mySmallAlert')">Show mySmallAlert</a><br>\n<a href="javascript:;" onclick="DC3.LightBox.showContent('<div style=\s'padding:10px;\s'>This uses the showContent() method!</div>')">Show using showContent()</a><br>\n<a href="javascript:;" onclick="DC3.LightBox.showAlert('ok', 'This uses the showAlert() method!')">Show using showAlert()</a></html>
Open [[System Status]] and use the "Owner" label/link to log off if you currently own the observatory.
Your Share Your Sky! login username and password. You must have administrator privileges to save changes.
Use this to recover from a "lost" telescope which is pointing at the wrong place in the sky. This utility takes an image of the sky currently seen by the telescope, then forces an //all-sky// plate solution and pointing update. The all-sky plate solution is done by the [[Astrometry.net|http://astrometry.net]] web service. After it completes, your telescope's coordinates should be correct for its current location. Of course, if it is having pointing or other problems, it can be inaccurate after a slew. If you have continuing problems, contact the observatory staff.
Macros are shortcuts that do all sorts of things within an item. They allow you to write more exotic items than those containing [[Basic Formatting]].\n|!Macro|!Description|!Syntax|\n|br|Force a line break|{{{<<br>>}}}|\n|closeAll|Displays a button to close all displayed items<<br>><<closeAll>>|{{{<<closeAll>>}}}|\n|gradient|<<gradient horiz #ff0000 #00ff00 #000000>>Produces a horizontal or vertical background gradient fill>><<br>>There can be 2 or more colors in the format: #rrggbb (hex), or RGB(r,g,b) (CSS)<<br>>Other CSS formatting can also be added, e.g. {{{<<gradient vert #000000 #660000 #aa2222>>color:#ffffff;font-size:12pt;Darkness>>}}}|{{{<<gradient [horiz|vert] #ff0000 #00ff00 #000000>>Some text here>>}}}|\n|slider|Display a Slider (a collapsible display of another item) Note: Put quotes around the label if needing spaces<<br>>where: ''ID''=cookie name to be used to save the state of the slider, ''Item''=name of the item to include in the slider, ''Label''=label text of the slider button, ''tooltip''=text of the buttons tooltip|{{{<<slider ID Item [Label] [toolTip]>>}}}|\n|sparkline|Produces a sparkline graphic<<br>>e.g. <<sparkline 163 218 231 236 232 266 176 249 289 1041 1835 2285 3098 2101 1755 3283 3353 3335 2898 2224 1404 1354 1825 1839 2142 1942 1784 1145 979 1328 1611>>|{{{<<sparkline num1 num2 ... numN>>}}}|\n|tabs|Display Tabbed content (contents of tab provided by another item)|{{{<<tabs indentifier tabLabel tabName Item>>}}}|\n|tiddler|Display contents of another item inline|{{{<<tiddler Item>>}}}|\n|today|Display Today's Date, e.g.<<br>><<today>><<br>><<today 0hh:0mm:0ss>>|<<br>>{{{<<today>>}}}<<br>>{{{<<today 0hh:0mm:0ss>>}}}|\n!Notes\nThe today macro take a DateFormatString as an optional argument. This string can be a combination of ordinary text, with some special characters that get substituted by parts of the date:\n* DDD - day of week in full (eg, "Monday")\n* DD - day of month, 0DD - adds a leading zero\n* MMM - month in full (eg, "July")\n* MM - month number, 0MM - adds leading zero\n* YYYY - full year, YY - two digit year\n* hh - hours, 0hh - adds a leading zero\n* mm - minutes, 0mm - adds a leading zero\n* ss - seconds, 0ss - adds a leading zero\nIf you need to supply a parameter that should be evaluated (e.g. a JavaScript variable), enclose the parameter in <html><code>{{</code></html> and <html><code>}}</code></html> rather than quotes. Note however, that the scope used in the evaluation is {{{global}}} rather than {{{local}}}. In other words, the evaluation is done ''before'' the parameter is passed to the macro/plugin so it cannot access any of the variables or functions defined within the macro/plugin.\n!Plugin Macros\nThe Share Your Sky! web content makes extensive use of special macros that are implemented in //plugins//. The ones that are useful to authors are lisited below, along with links to the plugins which implement them. The plugin items contain documentation on the use of the macros that they implement.\n|!Macro|!Description|!Plugin Item|\n|script|Allows embedding ~JavaScript within item text|InlineJavascriptPlugin|\n|persistentForm|Save/restore contents of HTML form(s) in an item|PersistentFormPlugin|\n|postForm|Send data in HTML form(s) in an item to the server|PostFormPlugin|\n|refreshIFrame|Manage an embedded HTML {{{<iframe>>}}} in an item|RefreshIFramePlugin|\n|refreshTiddler|Refresh an entire tiddler, optional periodic refresh|RefreshTiddlerPlugin|\n|remoteContent|Fill an item with content from the server|RemoteContentPlugin|\n
<html>\n<div class="navbar">\n <!--<% if(false) { %>-->\n <div class="mainDiv">\n <div class="topItem" >Authoring</div>\n <div class="dropMenu" >\n <div class="subMenu" style="display:none;">\n <div class="subItem"><a href="javascript:;" title="Authoring welcome and contents" onClick="story.displayTiddler(this,'Authoring System',null,config.options.chkAnimate,false)">Welcome</a></div>\n <div class="subItem"><a href="javascript:;" title="Critical settings before authoring" onClick="story.displayTiddler(this,'Authoring Setup',null,config.options.chkAnimate,false)">Setup</a> (required)</div>\n <div class="subItem"><a href="javascript:;" title="Overview of the authoring process" onClick="story.displayTiddler(this,'Authoring Roadmap',null,config.options.chkAnimate,false)">Roadmap</a></div>\n <div class="subItem"><a href="javascript:;" title="Recovering from Editing Mistakes" onClick="story.displayTiddler(this,'Recovering from Editing Mistakes',null,config.options.chkAnimate,false)">Error Recovery</a></div>\n <div class="subItem"><a href="javascript:;" title="Markup for text styles" onClick="story.displayTiddler(this,'Basic Formatting',null,config.options.chkAnimate,false)">Basic Formatting</a></div>\n <div class="subItem"><a href="javascript:;" title="Practice formatting here" onClick="story.displayTiddler(this,'Sandbox',null,config.options.chkAnimate,false)">Sandbox</a> (practice area)</div>\n <div class="subItem"><a href="javascript:;" title="Headings, images, lists, links, etc." onClick="story.displayTiddler(this,'Item Level Structure',null,config.options.chkAnimate,false)">Item Level Structure</a></div>\n <div class="subItem"><a href="javascript:;" title="The many ways tables can be made" onClick="story.displayTiddler(this,'Formatting Tables',null,config.options.chkAnimate,false)">Formatting Tables</a></div>\n <div class="subItem"><a href="javascript:;" title="Tags classify items by type" onClick="story.displayTiddler(this,'Tag Usage',null,config.options.chkAnimate,false)">Tag Usage</a></div>\n <div class="subItem"><a href="javascript:;" title="Macros greatly expand the possibilities" onClick="story.displayTiddler(this,'Macros',null,config.options.chkAnimate,false)">Macros</a></div>\n <div class="subItem"><a href="javascript:;" title="Using jQuery" onClick="story.displayTiddler(this,'Using jQuery',null,config.options.chkAnimate,false)">Using jQuery</a></div>\n <div class="subItem"><a href="javascript:;" title="Save and restore custom items" onClick="story.displayTiddler(this,'Importing and Exporting Items',null,config.options.chkAnimate,false)">Importing & Exporting</a></div>\n </div>\n </div>\n </div>\n <div style="text-align:left;margin:0">Users see these:</div>\n <!--<% } %>-->\n <div id="mm_liveObsBlock" class="mainDiv">\n <div class="topItem">Live Observing</div>\n <div class="dropMenu" >\n <div class="subMenu" style="display:none;">\n <div id="mm_liveTitle" class="subItem">Single Object Imaging</div>\n <div id="mm_liveSingle" class="subSubItem"><a href="javascript:;" title="Acquire a single image" onClick="story.displayTiddler(this,'Acquire a Single Image',null,config.options.chkAnimate,false)">Single Image</a></div>\n <div id="mm_liveSeries" class="subSubItem"><a href="javascript:;" title="Acquire multiple images in multiple colors" onClick="story.displayTiddler(this,'Single Object Color Series',null,config.options.chkAnimate,false)">Color Series</a></div>\n <div id="mm_liveMultiple" class="subItem"><a href="javascript:;" title="Image multiple targets using an observing plan" onClick="story.displayTiddler(this,'Multiple Objects (Plan)',null,config.options.chkAnimate,false)">Multiple Objects (Plan)</a></div>\n <div id="mm_liveDarkBias" class="subItem"><a href="javascript:;" title="Acquire dark and bias frames" onClick="story.displayTiddler(this,'Calibration Frames',null,config.options.chkAnimate,false)">Cal Frames (Dark/Bias)</a></div>\n <!--<% if(screenFlats) { %>-->\n <div id="mm_liveStdFlats" class="subItem"><a href="javascript:;" title="Acquire standard automatic screen flats now" onClick="story.displayTiddler(this,'Standard Flat Fields',null,config.options.chkAnimate,false)">Standard Screen Flats</a></div>\n <div id="mm_liveOneFlats" class="subItem"><a href="javascript:;" title="Setup and do a one-time screen flat run now" onClick="story.displayTiddler(this,'One-Time Flat Field Run',null,config.options.chkAnimate,false)">One-Time Screen Flats</a></div>\n <!--<% } else { %>-->\n <div id="mm_liveStdFlats" class="subItem"><a href="javascript:;" title="Acquire automatic sky flats" onClick="story.displayTiddler(this,'Standard Flat Fields',null,config.options.chkAnimate,false)">Standard Sky Flats</a></div>\n <div id="mm_liveOneFlats" class="subItem"><a href="javascript:;" title="Setup and do a one-time sky flat run" onClick="story.displayTiddler(this,'One-Time Flat Field Run',null,config.options.chkAnimate,false)">One-Time Sky Flats</a></div>\n <!--<% } %>-->\n <div class="subItem">Special Tasks</div>\n <div class="subSubItem"><a href="javascript:;" title="Status and control center for the observatory" onClick="story.displayTiddler(this,'System Status',null,config.options.chkAnimate,false)">System Status Disp.</a></div>\n <!--<% if(screenFlats) { %>-->\n <div class="subSubItem"><a href="javascript:;" title="Set up standard automatic screen flats" onClick="story.displayTiddler(this,'Setup Standard Flat Fields',null,config.options.chkAnimate,false)">Setup Screen Flats</a></div>\n <!--<% } else { %>-->\n <div class="subSubItem"><a href="javascript:;" title="Set up standard automatic sky flats" onClick="story.displayTiddler(this,'Setup Standard Flat Fields',null,config.options.chkAnimate,false)">Setup Sky Flats</a></div>\n <!--<% } %>-->\n <div id="mm_liveRelease" class="subSubItem"><a href="javascript:;" title="Release the observatory" onClick="DC3.Lib.logOff();">Release the Obs.</a></div>\n <div class="subSubItem"><a href="javascript:;" title="Find objects in our 70,000+ object deep sky catalog" onClick="story.displayTiddler(this,'Deep Sky Catalog Search',null,config.options.chkAnimate,false)">Deep Sky Catalog</a></div>\n <div class="subSubItem"><a href="javascript:;" title="Pre-compile and check an observing plan" onClick="story.displayTiddler(this,'Check Observing Plan',null,config.options.chkAnimate,false)">Obs. Plan Checker</a></div>\n </div>\n </div>\n </div>\n <!--<% if(schInst) { %>-->\n <div class="mainDiv">\n <div class="topItem" >Scheduled</div>\n <div class="dropMenu" >\n <div class="subMenu" style="display:none;">\n <div class="subItem"><a href="/sc/index.asp" target="_blank" title="Show the Scheduler's Database of requests">Schedule Browser</a></div>\n <div class="subItem"><a href="javascript:;" title="Request color data for astro-imaging" onClick="story.displayTiddler(this,'Schedule Astro-Imaging',null,config.options.chkAnimate,false)">Astro-Imaging</a></div>\n <div class="subItem"><a href="javascript:;" title="Request a single series of images" onClick="story.displayTiddler(this,'Schedule Time Series',null,config.options.chkAnimate,false)">Time Series</a></div>\n <div class="subItem"><a href="javascript:;" title="Enter requests from RTML" onClick="story.displayTiddler(this,'Submit RTML Request',null,config.options.chkAnimate,false)">Upload RTML</a></div>\n </div>\n </div>\n </div>\n <!--<% } %>-->\n <!--<% if(User.Username != "localweb") { %>-->\n <div class="mainDiv">\n <div class="topItem" >My Documents</div>\n <div class="dropMenu" >\n <div class="subMenu" style="display:none;">\n <div class="subItem"><a href="javascript:;" title="Your acquired images" onClick="story.displayTiddler(this,'Acquired Images',null,config.options.chkAnimate,false)">Acquired Images</a></div>\n <div class="subItem"><a href="javascript:;" title="Your observing plans" onClick="story.displayTiddler(this,'Observing Plans',null,config.options.chkAnimate,false)">Observing Plans</a></div>\n <div class="subItem"><a href="javascript:;" title="Your run logs" onClick="story.displayTiddler(this,'Run Logs',null,config.options.chkAnimate,false)">Run Logs</a></div>\n </div>\n </div>\n </div>\n <!--<% } %>-->\n <div class="mainDiv">\n <div class="topItem" >Shared Files</div>\n <div class="dropMenu" >\n <div class="subMenu" style="display:none;">\n <!--<% if(User.CanUpload) { %>-->\n <div class="subItem"><a href="javascript:;" title="Upload and share files with other observers" onClick="story.displayTiddler(this,'Shared File Area',null,config.options.chkAnimate,false)">Shared File Area</a></div>\n <!--<% } else { %>-->\n <div class="subItem"><a href="javascript:;" title="Files shared by other observers" onClick="story.displayTiddler(this,'Shared File Area',null,config.options.chkAnimate,false)">Shared File Area</a></div>\n <!--<% } %>-->\n <div class="subItem"><a href="javascript:;" title="Downloads provided by the staff" onClick="story.displayTiddler(this,'Downloads',null,config.options.chkAnimate,false)">Downloads</a></div>\n </div>\n </div>\n </div>\n <div class="mainDiv">\n <div class="topItem" >Observatory Info</div>\n <div class="dropMenu" >\n <div class="subMenu" style="display:none;">\n <div class="subItem"><a href="javascript:;" title="Status and control center" onClick="story.displayTiddler(this,'System Status',null,config.options.chkAnimate,false)">System Status Display</a></div>\n <div class="subItem"><a href="javascript:;" title="Shows a movable astro-photo at current scope coordinates" onClick="story.displayTiddler(this,'Pictorial Camera Field', null, config.options.chkAnimate,false)">Pictorial Camera Field</a></div>\n <div class="subItem"><a href="javascript:;" title="Detailed specs on our instruments and equipment" onClick="story.displayTiddler(this,'Instruments & Equipment',null,config.options.chkAnimate,false)">Instruments & Equipment</a></div>\n <div class="subItem"><a href="javascript:;" title="Geographic location and elevation" onClick="story.displayTiddler(this,'Observatory Location',null,config.options.chkAnimate,false)">Observatory Location</a></div>\n <div class="subItem"><a href="javascript:;" title="Shows our Clear Sky Clock" onClick="story.displayTiddler(this,'Our Clear Sky Chart', null, config.options.chkAnimate,false)">Clear Sky Chart</a></div>\n <div class="subItem"><a href="javascript:;" title="Detailed weather information" onClick="story.displayTiddler(this,'Weather',null,config.options.chkAnimate,false)">Local Weather</a></div>\n <div class="subItem"><a href="javascript:;" title="Weather Radar in Our Area" onClick="story.displayTiddler(this,'Radar Animation',null,config.options.chkAnimate,false)">Radar Animation</a></div>\n <div class="subItem"><a href="javascript:;" title="Upcoming dawn and dusk times of various types" onClick="story.displayTiddler(this,'Dawn-Dusk Times',null,config.options.chkAnimate,false)">Dawn-Dusk Times</a></div>\n <div class="subItem"><a href="javascript:;" title="How to contact the observatory staff" onClick="story.displayTiddler(this,'Contact Info',null,config.options.chkAnimate,false)">Contact Info</a></div>\n <div class="subItem"><a href="javascript:;" title="Feed your newsreader with observatory events" onClick="story.displayTiddler(this,'RSS Feed',null,config.options.chkAnimate,false)"><img src="/im/feed-icon-14x14.png" border="0" width="14" height="14" align="absmiddle"> RSS Events Feed</a></div>\n </div>\n </div>\n </div>\n <div class="mainDiv">\n <div class="topItem" >Help Resources</div>\n <div class="dropMenu" >\n <div class="subMenu" style="display:none;">\n <div class="subItem"><a href="javascript:;" onClick="story.displayTiddler(this,'Welcome',null,config.options.chkAnimate,false)">Welcome</a></div>\n <div class="subItem"><a href="javascript:;" onClick="story.displayTiddler(this,'Using This Web Site',null,config.options.chkAnimate,false)">Using This Web Site</a></div>\n <div class="subItem"><a href="javascript:;" onClick="story.displayTiddler(this,'Getting Started',null,config.options.chkAnimate,false)">Getting Started</a></div>\n <div class="subItem"><a href="javascript:;" onClick="story.displayTiddler(this,'Common Questions',null,config.options.chkAnimate,false)">Common Questions</a></div>\n <div class="subItem"><a href="javascript:;" onClick="story.displayTiddler(this,'Making Observing Plans',null,config.options.chkAnimate,false)">Making Obs. Plans</a></div>\n </div>\n </div>\n </div>\n <div class="mainDiv">\n <div class="topItem" >Toolbox</div>\n <div class="dropMenu" >\n <div class="subMenu" style="display:none;">\n <div class="subItem"><a href="javascript:;" title="Pre-compile and check an observing plan" onClick="story.displayTiddler(this,'Check Observing Plan',null,config.options.chkAnimate,false)">Obs. Plan Checker</a></div>\n <!--<% if(!screenFlats) { %>-->\n <div class="subItem"><a href="javascript:;" title="Analyze sky flats" onClick="story.displayTiddler(this,'Sky Flat Analyzer',null,config.options.chkAnimate,false)">Sky Flat Analyzer</a></div>\n <!--<% } %>-->\n <div class="subItem"><a href="javascript:;" title="Generate an AAVSO chart" onClick="story.displayTiddler(this,'AAVSO Chart',null,config.options.chkAnimate,false)">AAVSO Chart</a></div>\n <div class="subItem"><a href="javascript:;" title="Update Minor Planet Center orbital element databases" onClick="story.displayTiddler(this,'Update MPC Data',null,config.options.chkAnimate,false)">Update MPC Data</a></div>\n <div class="subItem"><a href="javascript:;" title="Various observatory tasks and tests" onClick="story.displayTiddler(this,'Utility Tasks',null,config.options.chkAnimate,false)">Utility Tasks</a></div>\n <!--<% if(User.IsAdministrator) { %>-->\n <div class="subItem"><a href="javascript:;" title="Start or restart the Scheduler applicaiton" onClick="story.displayTiddler(this,'Start/Restart Scheduler',null,config.options.chkAnimate,false)">Start/Restart Scheduler</a></div>\n <div class="subItem"><a href="author.html" title="Make changes to web content">Authoring System</a></div>\n <!--<% } %>-->\n </div>\n </div>\n </div>\n</div>\n</html>\n<<XPMenu>>\n
@@UNUSED FOR NOW (tagged deleteUser)@@\nRather than use the [[Automatic Sky Flats]] form, you can make your own flat plan and upload it to your [[Observing Plans]] folder. The simplest approach is to create a single flat plan called defaultflat.txt. If you want separate flat plans for dawn and dusk, you can create two flat plans defaultdawnflats.txt and defaultduskflats.txt. The following is a simplified explanation; to access the full (advanced) capabilities of ACP's flat planning, see the help for ACP itself.\n!!Filter Order\nThe order of flat sets must be as they would be taken at dusk - with the filter/binning resulting in the lowest sensitivity used first (when the sky is brightest).\n<<<\nFilter sensitivity for sky-flats is not the same as for night imaging. Often Red will be the least sensitive. For sky-flats, you are imaging a blue sky! Also, higher binning is much more sensitive so list your lowest binning levels first, regardless of the filter.\n<<<\n!!Example (no rotator)\n{{{\n;\n; Sample Flat Plan (no rotator)\n;\n5, Luminance, 1\n5, Red, 2\n5, Green, 2\n5, Blue, 2\n}}}\nThis takes 5 flats in Luminance at binning 1, followed by 5 flats each in Red, Green, then Blue, all at binning 2. \n!!Syntax\nThe three comma-separated items are \n# count\n# filter\n# binning\nYou can put in spaces for clarity (as in the example), they are ignored. The semicolon starts a comment. Comments are ignored.\n!!Rotators\nIf you have an imager rotator, the flat specs need one more field: the sky position angle (PA). For example:\n{{{\n;\n; Sample Flat Plan (PA = 0 deg.)\n;\n5, Luminance, 1, 0\n5, Red, 2, 0\n5, Green, 2, 0\n5, Blue, 2, 0\n}}}\nUsually, you'll set the PA to 0 degrees (as in the example) but for the absolute best accuracy you need to acquire flats at the same PA as your images. As usual for rotators, this gets complicated. What if you acquire images of two targets at different ~PAs? Then you need to take flats at each of the two ~PAs. But that can be time consuming and you may run out of flat time. One way around this is to do one PA at dusk (with a defaultduskflat plan) and the other at dawn (with a defaultdawnflat plan). \n!!!Rotated Flats with German Mounts\nIf your telescope is a German Equatorial Mount (GEM), the flat system automatically splits your flats into two sets, half taken at the specified PA and the other half at PA + 180 degrees. The assumption is that you acquire your images across the meridian, where the seeing is best. When your target transits, the mount flips and the rotator rolls the imager over 180 degrees so that the (sky) PA is the same and your guide star will still be on the internal guided chip. Mechanically and optically, though, the imager has rotated 180 degrees, thus the flats will be different. The flat images will be marked "east" (looking east of the meridian) and "west" (looking west of the meridian) so you can tell which is which.\n\nIf you take the simplified approach, setting the PA to 0, then you also don't care about the difference between the east and west flats, and you can combine them into one master flat.
After you've used the [[Single Image|Acquire a Single Image]] and [[Color Series|Single Object Color Series]] live-observing modes a few times, you may be interested in acquiring images of multiple targets. This is //essential// for science work, but __it is also the best way to do astro-imaging__. Rather than sitting on one object all night and getting lots of data at low elevations through a lot of air, consider doing three targets over three nights, all at high elevations, crossing the meridian. <% if(Telescope.Connected && Telescope.AlignmentMode == 2) { %>You never have to worry about the meridian and flipping, even though our mount is a German equatorial! Just plan across the meridian and let our system take care of flipping.<% } %>\n\nIn order to do this, you need to upload an __Observing Plan__ then run it. Planning a night's multi-target run is difficult without visualization tools. Fortunately, we provide a //free// Windows tool for making plans, ACP Planner. It works best with Imaginova's ~StarryNight Pro and Pro Plus, and Software Bisque's ~TheSky, but it can also be used by itself. Take a few moments to [[view the ACP Planner videos|https://www.youtube.com/playlist?list=PLBBA0B21E71E4B22B]] now!\n!Installing ACP Planner\n#[[Download ACP Planner|http://acp.dc3.com/get-planner.html]]\n#Run the installer\n!Using ACP Planner\nOnce again, you should [[view the ACP Planner videos|https://www.youtube.com/playlist?list=PLBBA0B21E71E4B22B]] now!\n#Start ACP Planner and read the help info, or just dive in and run ~TheSky or ~StarryNight. For ~TheSky, you also need to start ~TheSky Plan Capture applet. Planner support is built into ~StarryNight.\n#Make a plan, <% if(User.Username != "localweb") { %>upload it to your [[Observing Plans]] area at the observatory.<% } else { %>put it into your plans folder (My Documents\sACP Astronomy\sPlans).<% } %>\n!Advanced Planning\nYou can also make plans by hand, using Notepad or any other text editor. They are very easy to understand, yet extremely flexible. For advanced usage, this is the way to go. Any heavy-duty observing run needs careful planning, after all, and once you know the //what// and //when// for your observing run, you can type up a plan for the observatory. The details of this would make this web content too big, so we've provided you with the ACP socumentation set in the [[Downloads]] area. Download ~ACPHelp.zip and unzip all of the files to some folder. Then double click @@ACP Help.chm@@. Look in the Making Observing Plans section. If you get stuck, ask us for help on the [[DC-3 Dreams Communication Center|http://forums.dc3.com/]].
<!--{{{-->\n<!-- Load JQuery and plugins used herein -->\n<script language='javascript' type='text/javascript' src='ac/jquery-3.3.1.min.js'></script>\n<script language='javascript' type='text/javascript' src='ac/jquery.sparkline.min.js'></script>\n<script language='javascript' type='text/javascript' src='ac/jquery.bvalidator.js'></script>\n<!-- Special cookie processing for TW -->\n<script language='javascript' type='text/javascript'>\nwindow.loadOptionsCookie_orig_DC3 = window.loadOptionsCookie;\nwindow.loadOptionsCookie = function()\n{\n if(safeMode)\n return;\n var cookies = document.cookie.split(";");\n for(var c = 0; c < cookies.length; c++)\n {\n var p = cookies[c].indexOf("=");\n if(p != -1)\n {\n var name = cookies[c].substr(0,p).trim();\n if(name.substr(0, 6) == "tw_opt") // Found the 'tw_opt' cookie\n {\n var value = cookies[c].substr(p + 1).trim(); // This has all the options\n var fc = value.split("&");\n for(var i = 0; i < fc.length; i++) \n {\n p = fc[i].indexOf(":");\n name = fc[i].substr(0, p).trim();\n value = fc[i].substr(p + 1).trim();\n switch(name.substr(0,3))\n {\n case "txt":\n case "pas": // for UploadPlugin\n config.options[name] = unescape(value);\n break;\n case "chk":\n config.options[name] = (value == "true");\n break;\n }\n }\n return; // Don't look at more cookies \n }\n }\n }\n};\n//\n// For the Moon Avoidance live spreadsheet in Moon Avoidance Lorentzian Help.\n//\nfunction mah_calc()\n{\n var d = document.getElementById('mah_inDist').value;\n var w = document.getElementById('mah_inWidth').value;\n for (a = 0; a < 16; a++)\n {\n document.getElementById("mah_dist" + a).innerHTML = (d / (1.0 + Math.pow(((0.5 - (a / 29.5)) / (w / 29.5)), 2))).toFixed(0);\n }\n}\n</script>\n<!--}}}-->
<!--{{{-->\n<!-- LightBox translucent overlay -->\n<div id="lightBoxOverlay" onclick="DC3.LightBox.hideBox()" style="display:none"></div>\n<!-- General use simple LightBox -->\n<div class="lightBox" id="lightBox" style="display:none">\n <img class="lightBoxClose" src="im/close.gif" onclick="DC3.LightBox.hideBox()" alt="Close" title="Close this window" />\n <div id="lightBoxContent"></div>\n</div>\n<!-- General use Alert LightBox -->\n<div class="lightBoxAlert" id="lightBoxAlert" style="display:none">\n <img class="lightBoxClose" src="im/close.gif" onclick="DC3.LightBox.hideBox()" alt="Close" title="Close this window" />\n <div class="lightBoxAlertIcon"><img id="lightBoxAlertIcon" src="" alt="" title=""></div>\n <div class="lightBoxAlertMessage" id="lightBoxAlertMessage">runtime</div>\n</div>\n<!-- End of LightBox --> \n<!--}}}-->\n
<!-- Enabling autodiscovery of RSS feed -->\n<link rel="alternate" type="application/rss+xml" title="Observing events at <%= Prefs.SiteName %>" href="/ac/arss.asp" />\n<!-- Defeating IE6 b/g image loading bug -->\n<script language="javascript" type="text/javascript">\ntry {\n document.execCommand("BackgroundImageCache", false, true);\n} catch(err) {}\n</script>\n<!-- Loading spash screen -->\n<style type="text/css">\n#contentWrapper {display:none;}\n</style>\n<div id="SplashScreen" style="background-color:black; position:absolute; top:0; left:0; width:100%; height:100%;">\n<div style="border: 0px solid navy; border-radius: 8px; -moz-border-radius: 8px; -webkit-border-radius: 8px; outline: none; box-shadow: 0 0 32px #4444ff; -moz-box-shadow: 0 0 32px #4444ff; -webkit-box-shadow: 0 0 32px #4444ff; display: block; text-align: center; width: 600px; margin: 100px auto; padding: 10px 10px 10px 10px;; color:#FFA; font-size: 24px; font-family:Tahoma; background-color:#000030;"><table border="0" cellpadding="10px"><tr><td><img src="im/dc3logo.jpg"/></td><td><img src="im/loading.gif" align="absmiddle" height="32" width="32" /> Loading <%= Prefs.SiteName %>...</td></tr></table></div></div>\n<!-- Server-side static initialization and support functions<%\nvar __fso = new ActiveXObject("Scripting.FileSystemObject");\nvar __port = ":" + Request.ServerVariables("SERVER_PORT");\nif(__port == ":80") __port = "";\nvar feedUri = "feed://" + Request.ServerVariables("SERVER_NAME") + __port + "/ac/arss.asp"; \nvar camAvail = false;\ntry { camAvail = Camera.LinkEnabled; } catch (ex) { camAvail = false; }\nvar __fso = new ActiveXObject("Scripting.FileSystemObject");\nvar rotAvail = Rotator.Configured;\nvar ditherMainPixels = (Prefs.AutoGuiding.SensorPlateScale !== 0)\nvar schInst = false;\nvar schAvail = false;\nvar schUserPrio = false;\nvar schPerAF = false;\nvar schDB;\nvar acpAutoCal = false;\nvar filtNames = null;\nvar filtNameOpts = "";\nvar filtNameOptsSch = "";\nvar binVals = null;\nvar binValOpts = "";\nvar screenFlats = false;\nvar __st;\ntry {\n __st = __fso.OpenTextFile(Prefs.WebRoot + "\s\sFilterNames.txt");\n __st.ReadLine();\n var __buf = __st.ReadLine();\n if(__buf.search(/no filters/i) == -1) {\n filtNames = new Array();\n while (!__st.AtEndOfStream) {\n filtNames.push(__st.ReadLine());\n }\n }\n __st.Close();\n buf = bufs = ""; // Bufs for scheduler flavor, names not numbers\n if(filtNames == null) {\n buf += "<option value=\s"0\s">N/A</option>";\n bufs += "<option>N/A</option>";\n } else {\n var cf = Prefs.CameraPrefs.ClearFilterNumber;\n for (var i = 0; i < filtNames.length; i++) {\n buf += "<option value=\s"" + i + "\s"";\n bufs += "<option ";\n if(i == cf) {\n buf += " selected";\n bufs += " selected";\n }\n buf += ">" + filtNames[i] + "</option>";\n bufs += ">" + filtNames[i] + "</option>";\n }\n }\n filtNameOpts = Server.HTMLEncode(buf);\n filtNameOptsSch = Server.HTMLEncode(bufs);\n} catch(ex) { }\ntry {\n __st = __fso.OpenTextFile(Prefs.WebRoot + "\s\sBinningVals.txt");\n __st.ReadLine();\n buf = "";\n while (!__st.AtEndOfStream)\n {\n var i = __st.ReadLine();\n buf += Server.HTMLEncode("<option value=\s"" + i + "\s">" + i + "</option>");\n }\n __st.Close();\n binValOpts = buf;\n} catch(ex) {\n binValOpts = Server.HTMLEncode("<option value=\s"1\s">1</option>");\n}\ntry {\n __st = __fso.OpenTextFile(ACPApp.ConfigPath + "\s\sAutoFlatConfig.txt");\n buf = __st.ReadAll();\n __st.Close();\n if (buf.search(/FlatMode\ss+Sky/i) < 0)\n screenFlats = true;\n} catch(ex) { }\n\nacpAutoCal = Prefs.CameraPrefs.AutoCalibrate;\n\nschInst = Scheduler.Installed;\nif (schInst) {\n schAvail = Scheduler.Available;\n schUserPrio = Scheduler.UserPriorities;\n schPerAF = Scheduler.PeriodicAutoFocus;\n schDB = Scheduler.Database;\n}\n \nfunction filterNameOptions()\n{\n return filtNameOpts;\n}\nfunction filterNameOptionsSch() // Option values are the names not the numbers\n{\n return filtNameOptsSch;\n}\nfunction binningOptions()\n{\n return binValOpts;\n}\n%>-->\n
/***\n|''Name:''|MathSVGPlugin|\n|''Description:''|This plugin translates a subset of the LaTeX math notation to MathML with a customisable image fallback when MathML is not supported. It also provides an easy way to produce mathematical SVG graphics with dynamical features and animation. Note this is no longer supported by Soares.|\n|''Version:''|1.5.0|\n|''Date:''|2016-08-16|\n|''Source:''|http://www.math.ist.utl.pt/~psoares/|\n|''Author:''|Paulo Soares (1.5 by Bob Denny rdenny@dc3.com for jQuery 1.12)|\n|''License:''|[[GNU Lesser General Public License|http://www.gnu.org/licences/lgpl.html]]|\n|''CoreVersion:''|2.1.3|\n|''Require:''|[[JQuery 1.12.4|http://jquery.com/]] and the [[jQuery bValidator plugin|http://code.google.com/p/bvalidator/]] v0.6|\n\n!Original copyright notice\n{{{\nASCIIMathML.js\n==============\nVersion 2.1 Oct 8, 2008, (c) Peter Jipsen http://www.chapman.edu/~jipsen\nThis version extends ASCIIMathML.js with LaTeXMathML.js and ASCIIsvg.js.\nLatest version at http://www.chapman.edu/~jipsen/mathml/ASCIIMathML.js\nIf you use it on a webpage, please send the URL to jipsen@chapman.edu\n\nThe LaTeXMathML modifications were made by Douglas Woodall, June 2006.\n(for details see header on the LaTeXMathML part in middle of file)\nExtensive clean-up and improvements by Paulo Soares, Oct 2007.\n\nThis program is free software; you can redistribute it and/or modify\nit under the terms of the GNU Lesser General Public License as published by\nthe Free Software Foundation; either version 2.1 of the License, or (at\nyour option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT \nANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS \nFOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License \n(at http://www.gnu.org/licences/lgpl.html) for more details.\n\nThis version removes the "clip-part" expression from the outer-<svg> code to \nmaintain compatibility with Firefox version 17.\n}}}\n!~MathSVG code (minified)\n***/\n//{{{\nMath.sec=function(a){return 1/Math.cos(a)};Math.csc=function(a){return 1/Math.sin(a)};Math.cot=function(a){return 1/Math.tan(a)};Math.asec=function(a){return Math.acos(1/a)};Math.acsc=function(a){return Math.asin(1/a)};Math.acot=function(a){return Math.atan(1/a)};Math.sinh=function(a){return(Math.exp(a)-Math.exp(-a))/2};Math.cosh=function(a){return(Math.exp(a)+Math.exp(-a))/2};Math.tanh=function(a){return(Math.exp(a)-Math.exp(-a))/(Math.exp(a)+Math.exp(-a))};Math.sech=function(a){return 1/Math.cosh(a)};Math.csch=function(a){return 1/Math.sinh(a)};Math.coth=function(a){return 1/Math.tanh(a)};Math.asinh=function(a){return Math.log(a+Math.sqrt(a*a+1))};Math.acosh=function(a){return Math.log(a+Math.sqrt(a*a-1))};Math.atanh=function(a){return Math.log((1+a)/(1-a))/2};Math.sech=function(a){return 1/Math.cosh(a)};Math.csch=function(a){return 1/Math.sinh(a)};Math.coth=function(a){return 1/Math.tanh(a)};Math.asech=function(a){return Math.acosh(1/a)};Math.acsch=function(a){return Math.asinh(1/a)};Math.acoth=function(a){return Math.atanh(1/a)};Math.sign=function(a){return(a===0?0:(a<0?-1:1))};Math.step=function(a,c,b){return(a<0?(b?b:0):(c?c:1))};Math.root=function(a,b){return Math.pow(a,1/b)};Math.factorial=function(b){if(b===0){return 1}if(b<0){if((b%1)===0){return}if(b>-1){return Math.factorial(b+1)/(b+1)}return -Math.PI/(Math.factorial(-1-b)*Math.sin(Math.PI*b))}var a=b;if((b%1)===0){while(b>1){b=b-1;a=a*b}}else{a=Math.exp((b+0.5)*Math.log(b+1)-b-b*(0.1121105+b*0.08106103)/(1.452342+b*(2.410858+b)))}return a};Math.Gamma=function(a){return Math.factorial(a-1)};Math.Beta=function(a,b){return Math.Gamma(a)*Math.Gamma(b)/Math.Gamma(a+b)};Math.C=function(a,b){var c=1/((a+1)*Math.Beta(b+1,a-b+1));return c};Math.truncate=function(a,c){var b=c||0;return Math.floor(a*Math.pow(10,b))/Math.pow(10,b)};Math.randomString=function(a,g){var f=(g||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz").split("");var e=[],c=Math.random;var d=f.length;for(var b=0;b<a;b++){e[b]=f[0|c()*d]}return e.join("")};Math.runif=function(d,c,f){var e=f||0;return Math.truncate((c+Math.pow(10,-e)-d)*Math.random()+d,e)};Math.rnormal=function(a,b){a=a||0;b=b||1;var d=0,c=0;while(d*c===0){d=Math.random();c=Math.random()}return b*(Math.sqrt(-2*Math.log(d))*Math.cos(2*Math.PI*c))+a};(function(){var a=jQuery.fn.attr,b="http://www.w3.org/2000/svg";jQuery.fn.attr=function(m,l){var g=this.length;if(!g){return this}for(var f=0;f<g;f++){var c=this[f];if(c.namespaceURI===b){if(l!==undefined){c.setAttribute(m,l)}else{if($.isArray(m)){var d=m.length,e={};while(d--){var k=m[d];var h=c.getAttribute(k);if(h||h==="0"){h=isNaN(h)?h:h-0}e[k]=h}return e}else{if(typeof m==="object"){for(v in m){c.setAttribute(v,m[v])}}else{var h=c.getAttribute(m);if(h||h==="0"){h=isNaN(h)?h:h-0}return h}}}}else{return a.apply(this,arguments)}}return this}}());var MSVG=function($){var cal=["\suD835\suDC9C","\su212C","\suD835\suDC9E","\suD835\suDC9F","\su2130","\su2131","\suD835\suDCA2","\su210B","\su2110","\suD835\suDCA5","\suD835\suDCA6","\su2112","\su2133","\suD835\suDCA9","\suD835\suDCAA","\suD835\suDCAB","\suD835\suDCAC","\su211B","\suD835\suDCAE","\suD835\suDCAF","\suD835\suDCB0","\suD835\suDCB1","\suD835\suDCB2","\suD835\suDCB3","\suD835\suDCB4","\suD835\suDCB5","\suD835\suDCB6","\suD835\suDCB7","\suD835\suDCB8","\suD835\suDCB9","\su212F","\suD835\suDCBB","\su210A","\suD835\suDCBD","\suD835\suDCBE","\suD835\suDCBF","\suD835\suDCC0","\suD835\suDCC1","\suD835\suDCC2","\suD835\suDCC3","\su2134","\suD835\suDCC5","\suD835\suDCC6","\suD835\suDCC7","\suD835\suDCC8","\suD835\suDCC9","\suD835\suDCCA","\suD835\suDCCB","\suD835\suDCCC","\suD835\suDCCD","\suD835\suDCCE","\suD835\suDCCF"];var frk=["\suD835\suDD04","\suD835\suDD05","\su212D","\suD835\suDD07","\suD835\suDD08","\suD835\suDD09","\suD835\suDD0A","\su210C","\su2111","\suD835\suDD0D","\suD835\suDD0E","\suD835\suDD0F","\suD835\suDD10","\suD835\suDD11","\suD835\suDD12","\suD835\suDD13","\suD835\suDD14","\su211C","\suD835\suDD16","\suD835\suDD17","\suD835\suDD18","\suD835\suDD19","\suD835\suDD1A","\suD835\suDD1B","\suD835\suDD1C","\su2128","\suD835\suDD1E","\suD835\suDD1F","\suD835\suDD20","\suD835\suDD21","\suD835\suDD22","\suD835\suDD23","\suD835\suDD24","\suD835\suDD25","\suD835\suDD26","\suD835\suDD27","\suD835\suDD28","\suD835\suDD29","\suD835\suDD2A","\suD835\suDD2B","\suD835\suDD2C","\suD835\suDD2D","\suD835\suDD2E","\suD835\suDD2F","\suD835\suDD30","\suD835\suDD31","\suD835\suDD32","\suD835\suDD33","\suD835\suDD34","\suD835\suDD35","\suD835\suDD36","\suD835\suDD37"];var bbb=["\suD835\suDD38","\suD835\suDD39","\su2102","\suD835\suDD3B","\suD835\suDD3C","\suD835\suDD3D","\suD835\suDD3E","\su210D","\suD835\suDD40","\suD835\suDD41","\suD835\suDD42","\suD835\suDD43","\suD835\suDD44","\su2115","\suD835\suDD46","\su2119","\su211A","\su211D","\suD835\suDD4A","\suD835\suDD4B","\suD835\suDD4C","\suD835\suDD4D","\suD835\suDD4E","\suD835\suDD4F","\suD835\suDD50","\su2124","\suD835\suDD52","\suD835\suDD53","\suD835\suDD54","\suD835\suDD55","\suD835\suDD56","\suD835\suDD57","\suD835\suDD58","\suD835\suDD59","\suD835\suDD5A","\suD835\suDD5B","\suD835\suDD5C","\suD835\suDD5D","\suD835\suDD5E","\suD835\suDD5F","\suD835\suDD60","\suD835\suDD61","\suD835\suDD62","\suD835\suDD63","\suD835\suDD64","\suD835\suDD65","\suD835\suDD66","\suD835\suDD67","\suD835\suDD68","\suD835\suDD69","\suD835\suDD6A","\suD835\suDD6B"];var CONST=0,UNARY=1,BINARY=2,INFIX=3,LEFTBRACKET=4,RIGHTBRACKET=5,SPACE=6,UNDEROVER=7,DEFINITION=8,LEFTRIGHT=9,TEXT=10,BIG=11,STRETCHY=13,MATRIX=14;var symbols=[{input:"\s\svarepsilon",tag:"mi",output:"\su025B",ttype:CONST},{input:"\s\svarsigma",tag:"mi",output:"\su03C2",ttype:CONST},{input:"\s\svartheta",tag:"mi",output:"\su03D1",ttype:CONST},{input:"\s\svarphi",tag:"mi",output:"\su03D5",ttype:CONST},{input:"\s\svarpi",tag:"mi",output:"\su03D6",ttype:CONST},{input:"\s\svarrho",tag:"mi",output:"\su03F1",ttype:CONST},{input:"\s\salpha",tag:"mi",output:"\su03B1",ttype:CONST},{input:"\s\sbeta",tag:"mi",output:"\su03B2",ttype:CONST},{input:"\s\sgamma",tag:"mi",output:"\su03B3",ttype:CONST},{input:"\s\sdelta",tag:"mi",output:"\su03B4",ttype:CONST},{input:"\s\sepsilon",tag:"mi",output:"\su03B5",ttype:CONST},{input:"\s\szeta",tag:"mi",output:"\su03B6",ttype:CONST},{input:"\s\seta",tag:"mi",output:"\su03B7",ttype:CONST},{input:"\s\stheta",tag:"mi",output:"\su03B8",ttype:CONST},{input:"\s\siota",tag:"mi",output:"\su03B9",ttype:CONST},{input:"\s\skappa",tag:"mi",output:"\su03BA",ttype:CONST},{input:"\s\slambda",tag:"mi",output:"\su03BB",ttype:CONST},{input:"\s\smu",tag:"mi",output:"\su03BC",ttype:CONST},{input:"\s\snu",tag:"mi",output:"\su03BD",ttype:CONST},{input:"\s\sxi",tag:"mi",output:"\su03BE",ttype:CONST},{input:"\s\somicron",tag:"mi",output:"\su03BF",ttype:CONST},{input:"\s\spi",tag:"mi",output:"\su03C0",ttype:CONST},{input:"\s\srho",tag:"mi",output:"\su03C1",ttype:CONST},{input:"\s\ssigma",tag:"mi",output:"\su03C3",ttype:CONST},{input:"\s\stau",tag:"mi",output:"\su03C4",ttype:CONST},{input:"\s\supsilon",tag:"mi",output:"\su03C5",ttype:CONST},{input:"\s\sphi",tag:"mi",output:"\su03C6",ttype:CONST},{input:"\s\schi",tag:"mi",output:"\su03C7",ttype:CONST},{input:"\s\spsi",tag:"mi",output:"\su03C8",ttype:CONST},{input:"\s\somega",tag:"mi",output:"\su03C9",ttype:CONST},{input:"\s\sAlpha",tag:"mo",output:"\su0391",ttype:CONST},{input:"\s\sBeta",tag:"mo",output:"\su0392",ttype:CONST},{input:"\s\sGamma",tag:"mo",output:"\su0393",ttype:CONST},{input:"\s\sDelta",tag:"mo",output:"\su0394",ttype:CONST},{input:"\s\sEpsilon",tag:"mo",output:"\su0395",ttype:CONST},{input:"\s\sZeta",tag:"mo",output:"\su0396",ttype:CONST},{input:"\s\sEta",tag:"mo",output:"\su0397",ttype:CONST},{input:"\s\sTheta",tag:"mo",output:"\su0398",ttype:CONST},{input:"\s\sIota",tag:"mo",output:"\su0399",ttype:CONST},{input:"\s\sKappa",tag:"mo",output:"\su039A",ttype:CONST},{input:"\s\sLambda",tag:"mo",output:"\su039B",ttype:CONST},{input:"\s\sMu",tag:"mo",output:"\su039C",ttype:CONST},{input:"\s\sNu",tag:"mo",output:"\su039D",ttype:CONST},{input:"\s\sXi",tag:"mo",output:"\su039E",ttype:CONST},{input:"\s\sOmicron",tag:"mo",output:"\su039F",ttype:CONST},{input:"\s\sPi",tag:"mo",output:"\su03A0",ttype:CONST},{input:"\s\sRho",tag:"mo",output:"\su03A1",ttype:CONST},{input:"\s\sSigma",tag:"mo",output:"\su03A3",ttype:CONST},{input:"\s\sTau",tag:"mo",output:"\su03A4",ttype:CONST},{input:"\s\sUpsilon",tag:"mo",output:"\su03A5",ttype:CONST},{input:"\s\sPhi",tag:"mo",output:"\su03A6",ttype:CONST},{input:"\s\sChi",tag:"mo",output:"\su03A7",ttype:CONST},{input:"\s\sPsi",tag:"mo",output:"\su03A8",ttype:CONST},{input:"\s\sOmega",tag:"mo",output:"\su03A9",ttype:CONST},{input:"\s\sfrac12",tag:"mo",output:"\su00BD",ttype:CONST},{input:"\s\sfrac14",tag:"mo",output:"\su00BC",ttype:CONST},{input:"\s\sfrac34",tag:"mo",output:"\su00BE",ttype:CONST},{input:"\s\sfrac13",tag:"mo",output:"\su2153",ttype:CONST},{input:"\s\sfrac23",tag:"mo",output:"\su2154",ttype:CONST},{input:"\s\sfrac15",tag:"mo",output:"\su2155",ttype:CONST},{input:"\s\sfrac25",tag:"mo",output:"\su2156",ttype:CONST},{input:"\s\sfrac35",tag:"mo",output:"\su2157",ttype:CONST},{input:"\s\sfrac45",tag:"mo",output:"\su2158",ttype:CONST},{input:"\s\sfrac16",tag:"mo",output:"\su2159",ttype:CONST},{input:"\s\sfrac56",tag:"mo",output:"\su215A",ttype:CONST},{input:"\s\sfrac18",tag:"mo",output:"\su215B",ttype:CONST},{input:"\s\sfrac38",tag:"mo",output:"\su215C",ttype:CONST},{input:"\s\sfrac58",tag:"mo",output:"\su215D",ttype:CONST},{input:"\s\sfrac78",tag:"mo",output:"\su215E",ttype:CONST},{input:"\s\spm",tag:"mo",output:"\su00B1",ttype:CONST},{input:"\s\smp",tag:"mo",output:"\su2213",ttype:CONST},{input:"\s\striangleleft",tag:"mo",output:"\su22B2",ttype:CONST},{input:"\s\striangleright",tag:"mo",output:"\su22B3",ttype:CONST},{input:"\s\scdot",tag:"mo",output:"\su22C5",ttype:CONST},{input:"\s\sstar",tag:"mo",output:"\su22C6",ttype:CONST},{input:"\s\sast",tag:"mo",output:"\su002A",ttype:CONST},{input:"\s\stimes",tag:"mo",output:"\su00D7",ttype:CONST},{input:"\s\sdiv",tag:"mo",output:"\su00F7",ttype:CONST},{input:"\s\scirc",tag:"mo",output:"\su2218",ttype:CONST},{input:"\s\sbullet",tag:"mo",output:"\su2022",ttype:CONST},{input:"\s\soplus",tag:"mo",output:"\su2295",ttype:CONST},{input:"\s\sominus",tag:"mo",output:"\su2296",ttype:CONST},{input:"\s\sotimes",tag:"mo",output:"\su2297",ttype:CONST},{input:"\s\sbigcirc",tag:"mo",output:"\su25CB",ttype:CONST},{input:"\s\soslash",tag:"mo",output:"\su2298",ttype:CONST},{input:"\s\sodot",tag:"mo",output:"\su2299",ttype:CONST},{input:"\s\sland",tag:"mo",output:"\su2227",ttype:CONST},{input:"\s\swedge",tag:"mo",output:"\su2227",ttype:CONST},{input:"\s\slor",tag:"mo",output:"\su2228",ttype:CONST},{input:"\s\svee",tag:"mo",output:"\su2228",ttype:CONST},{input:"\s\scap",tag:"mo",output:"\su2229",ttype:CONST},{input:"\s\scup",tag:"mo",output:"\su222A",ttype:CONST},{input:"\s\ssqcap",tag:"mo",output:"\su2293",ttype:CONST},{input:"\s\ssqcup",tag:"mo",output:"\su2294",ttype:CONST},{input:"\s\suplus",tag:"mo",output:"\su228E",ttype:CONST},{input:"\s\samalg",tag:"mo",output:"\su2210",ttype:CONST},{input:"\s\sbigtriangleup",tag:"mo",output:"\su25B3",ttype:CONST},{input:"\s\sbigtriangledown",tag:"mo",output:"\su25BD",ttype:CONST},{input:"\s\sdag",tag:"mo",output:"\su2020",ttype:CONST},{input:"\s\sdagger",tag:"mo",output:"\su2020",ttype:CONST},{input:"\s\sddag",tag:"mo",output:"\su2021",ttype:CONST},{input:"\s\sddagger",tag:"mo",output:"\su2021",ttype:CONST},{input:"\s\slhd",tag:"mo",output:"\su22B2",ttype:CONST},{input:"\s\srhd",tag:"mo",output:"\su22B3",ttype:CONST},{input:"\s\sunlhd",tag:"mo",output:"\su22B4",ttype:CONST},{input:"\s\sunrhd",tag:"mo",output:"\su22B5",ttype:CONST},{input:"\s\ssum",tag:"mo",output:"\su2211",ttype:UNDEROVER},{input:"\s\sprod",tag:"mo",output:"\su220F",ttype:UNDEROVER},{input:"\s\sbigcap",tag:"mo",output:"\su22C2",ttype:UNDEROVER},{input:"\s\sbigcup",tag:"mo",output:"\su22C3",ttype:UNDEROVER},{input:"\s\sbigwedge",tag:"mo",output:"\su22C0",ttype:UNDEROVER},{input:"\s\sbigvee",tag:"mo",output:"\su22C1",ttype:UNDEROVER},{input:"\s\sbigsqcap",tag:"mo",output:"\su2A05",ttype:UNDEROVER},{input:"\s\sbigsqcup",tag:"mo",output:"\su2A06",ttype:UNDEROVER},{input:"\s\scoprod",tag:"mo",output:"\su2210",ttype:UNDEROVER},{input:"\s\sbigoplus",tag:"mo",output:"\su2A01",ttype:UNDEROVER},{input:"\s\sbigotimes",tag:"mo",output:"\su2A02",ttype:UNDEROVER},{input:"\s\sbigodot",tag:"mo",output:"\su2A00",ttype:UNDEROVER},{input:"\s\sbiguplus",tag:"mo",output:"\su2A04",ttype:UNDEROVER},{input:"\s\sint",tag:"mo",output:"\su222B",ttype:CONST},{input:"\s\soint",tag:"mo",output:"\su222E",ttype:CONST},{input:":=",tag:"mo",output:":=",ttype:CONST},{input:"\s\slt",tag:"mo",output:"<",ttype:CONST},{input:"\s\sgt",tag:"mo",output:">",ttype:CONST},{input:"\s\sne",tag:"mo",output:"\su2260",ttype:CONST},{input:"\s\sneq",tag:"mo",output:"\su2260",ttype:CONST},{input:"\s\sle",tag:"mo",output:"\su2264",ttype:CONST},{input:"\s\sleq",tag:"mo",output:"\su2264",ttype:CONST},{input:"\s\sleqslant",tag:"mo",output:"\su2264",ttype:CONST},{input:"\s\sge",tag:"mo",output:"\su2265",ttype:CONST},{input:"\s\sgeq",tag:"mo",output:"\su2265",ttype:CONST},{input:"\s\sgeqslant",tag:"mo",output:"\su2265",ttype:CONST},{input:"\s\sequiv",tag:"mo",output:"\su2261",ttype:CONST},{input:"\s\sll",tag:"mo",output:"\su226A",ttype:CONST},{input:"\s\sgg",tag:"mo",output:"\su226B",ttype:CONST},{input:"\s\sdoteq",tag:"mo",output:"\su2250",ttype:CONST},{input:"\s\sprec",tag:"mo",output:"\su227A",ttype:CONST},{input:"\s\ssucc",tag:"mo",output:"\su227B",ttype:CONST},{input:"\s\spreceq",tag:"mo",output:"\su227C",ttype:CONST},{input:"\s\ssucceq",tag:"mo",output:"\su227D",ttype:CONST},{input:"\s\ssubset",tag:"mo",output:"\su2282",ttype:CONST},{input:"\s\ssupset",tag:"mo",output:"\su2283",ttype:CONST},{input:"\s\ssubseteq",tag:"mo",output:"\su2286",ttype:CONST},{input:"\s\ssupseteq",tag:"mo",output:"\su2287",ttype:CONST},{input:"\s\ssqsubset",tag:"mo",output:"\su228F",ttype:CONST},{input:"\s\ssqsupset",tag:"mo",output:"\su2290",ttype:CONST},{input:"\s\ssqsubseteq",tag:"mo",output:"\su2291",ttype:CONST},{input:"\s\ssqsupseteq",tag:"mo",output:"\su2292",ttype:CONST},{input:"\s\ssim",tag:"mo",output:"\su223C",ttype:CONST},{input:"\s\ssimeq",tag:"mo",output:"\su2243",ttype:CONST},{input:"\s\sapprox",tag:"mo",output:"\su2248",ttype:CONST},{input:"\s\scong",tag:"mo",output:"\su2245",ttype:CONST},{input:"\s\sJoin",tag:"mo",output:"\su22C8",ttype:CONST},{input:"\s\sbowtie",tag:"mo",output:"\su22C8",ttype:CONST},{input:"\s\sin",tag:"mo",output:"\su2208",ttype:CONST},{input:"\s\sni",tag:"mo",output:"\su220B",ttype:CONST},{input:"\s\sowns",tag:"mo",output:"\su220B",ttype:CONST},{input:"\s\spropto",tag:"mo",output:"\su221D",ttype:CONST},{input:"\s\svdash",tag:"mo",output:"\su22A2",ttype:CONST},{input:"\s\sdashv",tag:"mo",output:"\su22A3",ttype:CONST},{input:"\s\smodels",tag:"mo",output:"\su22A8",ttype:CONST},{input:"\s\sperp",tag:"mo",output:"\su22A5",ttype:CONST},{input:"\s\ssmile",tag:"mo",output:"\su2323",ttype:CONST},{input:"\s\sfrown",tag:"mo",output:"\su2322",ttype:CONST},{input:"\s\sasymp",tag:"mo",output:"\su224D",ttype:CONST},{input:"\s\snotin",tag:"mo",output:"\su2209",ttype:CONST},{input:"\s\sbegin{eqnarray}",output:"X",ttype:MATRIX,invisible:true},{input:"\s\sbegin{array}",output:"X",ttype:MATRIX,invisible:true},{input:"\s\s\s\s",output:"}&{",ttype:DEFINITION},{input:"\s\send{eqnarray}",output:"}}",ttype:DEFINITION},{input:"\s\send{array}",output:"}}",ttype:DEFINITION},{input:"\s\sbig",tag:"mo",output:"X",atval:"1.2",ttype:BIG},{input:"\s\sBig",tag:"mo",output:"X",atval:"1.8",ttype:BIG},{input:"\s\sbigg",tag:"mo",output:"X",atval:"2.3",ttype:BIG},{input:"\s\sBigg",tag:"mo",output:"X",atval:"2.9",ttype:BIG},{input:"\s\sleft",tag:"mo",output:"X",ttype:LEFTBRACKET},{input:"\s\sright",tag:"mo",output:"X",ttype:RIGHTBRACKET},{input:"{",output:"{",ttype:LEFTBRACKET,invisible:true},{input:"}",output:"}",ttype:RIGHTBRACKET,invisible:true},{input:"(",tag:"mo",output:"(",atval:"1",ttype:STRETCHY},{input:"[",tag:"mo",output:"[",atval:"1",ttype:STRETCHY},{input:"\s\slbrack",tag:"mo",output:"[",atval:"1",ttype:STRETCHY},{input:"\s\s{",tag:"mo",output:"{",atval:"1",ttype:STRETCHY},{input:"\s\slbrace",tag:"mo",output:"{",atval:"1",ttype:STRETCHY},{input:"\s\slangle",tag:"mo",output:"\su2329",atval:"1",ttype:STRETCHY},{input:"\s\slfloor",tag:"mo",output:"\su230A",atval:"1",ttype:STRETCHY},{input:"\s\slceil",tag:"mo",output:"\su2308",atval:"1",ttype:STRETCHY},{input:")",tag:"mo",output:")",rtag:"mi",atval:"1",ttype:STRETCHY},{input:"]",tag:"mo",output:"]",rtag:"mi",atval:"1",ttype:STRETCHY},{input:"\s\srbrack",tag:"mo",output:"]",rtag:"mi",atval:"1",ttype:STRETCHY},{input:"\s\s}",tag:"mo",output:"}",rtag:"mi",atval:"1",ttype:STRETCHY},{input:"\s\srbrace",tag:"mo",output:"}",rtag:"mi",atval:"1",ttype:STRETCHY},{input:"\s\srangle",tag:"mo",output:"\su232A",rtag:"mi",atval:"1",ttype:STRETCHY},{input:"\s\srfloor",tag:"mo",output:"\su230B",rtag:"mi",atval:"1",ttype:STRETCHY},{input:"\s\srceil",tag:"mo",output:"\su2309",rtag:"mi",atval:"1",ttype:STRETCHY},{input:"|",tag:"mo",output:"\su2223",atval:"1",ttype:STRETCHY},{input:"\s\s|",tag:"mo",output:"\su2225",atval:"1",ttype:STRETCHY},{input:"\s\svert",tag:"mo",output:"\su2223",atval:"1",ttype:STRETCHY},{input:"\s\sVert",tag:"mo",output:"\su2225",atval:"1",ttype:STRETCHY},{input:"\s\smid",tag:"mo",output:"\su2223",atval:"1",ttype:STRETCHY},{input:"\s\sparallel",tag:"mo",output:"\su2225",atval:"1",ttype:STRETCHY},{input:"/",tag:"mo",output:"/",atval:"1.01",ttype:STRETCHY},{input:"\s\sbackslash",tag:"mo",output:"\su2216",atval:"1",ttype:STRETCHY},{input:"\s\ssetminus",tag:"mo",output:"\s\s",ttype:CONST},{input:"\s\s!",tag:"mspace",atname:"width",atval:"-0.167em",ttype:SPACE},{input:"\s\s,",tag:"mspace",atname:"width",atval:"0.167em",ttype:SPACE},{input:"\s\s>",tag:"mspace",atname:"width",atval:"0.222em",ttype:SPACE},{input:"\s\s:",tag:"mspace",atname:"width",atval:"0.222em",ttype:SPACE},{input:"\s\s;",tag:"mspace",atname:"width",atval:"0.278em",ttype:SPACE},{input:"~",tag:"mspace",atname:"width",atval:"0.333em",ttype:SPACE},{input:"\s\squad",tag:"mspace",atname:"width",atval:"1em",ttype:SPACE},{input:"\s\sqquad",tag:"mspace",atname:"width",atval:"2em",ttype:SPACE},{input:"\s\sprime",tag:"mo",output:"\su2032",ttype:CONST},{input:"'",tag:"mo",output:"\su02B9",ttype:CONST},{input:"''",tag:"mo",output:"\su02BA",ttype:CONST},{input:"'''",tag:"mo",output:"\su2034",ttype:CONST},{input:"''''",tag:"mo",output:"\su2057",ttype:CONST},{input:"\s\sldots",tag:"mo",output:"\su2026",ttype:CONST},{input:"\s\scdots",tag:"mo",output:"\su22EF",ttype:CONST},{input:"\s\svdots",tag:"mo",output:"\su22EE",ttype:CONST},{input:"\s\sddots",tag:"mo",output:"\su22F1",ttype:CONST},{input:"\s\sforall",tag:"mo",output:"\su2200",ttype:CONST},{input:"\s\sexists",tag:"mo",output:"\su2203",ttype:CONST},{input:"\s\sRe",tag:"mo",output:"\su211C",ttype:CONST},{input:"\s\sIm",tag:"mo",output:"\su2111",ttype:CONST},{input:"\s\saleph",tag:"mo",output:"\su2135",ttype:CONST},{input:"\s\shbar",tag:"mo",output:"\su210F",ttype:CONST},{input:"\s\sell",tag:"mo",output:"\su2113",ttype:CONST},{input:"\s\swp",tag:"mo",output:"\su2118",ttype:CONST},{input:"\s\semptyset",tag:"mo",output:"\su2205",ttype:CONST},{input:"\s\sinfty",tag:"mo",output:"\su221E",ttype:CONST},{input:"\s\ssurd",tag:"mo",output:"\s\ssqrt{}",ttype:DEFINITION},{input:"\s\spartial",tag:"mo",output:"\su2202",ttype:CONST},{input:"\s\snabla",tag:"mo",output:"\su2207",ttype:CONST},{input:"\s\striangle",tag:"mo",output:"\su25B3",ttype:CONST},{input:"\s\stherefore",tag:"mo",output:"\su2234",ttype:CONST},{input:"\s\sangle",tag:"mo",output:"\su2220",ttype:CONST},{input:"\s\sdiamond",tag:"mo",output:"\su22C4",ttype:CONST},{input:"\s\sDiamond",tag:"mo",output:"\su25C7",ttype:CONST},{input:"\s\sneg",tag:"mo",output:"\su00AC",ttype:CONST},{input:"\s\slnot",tag:"mo",output:"\su00AC",ttype:CONST},{input:"\s\sbot",tag:"mo",output:"\su22A5",ttype:CONST},{input:"\s\stop",tag:"mo",output:"\su22A4",ttype:CONST},{input:"\s\ssquare",tag:"mo",output:"\su25AB",ttype:CONST},{input:"\s\sBox",tag:"mo",output:"\su25A1",ttype:CONST},{input:"\s\swr",tag:"mo",output:"\su2240",ttype:CONST},{input:"\s\sarccos",tag:"mi",output:"arccos",ttype:UNARY,func:true},{input:"\s\sarcsin",tag:"mi",output:"arcsin",ttype:UNARY,func:true},{input:"\s\sarctan",tag:"mi",output:"arctan",ttype:UNARY,func:true},{input:"\s\sarg",tag:"mi",output:"arg",ttype:UNARY,func:true},{input:"\s\scos",tag:"mi",output:"cos",ttype:UNARY,func:true},{input:"\s\scosh",tag:"mi",output:"cosh",ttype:UNARY,func:true},{input:"\s\scot",tag:"mi",output:"cot",ttype:UNARY,func:true},{input:"\s\scoth",tag:"mi",output:"coth",ttype:UNARY,func:true},{input:"\s\scsc",tag:"mi",output:"csc",ttype:UNARY,func:true},{input:"\s\sdeg",tag:"mi",output:"deg",ttype:UNARY,func:true},{input:"\s\sdet",tag:"mi",output:"det",ttype:UNARY,func:true},{input:"\s\sdim",tag:"mi",output:"dim",ttype:UNARY,func:true},{input:"\s\sexp",tag:"mi",output:"exp",ttype:UNARY,func:true},{input:"\s\sgcd",tag:"mi",output:"gcd",ttype:UNARY,func:true},{input:"\s\shom",tag:"mi",output:"hom",ttype:UNARY,func:true},{input:"\s\sinf",tag:"mo",output:"inf",ttype:UNDEROVER},{input:"\s\sker",tag:"mi",output:"ker",ttype:UNARY,func:true},{input:"\s\slg",tag:"mi",output:"lg",ttype:UNARY,func:true},{input:"\s\slim",tag:"mo",output:"lim",ttype:UNDEROVER},{input:"\s\sliminf",tag:"mo",output:"liminf",ttype:UNDEROVER},{input:"\s\slimsup",tag:"mo",output:"limsup",ttype:UNDEROVER},{input:"\s\sln",tag:"mi",output:"ln",ttype:UNARY,func:true},{input:"\s\slog",tag:"mi",output:"log",ttype:UNARY,func:true},{input:"\s\smax",tag:"mo",output:"max",ttype:UNDEROVER},{input:"\s\smin",tag:"mo",output:"min",ttype:UNDEROVER},{input:"\s\sPr",tag:"mi",output:"Pr",ttype:UNARY,func:true},{input:"\s\ssec",tag:"mi",output:"sec",ttype:UNARY,func:true},{input:"\s\ssin",tag:"mi",output:"sin",ttype:UNARY,func:true},{input:"\s\ssinh",tag:"mi",output:"sinh",ttype:UNARY,func:true},{input:"\s\ssup",tag:"mo",output:"sup",ttype:UNDEROVER},{input:"\s\stan",tag:"mi",output:"tan",ttype:UNARY,func:true},{input:"\s\stanh",tag:"mi",output:"tanh",ttype:UNARY,func:true},{input:"\s\sgets",tag:"mo",output:"\su2190",ttype:CONST},{input:"\s\sleftarrow",tag:"mo",output:"\su2190",ttype:CONST},{input:"\s\sto",tag:"mo",output:"\su2192",ttype:CONST},{input:"\s\srightarrow",tag:"mo",output:"\su2192",ttype:CONST},{input:"\s\sleftrightarrow",tag:"mo",output:"\su2194",ttype:CONST},{input:"\s\suparrow",tag:"mo",output:"\su2191",ttype:CONST},{input:"\s\sdownarrow",tag:"mo",output:"\su2193",ttype:CONST},{input:"\s\supdownarrow",tag:"mo",output:"\su2195",ttype:CONST},{input:"\s\sLeftarrow",tag:"mo",output:"\su21D0",ttype:CONST},{input:"\s\sRightarrow",tag:"mo",output:"\su21D2",ttype:CONST},{input:"\s\sLeftrightarrow",tag:"mo",output:"\su21D4",ttype:CONST},{input:"\s\siff",tag:"mo",output:"~\s\sLongleftrightarrow~",ttype:DEFINITION},{input:"\s\sUparrow",tag:"mo",output:"\su21D1",ttype:CONST},{input:"\s\sDownarrow",tag:"mo",output:"\su21D3",ttype:CONST},{input:"\s\sUpdownarrow",tag:"mo",output:"\su21D5",ttype:CONST},{input:"\s\smapsto",tag:"mo",output:"\su21A6",ttype:CONST},{input:"\s\slongleftarrow",tag:"mo",output:"\su27F5",ttype:CONST},{input:"\s\slongrightarrow",tag:"mo",output:"\su27F6",ttype:CONST},{input:"\s\slongleftrightarrow",tag:"mo",output:"\su27F7",ttype:CONST},{input:"\s\sLongleftarrow",tag:"mo",output:"\su27F8",ttype:CONST},{input:"\s\sLongrightarrow",tag:"mo",output:"\su27F9",ttype:CONST},{input:"\s\sLongleftrightarrow",tag:"mo",output:"\su27FA",ttype:CONST},{input:"\s\slongmapsto",tag:"mo",output:"\su27FC",ttype:CONST},{input:"\s\ssqrt",tag:"msqrt",output:"sqrt",ttype:UNARY},{input:"\s\sroot",tag:"mroot",output:"root",ttype:BINARY},{input:"\s\sfrac",tag:"mfrac",output:"/",ttype:BINARY},{input:"\s\sbfrac",tag:"mfrac",output:"/",ttype:BINARY},{input:"\s\sstackrel",tag:"mover",output:"stackrel",ttype:BINARY},{input:"\s\satop",tag:"mfrac",output:"",ttype:INFIX},{input:"\s\schoose",tag:"mfrac",output:"",ttype:INFIX},{input:"\s\sover",tag:"mfrac",output:"/",ttype:INFIX},{input:"_",tag:"msub",output:"_",ttype:INFIX},{input:"^",tag:"msup",output:"^",ttype:INFIX},{input:"\s\smbox",tag:"mtext",output:"mbox",ttype:TEXT},{input:"\s\sacute",tag:"mover",output:"\su00B4",ttype:UNARY,acc:true},{input:"\s\sgrave",tag:"mover",output:"\su0060",ttype:UNARY,acc:true},{input:"\s\sbreve",tag:"mover",output:"\su02D8",ttype:UNARY,acc:true},{input:"\s\scheck",tag:"mover",output:"\su02C7",ttype:UNARY,acc:true},{input:"\s\sdot",tag:"mover",output:".",ttype:UNARY,acc:true},{input:"\s\sddot",tag:"mover",output:"..",ttype:UNARY,acc:true},{input:"\s\smathring",tag:"mover",output:"\su00B0",ttype:UNARY,acc:true},{input:"\s\svec",tag:"mover",output:"\su2192",ttype:UNARY,acc:true},{input:"\s\soverrightarrow",tag:"mover",output:"\su2192",ttype:UNARY,acc:true},{input:"\s\soverleftarrow",tag:"mover",output:"\su2190",ttype:UNARY,acc:true},{input:"\s\shat",tag:"mover",output:"\su005E",ttype:UNARY,acc:true},{input:"\s\swidehat",tag:"mover",output:"\su0302",ttype:UNARY,acc:true},{input:"\s\stilde",tag:"mover",output:"~",ttype:UNARY,acc:true},{input:"\s\swidetilde",tag:"mover",output:"\su02DC",ttype:UNARY,acc:true},{input:"\s\sbar",tag:"mover",output:"\su203E",ttype:UNARY,acc:true},{input:"\s\soverbrace",tag:"mover",output:"\su23B4",ttype:UNARY,acc:true},{input:"\s\soverline",tag:"mover",output:"\su00AF",ttype:UNARY,acc:true},{input:"\s\sunderbrace",tag:"munder",output:"\su23B5",ttype:UNARY,acc:true},{input:"\s\sunderline",tag:"munder",output:"\su00AF",ttype:UNARY,acc:true},{input:"\s\sdisplaystyle",tag:"mstyle",atname:"displaystyle",atval:"true",ttype:UNARY},{input:"\s\stextstyle",tag:"mstyle",atname:"displaystyle",atval:"false",ttype:UNARY},{input:"\s\sscriptstyle",tag:"mstyle",atname:"scriptlevel",atval:"1",ttype:UNARY},{input:"\s\sscriptscriptstyle",tag:"mstyle",atname:"scriptlevel",atval:"2",ttype:UNARY},{input:"\s\smathrm",tag:"mtext",output:"text",ttype:TEXT},{input:"\s\stextrm",tag:"mtext",output:"text",ttype:TEXT},{input:"\s\smathbf",tag:"mstyle",atname:"mathvariant",atval:"bold",ttype:UNARY},{input:"\s\stextbf",tag:"mstyle",atname:"mathvariant",atval:"bold",ttype:UNARY},{input:"\s\smathit",tag:"mstyle",atname:"mathvariant",atval:"italic",ttype:UNARY},{input:"\s\stextit",tag:"mstyle",atname:"mathvariant",atval:"italic",ttype:UNARY},{input:"\s\smathtt",tag:"mstyle",atname:"mathvariant",atval:"monospace",ttype:UNARY},{input:"\s\stexttt",tag:"mstyle",atname:"mathvariant",atval:"monospace",ttype:UNARY},{input:"\s\smathsf",tag:"mstyle",atname:"mathvariant",atval:"sans-serif",ttype:UNARY},{input:"\s\smathbb",tag:"mstyle",atname:"mathvariant",atval:"double-struck",ttype:UNARY,codes:bbb},{input:"\s\smathcal",tag:"mstyle",atname:"mathvariant",atval:"script",ttype:UNARY,codes:cal},{input:"\s\smathfrak",tag:"mstyle",atname:"mathvariant",atval:"fraktur",ttype:UNARY,codes:frk}];var names=[];var mathVariant="italic";if(!document.createElementNS){document.createElementNS=function(link,type){return this.createElement(type)}}function compareNames(x,y){if(x.input>y.input){return 1}else{return -1}}function refreshSymbols(){var len=symbols.length;symbols.sort(compareNames);for(var i=0;i<len;i++){names[i]=symbols[i].input}}function strim(str,n){return $.trim(str.slice(n))}function createElementXHTML(elType){return document.createElementNS("http://www.w3.org/1999/xhtml",elType)}function position(str,n){var pos=$.inArray(str,names.slice(n));if(pos<0){var narr=names.concat([str]);narr.sort();pos=$.inArray(str,narr.slice(n))}return n+pos}function getSymbol(str){var k=0;var j=0;var mk;var st;var tagst;var match="";var more=true;var sLen=str.length;for(var i=1;i<=sLen&&more;i++){st=str.slice(0,i);j=k;k=position(st,j);if(k<names.length&&str.slice(0,names[k].length)==names[k]){match=names[k];mk=k;i=match.length}more=k<names.length&&str.slice(0,names[k].length)>=names[k]}if(match!==""){return symbols[mk]}k=1;st=str.slice(0,1);if("0"<=st&&st<="9"){tagst="mn"}else{tagst=(("A">st||st>"Z")&&("a">st||st>"z")?"mo":"mi")}return{input:st,tag:tagst,output:st,ttype:CONST}}function parseSexpr(str){var symbol,node,result,result2,i,st,newFrag=document.createDocumentFragment();var ch,newst,text="";symbol=getSymbol(str);if(symbol===null||symbol.ttype==RIGHTBRACKET){return[null,str,null]}if(symbol.ttype==DEFINITION){str=symbol.output+strim(str,symbol.input.length);symbol=getSymbol(str);if(symbol===null||symbol.ttype==RIGHTBRACKET){return[null,str,null]}}if(symbol.ttype==CONST&&symbol.tag=="mi"&&str!=""){while(symbol.ttype==CONST&&symbol.tag=="mi"&&str!=""){text+=symbol.output;str=strim(str,symbol.input.length);symbol=getSymbol(str)}node=createMmlNode("mi",document.createTextNode(text));node.setAttribute("mathvariant",mathVariant);return[node,str,"mi"]}else{str=strim(str,symbol.input.length)}switch(symbol.ttype){case SPACE:node=createMmlNode(symbol.tag);node.setAttribute(symbol.atname,symbol.atval);return[node,str,symbol.tag];case UNDEROVER:return[createMmlNode(symbol.tag,document.createTextNode(symbol.output)),str,symbol.tag];case CONST:node=createMmlNode(symbol.tag,document.createTextNode(symbol.output));return[node,str,symbol.tag];case STRETCHY:node=createMmlNode(symbol.tag,document.createTextNode(symbol.output));if(symbol.input=="|"||symbol.input=="\s\svert"||symbol.input=="\s\s|"||symbol.input=="\s\sVert"){node.setAttribute("lspace","0em");node.setAttribute("rspace","0em")}node.setAttribute("maxsize",symbol.atval);if(symbol.rtag!==null){return[node,str,symbol.rtag]}else{return[node,str,symbol.tag]}break;case BIG:var atval=symbol.atval;symbol=getSymbol(str);if(symbol===null){return[null,str,null]}str=strim(str,symbol.input.length);node=createMmlNode(symbol.tag,document.createTextNode(symbol.output));node.setAttribute("minsize",atval);node.setAttribute("maxsize",atval);return[node,str,symbol.tag];case LEFTBRACKET:if(symbol.input=="\s\sleft"){symbol=getSymbol(str);if(symbol!==null){if(symbol.input=="."){symbol.invisible=true}str=strim(str,symbol.input.length)}}result=parseExpr(str,true,false);if(symbol===null||(typeof symbol.invisible=="boolean"&&symbol.invisible)){node=createMmlNode("mrow",result[0])}else{node=createMmlNode("mo",document.createTextNode(symbol.output));node=createMmlNode("mrow",node);node.appendChild(result[0])}return[node,result[1],result[2]];case MATRIX:if(symbol.input=="\s\sbegin{array}"){var mask="";symbol=getSymbol(str);str=$.trim(str);if(symbol===null){mask="l"}else{str=strim(str,symbol.input.length);if(symbol.input!="{"){mask="l"}else{do{symbol=getSymbol(str);if(symbol!==null){str=strim(str,symbol.input.length);if(symbol.input!="}"){mask=mask+symbol.input}}}while(symbol!==null&&symbol.input!==""&&symbol.input!="}")}}result=parseExpr("{"+str,true,true);node=createMmlNode("mtable",result[0]);mask=mask.replace(/l/g,"left ");mask=mask.replace(/r/g,"right ");mask=mask.replace(/c/g,"center ");node.setAttribute("columnalign",mask);node.setAttribute("displaystyle","false");return[node,result[1],null]}else{result=parseExpr("{"+str,true,true);node=createMmlNode("mtable",result[0]);node.setAttribute("columnalign","right center left");node.setAttribute("displaystyle","true");node=createMmlNode("mrow",node);return[node,result[1],null]}break;case TEXT:if(str.charAt(0)=="{"){i=str.indexOf("}")}else{i=0}if(i==-1){i=str.length}st=str.slice(1,i);node=createMmlNode(symbol.tag,document.createTextNode(st));newFrag.appendChild(node);str=strim(str,i+1);return[createMmlNode("mrow",newFrag),str,null];case UNARY:if(symbol.atname=="mathvariant"){mathVariant=symbol.atval}result=parseSexpr(str);if(result[0]===null){return[createMmlNode(symbol.tag,document.createTextNode(symbol.output)),str]}if(typeof symbol.func=="boolean"&&symbol.func){st=str.charAt(0);if(st=="^"||st=="_"||st==","){return[createMmlNode(symbol.tag,document.createTextNode(symbol.output)),str,symbol.tag]}else{node=createMmlNode("mrow",createMmlNode(symbol.tag,document.createTextNode(symbol.output)));node.appendChild(result[0]);return[node,result[1],symbol.tag]}}if(symbol.input=="\s\ssqrt"){return[createMmlNode(symbol.tag,result[0]),result[1],symbol.tag]}else{if(typeof symbol.acc=="boolean"&&symbol.acc){node=createMmlNode(symbol.tag,result[0]);var output=symbol.output;var node1=createMmlNode("mo",document.createTextNode(output));if(symbol.input=="\s\svec"||symbol.input=="\s\scheck"){node1.setAttribute("maxsize","1.2")}if(symbol.input=="\s\sunderbrace"||symbol.input=="\s\sunderline"){node1.setAttribute("accentunder","true")}else{node1.setAttribute("accent","true")}node.appendChild(node1);if(symbol.input=="\s\soverbrace"||symbol.input=="\s\sunderbrace"){node.ttype=UNDEROVER}return[node,result[1],symbol.tag]}else{if(typeof symbol.codes!="undefined"){for(i=0;i<result[0].childNodes.length;i++){if(result[0].childNodes[i].nodeName=="mi"||result[0].nodeName=="mi"){st=(result[0].nodeName=="mi"?result[0].firstChild.nodeValue:result[0].childNodes[i].firstChild.nodeValue);newst="";for(var j=0;j<st.length;j++){ch=st.charCodeAt(j);if(ch>64&&ch<91){newst=newst+symbol.codes[ch-65]}else{if(ch>96&&ch<123){newst=newst+symbol.codes[ch-71]}}}if(result[0].nodeName=="mi"){result[0]=createMmlNode("mo").appendChild(document.createTextNode(newst))}else{result[0].replaceChild(createMmlNode("mo").appendChild(document.createTextNode(newst)),result[0].childNodes[i])}}}}node=createMmlNode(symbol.tag,result[0]);node.setAttribute(symbol.atname,symbol.atval);if(symbol.input=="\s\sscriptstyle"||symbol.input=="\s\sscriptscriptstyle"){node.setAttribute("displaystyle","false")}return[node,result[1],symbol.tag]}}break;case BINARY:result=parseSexpr(str);if(result[0]===null){return[createMmlNode("mo",document.createTextNode(symbol.input)),str,null]}result2=parseSexpr(result[1]);if(result2[0]===null){return[createMmlNode("mo",document.createTextNode(symbol.input)),str,null]}if(symbol.input=="\s\sroot"||symbol.input=="\s\sstackrel"){newFrag.appendChild(result2[0])}newFrag.appendChild(result[0]);if(symbol.input=="\s\sfrac"||symbol.input=="\s\sbfrac"){newFrag.appendChild(result2[0])}node=createMmlNode(symbol.tag,newFrag);if(symbol.input=="\s\sbfrac"){node.setAttribute("bevelled","true")}return[node,result2[1],symbol.tag];case INFIX:str=strim(str,symbol.input.length);return[createMmlNode("mo",document.createTextNode(symbol.output)),str,symbol.tag];default:return[createMmlNode(symbol.tag,document.createTextNode(symbol.output)),str,symbol.tag]}}function parseIexpr(str){var symbol,sym1,sym2,node,result,tag,underover;sym1=getSymbol(str);result=parseSexpr(str);node=result[0];str=result[1];tag=result[2];symbol=getSymbol(str);if(symbol.ttype==INFIX){str=strim(str,symbol.input.length);result=parseSexpr(str);if(result[0]===null){result[0]=createMmlNode("mo",document.createTextNode("\su25A1"))}str=result[1];tag=result[2];if(symbol.input=="_"||symbol.input=="^"){sym2=getSymbol(str);tag=null;underover=((sym1.ttype==UNDEROVER)||(node.ttype==UNDEROVER));if((symbol.input=="_"&&sym2.input=="^")||(symbol.input=="^"&&sym2.input=="_")){str=strim(str,sym2.input.length);var res2=parseSexpr(str);str=res2[1];tag=res2[2];node=createMmlNode((underover?"munderover":"msubsup"),node);if(symbol.input=="_"){node.appendChild(result[0]);node.appendChild(res2[0])}else{node.appendChild(res2[0]);node.appendChild(result[0])}}else{if(symbol.input=="_"){node=createMmlNode((underover?"munder":"msub"),node);node.appendChild(result[0])}else{node=createMmlNode((underover?"mover":"msup"),node);node.appendChild(result[0])}}node=createMmlNode("mrow",node)}else{node=createMmlNode(symbol.tag,node);if(symbol.input=="\s\satop"||symbol.input=="\s\schoose"){node.setAttribute("linethickness","0ex")}node.appendChild(result[0]);if(symbol.input=="\s\schoose"){node=createMmlNode("mfenced",node)}}}return[node,str,tag]}function parseExpr(str,rightbracket,matrix){var symbol,node,result,i,tag,newFrag=document.createDocumentFragment();do{str=$.trim(str);result=parseIexpr(str);node=result[0];str=result[1];tag=result[2];symbol=getSymbol(str);if(node){if((tag=="mn"||tag=="mi")&&symbol!==null&&typeof symbol.func=="boolean"&&symbol.func){var space=createMmlNode("mspace");space.setAttribute("width","0.167em");node=createMmlNode("mrow",node);node.appendChild(space)}if(tag=="mstyle"){mathVariant="italic"}newFrag.appendChild(node)}}while((symbol.ttype!=RIGHTBRACKET)&&symbol!==null&&symbol.output!=="");tag=null;if(symbol.ttype==RIGHTBRACKET){if(symbol.input=="\s\sright"){str=strim(str,symbol.input.length);symbol=getSymbol(str);if(symbol!==null&&symbol.input=="."){symbol.invisible=true}if(symbol!==null){tag=symbol.rtag}}if(symbol!==null){str=strim(str,symbol.input.length)}var len=newFrag.childNodes.length;if(matrix&&len>0&&newFrag.childNodes[len-1].nodeName=="mrow"){var pos=[];var m=newFrag.childNodes.length;for(i=0;matrix&&i<m;i=i+2){pos[i]=[];node=newFrag.childNodes[i];for(var j=0;j<node.childNodes.length;j++){if(node.childNodes[j].firstChild&&node.childNodes[j].firstChild.nodeValue=="&"){pos[i][pos[i].length]=j}}}var row,frag,n,k,table=document.createDocumentFragment();for(i=0;i<m;i=i+2){row=document.createDocumentFragment();frag=document.createDocumentFragment();node=newFrag.firstChild;n=node.childNodes.length;k=0;for(j=0;j<n;j++){if(typeof pos[i][k]!="undefined"&&j==pos[i][k]){node.removeChild(node.firstChild);row.appendChild(createMmlNode("mtd",frag));k++}else{frag.appendChild(node.firstChild)}}row.appendChild(createMmlNode("mtd",frag));if(newFrag.childNodes.length>2){newFrag.removeChild(newFrag.firstChild);newFrag.removeChild(newFrag.firstChild)}table.appendChild(createMmlNode("mtr",row))}return[table,str]}if(typeof symbol.invisible!="boolean"||!symbol.invisible){node=createMmlNode("mo",document.createTextNode(symbol.output));newFrag.appendChild(node)}}return[newFrag,str,tag]}function createMmlNode(t,frag){var node=document.createElementNS("http://www.w3.org/1998/Math/MathML",t);if(frag){$(node).append(frag)}return node}var SVG,canvas;var collection=[];function createSVGElement(elType){return document.createElementNS("http://www.w3.org/2000/svg",elType)}function getSVGElement(id,el){var res={node:null,newEl:false};if(id){id=SVG.id+"_"+id;res.node=$("#"+id)[0]}if(!res.node){res.node=createSVGElement(el);if(id){res.node.id=id}res.newEl=true}return res}function openGroup(id,clear){var newEl=getSVGElement(id,"g");appendSVG(newEl);canvas=$("#"+SVG.id+"_"+id)[0];if(clear){$(canvas).empty()}}function closeGroup(){canvas=$("#"+SVG.id+"_Canvas")[0]}function appendSVG(elmt){if(elmt.newEl){$(canvas).append(elmt.node)}}function addButton(parent,text,title,func,id){var node=createElementXHTML("span");node.className="svgButton";node.title=title;node.onclick=func;if(id){node.id=id}$(node).append(text);$(node).css({paddingRight:"0.5em",paddingLeft:"0.5em",fontSize:"1em",fontFamily:"monospace",background:"blue",color:"yellow",cursor:"pointer"});$(node).mouseover(function(){$(this).css({background:"yellow",color:"blue"})});$(node).mouseout(function(){$(this).css({background:"blue",color:"yellow"})});$(parent).append(node);return parent}function pictureAttributes(){this.id=null;this.stroke="blue";this.strokewidth=1;this.strokeopacity=1;this.strokedasharray="none";this.fill="none";this.fillopacity=1;this.fixed=false;this.fontstyle="normal";this.fontfamily="serif";this.fontweight="normal";this.fontsize=12;this.fontstroke="none";this.fontstrokewidth=1;this.fontstrokeopacity=1;this.fontstrokedasharray="none";this.fontfill="black";this.fontfillopacity=1;this.sector=false;this.largearc=0;this.marker="o";this.orient="auto";this.size=8;this.units="userSpaceOnUse";this.markerstroke="blue";this.markerstrokewidth=1;this.markerstrokeopacity=1;this.markerstrokedasharray="none";this.markerfill="none";this.markerfillopacity=1;this.sweep=0;this.rx=0;this.ry=0;this.closed=false;this.curve="";this.direction=[1,0];this.ticklabels="";this.pos="";this.points=200;this.backgroundcolor="none";this.backgroundopacity=1}function pictureObject(){this.id=null;this.src="";this.width=320;this.height=null;this.factor=1;this.xmin=-5;this.xmax=5;this.ymin=null;this.ymax=null;this.xunitlength=null;this.yunitlength=null;this.origin=[0,0];this.mouse=[null,null];this.coords="cartesian";this.drag=null;this.pan=true;this.locked=false;this.attr=new pictureAttributes()}function drawPicture(){$(canvas).empty();$("#"+SVG.id+" .svgMarker").remove();SVG.attr=new pictureAttributes();try{this.code=function(){with(Math){eval(SVG.src)}}();this.code=null}catch(err){var errstr;if(typeof err=="object"){errstr=err.name+" "+err.message+" "+err.number+" "+err.description}else{errstr=err}alert(errstr+"\sn"+SVG.src)}collection[SVG.id]=SVG}function setOptions(atr){for(var i in atr){SVG.attr[i]=atr[i]}}function getOptions(attr,options,prefix){var pref=prefix||"";if(typeof attr=="string"){return(options[pref+attr]==undefined?SVG.attr[pref+attr]:options[pref+attr])}else{var i,newAttr={},len=attr.length,item;for(i=0;i<len;i++){item=attr[i];newAttr[item]=options[pref+item]==undefined?SVG.attr[pref+item]:options[pref+item]}return newAttr}}function setAction(evt,fn,id){if(!$.isFunction(fn)){return}var node=id?$("#"+SVG.id+"_"+id):$("#"+SVG.id);$(node).bind(evt,fn)}function getAngle(p){p=p||[0,0];var res=Math.atan2(SVG.mouse[1]-p[1],SVG.mouse[0]-p[0]);res=(res<0)?res+2*Math.PI:res;return res}function getDistance(p){p=p||[0,0];return Math.sqrt(Math.pow(SVG.mouse[0]-p[0],2)+Math.pow(SVG.mouse[1]-p[1],2))}function updateButton(){var obj=$("#SVGtoolbar #SVGupdateButton");if(obj.text()=="Edit"){obj.text("Update");obj.attr("title","Update picture");$("#SVGsrc").val(SVG.src).css("display","block")}else{SVG.src=$("#SVGsrc").val();drawPicture()}}function closeEditor(){$("#SVGtoolbar").slideUp();$("#SVGsrc").val("");SVG.locked=false}function switchTo(evt){var name=evt.currentTarget.id;if(SVG.id==name||SVG.locked){return false}SVG=collection[name];canvas=$("#"+SVG.id+"_Canvas")[0];return false}function onWheel(evt){if(SVG.locked){return false}evt=evt||window.event;var factor=1;evt.preventDefault();evt.stopPropagation();if(evt.wheelDelta){factor=(evt.wheelDelta>0)?0.8:1.25}else{if(evt.detail){factor=(evt.detail<0)?0.8:1.25}}if(evt.altKey){resize(factor)}else{zoom(factor)}return false}function onClick(evt){if(SVG.locked){return false}if(evt.button===0){if(evt.shiftKey){$("#SVGtoolbar #SVGupdateButton").text("Update");$("#SVGsrc").val(SVG.src);$("#SVGtoolbar").css({top:evt.pageY,left:evt.pageX}).slideDown();SVG.locked=true;evt.stopImmediatePropagation()}else{if(SVG.pan){SVG.drag=[evt.clientX,evt.clientY];document.body.style.cursor="move"}}}return false}function onDrop(evt){if(SVG.drag==null){return false}document.body.style.cursor="default";var xlen=(SVG.drag[0]-evt.clientX)/SVG.xunitlength;var ylen=(-SVG.drag[1]+evt.clientY)/SVG.yunitlength;SVG.drag=null;if(xlen!=0||ylen!=0){setScales([SVG.xmin+xlen,SVG.xmax+xlen,SVG.ymin+ylen,SVG.ymax+ylen])}return false}function setScales(scales){if(scales){SVG.xmin=scales[0];SVG.xmax=scales[1];SVG.ymin=scales[2];SVG.ymax=scales[3]}SVG.xunitlength=SVG.width/(SVG.xmax-SVG.xmin);SVG.yunitlength=SVG.height/(SVG.ymax-SVG.ymin);SVG.origin=[-SVG.xmin*SVG.xunitlength,-SVG.ymin*SVG.yunitlength];drawPicture()}function getScales(scales){scales=scales||[];var res=[null,null,null,null,0];if(scales.length==0){res[0]=SVG.xmin;res[1]=SVG.xmax}if(scales.length>1){if(typeof scales[0]=="number"&&typeof scales[1]=="number"&&scales[1]>scales[0]){res[0]=scales[0];res[1]=scales[1];res[4]=4}else{res[0]=SVG.xmin;res[1]=SVG.xmax}}if(scales.length==4){if(typeof scales[2]=="number"&&typeof scales[3]=="number"&&scales[3]>scales[2]){res[2]=scales[2];res[3]=scales[3];res[4]+=8}}return res}function resize(factor){SVG.factor=(SVG.factor*factor).toFixed(3);SVG.width/=factor;SVG.height/=factor;var picture=$("#"+SVG.id);picture.attr("width",SVG.width);picture.attr("height",SVG.height);var parent=picture[0].parentNode;if(parent.nodeName=="DIV"){parent.style.width=SVG.width+"px";parent.style.height=SVG.height+"px"}var node=$("#"+SVG.id+"ClipPath")[0].firstChild;$(node).attr("d","M0,0 "+SVG.width+",0 "+SVG.width+","+SVG.height+" 0,"+SVG.height);setScales()}function zoom(factor,center){var px,py;if(center){px=(SVG.xmax+SVG.xmin)*0.5;py=(SVG.ymax+SVG.ymin)*0.5}else{px=SVG.mouse[0];py=SVG.mouse[1]}SVG.factor=(SVG.factor*factor).toFixed(3);var dx=(SVG.xmax-SVG.xmin)*factor;var dy=(SVG.ymax-SVG.ymin)*factor;var xmin=(1-factor)*px+factor*SVG.xmin;var ymin=(1-factor)*py+factor*SVG.ymin;setScales([xmin,xmin+dx,ymin,ymin+dy])}function updateCartesianCoord(){if(!SVG.locked){$("#"+SVG.id+"_Coords").text("("+SVG.mouse[0].toFixed(2)+", "+SVG.mouse[1].toFixed(2)+")")}return false}function updatePolarCoord(){if(!SVG.locked){$("#"+SVG.id+"_Coords").text("("+getDistance().toFixed(2)+", "+getAngle().toFixed(2)+")")}return false}function getPosition(evt){var a=[null,null];var off=$(evt.currentTarget.parentNode).offset();a[0]=(evt.pageX-off.left-SVG.origin[0])/SVG.xunitlength;a[1]=(SVG.height-SVG.origin[1]-evt.pageY+off.top)/SVG.yunitlength;return a}function updatePosition(evt){SVG.mouse=getPosition(evt);return false}function removeCoord(){$("#"+SVG.id+"_Coords").text("");return false}function tracker(pos,options){options=options||{};var coords=options.coords||SVG.coords;var func=(coords=="polar")?updatePolarCoord:updateCartesianCoord;options.id="Coords";options.fixed=true;text(pos,"",options);setAction("mousemove",func);setAction("mouseout",removeCoord)}function exportSVG(){var svg="<?xml version='1.0' encoding='UTF-8' standalone='no'?>\sn";svg+=$("#"+SVG.id).parent().html();svg=svg.replace(/ /g,"");svg=svg.replace(/><(?!\s/)/g,">\sn<");$("#SVGtoolbar #SVGupdateButton").text("Edit").attr("title","Edit script");$("#SVGsrc").val(svg).css("display","block")}function toSVG(p){var x=p[0]*SVG.xunitlength+SVG.origin[0];var y=SVG.height-p[1]*SVG.yunitlength-SVG.origin[1];return[x,y]}function toSVGPair(p){var q=toSVG(p);return q[0]+" "+q[1]}function setStrokeAndFill(node,options,prefix){var attributes=["stroke","strokewidth","strokedasharray","strokeopacity","fill","fillopacity"];var attr=getOptions(attributes,options,prefix);var elem=$(node);elem.attr("stroke",attr.stroke);elem.attr("stroke-width",attr.strokewidth/SVG.factor);elem.attr("stroke-dasharray",attr.strokedasharray);elem.attr("stroke-opacity",attr.strokeopacity);elem.attr("fill",attr.fill);elem.attr("fill-opacity",attr.fillopacity)}function button(p,q,txt,action,options){options=options||{};options.id=(options.id||Math.randomString(8));rect(p,q,options);setAction("click",action,options.id);options.fill=null;options.fillopacity=1;options.id+="_t";text([(p[0]+q[0])*0.5,(p[1]+q[1])*0.5],txt,options);setAction("click",action,options.id)}function setMarkers(obj,options){var markerChars="o*sSx+<>|";var attributes=["marker","size","units","orient","markerstroke","markerstrokewidth","markerstrokeopacity"];var attr=getOptions(attributes,options);var node,node2,i,id,pos=["marker-start","marker-mid","marker-end"];var lim=attr.marker.length;for(i=0;i<lim;i++){var type=attr.marker.charAt(i);if(type=="-"||markerChars.indexOf(type)<0){continue}id=(options.id||Math.randomString(8))+"Marker_"+markerChars.indexOf(type);node=$("#"+SVG.id+"_"+id);if(node.length===0){node=$(getSVGElement(id,"marker").node);node.attr("class","svgMarker");node.attr("viewBox","0 0 10 10");node.attr("refX",5);node.attr("refY",5);node.attr("orient",attr.orient);node.attr("markerUnits",attr.units);switch(type){case"*":case"o":node2=$(createSVGElement("circle"));node2.attr("cx",5);node2.attr("cy",5);node2.attr("r",4);break;case">":node2=$(createSVGElement("path"));node2.attr("d","M0 0 L10 5 L0 10 z");node.attr("refX",10);break;case"<":node2=$(createSVGElement("path"));node2.attr("d","M10 0 L10 10 L0 5 z");node.attr("refX",0);break;case"x":node2=$(createSVGElement("path"));node2.attr("d","M0 0 L10 10 M0 10 L10 0");break;case"+":node2=$(createSVGElement("path"));node2.attr("d","M5 0 L5 10 M0 5 L10 5");break;case"|":node2=$(createSVGElement("path"));node2.attr("d","M5 0 L5 10");break;case"S":case"s":node2=$(createSVGElement("rect"));node2.attr("x",0);node2.attr("y",0);node2.attr("width",10);node2.attr("height",10)}setStrokeAndFill(node2,options,"marker");node2.attr("stroke-width",attr.markerstrokewidth);if("*<>S".indexOf(type)>-1){node2.attr("fill",attr.markerstroke);node2.attr("fill-opacity",attr.markerstrokeopacity)}node.append(node2);$("#"+SVG.id+"_Defs").append(node)}node.attr("markerWidth",attr.size/SVG.factor);node.attr("markerHeight",attr.size/SVG.factor);$(obj).attr(pos[i],"url(#"+SVG.id+"_"+id+")")}}function setLabels(p,options){var i,point=[0,0],pos;var label=(typeof options.label=="string")?[options.label]:options.label;var labelpos=getOptions("pos",options);labelpos=(typeof labelpos=="string")?[labelpos]:labelpos;var poslen=labelpos.length;var size=options.size||SVG.attr.size;var dx=(0.5*size/SVG.xunitlength)/SVG.factor;var dy=(0.5*size/SVG.yunitlength)/SVG.factor;for(i=0;i<label.length;i++){options.isLabel="_label"+i;point[0]=p[i][0];point[1]=p[i][1];pos=(poslen>i)?labelpos[i].toUpperCase():pos;if(/E/.test(pos)){point[0]+=dx}if(/W/.test(pos)){point[0]-=dx}if(/N/.test(pos)){point[1]+=dy}if(/S/.test(pos)){point[1]-=dy}options.pos=pos;text(point,label[i],options)}}function line(p,q,options){options=options||{};options.closed=false;options.curve="";path([p,q],options)}function dot(p,options){options=options||{};var direction=getOptions("direction",options);var q=[p[0]+direction[0]/SVG.xunitlength,p[1]+direction[1]/SVG.yunitlength];var st="M"+toSVGPair(p)+" "+toSVGPair(q);var elmt=getSVGElement(options.id,"path");var elem=$(elmt.node);elem.attr("d",st);elem.attr("stroke","none");setMarkers(elem,options);appendSVG(elmt);if(options.label){setLabels([p],options)}}function path(list,options,append){options=options||{};var i,elmt=getSVGElement(options.id,"path");var attr=getOptions(["curve","closed"],options);var len=list.length;if(len>0){var node=$(elmt.node);var st=(append&&!elmt.newEl)?elmt.node.getAttribute("d"):"";st+="M"+toSVGPair(list[0])+" "+attr.curve;for(i=1;i<len;i++){st+=toSVGPair(list[i])+" "}if(attr.closed){st+="Z"}node.attr("d",st);setStrokeAndFill(node,options);if(options.marker){setMarkers(node,options)}appendSVG(elmt);if(options.label){setLabels(list,options)}}}function rotate(id,angle,options){if(!id||!angle){return}var node=$("#"+SVG.id+"_"+id)[0];if(node){options=options||{};var center=options.center?toSVG(options.center):SVG.origin;angle=-angle*180/Math.PI;var transform=node.getAttribute("transform")||"";transform="rotate("+angle+" "+center+") "+(options.replace?"":transform);$(node).attr("transform",transform)}}function translate(id,delta,options){if(!id||!delta){return}var node=$("#"+SVG.id+"_"+id)[0];if(node){options=options||{};delta=toSVG(delta);var transform=node.getAttribute("transform")||"";transform="translate("+(delta[0]-SVG.origin[0])+" "+(SVG.origin[1]+delta[1]-SVG.height)+") "+(options.replace?"":transform);$(node).attr("transform",transform)}}function curve(list,options){options=options||{};options.curve=options.curve||"T";path(list,options)}function circle(center,radius,options){ellipse(center,radius,radius,options)}function loop(p,options){options=options||{};var d=options.direction||[1,0];options.curve="C";options.closed=false;path([p,[p[0]+d[0],p[1]+d[1]],[p[0]-d[1],p[1]+d[0]],p],options)}function arc(options){options=options||{};var start=options.start;var end=options.end;var center=options.center;var startangle=options.startangle;var endangle=options.endangle;var st="M",elmt=getSVGElement(options.id,"path");var attr=getOptions(["largearc","sweep","closed","sector"],options);var radius=options.radius;if(center!=null&&startangle!=null&&endangle!=null&&radius!=null){start=[radius*Math.cos(startangle)+center[0],radius*Math.sin(startangle)+center[1]];end=[radius*Math.cos(endangle)+center[0],radius*Math.sin(endangle)+center[1]]}if(start==null||end==null){return}if(!radius){var v=[end[0]-start[0],end[1]-start[1]];radius=Math.sqrt(v[0]*v[0]+v[1]*v[1])}if(attr.sector){st+=toSVGPair(center)+" "}st+=toSVGPair(start)+" A"+radius*SVG.xunitlength+","+radius*SVG.yunitlength+" 0 "+attr.largearc+","+attr.sweep+" "+toSVGPair(end);if(attr.sector||attr.closed){st+=" z"}var node=$(elmt.node);node.attr("d",st);setStrokeAndFill(node,options);if(options.marker){setMarkers(node,options)}appendSVG(elmt);if(options.label){setLabels([start,end],options)}}function sector(options){if(!options.center||!options.startangle||!options.endangle||!options.radius){return}options.sector=true;arc(options)}function ellipse(center,rx,ry,options){options=options||{};var elmt=getSVGElement(options.id,"ellipse");center=toSVG(center);var node=$(elmt.node);node.attr("cx",center[0]);node.attr("cy",center[1]);node.attr("rx",rx*SVG.xunitlength);node.attr("ry",ry*SVG.yunitlength);setStrokeAndFill(node,options);appendSVG(elmt)}function polygon(list,options){options=options||{};options.closed=true;path(list,options)}function rect(p,q,options){options=options||{};var elmt=getSVGElement(options.id,"rect");var attr=getOptions(["rx","ry"],options);var node=$(elmt.node);node.attr("x",toSVG(p)[0]);node.attr("y",toSVG(q)[1]);node.attr("width",(q[0]-p[0])*SVG.xunitlength);node.attr("height",(q[1]-p[1])*SVG.yunitlength);node.attr("rx",attr.rx*SVG.xunitlength);node.attr("ry",attr.ry*SVG.yunitlength);setStrokeAndFill(node,options);appendSVG(elmt)}function text(p,st,options){options=options||{};var id=options.id;var attr=getOptions(["fontstyle","fontfamily","fontweight","fontfill","fontsize","fixed","pos"],options);if(id&&options.isLabel){id+=options.isLabel}var pos=attr.pos.toUpperCase();if(!attr.fixed){attr.fontsize/=SVG.factor}var elem,node,dx,dy,latex=false,str=$.trim(st.toString()),q=toSVG(p);if(str.charAt(0)=="$"){str=str.substr(1,str.length-2);latex=true}if(latex){if(p[0]>SVG.xmax||p[0]<SVG.xmin||p[1]>SVG.ymax||p[1]<SVG.ymin){return}node=createElementXHTML("div");node.style.position="absolute";node.style.left="-1000px";node.style.top="-1000px";$("body").append(node);var math=MSVG.parseMath(str,true,attr.fontsize+"px",attr.fontfill);var mathNode=$(node);mathNode.append($(math).clone());dx=-node.offsetWidth/2;dy=-node.offsetHeight/2;if(/N/.test(pos)){dy=-node.offsetHeight}if(/S/.test(pos)){dy=0}if(/E/.test(pos)){dx=0}if(/W/.test(pos)){dx=-node.offsetWidth}var width=mathNode.width(),height=mathNode.height();mathNode.remove();q[0]+=dx;q[1]+=dy;var elmt=getSVGElement(id,"foreignObject");elem=$(elmt.node);elem.empty().append(math);elem.attr("width",width);elem.attr("height",height)}else{var baseline="middle",textanchor="middle";if(/E/.test(pos)){textanchor="start"}if(/W/.test(pos)){textanchor="end"}if(/N/.test(pos)){baseline="text-after-edge"}if(/S/.test(pos)){baseline="text-before-edge"}var elmt=getSVGElement(id,"text");elem=$(elmt.node);elem.empty().text(str);elem.attr("font-style",attr.fontstyle);elem.attr("font-family",attr.fontfamily);elem.attr("font-weight",attr.fontweight);elem.attr("font-size",attr.fontsize);elem.attr("text-anchor",textanchor);elem.attr("dominant-baseline",baseline);setStrokeAndFill(elem,options,"font")}elem.attr("x",q[0]);elem.attr("y",q[1]);appendSVG(elmt)}function image(url,options){options=options||{};var elmt=getSVGElement(options.id,"image");var elem=$(elmt.node);var height=options.height?options.height/SVG.factor:SVG.height;var width=options.width?options.width/SVG.factor:SVG.width;var origin=toSVG(options.origin||[SVG.xmin,SVG.ymin]);var pos=(options.pos||"").toUpperCase();var x=origin[0]-width*0.5;var y=origin[1]-height*0.5;if(/N/.test(pos)){y-=height*0.5}if(/S/.test(pos)){y+=height*0.5}if(/E/.test(pos)){x+=width*0.5}if(/W/.test(pos)){x-=width*0.5}elem.attr("x",x);elem.attr("y",y);elem.attr("width",width);elem.attr("height",height);elem.attr("preserveAspectRatio","none");elmt.node.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",url);appendSVG(elmt)}function grid(options){options=options||{};var dx,dy,x,y,k;var orig=options.origin||[0,0];var id=options.id||"Grid";options.stroke=options.stroke||"grey";options.strokewidth=(options.strokewidth||SVG.attr.strokewidth*0.5);var coords=options.coords||SVG.coords;var lim=getScales(options.scales);openGroup(id,true);lim[2]=(typeof lim[2]=="number")?lim[2]:SVG.ymin;lim[3]=(typeof lim[3]=="number")?lim[3]:SVG.ymax;if(coords=="polar"){dx=options.dx||1;dy=options.dy||3;var limit=Math.max(Math.abs(lim[0]),Math.abs(lim[1]),Math.abs(lim[2]),Math.abs(lim[3]));for(x=dx;x<limit;x+=dx){circle(orig,x,options)}if(dy>1){for(y=1;y<dy;y++){k=Math.tan(y*Math.PI/(2*dy));line([lim[0],(lim[0]-orig[0])*k+orig[1]],[SVG.xmax,(lim[1]-orig[0])*k+orig[1]],options);line([lim[0],-(lim[0]-orig[0])*k+orig[1]],[SVG.xmax,-(lim[1]-orig[0])*k+orig[1]],options)}}}else{dx=options.dx||1;dy=options.dy||dx;for(x=orig[0];x<SVG.xmax;x+=dx){if(x>lim[0]&&x<lim[1]){line([x,lim[2]],[x,lim[3]],options)}}for(x=orig[0]-dx;x>SVG.xmin;x-=dx){if(x>lim[0]&&x<lim[1]){line([x,lim[2]],[x,lim[3]],options)}}for(y=orig[1];y<SVG.ymax;y+=dy){if(y>lim[2]&&y<lim[3]){line([lim[0],y],[lim[1],y],options)}}for(y=orig[1]-dy;y>SVG.ymin;y-=dy){if(y>lim[2]&&y<lim[3]){line([lim[0],y],[lim[1],y],options)}}}closeGroup()}function axes(options){options=options||{};options.marker="-|"+(options.marker?options.marker.charAt(0):"-");var i,x,y,start,stop,label;var dx=options.dx||1;var dy=options.dy||dx;var id=options.id||"Axes";var fontsize=getOptions("fontsize",options);var coords=options.coords||SVG.coords;var orig=(coords=="polar")?[0,0]:(options.origin||[0,0]);var ddx=options.decx||Math.max(0,-Math.floor(Math.log(dx)/Math.log(10)));var ddy=options.decy||Math.max(0,-Math.floor(Math.log(dy)/Math.log(10)));options.stroke=options.stroke||"black";options.strokewidth=(options.strokewidth||SVG.attr.strokewidth*0.5);options.markerstroke=options.stroke;options.markerstrokewidth=options.strokewidth;openGroup(id,true);var lim=getScales(options.scales);lim[2]=lim[2]||SVG.ymin;lim[3]=lim[3]||SVG.ymax;if($.isArray(options.xticks)){var xticks=options.xticks.sort();var list2=[[lim[0],orig[1]]];label=[""];for(i=0;i<xticks.length;i++){list2.push([xticks[i],orig[1]]);label.push(String(xticks[i].toFixed(ddx)))}list2.push([lim[1],orig[1]]);label.push("")}else{var list1=[],label1=[];var list2=[],label2=[];start=SVG.xmin+0.25*dx;stop=SVG.xmax-0.25*dx;i=1;var cand,leftExit=0,rightExit=0;while(leftExit*rightExit==0){cand=orig[0]+i*dx;if(cand>start){if(cand<stop){list1.push([cand,orig[1]]);label1.push(String(cand.toFixed(ddx)))}else{rightExit=1}}cand=orig[0]-i*dx;if(cand<stop){if(cand>start){list2.push([cand,orig[1]]);label=(coords=="polar")?"":cand.toFixed(ddx);label2.push(String(label))}else{leftExit=1}}i++}list1.push([lim[1],orig[1]]);label1.push("");list2.push([lim[0],orig[1]]);label2.push("");list2.reverse();list2=list2.concat(list1);label2.reverse();label=label2.concat(label1)}if(options.ticklabels!=false){options.label=label;options.pos="S"}path(list2,options);if($.isArray(options.yticks)){var yticks=options.yticks.sort();var list2=[[orig[0],lim[2]]];label=[""];for(i=0;i<yticks.length;i++){list2.push([orig[0],yticks[i]]);label.push(String(yticks[i].toFixed(ddy)))}list2.push([orig[0],lim[3]]);label.push("")}else{list1=[],label1=[];list2=[];label2=[];start=SVG.ymin+0.25*dy;stop=SVG.ymax-0.25*dy;i=1;leftExit=0;rightExit=0;while(leftExit*rightExit==0){cand=orig[1]+i*dy;if(cand>start){if(cand<stop){list1.push([orig[0],cand]);label1.push(String(cand.toFixed(ddy)))}else{rightExit=1}}cand=orig[1]-i*dy;if(cand<stop){if(cand>start){list2.push([orig[0],cand]);label=(coords=="polar")?"":cand.toFixed(ddy);label2.push(String(label))}else{leftExit=1}}i++}list1.push([orig[0],lim[3]]);label1.push("");list2.push([orig[0],lim[2]]);label2.push("");list2.reverse();list2=list2.concat(list1);label2.reverse();label=label2.concat(label1)}if(options.ticklabels!=false){options.label=label;options.pos="W"}options.stroke=options.markerstroke;path(list2,options);closeGroup()}function list(fun,tmin,tmax,options){var inc=(tmax-tmin)/getOptions("points",options);if(inc<=0||fun.length==0){return}var t,pth,g=[],xt,yt;for(t=1;t>=0;t--){if($.isFunction(fun[t])){g[t]=fun[t]}else{if(typeof fun[t]=="string"){with(Math){eval("g["+t+"] = function(x){return "+fun[t]+"}")}}else{return}}}if(g.length<2){return}pth=[];for(t=tmin;t<=tmax;t+=inc){xt=g[0](t);yt=g[1](t);if(isFinite(xt)&&isFinite(yt)){pth[pth.length]=[xt,yt]}}return pth}function plot(fun,options){options=options||{};var append,pth,steps=options.steps||[];var n_steps=steps.length;options.closed=false;options.curve="";var xmin=(options.min==null)?SVG.xmin:Math.max(SVG.xmin,options.min);var xmax=(options.max==null)?SVG.xmax:Math.min(SVG.xmax,options.max);if(n_steps===0){pth=list(["x",fun],xmin,xmax,options);if(pth){path(pth,options)}}else{options.id=options.id||Math.randomString(6);steps.sort();var steps_a=[];steps_a.push(xmin);for(i=0;i<n_steps;i++){if(steps[i]>xmin&&steps[i]<xmax){steps_a.push(steps[i])}}steps_a.push(xmax);n_steps=steps_a.length-1;for(i=0;i<n_steps;i++){xmax=steps_a[i+1];xmin=steps_a[i];pth=list(["x",fun],xmin,xmax,options);append=(i>0);if(pth){path(pth,options,append)}}}}function area(fun1,fun2,options){options=options||{};options.curve="";options.closed=true;var xmin=(options.min==null)?SVG.xmin:options.min;var xmax=(options.max==null)?SVG.xmax:options.max;var pth1=list(["x",fun1],xmin,xmax,options);var pth2=list(["x",fun2],xmin,xmax,options);if(pth1&&pth2){pth1=pth1.concat(pth2.reverse());path(pth1,options)}}function polarPlot(fun,options){var g1,g2;if(typeof fun=="string"){with(Math){eval("g1 = function(x){return ("+fun+")*cos(x)}");eval("g2 = function(x){return ("+fun+")*sin(x)}")}}else{if($.isFunction(fun)){with(Math){eval("g1 = function(x){return fun(x)*cos(x)}");eval("g2 = function(x){return fun(x)*sin(x)}")}}}parametricPlot(g1,g2,options)}function parametricPlot(fun1,fun2,options){options=options||{};options.closed=false;options.curve="";var xmin=(options.min==null)?0:options.min;var xmax=(options.max==null)?2*Math.PI:options.max;var pth=list([fun1,fun2],xmin,xmax,options);if(pth){path(pth,options)}}function slopeField(fun,options){options=options||{};var g=fun;if(typeof fun=="string"){with(Math){eval("g = function(x,y){return "+fun+"}")}}var gxy,x,y,u,v,dz;var dx=(options.dx==null)?1:options.dx;var dy=(options.dy==null)?1:options.dy;dz=Math.sqrt(dx*dx+dy*dy)/6;var xmin=Math.ceil(SVG.xmin/dx);var ymin=Math.ceil(SVG.ymin/dy);for(x=xmin;x<=SVG.xmax;x+=dx){for(y=ymin;y<=SVG.ymax;y+=dy){gxy=g(x,y);if(!isNaN(gxy)){if(Math.abs(gxy)=="Infinity"){u=0;v=dz}else{u=dz/Math.sqrt(1+gxy*gxy);v=gxy*u}line([x-u,y-v],[x+u,y+v],options)}}}}return{showFormulaOnMouseOver:false,latexImages:false,latexConverter:"http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=",mathColor:"",mathFontSize:"",mathFontFamily:"",define:function(oldstr,newstr){if(MSVG.latexImages){return}if((typeof oldstr)=="string"){oldstr=[oldstr];newstr=[newstr]}var i,len=oldstr.length;if(len!=newstr.length){return}for(i=0;i<len;i++){symbols=symbols.concat([{input:"\s\s"+oldstr[i],tag:"mo",output:newstr[i],ttype:DEFINITION}])}refreshSymbols()},parseMath:function(str,displaystyle,size,color){if(str===null){return null}str=str.replace(/_([^\s{])/gm,"_{$1}");str=str.replace(/\s^([^\s{])/gm,"^{$1}");var frag=parseExpr(str.replace(/^\ss+/g,""),false,false)[0];var node=createMmlNode("mstyle",frag);$(node).attr({displaystyle:displaystyle,mathcolor:color||MSVG.mathColor,mathsize:size||MSVG.mathFontSize,fontfamily:MSVG.mathFontFamily});node=createMmlNode("math",node);if(MSVG.showFormulaOnMouseOver){$(node).attr({title:str.replace(/\ss+/g," ")})}return node},parseMathExternal:function(str,displaystyle,size,color){if(str===null){return null}var node=createElementXHTML("img");var snip=MSVG.latexConverter+str;$(node).attr({src:snip});if(MSVG.showFormulaOnMouseOver){$(node).attr({title:str.replace(/\ss+/g," ")})}return node},generic:function(){if(true){MSVG.latexImages=true}if(MSVG.latexImages){MSVG.parseMath=MSVG.parseMathExternal}else{refreshSymbols()}\n\nif(!document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")){MSVG.initPictures=MSVG.removePictures}},removePictures:function(obj){var pictures=obj?$(obj):$(".SVGgraph");$(pictures).each(function(){var that=$(this);this.id=null;that.empty();that.css({color:"red",background:"yellow"});that.text("Missing picture: your browser does not support inline SVG");window.setTimeout(function(){that.remove()},10000)})},initPictures:function(obj){var options,scales,qnode,node,node2,status,elem;var pictures=obj?$(obj):$(".SVGgraph");$(pictures).each(function(){var that=$(this);status=0;SVG=new pictureObject();options=$(this).attr("options");that.removeAttr("id");if(options){with(Math){eval("options={"+options+"}")}setOptions(options)}else{options={}}if(options.pan==false){SVG.pan=false}SVG.coords=options.coords||SVG.coords;SVG.src=$.trim($(this).text());that.empty();if(typeof options.width=="number"&&options.width>0){SVG.width=options.width;status+=1}if(typeof options.height=="number"&&options.height>0){SVG.height=options.height;status+=2}var scales=getScales(options.scales);SVG.xmin=scales[0];SVG.xmax=scales[1];SVG.ymin=scales[2];SVG.ymax=scales[3];status+=scales[4];SVG.height=options.height;if(status%4!=0){SVG.width=options.width}if(!SVG.width){SVG.width=1.6*SVG.height}else{if(!SVG.height){SVG.height=0.625*SVG.width}}if(status<8){SVG.ymax=0.5*SVG.height*(SVG.xmax-SVG.xmin)/SVG.width;SVG.ymin=-SVG.ymax}else{if(status<12){SVG.xmax=0.5*SVG.width*(SVG.ymax-SVG.ymin)/SVG.height;SVG.xmin=-SVG.xmax}}if(status==12||status==13){SVG.height=SVG.width*(SVG.ymax-SVG.ymin)/(SVG.xmax-SVG.xmin)}else{if(status==14){SVG.width=SVG.height*(SVG.xmax-SVG.xmin)/(SVG.ymax-SVG.ymin)}}SVG.id=options.id||Math.randomString(16);qnode=createSVGElement("svg");elem=$(qnode);qnode.id=SVG.id;elem.attr("xmlns","http://www.w3.org/2000/svg");elem.attr("xmlns:ev","http://www.w3.org/2001/xml-events");elem.attr("xmlns:xlink","http://www.w3.org/1999/xlink");elem.attr("version","1.1");elem.attr("baseProfile","full");if(options.border){elem.attr("style","border:"+options.border)}node=createSVGElement("clipPath");node.id=SVG.id+"ClipPath";node2=createSVGElement("path");$(node).append(node2);node2=createSVGElement("defs");node2.id=SVG.id+"_Defs";$(node2).append(node);$(qnode).append(node2);node2=createSVGElement("g");node2.id=SVG.id+"_Canvas";$(qnode).append(node2);that.append(qnode);this.style.position="relative";if(!(this.nodeName=="SPAN")){setAction("mousemove",updatePosition);if(SVG.pan){setAction("mouseup",onDrop)}if(window.addEventListener){var evt=false?"DOMMouseScroll":"mousewheel";qnode.addEventListener(evt,onWheel,false)}}setAction("mousedown",onClick);setAction("mouseover",switchTo);canvas=$("#"+SVG.id+"_Canvas")[0];resize(1)});if(pictures.length>0&&$("#SVGtoolbar").length===0){node=createElementXHTML("span");node.id="SVGtoolbar";node.style.position="absolute";node.style.textAlign="left";node.style.zIndex=10;node=addButton(node,"X","Close editor",closeEditor);node=addButton(node,"Update","Update picture",updateButton,"SVGupdateButton");node=addButton(node,"SVG","View SVG code",exportSVG);node=addButton(node,"-","Zoom out",function(){zoom(1.25,true)});node=addButton(node,"+","Zoom in",function(){zoom(0.8,true)});node=addButton(node,"\su2191","Enlarge picture",function(){resize(0.8)});node=addButton(node,"\su2193","Reduce picture",function(){resize(1.25)});$(node).append("<br />");node2=createElementXHTML("textarea");$(node2).attr({id:"SVGsrc",rows:8,cols:60});$(node).append(node2);$(node).hide();$("body").append(node)}}}}(jQuery);\n//}}}\n/***\n!~TiddlyWiki formatters\n***/\n//{{{\nif(!version.extensions.MathSVGPlugin) { //# ensure that the plugin is only installed once\nversion.extensions.MathSVGPlugin = {installed: true};\nMSVG.generic();\n\nconfig.formatterHelpers.MathSVGHelper = function(z) {\n if(z.tiddler && MSVG.noMathTag && jQuery.inArray(MSVG.noMathTag,z.tiddler.tags)>-1) return;\n this.lookaheadRegExp.lastIndex = z.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(z.source);\n if(lookaheadMatch){\n var eq = MSVG.parseMath(lookaheadMatch[1],this.displaystyle);\n if(this.displaystyle){\n var node = createTiddlyElement(z.output,"div");\n node.style.textAlign='center';\n node.appendChild(eq);\n z.output.appendChild(node);\n } else {z.output.appendChild(eq);}\n z.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n}\n\nconfig.formatters.push( {\n name: "clatex",\n match: "\s\s$\s\s$",\n lookaheadRegExp: /\s$\s$((?:.|\sn)*?)\s$\s$/mg,\n displaystyle: true,\n handler: config.formatterHelpers.MathSVGHelper\n})\n\nconfig.formatters.push( {\n name: "clatex2",\n match: "\s\s\s\s\s\s\s[",\n lookaheadRegExp: /\s\s\s[((?:.|\sn)*?)\s\s\s]/mg,\n displaystyle: true,\n handler: config.formatterHelpers.MathSVGHelper\n})\n\nconfig.formatters.push( {\n name: "latex",\n match: "\s\s$",\n lookaheadRegExp: /\s$((?:.|\sn)*?)\s$/mg,\n displaystyle: false,\n handler: config.formatterHelpers.MathSVGHelper\n})\n\nconfig.formatters.push( {\n name: "latex2",\n match: "\s\s\s\s\s\s\s(",\n lookaheadRegExp: /\s\s\s(((?:.|\sn)*?)\s\s\s)/mg,\n displaystyle: false,\n handler: config.formatterHelpers.MathSVGHelper\n})\n\nconfig.formatters.push( {\n name: "graph",\n match: "<div",\n lookaheadRegExp: /<div.+SVGgraph.+?>((?:.|\sn)*?)<\s/div>/mg,\n handler: function(z){\n if(z.tiddler && MSVG.noSvgTag && jQuery.inArray(MSVG.noSvgTag,z.tiddler.tags)>-1) return;\n this.lookaheadRegExp.lastIndex = z.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(z.source);\n if(lookaheadMatch){\n var text = lookaheadMatch[0].replace('<div','<div id="currentGraph"');\n jQuery(z.output).append(text);\n MSVG.initPictures("#currentGraph");\n z.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n})\n\nconfig.formatters.push( {\n name: "inlineGraph",\n match: "<span",\n lookaheadRegExp: /<span.+SVGgraph.+?>((?:.|\sn)*?)<\s/span>/mg,\n handler: function(z){\n if(z.tiddler && MSVG.noSvgTag && jQuery.inArray(MSVG.noSvgTag,z.tiddler.tags)>-1) return;\n this.lookaheadRegExp.lastIndex = z.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(z.source);\n if(lookaheadMatch){\n var text = lookaheadMatch[0].replace('<span','<span id="currentGraph"');\n jQuery(z.output).append(text);\n MSVG.initPictures("#currentGraph");\n z.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n})\n\n}\n//}}}\n
//{{{\n//\n// Change the user interface when the page was rendered via ACP/ASP for\n// end users. Note that these changes eliminate the possibility of users\n// viewing, editing, or saving tiddlers, so the replacement tiddlers\n// that control the UI are temporary only. Also the aspMode variable\n// is global and can be used by any JS, plugin, macro, etc. It also\n// adds 'excludeLists' tags to all tiddlers that are tagged with\n// 'hideUser'. This allows those tiddlers to be seen while editing\n// in HTML mode, but hides them from users in ASP mode! Do the same\n// for obvious hidden things, systemConfig!\n//\n// 21-Sep-06 rbd Initial edit\n// 22-Sep-06 rbd Replace 'tiddler' with 'item' in user mode messages\n// 23-Sep-06 rbd Add FontSize to sidebar, add side-bar (toggle) to tiddler toolbar\n// Auto-hide systemContent. Add excludeLists tag to temp tiddlers\n// used to control UI changes. Add temp TabTags tiddler to call \n// the allTagsEx macro, which hides tags in the tags tab using the\n// same rules as regular tiddlers.\n// 25-Sep-05 rbd Add single-page and open-at-top options\n// 27-Oct-06 rbd More overrides, add excludeSearch where adding excludeLists.\n// Refactor code that adds excludeXxx tags into function.\n// 01-Nov-06 rbd Add RSS icon to [[SideBarOptions]]\n// 04-Nov-06 rbd Switch DefaultTiddlers to those used at run time\n// 21-Nov-06 rbd Add support for [[CollapseTiddlerPlugin]]\n// 22-Nov-06 rbd New hiding tag hideLocalUser used to hide tiddlers (e.g. the\n// My Documents ones) only if user is 'localweb'.\n// 25-Nov-06 rbd Fix bogus syntax on hideLocalUser feature.\n// 08-Apr-08 rbd Hide side-bar by default, add tooltip for sidebar toggler.\n// 13-Apr-08 rbd New StartupItems in author environment turns into DefaultTiddlers\n// in user mode... allows authors to change default tiddlers on open.\n//\n\nfunction _modeSwitchHideTiddler(tiddler)\n{\n if(!tiddler.isTagged("excludeLists"))\n tiddler.assign(undefined, undefined, undefined, undefined, tiddler.getTags() + " excludeLists");\n if(!tiddler.isTagged("excludeSearch"))\n tiddler.assign(undefined, undefined, undefined, undefined, tiddler.getTags() + " excludeSearch");\n}\n\nvar aspMode = (document.location.pathname.lastIndexOf(".asp") != -1);\nif(aspMode)\n{\n //\n // Change the user interface in several places\n //\n var _temp = store.createTiddler("SideBarTabs"); // Will get existing safely.\n _temp.assign(undefined, "<<tabs txtMainTab Items 'All Items' TabAll Categories 'Items by category' TabTags>>", \n "System", undefined, "excludeLists excludeSearch");\n _temp = store.createTiddler("TabTags");\n _temp.assign(undefined, "<<allTagsEx>>", // Supresses tag-tiddlers too!\n "System", undefined, "excludeLists excludeSearch");\n _temp = store.createTiddler("SideBarOptions");\n _temp.assign(undefined, "<html><a href=\s"<%= feedUri %>\s"><img src=\s"/im/feed-icon-14x14.png\s" " + \n "border=\s"0\s" title=\s"Subscribe to RSS feed\s" width=\s"14\s" height=\s"14\s" " +\n "align=\s"right\s"></a></html>" + \n "<<search>><<closeAll>><<themeSelect style 'select theme'>>" + \n "<<fontSize 'font: '>><<slider chkSliderOptionsPanel OptionsPanel " + \n "'options ยป' 'Change options'>>", \n "System", undefined, "excludeLists excludeSearch");\n _temp = store.createTiddler("OptionsPanel");\n _temp.assign(undefined,\n "These options are saved in your browser. Click on a label for help.\sn\sn" +\n "<<option chkSinglePageMode>> SingleItemDisplay\sn" +\n "<<option chkTopOfPageMode>> OpenNewItemAtTop\sn" + \n "<<option chkRegExpSearch>> RegExpSearch\sn"+\n "<<option chkCaseSensitiveSearch>> CaseSensitiveSearch\sn"+\n "<<option chkAnimate>> EnableAnimations",\n "System", undefined, "excludeLists excludeSearch");\n _temp = store.createTiddler("ViewTemplate");\n _temp.assign(undefined,\n "<div class='toolbar'>\sn" + \n " <span macro='toolbar collapseTiddler -closeTiddler closeOthers references jump'></span>\sn" +\n " <span macro='toggleSideBar side-bar \s"hide/show side-bar\s" hide'></span>\sn" +\n "</div>" + \n "<div class='title' macro='view title'></div>\sn" + \n "<div class='viewer' macro='view text wikified'></div>\sn" +\n "<div class='tagClear'></div>",\n "System", undefined, "excludeLists excludeSearch");\n store.saveTiddler("StartupItems", "DefaultTiddlers", undefined, undefined, undefined, "excludeLists excludeSearch");\n\n var i;\n //\n // These hide tiddlers with certain tags from the user environment\n //\n _temp = store.getTaggedTiddlers("hideUser"); // Array (typ.)\n if(_temp.length > 0) {\n for(i = 0; i < _temp.length; i++) _modeSwitchHideTiddler(_temp[i]);\n }\n if('<%= User.Username %>' == 'localweb') { // Hide only from 'localweb' user\n _temp = store.getTaggedTiddlers("hideLocalUser");\n if(_temp.length > 0) {\n for(i = 0; i < _temp.length; i++) _modeSwitchHideTiddler(_temp[i]);\n }\n }\n _temp = store.getTaggedTiddlers("systemContent");\n if(_temp.length > 0) {\n for(i = 0; i < _temp.length; i++) _modeSwitchHideTiddler(_temp[i]);\n }\n _temp = store.getTaggedTiddlers("systemConfig");\n if(_temp.length > 0) {\n for(i = 0; i < _temp.length; i++) _modeSwitchHideTiddler(_temp[i]);\n }\n store.setDirty(false); // Prevent dirty warning from the above adjustments\n //\n // supress 'tiddler' in a some popups and tooltips\n //\n config.messages.undefinedTiddlerToolTip = "The item '%0' doesn't exist";\n config.commands.closeTiddler.tooltip = "Close this item";\n config.commands.closeOthers.tooltip = "Close all other items";\n config.commands.collapseTiddler.tooltip = "Collapse this item";\n config.commands.expandTiddler.tooltip = "Restore this item";\n config.commands.collapseOthers.tooltip = "Restore this item and collapse all others";\n config.commands.references.tooltip = "Show items that link to this one";\n config.commands.jump.tooltip = "Jump to another open item";\n config.macros.list.all.prompt = "All items in alphabetical order";\n config.macros.closeAll.prompt = "Close all displayed items";\n config.macros.allTags.tooltip = "Show items tagged with '%0'";\n config.macros.search.prompt = "Search all items";\n config.macros.search.successMsg = "%0 items found matching %1";\n config.macros.search.failureMsg = "No items found matching %0";\n config.views.wikified.tag.openAllTooltip = "Open all of these items";\n config.views.wikified.tag.tooltip = "Show items tagged with '%0'";\n config.views.wikified.tag.popupNone = "No other items tagged with '%0'";\n config.views.wikified.defaultText = "The item '%0' doesn't exist. You can create it in the Share Your Sky! authoring environment.";\n}\n//}}}
Moon Avoid implements the ~Moon-Avoidance Lorentzian, which varies the avoidance distance from the Moon based on its phase. At full moon the Observation will need to be at its farthest from the Moon. __As the brightness decreases with phase, the Observation can be done closer__.\n\nMoon Avoid takes two parameters: ''distance'' (degrees) and ''width'' (days). Observations will not be scheduled if the target is within distance/(1+((distance-age)/width)^2) of the moon. This means at full moon the avoidance will be ''distance'', and ''width'' days before (or after) the avoidance will be one half ''distance''. @@If you are unsure what to use@@, start out with distance=120 and width=14, meaning that at full moon the target must be at least 120 degrees away and at 1st or 3rd quarter (half-illuminated) the target would need to be at least 90 degrees away.\n\nThanks to ACP Expert user Dick Berg for the idea of a live spreadsheet to help visualize this. His spreadsheet has been translated to HTML/Javascript and is given below. Enter values for ''distance'' and ''width'' below and you can see the resulting minimum angular distance from the Moon in the table day by day from new to full Moon.\n<html>\n<table border="1" style="margin-bottom: 4px;" cellpadding="2">\n <tr><th>Distance</th><td><input type="text" name="mah_inDist" id="mah_inDist" onKeyUp="mah_calc();" size="4" value="120"></td></tr>\n <tr><th>Width</th><td><input type="text" name="mah_inWidth" id="mah_inWidth" onKeyUp="mah_calc();" size="4" value="14"></td></tr>\n</table>\n\n<table border="1">\n <tr>\n <th scope="col">Age (days)</th>\n <th scope="col">Distance (deg.)</th>\n </tr>\n <tr>\n <td>0 (new)</td>\n <td id="mah_dist0"> </td>\n </tr>\n <tr>\n <td>1</td>\n <td id="mah_dist1"> </td>\n </tr>\n <tr>\n <td>2</td>\n <td id="mah_dist2"> </td>\n </tr>\n <tr>\n <td>3</td>\n <td id="mah_dist3"> </td>\n </tr>\n <tr>\n <td>4</td>\n <td id="mah_dist4"> </td>\n </tr>\n <tr>\n <td>5</td>\n <td id="mah_dist5"> </td>\n </tr>\n <tr>\n <td>6</td>\n <td id="mah_dist6"> </td>\n </tr>\n <tr>\n <td>7</td>\n <td id="mah_dist7"> </td>\n </tr>\n <tr>\n <td>8</td>\n <td id="mah_dist8"> </td>\n </tr>\n <tr>\n <td>9</td>\n <td id="mah_dist9"> </td>\n </tr>\n <tr>\n <td>10</td>\n <td id="mah_dist10"> </td>\n </tr>\n <tr>\n <td>11</td>\n <td id="mah_dist11"> </td>\n </tr>\n <tr>\n <td>12</td>\n <td id="mah_dist12"> </td>\n </tr>\n <tr>\n <td>13</td>\n <td id="mah_dist13"> </td>\n </tr>\n <tr>\n <td>14</td>\n <td id="mah_dist14"> </td>\n </tr>\n <tr>\n <td>15 (full)</td>\n <td id="mah_dist15"> </td>\n </tr>\n</table>\n</html>\nNote: When Moon Avoid rejects an Observation, its Plan will not be re-checked for observability until the next night. The ~Moon-Avoidance Lorentzian was formulated by the [[Berkeley Automated Imaging Telescope (BAIT)|http://w.astro.berkeley.edu/bait/]] team.\n<script>\nmah_calc();\n</script>\n
<<slider "" "Run Plan Help" Help "Helpful information">>\n\n<<RemoteContent "/ac/aacqplan.asp">>
To download a file, right-click on its link and select //Save link as// or //Save target as//. Binary files like FITS images and zip files can be downloaded by just clicking on the link, but other files like images and text files will just appear in a new browser window. The table may be sorted by clicking on a column header. Clicking again will sort it in reverse. If uploading is allowed here, and you have upload privileges, the upload controls will be visible above the directory listing.\n
/% INSTRUCTIONS: Using Basic Formatting, Item Level Formatting, or other advanced features, customize this for your users. Once you have this working feel free to erase everything before the "Information about..." below %/<% if(User.IsAdministrator) { %>\n@@''You can customize this in the [[Authoring Environment|/author.html]]''@@<% } %>\nInformation about the geographic location of the observatory, etc., goes here. Suggest you include the geodetic coordinates and ground elevation, perhaps nearby cultural features or well known landmarks.
''Tag'': Items which directly relate to observing. Always tagged as UserContent as well.
<<RemoteContent '/plans/<%= User.username %>/aindex.asp' Refresh 'Refresh the file list'>>
<% if(!screenFlats) { %><<slider "" "Sky Flats Help" "Help for Sky Flats" "Helpful information">>\n<% } %>\nThis item allows you to do a one-time flat field run per your specifications. Use this for special situations where you can't use the standard flat sets.<% if(!screenFlats) { %> @@You can use the [[Sky Flat Analyzer]] tool to help you order your flat filters and binnings to make the most of the twilight time.@@<% } %>\n\nThis will start immediately<% if(!screenFlats) { %>, then sit waiting until the next dusk or dawn, whichever comes first<% } else { %> and use the light panel/screen to acquire the flats. If needed, the dome/roof will be closed while this runs, and if it was open it will be re-opened afterward<% } %>.\n<html><form id="OFlatPlanForm">\n <table class="noBorder" style="border:0;margin-left:0">\n <tr>\n <th align="left">Use</th>\n <th align="left">Count</th>\n<!--<% if(filtNames) { %>-->\n <th align="left">Filter</th>\n<!--<% } %>-->\n <th align="left">Binning</th>\n<!--<% if(rotAvail) { %>-->\n <th align="left">Sky PA</th>\n<!--<% } %>-->\n </tr>\n <tr id="OFlatRow1">\n <td><input type="checkbox" name="OFlatUse1" id="OFlatUse1" value="yes"></td>\n <td><input type="text" name="OFlatCount1" id="OFlatCount1" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="OFlatFilter1" id="OFlatFilter1"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="OFlatBinning1" id="OFlatBinning1"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="OFlatPA1" id="OFlatPA1" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="OFlatRow2" style="display:none">\n <td><input type="checkbox" name="OFlatUse2" id="OFlatUse2" value="yes"></td>\n <td><input type="text" name="OFlatCount2" id="OFlatCount2" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="OFlatFilter2" id="OFlatFilter2"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="OFlatBinning2" id="OFlatBinning2"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="OFlatPA2" id="OFlatPA2" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="OFlatRow3" style="display:none">\n <td><input type="checkbox" name="OFlatUse3" id="OFlatUse3" value="yes"></td>\n <td><input type="text" name="OFlatCount3" id="OFlatCount3" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="OFlatFilter3" id="OFlatFilter3"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="OFlatBinning3" id="OFlatBinning3"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="OFlatPA3" id="OFlatPA3" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="OFlatRow4" style="display:none">\n <td><input type="checkbox" name="OFlatUse4" id="OFlatUse4" value="yes"></td>\n <td><input type="text" name="OFlatCount4" id="OFlatCount4" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="OFlatFilter4" id="OFlatFilter4"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="OFlatBinning4" id="OFlatBinning4"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="OFlatPA4" id="OFlatPA4" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="OFlatRow5" style="display:none">\n <td><input type="checkbox" name="OFlatUse5" id="OFlatUse5" value="yes"></td>\n <td><input type="text" name="OFlatCount5" id="OFlatCount5" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="OFlatFilter5" id="OFlatFilter5"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="OFlatBinning5" id="OFlatBinning5"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="OFlatPA5" id="OFlatPA5" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="OFlatRow6" style="display:none">\n <td><input type="checkbox" name="OFlatUse6" id="OFlatUse6" value="yes"></td>\n <td><input type="text" name="OFlatCount6" id="OFlatCount6" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="OFlatFilter6" id="OFlatFilter6"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="OFlatBinning6" id="OFlatBinning6"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="OFlatPA6" id="OFlatPA6" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="OFlatRow7" style="display:none">\n <td><input type="checkbox" name="OFlatUse7" id="OFlatUse7" value="yes"></td>\n <td><input type="text" name="OFlatCount7" id="OFlatCount7" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="OFlatFilter7" id="OFlatFilter7"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="OFlatBinning7" id="OFlatBinning7"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="OFlatPA7" id="OFlatPA7" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="OFlatRow8" style="display:none">\n <td><input type="checkbox" name="OFlatUse8" id="OFlatUse8" value="yes"></td>\n <td><input type="text" name="OFlatCount8" id="OFlatCount8" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="OFlatFilter8" id="OFlatFilter8"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="OFlatBinning8" id="OFlatBinning8"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="OFlatPA8" id="OFlatPA8" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="OFlatRow9" style="display:none">\n <td><input type="checkbox" name="OFlatUse9" id="OFlatUse9" value="yes"></td>\n <td><input type="text" name="OFlatCount9" id="OFlatCount9" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="OFlatFilter9" id="OFlatFilter9"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="OFlatBinning9" id="OFlatBinning9"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="OFlatPA9" id="OFlatPA9" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="OFlatRow10" style="display:none">\n <td><input type="checkbox" name="OFlatUse10" id="OFlatUse10" value="yes"></td>\n <td><input type="text" name="OFlatCount10" id="OFlatCount10" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="OFlatFilter10" id="OFlatFilter10"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="OFlatBinning10" id="OFlatBinning10"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="OFlatPA10" id="OFlatPA10" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="OFlatRow11" style="display:none">\n <td><input type="checkbox" name="OFlatUse11" id="OFlatUse11" value="yes"></td>\n <td><input type="text" name="OFlatCount11" id="OFlatCount11" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="OFlatFilter11" id="OFlatFilter11"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="OFlatBinning11" id="OFlatBinning11"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="OFlatPA11" id="OFlatPA11" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="OFlatRow12" style="display:none">\n <td><input type="checkbox" name="OFlatUse12" id="OFlatUse12" value="yes"></td>\n <td><input type="text" name="OFlatCount12" id="OFlatCount12" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="OFlatFilter12" id="OFlatFilter12"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="OFlatBinning12" id="OFlatBinning12"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="OFlatPA12" id="OFlatPA12" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="OFlatRow13" style="display:none">\n <td><input type="checkbox" name="OFlatUse13" id="OFlatUse13" value="yes"></td>\n <td><input type="text" name="OFlatCount13" id="OFlatCount13" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="OFlatFilter13" id="OFlatFilter13"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="OFlatBinning13" id="OFlatBinning13"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="OFlatPA13" id="OFlatPA13" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="OFlatRow14" style="display:none">\n <td><input type="checkbox" name="OFlatUse14" id="OFlatUse14" value="yes"></td>\n <td><input type="text" name="OFlatCount14" id="OFlatCount14" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="OFlatFilter14" id="OFlatFilter14"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="OFlatBinning14" id="OFlatBinning14"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="OFlatPA14" id="OFlatPA14" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="OFlatRow15" style="display:none">\n <td><input type="checkbox" name="OFlatUse15" id="OFlatUse15" value="yes"></td>\n <td><input type="text" name="OFlatCount15" id="OFlatCount15" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="OFlatFilter15" id="OFlatFilter15"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="OFlatBinning15" id="OFlatBinning15"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="OFlatPA15" id="OFlatPA15" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="OFlatRow16" style="display:none">\n <td><input type="checkbox" name="OFlatUse16" id="OFlatUse16" value="yes"></td>\n <td><input type="text" name="OFlatCount16" id="OFlatCount16" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="OFlatFilter16" id="OFlatFilter16"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="OFlatBinning16" id="OFlatBinning16"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="OFlatPA16" id="OFlatPA16" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr>\n <td colspan="5"><a href="javascript:;" class="button" title="Click to add another row" onclick="DC3.Lib.expandoAddRow('OFlat');">More</a></td>\n </tr>\n </table>\n</form></html><<PersistentForm>><<PostForm "FlatPlanForm" "/ac/aacqflat.asp" "Acquire Flat Fields" "Starts the flat field acquisition process">><<ValidateForm "" "postit">>\n<script>DC3.Lib.expandoInitializeForm('OFlat');</script>\n
<script>\nif("<%= User.IsAdministrator %>" == "True") alert('admin');\n</script>\nOpen [[System Status]] and use the "Shutter" and "Dome" labels (which are links) to control the dome. You can open and close the shutter, as well as control slaving and home or park the dome. Hover the mouse over the labels to see what clicking will do, given the current state of the dome.\n
Turn this on to have all newly opened items appear at the top. Otherwise they are opened 'nearby' the item from which the new item was opened.
Click the labels for help\n[[Author Name]]: <<br>><<option txtUserName>>\n[[Username|Login Information]]: <<br>><<option txtUploadUserName>>\n[[Password|Login Information]]: <<br>><<option pasUploadPassword>>\n<<option chkRegExpSearch>> RegExpSearch\n<<option chkCaseSensitiveSearch>> CaseSensitiveSearch\n<<option chkAnimate>> EnableAnimations\n----\nAdvancedOptions\nPluginManager
/% INSTRUCTIONS: Find your CSC in a browser. Then replace the first URL by right clicking on the Clock image and selecting Copy Link Address, replace the second URL by right clicking on the Clock image and selecting Copy Image Address. Once you have this working feel free to erase everything before the "Here are..." below %/<% if(User.IsAdministrator) { %>\n@@''You can customize this in the [[Authoring Environment|/author.html]]''@@<% } %>\nHere are the current weather and sky conditions at the <%= Prefs.SiteName %>:\n\n<script>return '<html><div><a href="http://www.cleardarksky.com/c/GrtBsnNPkNVkey.html" target="_new"><img src="http://www.cleardarksky.com/c/GrtBsnNPkNVcsk.gif?"+new Date().getTime()+" ></a></div></html>';</script>\nClick or touch the clock image to open a new browser to our full Clear Dark Sky page.\n\n
Edit this to see how to display a periodic refresh image such as that from a web cam or all-sky camera. Note that this technique is also used in items like [[Our Clear Sky Clock]] and [[Radar Animation]]. Feel free to edit these to see this technique in action!!\n\nHere is the latest all-sky camera from [[Kitt Peak National Observatory|http://kpasca-db.tuc.noao.edu/]] embedded in an item here. Check the box to have it automatically refresh every 5 minutes, and you can click/touch the ''Refresh'' button to force a refresh.\n\n@@''NOTE'' If the image is on your own (ACP) computer, omit the {{{http://domain}}} and start the URL with just the leading /. This allows the browser to fill in the domain or IP address based on whether you are "inside" (192.168...) or "outside" (domain or public IP) and your item with work either way.@@\n\n<script>\n return "[img[http://kpasca-db.tuc.noao.edu/latestred.png?" + \n new Date().getTime() + "]]";\n</script>\n<<RefreshTiddler Refresh "Refresh Display" 300>>
/***\n|''Name:''|PersistentFormPlugin|\n|''Description:''|Save HTML form states in a (big) cookie|\n|''Date:''|July 15, 2018|\n|''Author:''|Bob Denny ~DC-3 Dreams, SP|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''Version:''|1.2.0|\n|''~CoreVersion:''|2.0.11, 2.1.0|\nThis macro adds field persistence to HTML forms embedded in tiddlers, and an optional reset button to clear the form and erase any persisted field values. See the [[PostFormPlugin]]. Persistence is done using the same scheme that ~TiddlyWiki's options use, cookies. \n!Usage\nIf you have only one HTML form in your tiddler and don't need a reset button, simply include the macro call {{{<<PersistentForm>>}}}. \n\nIf you want to include a reset button, which will clear the form and the saved values //for that form only//, specify the third parameter, which is the label for the button and the fourth parameter, which is its tooltip, for example:\n\n{{{<<PersistentForm "formId" "1" "Forget" "Reset and forget saved form values">>}}}\n\nThis will cause a button labeled "Forget" to appear at the macro invocation location, apply to form "formId, and it will keep the saved form values for 1 day.\n!!Parameters\n# (optional) ID of form to be persisted (default is first or only form in tiddler)\n# (optional) lifetime of persistence cookies, days (default = 7)\n# (optional) Label of reset button for the form (default = no reset button)\n# (optional) Tooltip for reset button (if specified in param 3)\n!Notes\nIf a form element includes an attribute {{{persist="no"}}}, it will not be persisted, ever.\n\nThe value names are //not// uniquified to each form, //on purpose//. Thus, it is possible for a TiddlyWiki with several forms to share the same information. When someone fills out one of those forms, the same info will appear in the other forms as long as the form field names in both are the same. You are responsible for choosing form field names that are unique to each form if you want this isolation.\n\nA single cookie is baked by this plugin. It is named {{{pfc}}} and has a value that is the concatenation of all persisted form field name/value pairs as {{{name:value&name:value...}}}\n!!Example\nChange some of the fields, close and reopen this tiddler. See that the fields are restored. Then click the forget button, see the form clear. Close and reopen this tiddler again and see that the form is still cleared.\n<html><form id="myForm">\nText: <input type="text" name = "txt" width="40" value=""></input>\n<input type="checkbox" name="ckbox">Check this!</input><br>\nPassword: <input type="password" name="pass" value=""></input><br>\nSingle select: <select name="sel">\n<option value="a">Type A</option>\n<option value="b">Type B</option>\n<option value="c">Type C</option>\n</select> Multiple select: \n<select multiple size="3" name="selmult">\n<option value="1">Type 1</option>\n<option value="2">Type 2</option>\n<option value="3">Type 3</option>\n</select><br>\n<input type="radio" name="rbtn" value="rb1">Button 1</input><br>\n<input type="radio" name="rbtn" value="rb2">Button 2</input><br>\n<input type="radio" name="rbtn" value="rb3">Button 3</input><br>\n<textarea name=bigtext rows="5" cols="10"></textarea><br>\n</form></html><<PersistentForm "myForm" "1" "Forget" "Forget saved values">>\n!!Revision History\n<<<\n''2006.09.20 [1.0.1]'' Initial creation\n''2006.09.29 [1.0.2]'' Unsupported elements just skipped, allows submit etc. to be present.\n''2006.09.29 [1.0.3]'' Optional param form id to support multiple forms. Optional param to set expiry, now defaults to 7 days. New reset() method to delete all cookies for the target form.\n''2006.10.03 [1.0.4]'' Fix initialization of select-multiple fields, add optional button for resetting form and forgetting cookies, validate on TW 2.1.0, improve doc.\n''2006.10.18 [1.1.0]'' Embed all form data into a single cookie.\n''2018.07.15 [1.2.0]'' Add optional {{{persist="no"}}} attribute in form elements - will suppress persistence\n<<<\n!!Code\n***/\n//{{{\nversion.extensions.PersistentForm = {\n major: 1, minor: 1, revision: 0,\n date: new Date(2006, 10, 3), \n type: 'macro',\n source: "http://solo.dc3.com/tw/index.html#PersistentFormPlugin"\n};\n\nconfig.macros.PersistentForm = \n{\n expiry: 7, // Expiry, days (used in onChange())\n \n persistDict: { }, // Persistence data cache\n \n //\n // Turn PersistentForm cookie data into an associative array\n //\n loadPersistDict: function()\n {\n // Find pfc cookie\n var cookies = document.cookie.split(";");\n for(var i = 0; i < cookies.length; i++)\n {\n var p = cookies[i].indexOf("=");\n if(p != -1)\n {\n var name = cookies[i].substr(0, p).trim();\n if(name.substr(0, 3) == "pfc") // Found the 'pfc' cookie\n {\n var value = cookies[i].substr(p + 1).trim(); // This has the form contents\n var fc = value.split("&");\n for(i = 0; i < fc.length; i++)\n {\n p = fc[i].indexOf(":");\n name = fc[i].substr(0, p).trim();\n if(name !== "") {\n value = fc[i].substr(p + 1).trim();\n this.persistDict[name] = value;\n }\n }\n return;\n }\n }\n }\n },\n \n storePersistDict: function()\n {\n var c = "pfc=";\n var empty = true;\n for(var name in this.persistDict) \n c += name + ":" + this.persistDict[name] + "&";\n if(c.length > 4) {\n c = c.substr(0, c.length - 1); // Remove trailing '&'\n empty = false;\n }\n c += "; expires=" +\n new Date(new Date().getTime() + (86400000 * this.expiry)).toGMTString() +\n "; path=/";\n document.cookie = c;\n if(empty) // Don't save empty cookie\n document.cookie = "pfc=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/";\n },\n \n getTargetForm: function(formId, place)\n {\n var forms = place.getElementsByTagName("form");\n if(forms.length === 0) {\n displayMessage("PersistentForm: No form in tiddler!");\n return null;\n }\n var form = null; // Find the target form\n if(formId === "") {\n form = forms[0];\n } else {\n for(var i = 0; i < forms.length; i++) {\n if(forms[i].id == formId) {\n form = forms[i];\n break;\n }\n }\n }\n if(form === null) {\n displayMessage("PersistentForm: No form '" + formId + "' in tiddler.");\n return null;\n }\n return form;\n },\n \n handler: function(place, macroName, params, wikifier, paramString, tiddler) \n {\n var formId = params[0] ? params[0] : ""; // Empty means 1st/only form\n this.expiry = params[1] ? params[1] : 7; // Default to 7 day\n var label = params[2] ? params[2] : ""; // Default to no forget button\n var prompt = params[3] ? params[3] : ""; // Empty tooltip\n \n var form = this.getTargetForm(formId, place);\n if(form === null) return;\n this.loadPersistDict();\n // Enumerate form elements and set values as possible\n var nElem = form.elements.length;\n for(var i = 0; i < nElem; i++) {\n var elem = form.elements[i];\n var elemPersistVal = this.persistDict ? this.persistDict[elem.name] : ""; // Handle no cookie case\n switch(elem.type) {\n case "text":\n case "password":\n case "textarea":\n if(elemPersistVal) elem.value = unescape(elemPersistVal);\n elem.onkeyup = this.onChange;\n break;\n case "select-one":\n if(elemPersistVal) elem.value = unescape(elemPersistVal);\n elem.onchange = this.onChange;\n break;\n case "radio":\n elem.checked = (elemPersistVal == elem.value);\n elem.onclick = this.onChange;\n break;\n case "checkbox":\n if(elemPersistVal) elem.checked = (elemPersistVal == "true");\n elem.onclick = this.onChange;\n break;\n case "select-multiple":\n if(elemPersistVal) {\n var sels = elemPersistVal.split(","); // Array of selected option #s\n for(var j = 0; j < elem.options.length; j++)\n elem.options[j].selected = sels.contains(j.toString());\n }\n elem.onchange = this.onChange;\n break;\n default: // Others unsupported \n //displayMessage("PersistentForm: " + elem.type + " form elements not supported.");\n break; // Keep going\n }\n }\n \n if(label !== "")\n createTiddlyButton(place, label, prompt, \n function() {\n config.macros.PersistentForm.reset(place, form);\n return false;\n } );\n },\n \n onChange: function(e)\n {\n if (!e) e = window.event; // Ugh!\n var elem = e.target;\n if(!elem) elem = e.srcElement; // Ugh Ugh!\n var pers = elem.getAttribute("persist");\n if(pers && pers == "no") // If marked not to persist\n return; // do not save its value\n var val;\n switch(elem.type)\n {\n case "text":\n case "password":\n case "select-one":\n case "radio":\n case "textarea":\n val = escape(elem.value);\n break;\n case "checkbox":\n val = elem.checked ? "true" : "false";\n break;\n case "select-multiple": // "i,l,n" #s of sel'd items\n var sels = "";\n for(var j = 0; j < elem.options.length; j++) {\n if(elem.options[j].selected) // Encode only selected (may be none!)\n sels += j + ",";\n }\n if(sels) sels = sels.substr(0, sels.length -1); // Remove trailing comma\n val = sels;\n break;\n }\n config.macros.PersistentForm.persistDict[elem.name] = val;\n config.macros.PersistentForm.storePersistDict();\n },\n \n //\n // Delete cookies for given form/owner, clear the form\n //\n reset: function(place, form)\n {\n if(form === null) return;\n var nElem = form.elements.length;\n for(var i = 0; i < nElem; i++)\n delete this.persistDict[form.elements[i].name];\n this.storePersistDict();\n form.reset();\n }\n};\n//}}}\n
<<slider "" "Pictorial Camera Field Info" Details "Citation and usage info">>\n<html><table width="96%" style="border:none;margin:1px;background:transparent"><iframe id="aaladinlite" src="/ac/aaladinlite.asp" width="100%" height="0" frameborder="0" scrolling="no" allowtransparency style="border:none;"></iframe></table></html>\n<<RefreshIFrame "Recenter on Scope Field" "Move display back to scope coordinates">>
\nThis photographic view of your camera's current field of view is generated using the [[Aladin Lite service|http://aladin.u-strasbg.fr/AladinLite/?target=85.25%20-2.45&fov=1&survey=null]] which uses the "Aladin sky atlas" developed at CDS, Strasbourg Observatory, France โ [[2000A&AS..143...33B|http://cdsads.u-strasbg.fr/cgi-bin/nph-bib_query?2000A%26AS..143...33B&db_key=AST&nosetcookie=1]] and [[2014ASPC..485..277B|http://cdsads.u-strasbg.fr/cgi-bin/nph-bib_query?2014ASPC..485..277B&db_key=AST&nosetcookie=1]]\n\nIf the telescope is connected and running, then the display will be centered on the scope's current coordinates. If the scope is not connected, the center will be on the Horsehead Nebula. If both the scope and the camera are connected and running, the field of view shown will match your camera's field of view (given the camera pixel geometry and focal length set in ACP). Otherwise the FOV will be 30 arc minutes.\n\nYou can drag/move and zoom this with the mouse wheel or +/- buttons. Click/touch the Recenter button to restore the current conditions as previously described. Use the "full screen" icon in the upper left to fill the item with the display. __Recenter if the scope moves__. \n\nThanks to ACP user John Ramdenee for the proper scaling of the Aladin display to the camera pixel size, geometry, and telescope focal length.
/***\n|''Name:''|PinSystemStatusPlugin|\n|''Description:''|Force System Status tiddler to stay at top|\n|''Date:''|Nov 26, 2006|\n|''Author:''|Bob Denny|\n|''License:''|//none//|\n|''Version:''|1.0.1|\n|''~CoreVersion:''|2.1.3|\n!!Revision History\n<<<\n''2006.11.26 [1.0.1]'' Bob Denny - Initial edit\n<<<\n!! Hijack Code\n***/\n//{{{\nif(version.major == 2 && version.minor == 1)\n{\n Story.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)\n {\n var place = document.getElementById(this.container);\n var tiddlerElem = document.getElementById(this.idPrefix + title);\n if(tiddlerElem)\n this.refreshTiddler(title,template);\n else\n {\n var before;\n if(title == "System Status") {\n before = place.firstChild;\n } else {\n before = this.positionTiddler(srcElement);\n if(before && before.id == this.idPrefix + "System Status")\n before = before.nextSibling;\n }\n tiddlerElem = this.createTiddler(place,before,title,template);\n }\n if(srcElement && typeof srcElement !== "string")\n {\n if(anim && config.options.chkAnimate && (animate == undefined || animate === true))\n anim.startAnimating(new Cascade(title,srcElement,tiddlerElem,slowly),new Scroller(tiddlerElem,slowly));\n else\n window.scrollTo(0,ensureVisible(tiddlerElem));\n }\n };\n}\nelse\n alert("PinSystemStaturPlugin works only with TiddlyWiki 2.1.x");\n//}}}
/***\n|''Name:''|PostFormPlugin|\n|''Description:''|Post from form, wikify response|\n|''Date:''|Sep 1, 2011|\n|''Author:''|Bob Denny ~DC-3 Dreams, SP|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''Version:''|1.3.1|\n|''~CoreVersion:''|2.1.3|\n|''Require:''|[[DC3.Ajax|http://solo.dc3.com/tw/index.html#DC3.Ajax]] 1.0.5+, [[DC3.LightBox|http://solo.dc3.com/tw/#LightBoxPlugin]] (optional)|\n!!Description\nThis macro replaces the normal submit button for an HTML form contained in a tiddler. More than one form may appear in the tiddler, and this macro may be invoked on any of them. In addition, multiple invocations of this macro may appear in a tiddler, allowing you to provide posting from more than one form in a tiddler. \n\nThe macro invocation is replaced by wikified/styled button. The button's label and tooltip can be optionally specified as macro parameters. Clicking this button causes the contents of the form specified by the first (required) parameter to be ~POSTed to the URI that is the second (required) macro parameter. A standard message appears stating that the form data has been posted, then a second message appears when the response is received.\n\nThe macro also supports an optional parameter which causes a "confirm" popup to appear with specified text and one which causes the tiddler to be automatically refreshed following completion of the form post cycle.\n!!Integration with ValidateForm\nIf the ValidateForm macro (see [[ValidateFormPlugin]]) is invoked on the target form, then this macro will automatically call for validation just before posting to the remote server. Only if validation succeeds will the post be made. There is no specific action required of the programmer, PostForm just knows.\n!!Form Search Scope\nThe macro searches for its form within the scope of the macro handler's 'place' parameter. Normally, this is the tiddler viewer area. However, it is possible to include forms within a wikitext object such as a table cell. In this case, only forms within that table cell will be found by the macro (which also needs to be in that same table cell). This has some implications:\n# The form invocation must be within the same scope as the form it is controlling.\n# If only one form appears within a scope it need not be named, and the first parameter (the form name, see below) may be "".\n!!Usage\nCreate one or more forms in the tiddler, using {{{<html>}}} tags to enclose the form as usual. The form does not need to have {{{action}}} or {{{method}}} attributes, {{{<form>}}} is enough. If you have more than one form in the scope, you must give each one a name, for example, {{{<form name='form1'>}}}. Add form elements (text fields, checkboxes, etc.). each with a name and a value, per HTML. \n\nAt the location you want the post button to appear, invoke the PostForm macro. Remember the invocation must be in the same scope as the form! The macro has several parameters. If you need to include a parameter as a placeholder, use "":\n\n|!Param|!Description|\n|''1''|The name of the form, or "". If "" is given, the first form in the scope is posted even though there may be multiple forms in the scope.|\n|''2''|The URI of the remote form processor (typically a PHP, ASP, or CGI page). See the URI Formats section below.|\n|''3''|(optional) The label of the submit button, default "Submit"|\n|''4''|(optional) The tooltip of the submit button, default "Submit form to server"|\n|''5''|(optional) The text for a yes/no "confirm" popup that will be displayed after clicking the submit button and before posting the form to the server, default "" (no popup). Use this for an "Are you sure", for example.|\n|''6''|(optional) If given and not "false", the tiddler will be refreshed after the server has responded to the post. This can be very useful when combined with the RefreshTiddlerPlugin!|\n!!URI Formats\nThe second parameter is the URI of the remote form processor. If the ~TiddlyWiki itself is being read via HTTP from that same server and folder, then only the name of the form processor need be given. This approach makes it possible to move the ~TiddlyWiki and its form processors from one place to another on the net, without having to edit the URI parameter(s) of form post buttons. If the ~TiddlyWiki is being read from local disk, then you'll need to give the complete URI to the remote form processor. If you are unsure, just give the complete URI of the form processor.\n!!Security Issues\nYou may encounter security issues when using this plugin. Suppose you are reading the ~TiddlyWiki from one server, yet the ~PostForm macro specifies a form processor on a different server (different domain name). By default, most browsers will reject this cross-site operation. You may be able to override it, but in general this sort of thing is best avoided!\n!!Remote Form Processor\nThe remote form processor (e.g. PHP, ASP, CGI) is expected to return nothing or text with content type text/plain. If any text is returned, you have a choice of displaying it in a [[LightBox|http://solo.dc3.com/tw/#LightBoxPlugin]] alert or having it wikified and inserted //temporarily// at the end of the tiddler. To display the response in a ~LightBox alert, begin the response text with {{{[lba xx]}}} where xx is the icon name (ok, info, error, question, or warning). For appended wikitext, if the tiddler is closed and reopened, the response text will be gone. If the form is submitted more than once without closing the tiddler, multiple responses will be appended to the tiddler display. If the auto-refresh parameter is supplied, the tiddler will be refreshed after the post and any response text will be discarded.\n!!Examples\nHere's a simple form which is set to post to a mythical PHP page.\n{{{\n<html><form>\n<input type="text" name = "txt" width="40" value="Yo Mama!"></input>\n<input type="checkbox" name="ckbox" checked>Check this!</input>\n</form></html><<PostForm "" "formtest.php">>\n}}}\n<html><form>\n<input type="text" name = "txt" width="40" value="Yo Mama!"></input>\n<input type="checkbox" name="ckbox" checked>Check this!</input>\n</form></html><<PostForm "" "formtest.php">>\n!!Revision History\n<<<\n''2006.09.20 [1.0.1]'' Initial creation\n''2006.09.26 [1.1.1]'' Support multiple forms in a tiddler, ask, auto-refresh, Lint checked. Add documentation.\n''2006.10.03 [1.1.2]'' Validate with TW 2.1.0. No changes needed.\n''2006.10.24 [1.1.3]'' Comment out debugging displayMessage() calls\n''2007.10.15 [1.2.1]'' Add support for displaying response in LightBox\n''2008.04.02 [1.2.2]'' Fix multiple form support. Update version.extensions (cosmetic)\n''2011.08.29 [1.3.1]'' Add integration with new ValidateFormPlugin\n''2011.09.01 [1.3.1]'' Fix "no form" error message (just spotted by luck)\n<<<\n!!Code\n***/\n//{{{\nversion.extensions.PostForm = {\n major: 1, minor: 3, revision: 1,\n date: new Date(2011, 8, 29), \n type: 'macro',\n source: "http://solo.dc3.com/tw/index.html#PostFormPlugin"\n};\n\nconfig.macros.PostForm = \n{\n onComplete: function(text, params) \n {\n //displayMessage("Post completed successfully.");\n text = text.replace(/(^\ss*)|(\ss*$)/g, ""); // Trim off l/t junk!\n if(text) {\n if(text.search(/\s[lba /) != -1) { // Pop LB alert\n var icon = text.replace(/([\ss\sS]*\s[lba )([a-z]+)(\s][\ss\sS]*)/, "$2");\n var msg = text.replace(/([\sS\ss]*\s[lba [a-z]+\s])(.*)([\ss\sS]*)/, "$2");\n DC3.LightBox.showAlert(icon, msg);\n } else {\n wikify(text, params.place);\n }\n }\n if(params.refresh)\n story.refreshTiddler(params.tiddler.title, null, true);\n },\n \n handler: function(place, macroName, params, wikifier, paramString, tiddler) \n {\n var label = params[2] ? params[2] : "Submit";\n var prompt = params[3] ? params[3] : "Submit form to server";\n var ask = params[4] ? params[4] : "";\n var refresh = params[5] ? true : false;\n var complParams = { \n place: place,\n tiddler: tiddler,\n refresh: refresh\n };\n var forms = place.getElementsByTagName("form");\n if(forms.length === 0) {\n displayMessage("PostForm: No form in tiddler!");\n return;\n }\n var form = null;\n if(forms.length == 1 || params[0] === "") { // Only 1 or unspecified\n form = forms[0]; // First form in the tiddler\n } else {\n for(var i = 0; i < forms.length; i++) {\n if(forms[i].name == params[0]) {\n form = forms[i]; // Named form\n break;\n }\n }\n if(form === null) { // Not found by name\n displayMessage("PostForm: No form \s"" + params[0] + "\s"in tiddler!");\n return;\n }\n }\n createTiddlyButton(place, label, prompt, \n function () {\n if(ask) { if(!confirm(ask)) return false; }\n if(form.bValidator && !form.bValidator.validate())\n return false;\n //displayMessage("Posting data to server...");\n DC3.Ajax.postForm(form, params[1], \n config.macros.PostForm.onComplete, complParams);\n return false;\n } );\n }\n};\n//}}}\n
<html><a href="<%= feedUri %>"><img src="/im/feed-icon-28x28.png" border="0" title="Click to subscribe" width="28" height="28" align="right"></a></html>You can subscribe to an [[RSS feed|<%= feedUri %>]] of observing events from <%= Prefs.SiteName %>. The feed's "articles" are just one-liners describing the event, such as "Joe Astronomer started a run ...". \n\nNote that the __time of the event is the time of the article__, no explicit time is included in the articles themselves. This avoids having UTC times to deal with. The reader takes care of converting the article times into //your// local time.
<html>\n <table width="96%" style="border:none;margin:1px;background:transparent;clear:both;">\n <iframe src="https://radar.weather.gov/" width="100%" height="640px" \n scrolling="no" frameborder="0" allowtransparency>\n </iframe>\n </table>\n</html>\nClick or touch the chart image to zoom into an area. Drag to move the map. [[Open a new browser tab to the NWS Radar page|https://radar.weather.gov/]].
If you go beyond creating items, editing in ~WikiText, using the supplied plugins, etc. and get into advanced editing (low level HTML, writing your own ~JavaScript, using ~JQuery, etc.) you really need to know how to use the in-browser developer tools that are provided by the major browsers (Chrome, Firefox, the Microsoft browsers). You can find right where your script is failing or where the HTML is broken, where CSS styling is not working. etc. \n\nIf you make a mistake editing the UI content that results in the UI being unusable, preventing you from correcting your mistake. In this case you will need to revert to the previous content that was working. Recall that each time you Save to Web, the server saves a copy of the ''freshly modified'' Author.html to the ''author-backup'' folder, naming it {{{author.bk-yyyymmdd_hhmmss.html}}}. Then it makes the new index.asp.\n\n@@The web content is in {{{Public Documents\sACP Web Data\sDoc Root}}}@@\n\nLet's say you made a mistake, then did the Save to Web, then when doing the Test Live the UI fails to load and start, and maybe you get some error messages. Now what? And worse yet, maybe the Authoring environment has become unusable for some reason. You can always get back to where you were before your last set of changes (the ones that broke the UI). You do this by \n#In the ''Doc Root'' folder, delete the "live" ''author.html'' which has your mistakes in it. It's useless.\n#In the ''author-backup'' subfolder delete just-saved {{{author.bk-yyyymmdd_hhmmss.html}}} (the one with your mistakes, but be careful, check the file date time).\n#Now copy the next-to-newest saved author file (the one remaining after you deleted the newest in the previous step {{{author.bk-yyyymmdd_hhmmss.html}}}) from ''author-backup'' to the ''Doc Root'' folder //above// ''author-backup''. \n#Finally, rename {{{author.bk-yyyymmdd_hhmmss.html}}} to just plain ''author.html''.\n#Navigate with your browser directly to the authoring environment {{{http://127.0.0.1/Author.html}}}. Now the Authoring environment will be "reset" back to its state before you made the changes that killed it. #Refresh your browser (always). \n#Save To Web. This will replace the broken index.asp (live content) with the previous version that was working.\nThis will reset both the authoring environment (author.html) and the live content (index.asp) back to before your failed changes.
/***\n|''Name:''|RefreshIFramePlugin|\n|''Description:''|Refresh an entire tiddler with optional periodic re-refresh|\n|''Date:''|Oct 6, 2006|\n|''Source:''|http://solo.dc3.com/tw/index.html#RefreshIFramePlugin|\n|''Author:''|Bob Denny ~DC-3 Dreams, SP|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''Version:''|1.0.4|\n|''~CoreVersion:''|2.0.11, 2.1.0|\n|''Browser:''|Firefox 1.5; Internet Explorer 6.0; Safari|\n|''Require:''|CheckboxPlugin (http://www.TiddlyTools.com/#CheckboxPlugin)|\n!Description\nThis macro provides a tiddler with an <iframe> refresh control. This permits refreshing just the iframe, avoiding flashing due to refreshing the entire tiddler. Normally, a refresh button appears at the location of the macro invocation. Clicking this button causes the contents of the tiddler to be refreshed. Optionally, a checkbox may also be displayed with which the user can enable and disable automatic periodic refresh of the tiddler at an interval specified by the third parameter. Finally, for special applications, a fourth parameter may be given, and if "true" both the button and the checkbox will be hidden, and the tiddler will simply refresh periodically at the interval given by the third parameter.\n\n@@There is a //lot// you can do with iframes in a tiddler@@. For more information see my ~TiddkyWiki [[Magic With <iframe>|http://solo.dc3.com/tw/HandlingIframes.html]]. \n!Usage\nThis plugin supports tiddlers with a single <iframe>, thus it assiciates itself with the first/only <iframe> in a tiddler. To add refreshing, simply invoke the macro (with optional parameters as desired, see below) wherever you want the button and optional checkbox to appear.\n\nThere are four optional parameters:\n|!Parameter|!Description|\n|''1''|(optional) Button label, default "Refresh"|\n|''2''|(optional) Button tooltip, default "Refresh the remote frame"|\n|''3''|(optional) Periodic refresh interval, sec., default 0 (no periodic refresh checkbox)|\n|''4''|(optional) If present and "true" and parameter 3 > 0 all controls will be hidden and the tiddler will refresh periodically whenever it is visible.|\n!!Revision History\n<<<\n''2006.09.22 [1.0.1]'' Initial creation, from RefreshTiddler\n''2006.09.29 [1.0.2]'' Refresh checkbox cookie names different from RefreshTiddler.\n''2006.10.03 [1.0.3]'' Add parameter to hide button and checkbox while doing periodic refresh. Expand documentation, lint check, validate with ~TiddlyWiki 2.1.0\n''2006.10.03 [1.0.4]'' Handle race condition on IE - initial refresh lost. Force refresh at end of handler(). Disable container refreshing for checkbox, see CheckboxPlugin.\n<<<\n!!Code\n***/\n//{{{\nversion.extensions.RefreshIFrame = {\n major: 1, minor: 0, revision: 4,\n date: new Date(2006, 10, 6), \n type: 'macro',\n source: "#RefreshIFramePlugin"\n};\n\nconfig.macros.RefreshIFrame = \n{\n states: { }, // Associative array of refresh states indexed by tiddler name\n \n handler: function(place, macroName, params, wikifier, paramString, tiddler)\n {\n var tidTitle = tiddler.title; // Shortcut\n if(!this.states[tidTitle]) this.states[tidTitle] = { // Array of state objects for refreshed tiddlers\n iframe: null,\n butLabel: "",\n butTooltip: "",\n refInterval: 0,\n doRefresh: false,\n initPerRef: false,\n timerId: 0,\n chkBox: null\n };\n var state = this.states[tidTitle]; // Shortcut\n var iframes = place.getElementsByTagName("iframe");\n if(iframes.length === 0) {\n displayMessage("PostForm: No iframe in tiddler!");\n return;\n }\n state.iframe = iframes[0]; // Only 1st iframe\n state.butLabel = params[0] ? params[0] : "Refresh"; // Make these react to edits\n state.butTooltip = params[1] ? params[1] : "Refresh the remote frame";\n state.refInterval = params[2] ? params[2] : 0; // 0 = no periodic refresh checkbox\n var hidden = params[3] && params[3].toLowerCase() == "true" && state.refInterval > 0;\n if(!hidden) { // Unless want hidden\n var btn = createTiddlyButton(place, state.butLabel, state.butTooltip, this.onButClick);\n btn.name = tidTitle; // Set button name to tiddler name (see onButClick())\n if(state.refInterval > 0) // If periodic refresh wanted\n {\n wikify(" [ =chkPerRefIfr" + tiddler.created.convertToYYYYMMDDHHMM() + // Uniquify chkbox ID\n "{config.macros.RefreshIFrame.states[\s"" + tidTitle + "\s"].chkBox = this; " + \n "this.refresh.container=false;}" +\n "{config.macros.RefreshIFrame.onChkClick(\s"" + tidTitle + "\s");}] " + \n state.butLabel + " every " + state.refInterval + " seconds", place);\n state.timerId = 0;\n if(!state.initPerRef) this.onChkClick(tidTitle); // Simulate checkbox click (state already from cookie)\n }\n } else if(state.refInterval > 0 && !state.initPerRef) { // Hidden, if per ref and not started, start it\n if(state.timerId) clearTimeout(state.timerId);\n this.startRefresh(tidTitle); \n state.initPerRef = true;\n }\n state.iframe.src = state.iframe.src; // Refresh!\n },\n \n onButClick: function(e) \n {\n if(!e) e = window.event;\n var tidTitle = resolveTarget(e).name; // Name is the tiddler name!\n //displayMessage("but " + tidTitle);\n var iframe = config.macros.RefreshIFrame.states[tidTitle].iframe;\n iframe.src = iframe.src; // Refresh!\n return false;\n },\n \n onChkClick: function(tidTitle) \n {\n var state = this.states[tidTitle];\n if(state.chkBox.checked) {\n if(state.timerId) clearTimeout(state.timerId);\n this.startRefresh(tidTitle); \n } else { \n state.doRefresh = false;\n }\n state.initPerRef = true;\n },\n \n startRefresh: function(tidTitle) \n {\n var state = this.states[tidTitle];\n state.doRefresh = true;\n //displayMessage("st " + tidTitle + " " + state.refInterval);\n state.timerId = setTimeout("config.macros.RefreshIFrame.reRefresh(\s"" + \n tidTitle + "\s")", state.refInterval * 1000);\n },\n \n reRefresh: function(tidTitle)\n {\n var state = this.states[tidTitle];\n state.timerId = 0;\n if(!state.doRefresh) return;\n // Kill re-refresh cycle if tiddler closed or edited\n var tidElem = document.getElementById(story.idPrefix + tidTitle); // DON'T GET CUTE! THIS IS CORRECT!\n //**BUGBUG** Hardwired to EditTemplate!\n if(!tidElem || tidElem.attributes['template'].value == "EditTemplate") // Prevent hidden or editing\n {\n state.initPerRef = false;\n return;\n }\n //displayMessage("re " + tidTitle + " " + state.refInterval);\n state.iframe.src = state.iframe.src; // Refresh!\n state.timerId = setTimeout("config.macros.RefreshIFrame.reRefresh(\s"" + \n tidTitle + "\s")", state.refInterval * 1000);\n }\n};\n//}}}\n
/***\n|''Name:''|RefreshTiddlerPlugin|\n|''Description:''|Refresh an entire tiddler with optional periodic re-refresh|\n|''Date:''|July 5, 2011|\n|''Source:''|http://solo.dc3.com/tw/index.html#RefreshTiddlerPlugin|\n|''Author:''|Bob Denny ~DC-3 Dreams, SP|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''Version:''|1.1.1|\n|''~CoreVersion:''|2.0.11, 2.1.0|\n|''Require:''|[[CheckboxPlugin]]|\n\n!Usage\nThis macro provides a tiddler with refresh control. At a minimum, a refresh button appears at the location of the macro invocation. Clicking this button causes the contents of the tiddler to be refreshed. Optionally, a checkbox may also be displayed with which the user can enable and disable automatic periodic refresh of the tiddler at a specified interval.\nThere are three optional parameters\n|!Parameter|!Description|\n|''1''|Button label, default "Refresh"|\n|''2''|Button tooltip, default "Refresh this item"|\n|''3''|Periodic refresh interval, sec., default 0 (no periodic refresh checkbox)|\n|''4''|(optional) If present and "true" and parameter 3 > 0 all controls will be hidden and the tiddler will refresh periodically whenever it is visible.|\n\n!Examples\nTypically, an item that needs refreshing is used to display remote dynamic content. This could be some remote text generated by a server side script (ASP, PHP, etc., or a remote image that changes periodically (weather stations often generate these). The techniques for each of these differ:\n\n''Remote Text Generated by Script (PHP, ASP, etc.)''\nThis uses the [[RemoteContentPlugin]] to insert the remote text, which can be wikitext. You do not need the refresh controls of [[RemoteContentPlugin]].\n{{{\n<<RemoteContent "http://foo.bar.com/stuff.php">>\n<<RefreshTiddlerPlugin Refresh "Refresh the Stuff display">>\n}}}\nThis will display the wikitext generated by the remote script stuff.php. A button labeled Refresh, with a tooltip of "Refresh the Stuff display" will appear at the bottom of the item.\n\n''Remote Image that Changes Periodically''\nThis plugin is commonly used to display @@remote images which change over time@@, such as weather station outputs. Browser image caching often prevents the image from being refreshed, even though the usual HTTP cache-control protocol is in use. To force bypassing the browser cache for the displayed image, use the [[InlineJavascriptPlugin]] capability and construct the wikitext in Javascript so that the image URL has a query string which is a large unique number:\n{{{\n<script>\n return "[img[http://myweather.org/img/curweather.jpg?"\n + new Date().getTime() + "]]";\n</script>\nUpdated every 5 minutes\n<<RefreshTiddler xx 'xx' 300 true>>\n}}}\nThis will display the current version of the image curweather.jpg, and refresh every 5 minutes. No refresh button or checkbox will appear, so a text message informing the user of the 5 minute refresh interval was inserted below the image.\n\n!Revision History\n<<<\n\n''2006.09.13 [1.0.1]'' Initial creation, several days\n''2006.09.22 [1.0.2]'' Make periodic refresh checkbox optional\n''2006.09.29 [1.0.3]'' Refresh checkbox cookie names different from RefreshIframe.\n''2006.10.03 [1.0.4]'' Lint check, validate on TW 2.1.0.\n''2011.07.05 [1.1.1]'' Add 4th parameter for no checkbox but periodic refresh (like [[RefreshIFramePlugin]]). Change default button text 'tiddler' to 'item'. Add doc on how to display dynamically changing images. Restore code indentation that was destroyed by Internet Exploder.\n<<<\n\n!Code\n***/\n//{{{\nversion.extensions.RefreshTiddler = {\n major: 1, minor: 1, revision: 1,\n date: new Date(2011, 7, 5), \n type: 'macro',\n source: "#RefreshTiddlerPlugin"\n};\n\nconfig.macros.RefreshTiddler = \n{\n states: { }, // Associative array of refresh states indexed by tiddler name\n \n handler: function(place, macroName, params, wikifier, paramString, tiddler)\n {\n var tidTitle = tiddler.title; // Shortcut\n if(!this.states[tidTitle]) this.states[tidTitle] = { // Array of state objects for refreshed tiddlers\n butLabel: "",\n butTooltip: "",\n refInterval: 0,\n doRefresh: false,\n initPerRef: false,\n timerId: 0,\n chkBox: null\n };\n var state = this.states[tidTitle]; // Shortcut\n state.butLabel = params[0] ? params[0] : "Refresh"; // Make these react to edits\n state.butTooltip = params[1] ? params[1] : "Refresh this item";\n state.refInterval = params[2] ? params[2] : 0; // 0 = no periodic refresh checkbox\n var hidden = params[3] && params[3].toLowerCase() == "true" && state.refInterval > 0;\n if(!hidden) { // Unless want hidden\n var btn = createTiddlyButton(place, state.butLabel, state.butTooltip, this.onButClick);\n btn.name = tidTitle; // Set button name to tiddler name (see onButClick())\n if(state.refInterval > 0) // If periodic refresh wanted\n {\n wikify(" [ =chkPerRefTid" + tiddler.created.convertToYYYYMMDDHHMM() + // Uniquify chkbox ID\n "{config.macros.RefreshTiddler.states[\s"" + tidTitle + "\s"].chkBox = this;}" +\n "{config.macros.RefreshTiddler.onChkClick(\s"" + tidTitle + "\s");}] " + \n state.butLabel + " every " + state.refInterval + " seconds", place);\n state.timerId = 0;\n if(!state.initPerRef) this.onChkClick(tidTitle); // Simulate checkbox click (state already from cookie)\n }\n } else if(state.refInterval > 0 && !state.initPerRef) { // Hidden, if per ref and not started, start it\n if(state.timerId) clearTimeout(state.timerId);\n this.startRefresh(tidTitle); \n state.initPerRef = true;\n }\n },\n \n onButClick: function(e) \n {\n if(!e) e = window.event;\n var tidTitle = resolveTarget(e).name; // Name is the tiddler name!\n //displayMessage("but " + tidTitle);\n story.refreshTiddler(tidTitle, null, true);\n return false;\n },\n \n onChkClick: function(tidTitle) \n {\n var state = this.states[tidTitle];\n if(state.chkBox.checked) {\n if(state.timerId) clearTimeout(state.timerId);\n this.startRefresh(tidTitle); \n } else { \n state.doRefresh = false;\n }\n state.initPerRef = true;\n },\n \n startRefresh: function(tidTitle) \n {\n var state = this.states[tidTitle];\n state.doRefresh = true;\n //displayMessage("st " + tidTitle + " " + state.refInterval);\n state.timerId = setTimeout("config.macros.RefreshTiddler.reRefresh(\s"" + \n tidTitle + "\s")", state.refInterval * 1000);\n },\n \n reRefresh: function(tidTitle)\n {\n var state = this.states[tidTitle];\n state.timerId = 0;\n if(!state.doRefresh) return;\n // Kill re-refresh cycle if tiddler closed or edited\n var tidElem = document.getElementById(story.idPrefix + tidTitle); // DON'T GET CUTE! THIS IS CORRECT!\n //**BUGBUG** Hardwired to EditTemplate!\n if(!tidElem || tidElem.attributes['template'].value == "EditTemplate") // Prevent hidden or editing\n {\n state.initPerRef = false;\n return;\n }\n //displayMessage("re " + tidTitle + " " + state.refInterval);\n story.refreshTiddler(tidTitle, null, true);\n state.timerId = setTimeout("config.macros.RefreshTiddler.reRefresh(\s"" + \n tidTitle + "\s")", state.refInterval * 1000);\n }\n};\n//}}}\n
Turn this on to use regular expression patterns for searching. If you don't kow what a regular expression is, leave it off.
/***\n|''Name:''|RemoteContentPlugin|\n|''Description:''|Insert content from server with [Update] button|\n|''Date:''|Jan 21,2014|\n|''Source:''|[[RemoteContentPlugin]]|\n|''Author:''|Bob Denny ~DC-3 Dreams, SP|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''Version:''|2.0.1|\n|''~CoreVersion:''|2.1.3|\n|''Browser:''|Chrome; Internet Explorer 8+; Firefox; Safari|\n|''Require:''|[[DC3.Ajax]] 1.0.4+|\nThis macro allows remotely generated text (raw or wikified) to be inserted into a tiddler, along with an //optional// refresh button below the inserted text. This is different from the RefreshTiddlerPlugin, which is used (e.g.) to refresh an embedded <iframe> and adds just the refresh button and optional periodic refresh checkbox and nothing else.\n!!Usage\nPlace this macro in a tiddler where you want refreshable remote content to be inserted. There are up to 3 parameters:\n|!Parameter|!Meaning|\n|''1'' (required)|URI of the remote content (typically dynamic). The inserted text is //wikified// by default, that is, it is rendered as wiki text. Thus the remote content can contain any wiki formatting sequences, including stuff wrapped in <html> tags. An optional parameter allows the text to be inserted raw, without wikification (new behavior in 2014). |\n|''2'' (optional)|Label of refresh button. If not given, no refresh button is displayed.|\n|''3'' (optional)|Prompt (tooltip) of refresh button. Valid only if previous parameter is given. If not supplied and a refresh button is requested, this will default to "Refresh from remote data"|\n|''4'' (optional)|Literally "raw" to bypass the newline stripping and wikification process.|\n\n!!!Examples:\n{{{\n<<RemoteContent "http://foo.bar.com/stuff.php">>\n<<RemoteContent "http://foo.bar.com/stuff.php" "Try again" "Try to fetch data again">>\n<<RemoteContent "http://foo.bar.com/stuff.php" "" "" "raw">>\n}}}\n!!Revision History\n<<<\n''2006.09.16 [1.0.1]'' Initial creation\n''2006.09.19 [1.0.2]'' Add parameters to make refresh button optional. This allows the macro to be used inline in tiddler text to grab stuff from the server and insert it. Remove unused msg property and string.\n''2006.09.20 [1.0.3]'' Refactored for new DC3.Ajax signature, code cleanup\n''2006.09.26 [1.0.4]'' Fix wikify() call in onComplete() to include tiddler parameter.\n''2006.10.05 [1.0.5]'' Strip \sr characters from remote text before calling wikify() in onComplete(). These were fooling the wikify formatter for (at least) <html> blocks that contained one or more.\n''2014.01.21 [2.1.0]'' Add 4th parameter "raw" to suppress wikification and \sr stripping.\n<<<\n!!Code\n***/\n//{{{\nversion.extensions.RemoteContent = {\n major: 2, minor: 0, revision: 1,\n date: new Date(2014, 1, 21), \n type: 'macro',\n source: "#RemoteContentPlugin"\n};\n\nconfig.macros.RemoteContent = \n{\n onComplete: function(text, params) \n {\n if (params.raw) {\n createTiddlyText(params.place, "raw:" + text);\n } else {\n text = text.replace(/\sr/mg, "");\n wikify(text, params.place, "", params.tiddler);\n if(params.label) {\n wikify("<<RemoteContentUpdate " + params.url + \n " [[" + params.tiddler.title + "]] \s"" + params.label +\n "\s" \s"" + params.prompt + "\s">>", params.place);\n }\n }\n },\n \n handler: function(place, macroName, params ,wikifier, paramString, tiddler) \n {\n var complParams = { \n url: params[0],\n place: place,\n tiddler: tiddler,\n label: params[1] ? params[1] : "",\n prompt: params[2] ? params[2] : "",\n raw: params[3] == "raw"\n };\n DC3.Ajax.sendRequest('GET', params[0], "", this.onComplete, complParams);\n }\n};\n//}}}\n\n//{{{\nconfig.macros.RemoteContentUpdate = \n{\n handler: function(place ,macroName, params) {\n var url = params[0];\n var title = params[1];\n var label = params[2];\n var prompt = params[3] ? params[3] : "Refresh remote data";\n createTiddlyButton(place, label, prompt, \n function () {\n story.refreshTiddler(title, null, true);\n return false;\n }\n );\n }\n};\n//}}}\n
If you have lots of logs, this could take a long time to appear.\n\n<<RemoteContent '/logs/<%= User.Username %>/aindex.asp' Refresh 'Refresh the file list'>>
\nThis item lets you start an [[Observing Plan|Making Observing Plans]] that you have prepared in advance. Observing plans are typically used for //multiple target// runs or runs that use ACP's more advanced features. For more information on observing plans, see [[Making Observing Plans]].
\nThis item allows you to run one of the [[Utility Scripts]] that the staff has provided, or that someone has uploaded. If the script requests user input, you will see one or more input forms appear here some time after the script has started.\n\nSelect a [[Utility Script|Utility Scripts]] from the list box below then click the button to start it. As usual, any outoput from it will appear in the [[System Status]] run log panel.
Edit this item (just double-click anywhere inside or use the edit link in the upper right) and see what happens. Play with the various formatting markup and macros. This will not be seen by end users.\n\nHere is some //italic// text, some ''bold'', and __underlined__. You can link to an external site with a naked URI like http://acp.dc3.com/ or make a [[Hyperlink| http://acp.dc3.com/]] to an external site. The page will appear in a separate tab or window of the browser. It won't replace the current page!\n\nHere's an example of using [[JQuery|Using jQuery]] and the [[DC3.LightBox]] plugin to make clickable text that pops up an alert. This demonstrates several advanced techniques, including using ~HTML and ~JavaScript, as well as [[JQuery|Using jQuery]].\n\n<html><a href="javascript:;" id="sandboxClickyText">Click this link to show the alert.</a></html>\n<script>\n\n$('#sandboxClickyText').click(function() {\n DC3.LightBox.showAlert("info", "Hello world");\n});\n\n</script>\n
\n<<slider "" "Schedule Astro-Imaging Help" Help "Helpful information">>\n<html>\n<form name="scast_form" id="scast_form">\n <h2 id="SAstSect1" title="Click to toggle section visibility">1. Object and Coordinates</h2>\n <div id="SAstSlide1">\n <table class="noBorder" style="border:0;margin-left:0">\n <tr>\n <td>Target Name:</td>\n <td><input type="text" name="Target" id="SAstTarget" size="14" value="" validate="required">\n <input type="hidden" name="visOnly" id="sAstVisOnly" value="false">\n <input type="text" name="isOrb" id="SAstIsOrb">\n </td> <!-- persists for body type, must be text -->\n <td>\n <a id="sast_getCoords" href="javascript:;" \n onClick="DC3.CatSearch.lookup(DC3.Lib.getPlace(this),\n // Trigger event from a change in the isOrb field which DC3.CatSearch fills in\n (function(msg) { $('#SAstIsOrb').trigger(jQuery.Event('change')) }));"\n title="Look up coordinates or calculate planetary ephemeris"> Get Coordinates or Ephemeris</a>\n <a id="sast_getTheSky" style="display:none;" href="javascript:;" onClick="DC3.TheSky.fillFormInfo(DC3.Lib.getPlace(this));" \n title="Fill in the coordinates from the current target in TheSky"> Get Coordinates From TheSky</a>\n </td>\n </tr>\n <tr>\n <td>Right Asc. (hrs):</td>\n <td><input type="text" name="RA" id="SAstRA" size="12" value="" validate="sexanum[0:24],required"></td>\n <td><a id="sast_catSearch" href="javascript:;" onClick="story.displayTiddler(this,'Deep Sky Catalog Search',null,config.options.chkAnimate,false)" \n title="Open the Deep Sky Catalog Search Item"> Deep Sky Catalog Search</a></td>\n </tr>\n <tr>\n <td>Declination (deg):</td>\n <td><input type="text" name="Dec" id="SAstDec" size="12" value="" validate="sexanum[-90:90],required"></td>\n <td> <i>(coordinates in J2000)</i></td>\n </tr>\n <!--<% if(rotAvail) { %>-->\n <tr>\n <td>Pos. Angle (deg):</td>\n <td><input type="text" name="PA" id="SAstPA" size="5" value="" validate="number,between[0:360],required"></td>\n <td> <i>(true/sky PA, required)</i></td>\n </tr>\n <!--<% } %>-->\n <tr id="SAstOrbTrackRow">\n <td>Orbital Tracking:</td>\n <td colspan=><input type="checkbox" name="orbTrack" id="SAstOrbTrack" value="yes"></td>\n <td> <i>(follow body, if mount supports it)</i></td>\n </tr>\n </table>\n </div>\n <h2 id="SAstSect2" title="Click to toggle section visibility">2. Images (request each color separately)</h2>\n <div id="SAstSlide2">\n <table class="noBorder" style="border:0;margin-left:0;">\n <tr>\n <td>Total time:</td>\n <td><input type="text" name="TotalTime" id="SAstTotTime" size="5" value="" validate="number,required"></td>\n <td> <i>(hours, may extend over multiple nights)</i></td>\n </tr>\n <tr>\n <td>Exposure time:</td>\n <td><input type="text" name="ExposureTime" id="SAstExpTime" size="5" value="" validate="number,required"></td>\n <td> <i>(seconds, for each individual exposure)</i></td>\n </tr>\n <tr>\n <!--<% if(filtNames) { %>-->\n <td>Filter:</td>\n <td><select name="Filter" id="SAstFilter"><%= filterNameOptionsSch() %></select></td>\n <td> </td>\n <!--<%} else { %>-->\n <td colspan="3"> <span class="marked">(this observatory has no filters)</span></td>\n <!--<% } %>-->\n </tr>\n <tr>\n <td>Binning:</td>\n <td><select name="Binning" id="SAstBinning"><%= binningOptions() %></select></td>\n <td> </td>\n </tr>\n <tr>\n <td>Dithering:</td>\n <td><input type="text" name="Dither" id="SAstDither" size="5" value="0.0" validate="number,required"></td>\n <!--<% if(ditherMainPixels) { %>-->\n <td><i>(main imager pixels rms, -1.0 for auto)</i></td>\n <!--<% } else { %>-->\n <td><i>(pixels rms <img src="/im/tinyInfo.png" width="16" height="16" border="none" align="absmiddle" \n hspace="6" title="If guided: guider pixels. If unguided: main imager pixels."> -1.0 for auto)</i></td>\n <!--<% } %>-->\n </tr>\n <!--<% if(!schPerAF) { %>-->\n <tr>\n <td>Auto Focus:</td>\n <td><input type="checkbox" name="AutoFocus" id="SAstAF" size="0" value="yes"></td>\n <td><img src="/im/tinyInfo.png" width="16" height="16" border="none" align="absmiddle" \n hspace="6" title="Automatic focus management has been disabled."> Autofocus before each block of images</td>\n </tr>\n <!--<% } %>-->\n <!--<% if(!acpAutoCal) { %>-->\n <tr>\n <td>Auto Calibrate:</td>\n <td><input type="checkbox" name="AutoCal" id="SAstCal" size="0" value="yes"></td>\n <td> Perform full calibration after acquiring</td>\n </tr>\n <tr id="SAstHotPixRow">\n <td>Hot Pixels:</td>\n <td><input type="checkbox" name="HotPix" id="SAstHot" size="0" value="yes"></td>\n <td> Remove hot pixels after calibration</td>\n </tr>\n <!--<% } %>-->\n </table>\n </div>\n <h2 id="SAstSect3" title="Click to toggle section visibility">3. Priority and Constraints</h2>\n <div id="SAstSlide3">\n <table class="noBorder" style="border:0;margin-left:0;">\n <tr>\n <td>Priority:</td>\n <td><input type="text" name="Priority" id="SAstPriority" size="5" value="0" validate="number,between[0:127],required"></td>\n <!--<% if(schUserPrio) { %>-->\n <td id="SAstPriNote1"><i>(each observer has own priority scale)</i></td>\n <td id="SAstPriNote2"><i>(fixed time - priority n/a)</i></td>\n <!--<%} else { %>-->\n <td id="SAstPriNote1"><i>(all observers share priority scale)</i></td>\n <td id="SAstPriNote2"><i>(fixed time - priority n/a)</i></td>\n <!--<% } %>-->\n </tr>\n <tr>\n <td>Horizon:</td>\n <td><input type="text" name="Horizon" id="SAstHorizon" size="5" value="35" validate="number,between[0:85]"></td>\n <td><i>(degrees, must be above this altitude)</i></td>\n </tr>\n <tr>\n <td>Hour Angle:</td>\n <td><input type="text" name="HAEast" id="SAstHAEast" size="5" value="" validate="sexanum[-12:12]"> \n <input type="text" name="HAWest" id="SAstHAWest" size="5" value="" validate="sexanum[-12:12]"></td>\n <td><i>(Hours E, W, -east, must be within HA range)</i></td>\n </tr>\n <tr name="SAstMoonAvoidRow" id="SAstMoonAvoidRow">\n <td>Moon Avoid:</td>\n <td><input type="text" name="MADist" id="SAstMADist" size="5" value="" validate="between[1:120]"> \n <input type="text" name="MAWidth" id="SAstMAWidth" size="5" value="" validate="between[1:14]"></td>\n <td><i>(distance degrees, width days <img src="/im/tinyInfo.png" width="16" height="16" border="none" align="absmiddle" \n hspace="6" title="Moon Avoidance Lorentzian"> <a href="javascript:;" title="Moon Avoidance Lorentzian Help"\n onClick="story.displayTiddler(this,'Moon Avoidance Lorentzian Help',null,config.options.chkAnimate,false)">Moon Avoid Help</a>)</i></td>\n </tr>\n <tr>\n <td>Moon Down:</td>\n <td><input type="checkbox" name="MDown" id="SAstMDown" size="0" value="yes"></td>\n <td><i>(Moon must be below horizon, ignore Moon Avoid)</i></td>\n </tr>\n <tr>\n <td>Sky Condition:</td>\n <td><select name="SkyCond" id="SAstSkyCond">\n <option value="4">Excellent</option>\n <option value="3" selected>Good</option>\n <option value="2">Fair</option>\n </select></td>\n <td>(Sky must be at least this good)</td>\n </tr>\n </table>\n </div>\n <h2 id="SAstSect4" title="Click to toggle section visibility">4. Timing Controls</h2>\n <div id="SAstSlide4">\n <table class="noBorder" style="border:0;margin-left:0;">\n <tr>\n <td>Block Time:</td>\n <td><input type="text" name="SAstBlockTime" id="SAstBlockTime" size="5" value="1" validate="number,between[0.5:4.0]"></td>\n <td><i>(hours, <img src="/im/tinyWarn.png" width="16" height="16" border="none" align="absmiddle" hspace="6" title="Use with care. Each block of images is separately scheduled. The longer the block time is, the more chances it will fail for weather. Too many hours in a block and you don't need a scheduler, right?" /> divide images into blocks of time up to this long, default 1 hour, 0.5 - 4 hrs)</i></td>\n </tr>\n <tr>\n <td colspan="3"><span class="marked">Note: The values and options below cleared when this form is closed.</span></td>\n </tr>\n <tr>\n <td>Monitor Interval:</td>\n <td><input type="text" name="SAstMonitorInt" id="SAstMonitorInt" size="5" value="0" validate="number" persist="no"></td>\n <td name="SAstMonNote1" id="SAstMonNote1"><i>(days, requeue every 'n' days forever or until "Must Run Before")</i></td>\n <td name="SAstMonNote2" id="SAstMonNote2"><i>(monitor n/a for fixed time)</i></td>\n </tr>\n <tr>\n <td name="SAstMRALabel" id="SAstMRALabel">Must Run After:</td>\n <td><input type="text" name="SAstMustAfter" id="SAstMustAfter" size="20" value="" validate="idatetime" persist="no"></td>\n <td name="SAstMRACmt" id="SAstMRACmt"><i>(UTC, ex: 2022/11/30 03:12:44)</i></td>\n </tr>\n <tr>\n <td name="SAstMRBLabel" id="SAstMRBLabel">Must Run Before:</td>\n <td><input type="text" name="SAstMustBefore" id="SAstMustBefore" size="20" value="" validate="idatetime" persist="no"></td>\n <td name="SAstMRBCmt" id="SAstMRBCmt"><i>(UTC, ex: 2022/11/30 03:12:44)</i></td>\n </tr>\n <tr>\n <td>Fixed Time:</td>\n <td><input type="checkbox" name="SAstFixedTime" id="SAstFixedTime" size="0" value="yes" persist="no"></td>\n <td><i>(override dispatcher <img src="/im/tinyWarn.png" width="16" height="16" border="none" align="absmiddle" \n hspace="6" title="You can force this to stop early with 'Force end at'" /> <u>use with caution!</u>)</i></td>\n </tr>\n </table>\n </div>\n <input type="checkbox" name="autoSubmit" id="SAstAutoSubmit" value="yes">Enable requests immediately</input> \n</form>\n</html>\n<<PersistentForm>><<PostForm "" "/ac/asastroimage.asp" "Submit Request" "Sends this request to the scheduler">><<ValidateForm "" "postit">><script>\n// DC3.TheSky.setTargetInfo() and DC3.TheSky.switchLink() depend on the link IDs!\nif(DC3.TheSky.theSkyInfoAvailable()) DC3.TheSky.switchLink("sast");\n\nvar e = { target: null }; // Used for constructed eventArgs\n// SECTION 1\n$('#SAstIsOrb').change(function() {\n if($('#SAstIsOrb').val() == 'orb') {\n $('#SAstRA').fadeTo('slow', 0.3);\n $('#SAstRA').prop('disabled', true);\n $('#SAstDec').fadeTo('slow', 0.3);\n $('#SAstDec').prop('disabled', true);\n $('#SAstOrbTrackRow').fadeIn('slow');\n } else {\n $('#SAstRA').fadeTo('slow', 1.0);\n $('#SAstRA').prop('disabled', false);\n $('#SAstDec').fadeTo('slow', 1.0);\n $('#SAstDec').prop('disabled', false);\n $('#SAstOrbTrack').prop('checked', false); // for persisted forms\n e = { target: null };\n e.target = $('#SAstOrbTrack')[0];\n config.macros.PersistentForm.onChange(e);\n $('#SAstOrbTrackRow').fadeOut('slow');\n }\n });\n$('#SAstSect1').click(function () {\n $('SAstIsOrb').trigger(jQuery.Event('change'));\n $('#SAstSlide1').fadeToggle('slow');\n });\n \n// SECTION 2\n//<% if(!acpAutoCal) { %>\n$('#SAstCal').change(function () {\n if(this.checked) {\n $('#SAstHotPixRow').fadeIn('slow');\n } else {\n $('#SAstHotPixRow').fadeOut('slow');\n }\n });\n//<% } %>\n$('#SAstSect2').click(function () {\n //<% if(!acpAutoCal) { %>\n $('#SAstCal').trigger(jQuery.Event('change'));\n //<% } %>\n $('#SAstSlide2').fadeToggle('slow');\n });\n\n// SECTION 3\n$('#SAstMDown').change(function() {\n if(this.checked) {\n $('#SAstMoonAvoidRow').fadeOut('slow');\n $('#SAstMADist').val('');\n e = { target: null };\n e.target = $('#SAstMADist')[0];\n config.macros.PersistentForm.onChange(e);\n $('#SAstMAWidth').val('');\n e.target = $('#SAstMAWidth')[0];\n config.macros.PersistentForm.onChange(e);\n } else {\n $('#SAstMoonAvoidRow').fadeIn('slow');\n }\n });\n$('#SAstSect3').click(function () {\n $('#SAstMDown').trigger(jQuery.Event('change'));\n $('#SAstSlide3').fadeToggle('slow');\n });\n\n// SECTION 4 -- NOT PERSISTED, NO NEED FOR INIT ON FORM OPENING\n$('#SAstFixedTime').change(function() {\n if(this.checked) {\n $('#SAstPriority').fadeTo('slow', 0.3);\n $('#SAstPriority').prop('disabled', true);\n $('#SAstPriNote1').hide();\n $('#SAstPriNote2').fadeTo('slow', 0.3);\n $('#SAstMonitorInt').val(0);\n $('#SAstMonitorInt').fadeTo('slow', 0.3);\n $('#SAstMonitorInt').prop('disabled', true);\n $('#SAstMonNote1').hide();\n $('#SAstMonNote2').fadeTo('slow', 0.3);\n $('#SAstMustBefore').val('');\n $('#SAstMRALabel').prop('innerHTML', 'Force <b>start</b> at:');\n $('#SAstMRBLabel').prop('innerHTML', 'Force <b>end</b> at:');\n $('#SAstMRBCmt').prop('innerHTML', '<i>(leave blank to allow normal completion)</i>');\n $('#SAstRunNowRow').fadeOut('slow');\n $('#SAstAutoSubmit').prop('checked', true); // Probably wants this to be enabled since it is time critical\n// DC3.LightBox.showAlert("warning", \n// "Don't use Fixed Time for asteroids or comets. The system can calculate " + \n// "the coordinates and tracking rates at image time. The only reason to use " +\n// "Fixed Time is for events that have a hard timing or phase constraint.");\n } else {\n $('#SAstPriority').fadeTo('slow', 1.0);\n $('#SAstPriority').prop('disabled', false);\n $('#SAstPriNote2').hide();\n $('#SAstPriNote1').fadeTo('slow', 1.0);\n $('#SAstMonitorInt').fadeTo('slow', 1.0);\n $('#SAstMonitorInt').prop('disabled', false);\n $('#SAstMonNote1').fadeTo('slow', 1.0);\n $('#SAstMonNote2').hide();\n $('#SAstMRALabel').prop('innerText', 'Must run after:');\n $('#SAstMRBLabel').prop('innerText', 'Must run before:');\n $('#SAstMRBCmt').prop('innerHTML', '<i>(leave blank for any time thereafter)</i>');\n $('#SAstRunNowRow').fadeIn('slow');\n }\n });\n$('#SAstSect4').click(function () {\n $('#SAstFixedTime').trigger(jQuery.Event('change'));\n $('#SAstSlide4').fadeToggle('slow');\n });\n\n//\n// LOADING FORM\n// These run when the form is first opened in the item/tiddler. Must initialize\n// all of the interlocking dynamic elements in the sections that load open (1 & 2)\n//\n$('#SAstOrbTrackRow').fadeOut(0);\n$('#SAstIsOrb').hide();\n$('#SAstIsOrb').trigger(jQuery.Event('change'));\n$('#SAstHotPixRow').fadeOut(0); // Prevent this from fading out after form is opened \n$('#SAstTimeSpaceRow').fadeOut('slow');\n$('#SAstCal').trigger(jQuery.Event('change'));\n$('#SAstMDown').trigger(jQuery.Event('change'));\n$('#SAstFixedTime').trigger(jQuery.Event('change'));\n\n//Pre-collapse here, do NOT use display:none, validation will fail\n$('#SAstSlide3').fadeOut(0);\n$('#SAstSlide4').fadeOut(0);\n\n</script>\n
\nSubmit a request to the scheduler for astro-imaging data. The strategy is unusual. Each submission requests some number of hours in a single color/band with a specified sub-exposure time. The work is split up into one or more Plans, each of which is separately scheduled. The Plans are created to take ''Block Time'' hours (Section 4). The shorter the ''Block Time'' the more flexibility the scheduler has. This allows the scheduler to work its magic. You will never be able to guess when your observing will be done! But it will be done, and under the conditions you specify. Who has a crystal ball? \n\nYou can specify both deep sky and solar system targets, and the latter will have their ephemerides calculated automatically. See [[How to Specify Targets]]. Normally, the request will be entered in a disabled state, requiring you to enable it with the [[Schedule Browser|/sc/index.asp]] before it can run. If you're brave (certain that you've entered a correct request), check the ''Enable requests immediately'' box and your request will be runnable without further action. This does //not// mean it will run immediately, of course.\n\nThe form should be self-evident, but here are a few things to note:\n* Here details on the useful [[Moon Avoid constraint|Moon Avoidance Lorentzian Help]]\n* If you typically do 10 minute or shorter sub-exposures, consider setting the ''Block Time'' (section 4) to 0.5 hours. Any longer subs, use 1 hour block times. \n* Be very careful using the Timing features (section 4). You can easily create impossible situations. Relax and let the scheduler do its job!\n* You can force the request to start right now (section 4), but it will kill any run in progress. Also, if constraints aren't met it will fail right now. Again, use with care.
<<slider "" "Schedule Time Series Help" Help "Helpful information">>\n<html>\n<!-- This was the "photometry" form, hence the SPhotxxx names, which remain -->\n<form name="SPhotForm" id="SPhotForm">\n <h2 id="SPhotSect1" title="Click to toggle section visibility">1. Scheduler Project</h2>\n <div id="SPhotSlide1">\n <table class="noBorder" style="border:0;margin-left:0;">\n <tr>\n <td>Select Project:</td>\n <td><select name="Project" id="SPhotProject"></select> (select existing project, or...) <a href="javascript:;" onClick='DC3.Lib.fillInnerHTML("/ac/asgenprojlist.asp", "SPhotProject");'>Refresh Project List</a></td>\n </tr>\n <tr>\n <td>New Project:</td>\n <td><input class="txt" name="NewProject" type="text" id="SPhotNewProject" \n size="25" /> (...create new project with this name)</td>\n </tr>\n </table>\n </div>\n <h2 id="SPhotSect2" title="Click to toggle section visibility">2. Object and Coordinates</h2>\n <div id="SPhotSlide2">\n <table class="noBorder" style="border:0;margin-left:0;">\n <tr>\n <td>Target Name:</td>\n <td><input type="text" name="Target" id="SPhotTarget" size="14" value="" validate="required">\n <input type="hidden" name="visOnly" id="sPhotVisOnly" value="false">\n <input type="text" name="isOrb" id="SPhotIsOrb"></td>\n <td>\n <a id="sphot_getCoords" href="javascript:;" \n onClick="DC3.CatSearch.lookup(DC3.Lib.getPlace(this),\n // Trigger event from a change in the isOrb field which DC3.CatSearch fills in\n (function(msg) { $('#SPhotIsOrb').trigger(jQuery.Event('change')) }));"\n title="Look up coordinates or calculate planetary ephemeris"> Get Coordinates or Ephemeris</a>\n <a id="sphot_getTheSky" style="display:none;" href="javascript:;" onClick="DC3.TheSky.fillFormInfo(DC3.Lib.getPlace(this));" \n title="Fill in the coordinates from the current target in TheSky"> Get Coordinates From TheSky</a>\n </td>\n </tr>\n <tr>\n <td>Right Asc. (hrs):</td>\n <td><input type="text" name="RA" id="SPhotRA" size="12" value="" validate="sexanum[0:24],required"></td>\n <td><a id="sphot_catSearch" href="javascript:;" onClick="story.displayTiddler(this,'Deep Sky Catalog Search',null,config.options.chkAnimate,false)" \n title="Open the Deep Sky Catalog Search Item"> Deep Sky Catalog Search</a></td>\n </tr>\n <tr>\n <td>Declination (deg):</td>\n <td><input type="text" name="Dec" id="SPhotDec" size="12" value="" validate="sexanum[-90:90],required"></td>\n <td> <i>(coordinates in J2000)</i></td>\n </tr>\n <!--<% if(rotAvail) { %>-->\n <tr>\n <td>Pos. Angle (deg):</td>\n <td><input type="text" name="PA" id="SPhotPA" size="5" value="" validate="number,between[0:360],required"></td>\n <td> <i>(true/sky PA, required)</i></td>\n </tr>\n <!--<% } %>-->\n <tr id="SPhotOrbTrackRow">\n <td>Orbital Tracking:</td>\n <td colspan=><input type="checkbox" name="orbTrack" id="SPhotOrbTrack" value="yes"></td>\n <td> <i>(follow body, if mount supports it)</i></td>\n </tr>\n </table>\n </div>\n <h2 id="SPhotSect3" title="Click to toggle section visibility">3. Images and Processing</h2>\n <div id="SPhotSlide3">\n <table class="noBorder" style="border:0;margin-left:0;">\n <tr>\n <th>Use</th>\n <th>Count</th>\n <!--<% if(filtNames) { %>-->\n <th>Filter</th>\n <!--<% } %>-->\n <th>Duration</th>\n <th>Binning</th>\n </tr>\n <tr id="SPhotRow1">\n <td><input type="checkbox" name="SPhotUse1" id="SPhotUse1" value="yes"></td>\n <td><input type="text" name="SPhotCount1" id="SPhotCount1" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="SPhotFilter1" id="SPhotFilter1">\n <%= filterNameOptionsSch() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="SPhotExposure1" id="SPhotExposure1" size="5" value=""></td>\n <td><select name="SPhotBinning1" id="SPhotBinning1">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="SPhotRow2">\n <td><input type="checkbox" name="SPhotUse2" id="SPhotUse2" value="yes"></td>\n <td><input type="text" name="SPhotCount2" id="SPhotCount2" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="SPhotFilter2" id="SPhotFilter2">\n <%= filterNameOptionsSch() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="SPhotExposure2" id="SPhotExposure2" size="5" value=""></td>\n <td><select name="SPhotBinning2" id="SPhotBinning2">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="SPhotRow3">\n <td><input type="checkbox" name="SPhotUse3" id="SPhotUse3" value="yes"></td>\n <td><input type="text" name="SPhotCount3" id="SPhotCount3" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="SPhotFilter3" id="SPhotFilter3">\n <%= filterNameOptionsSch() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="SPhotExposure3" id="SPhotExposure3" size="5" value=""></td>\n <td><select name="SPhotBinning3" id="SPhotBinning3">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="SPhotRow4" style="display:none">\n <td><input type="checkbox" name="SPhotUse4" id="SPhotUse4" value="yes"></td>\n <td><input type="text" name="SPhotCount4" id="SPhotCount4" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="SPhotFilter4" id="SPhotFilter4">\n <%= filterNameOptionsSch() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="SPhotExposure4" id="SPhotExposure4" size="5" value=""></td>\n <td><select name="SPhotBinning4" id="SPhotBinning4">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="SPhotRow5" style="display:none">\n <td><input type="checkbox" name="SPhotUse5" id="SPhotUse5" value="yes"></td>\n <td><input type="text" name="SPhotCount5" id="SPhotCount5" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="SPhotFilter5" id="SPhotFilter5">\n <%= filterNameOptionsSch() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="SPhotExposure5" id="SPhotExposure5" size="5" value=""></td>\n <td><select name="SPhotBinning5" id="SPhotBinning5">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="SPhotRow6" style="display:none">\n <td><input type="checkbox" name="SPhotUse6" id="SPhotUse6" value="yes"></td>\n <td><input type="text" name="SPhotCount6" id="SPhotCount6" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="SPhotFilter6" id="SPhotFilter6">\n <%= filterNameOptionsSch() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="SPhotExposure6" id="SPhotExposure6" size="5" value=""></td>\n <td><select name="SPhotBinning6" id="SPhotBinning6">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="SPhotRow7" style="display:none">\n <td><input type="checkbox" name="SPhotUse7" id="SPhotUse7" value="yes"></td>\n <td><input type="text" name="SPhotCount7" id="SPhotCount7" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="SPhotFilter7" id="SPhotFilter7">\n <%= filterNameOptionsSch() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="SPhotExposure7" id="SPhotExposure7" size="5" value=""></td>\n <td><select name="SPhotBinning7" id="SPhotBinning7">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="SPhotRow8" style="display:none">\n <td><input type="checkbox" name="SPhotUse8" id="SPhotUse8" value="yes"></td>\n <td><input type="text" name="SPhotCount8" id="SPhotCount8" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="SPhotFilter8" id="SPhotFilter8">\n <%= filterNameOptionsSch() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="SPhotExposure8" id="SPhotExposure8" size="5" value=""></td>\n <td><select name="SPhotBinning8" id="SPhotBinning8">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="SPhotRow9" style="display:none">\n <td><input type="checkbox" name="SPhotUse9" id="SPhotUse9" value="yes"></td>\n <td><input type="text" name="SPhotCount9" id="SPhotCount9" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="SPhotFilter9" id="SPhotFilter9">\n <%= filterNameOptionsSch() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="SPhotExposure9" id="SPhotExposure9" size="5" value=""></td>\n <td><select name="SPhotBinning9" id="SPhotBinning9">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="SPhotRow10" style="display:none">\n <td><input type="checkbox" name="SPhotUse10" id="SPhotUse10" value="yes"></td>\n <td><input type="text" name="SPhotCount10" id="SPhotCount10" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="SPhotFilter10" id="SPhotFilter10">\n <%= filterNameOptionsSch() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="SPhotExposure10" id="SPhotExposure10" size="5" value=""></td>\n <td><select name="SPhotBinning10" id="SPhotBinning10">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="SPhotRow11" style="display:none">\n <td><input type="checkbox" name="SPhotUse11" id="SPhotUse11" value="yes"></td>\n <td><input type="text" name="SPhotCount11" id="SPhotCount11" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="SPhotFilter11" id="SPhotFilter11">\n <%= filterNameOptionsSch() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="SPhotExposure11" id="SPhotExposure11" size="5" value=""></td>\n <td><select name="SPhotBinning11" id="SPhotBinning11">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="SPhotRow12" style="display:none">\n <td><input type="checkbox" name="SPhotUse12" id="SPhotUse12" value="yes"></td>\n <td><input type="text" name="SPhotCount12" id="SPhotCount12" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="SPhotFilter12" id="SPhotFilter12">\n <%= filterNameOptionsSch() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="SPhotExposure12" id="SPhotExposure12" size="5" value=""></td>\n <td><select name="SPhotBinning12" id="SPhotBinning12">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="SPhotRow13" style="display:none">\n <td><input type="checkbox" name="SPhotUse13" id="SPhotUse13" value="yes"></td>\n <td><input type="text" name="SPhotCount13" id="SPhotCount13" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="SPhotFilter13" id="SPhotFilter13">\n <%= filterNameOptionsSch() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="SPhotExposure13" id="SPhotExposure13" size="5" value=""></td>\n <td><select name="SPhotBinning13" id="SPhotBinning13">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="SPhotRow14" style="display:none">\n <td><input type="checkbox" name="SPhotUse14" id="SPhotUse14" value="yes"></td>\n <td><input type="text" name="SPhotCount14" id="SPhotCount14" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="SPhotFilter14" id="SPhotFilter14">\n <%= filterNameOptionsSch() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="SPhotExposure14" id="SPhotExposure14" size="5" value=""></td>\n <td><select name="SPhotBinning14" id="SPhotBinning14">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="SPhotRow15" style="display:none">\n <td><input type="checkbox" name="SPhotUse15" id="SPhotUse15" value="yes"></td>\n <td><input type="text" name="SPhotCount15" id="SPhotCount15" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="SPhotFilter15" id="SPhotFilter15">\n <%= filterNameOptionsSch() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="SPhotExposure15" id="SPhotExposure15" size="5" value=""></td>\n <td><select name="SPhotBinning15" id="SPhotBinning15">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="SPhotRow16" style="display:none">\n <td><input type="checkbox" name="SPhotUse16" id="SPhotUse16" value="yes"></td>\n <td><input type="text" name="SPhotCount16" id="SPhotCount16" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="SPhotFilter16" id="SPhotFilter16">\n <%= filterNameOptionsSch() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="SPhotExposure16" id="SPhotExposure16" size="5" value=""></td>\n <td><select name="SPhotBinning16" id="SPhotBinning16">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr>\n <td colspan="5"><a href="javascript:;" class="button" title="Click to add another row" onclick="DC3.Lib.expandoAddRow('SPhot');">More</a></td>\n </tr>\n <tr>\n <td>Dithering:</td>\n <td><input type="text" name="SPhotDither" id="SPhotDither" size="5" value="0.0" validate="number,required"></td>\n <!--<% if(ditherMainPixels) { %>-->\n <td colspan="3"><i>(main imager pixels, -1.0 for auto)</td>\n <!--<% } else { %>-->\n <td colspan="3"><i>(pixels rms <img src="/im/tinyInfo.png" width="16" height="16" border="none" \n align="absmiddle" hspace="6" title="If guided: guider pixels. If unguided: main imager pixels." />\n -1.0 for auto)</i></td>\n <!--<% } %>-->\n </tr>\n <!--<% if(!schPerAF) { %>-->\n <tr>\n <td>Auto Focus:</td>\n <td><input type="checkbox" name="AutoFocus" id="SPhotAF" size="0" value="yes"></td>\n <td colspan="3"><i><img src="/im/tinyInfo.png" width="16" height="16" border="none" align="absmiddle" \n hspace="6" title="Automatic focus management has been disabled."> Autofocus before each block of images</i></td>\n </tr>\n <!--<% } %>-->\n <!--<% if(!acpAutoCal) { %>-->\n <tr>\n <td>Auto Calibrate:</td>\n <td><input type="checkbox" name="AutoCal" id="SPhotCal" size="0" value="yes"></td>\n <td> Perform full calibration after acquiring</td>\n </tr>\n <tr id="SPhotHotPixRow">\n <td>Hot Pixels:</td>\n <td><input type="checkbox" name="HotPix" id="SPhotHot" size="0" value="yes"></td>\n <td> Remove hot pixels after calibration</td>\n </tr>\n <!--<% } %>-->\n </table>\n </div>\n <h2 id="SPhotSect4" title="Click to toggle section visibility">4. Constraints</h2>\n <div id="SPhotSlide4">\n <table class="noBorder" style="border:0;margin-left:0;">\n <tr>\n <td>Horizon:</td>\n <td><input type="text" name="Horizon" id="SPhotHorizon" size="5" value="35" validate="between[0:85]"></td>\n <td><i>(degrees, must be above this altitude)</i></td>\n </tr>\n <tr>\n <td>Hour Angle:</td>\n <td><input type="text" name="HAEast" id="SPhotHAEast" size="5" value="" validate="sexanum[-12:12]"> \n <input type="text" name="HAWest" id="SPhotHAWest" size="5" value="" validate="sexanum[-12:12]"></td>\n <td><i>(Hours E, W, -east, must be within HA range)</i></td>\n </tr>\n <tr>\n <td>Air Mass Range:</td>\n <td><input type="text" name="AmHigh" id="SPhotAmHigh" size="5" value="" validate="between[1:10]"> \n <input type="text" name="AmLow" id="SPhotAmLow" size="5" value="" validate="between[1:10]"></td>\n <td><i>(max, min - relative air mass <img src="/im/tinyInfo.png" width="16" height="16" border="none" align="absmiddle" \n hspace="6" title="Use a minimum of 1.0 for 'air mass below' constraint" /> must be within this range)</i></td>\n </tr>\n <tr name="SPhotMoonAvoidRow" id="SPhotMoonAvoidRow">\n <td>Moon Avoid:</td>\n <td><input type="text" name="MADist" id="SPhotMADist" size="5" value="" validate="between[1:120]"> \n <input type="text" name="MAWidth" id="SPhotMAWidth" size="5" value="" validate="between[1:14]"></td>\n <td><i>(distance degrees, width days <img src="/im/tinyInfo.png" width="16" height="16" border="none" align="absmiddle" \n hspace="6" title="Moon Avoidance Lorentzian" /> <a href="javascript:;" title="Moon Avoidance Lorentzian Help"\n onClick="story.displayTiddler(this,'Moon Avoidance Lorentzian Help',null,config.options.chkAnimate,false)">Moon Avoid Help</a>)</i></td>\n </tr>\n <tr>\n <td>Moon Down:</td>\n <td><input type="checkbox" name="MDown" id="SPhotMDown" size="0" value="yes"></td>\n <td><i>(Moon must be below horizon, ignore Moon Avoid)</i></td>\n </tr>\n <tr>\n <td>Sky Condition:</td>\n <td><select name="SkyCond" id="SPhotSkyCond">\n <option value="4">Excellent</option>\n <option value="3" selected>Good</option>\n <option value="2">Fair</option>\n </select></td>\n <td><i>(Sky must be at least this good)</i></td>\n </tr>\n </table>\n </div>\n <h2 id="SPhotSect5" title="Click to toggle section visibility">5. Priority and Series</h2>\n <div id="SPhotSlide5">\n <table class="noBorder" style="border:0;margin-left:0;">\n <tr>\n <td>Priority:</td>\n <td><input type="text" name="Priority" id="SPhotPriority" size="5" value="0" validate="number, between[0:127],required"></td>\n <!--<% if(schUserPrio) { %>-->\n <td colspan="4" id="SPhotPriNote1"><i>(each observer has own priority scale)</i></td>\n <td colspan="4" id="SPhotPriNote2"><i>(fixed time - priority n/a)</i></td>\n <!--<%} else { %>-->\n <td colspan="4" id="SPhotPriNote1"><i>(all observers share priority scale)</i></td>\n <td colspan="4" id="SPhotPriNote2"><i>(fixed time - priority n/a)</i></td>\n <!--<% } %>-->\n </tr>\n <tr>\n <td>Repeat Series:</td>\n <td><input type="text" name="SPhotRepeat" id="SPhotRepeat" size="5" value="1" validate="number,required"></td>\n <td colspan="4"><i>(repeat entire image set this many times)</i></td>\n </tr>\n <tr name="SPhotMultObsRow" id="SPhotMultObsRow">\n <td>Separate Obs:</td>\n <td><input type="checkbox" name="SPhotMultObs" id="SPhotMultObs" size="0" value="yes"></td>\n <td colspan="4"><i>(each repeat is a separate Observation/ACP run)</i></td>\n </tr>\n <tr name="SPhotTimeSpaceRow" id="SPhotTimeSpaceRow">\n <td>Time Spacing:</td>\n <td><input type="text" name="SPhotTimeSpace" id="SPhotTimeSpace" size="5" value="0" validate="number,required"></td>\n <td><i>(sec, start to start)</i> </td>\n <td>Spacing Tol:</td>\n <td><input type="text" name="SPhotTimeTol" id="SPhotTimeTol" size="5" value="0" validate="number,required"></td>\n <td><i>(sec, early/late)</i></td>\n </tr>\n <tr name="SPhotBestEffortsRow" id="SPhotBestEffortsRow">\n <td>Best Efforts:</td>\n <td><input type="checkbox" name="SPhotBestEfforts" id="SPhotBestEfforts" size="0" value="yes"></td>\n <td colspan="4"><i>(OK if series terminates early)</i></td>\n </tr>\n </table>\n </div>\n <h2 id="SPhotSect6" title="Click to toggle section visibility">6. Timing and Monitor Mode</h2>\n <div id="SPhotSlide6">\n <table class="noBorder" style="border:0;margin-left:0;">\n <tr>\n <td colspan="3"><span class="marked">Note: The values and options in this section are cleared when this form is closed.</span></td>\n </tr>\n <tr>\n <td>Monitor Interval:</td>\n <td><input type="text" name="SPhotMonitorInt" id="SPhotMonitorInt" size="5" value="0" validate="number" persist="no"></td>\n <td name="SPhotMonNote1" id="SPhotMonNote1"><i>(days, requeue every 'n' days forever or until "Must Run Before")</i></td>\n <td name="SPhotMonNote2" id="SPhotMonNote2"><i>(fixed time - monitor n/a)</i></td>\n </tr>\n <tr>\n <td name="SPhotMRALabel" id="SPhotMRALabel">Must Run After:</td>\n <td><input type="text" name="SPhotMustAfter" id="SPhotMustAfter" size="20" value="" validate="idatetime" persist="no"></td>\n <td name="SPhotMRACmt" id="SPhotMRACmt"><i>(UTC, ex: 2022/11/30 03:12:44)</i></td>\n </tr>\n <tr>\n <td name="SPhotMRBLabel" id="SPhotMRBLabel">Must Run Before:</td>\n <td><input type="text" name="SPhotMustBefore" id="SPhotMustBefore" size="20" value="" validate="idatetime" persist="no"></td>\n <td name="SPhotMRBCmt" id="SPhotMRBCmt"><i>(UTC, ex: 2022/11/30 03:12:44)</i></td>\n </tr>\n <tr>\n <td>Fixed Time:</td>\n <td><input type="checkbox" name="SPhotFixedTime" id="SPhotFixedTime" size="0" value="yes" persist="no"></td>\n <td><i>(override dispatcher <img src="/im/tinyWarn.png" width="16" height="16" border="none" align="absmiddle" \n hspace="6" title="You can force this to stop early with 'Force end at'" /> <u>use with caution!</u>)</i></td>\n </tr>\n <tr name="SPhotRunNowRow" id="SPhotRunNowRow">\n <td>Run Now:</td>\n <td><input type="checkbox" name="SPhotRunNow" id="SPhotRunNow" size="0" value="yes" persist="no"></td>\n <td><i>(start immediately <img src="/im/tinyWarn.png" width="16" height="16" border="none" align="absmiddle" \n hspace="6" title="Interrupts current Observation if running and starts this immediately" /> if constraints met)</i></td>\n </tr>\n </table>\n </div>\n <input type="checkbox" name="autoSubmit" id="SPhotAutoSubmit" value="yes" persist="no">Enable requests immediately</input>\n</form>\n</html>\n<<PersistentForm>><<PostForm "" "/ac/asphotosingle.asp" "Submit Request" "Sends this request to the scheduler">><<ValidateForm "" "postit">><script>\n// DC3.TheSky.setTargetInfo() and DC3.TheSky.switchLink() depend on the link IDs!\nif(DC3.TheSky.theSkyInfoAvailable()) DC3.TheSky.switchLink("sphot");\nDC3.Lib.expandoInitializeForm("SPhot");\n\nvar e = { target: null }; // Used for constructed eventArgs\n\n// SECTION 1\n$('#SPhotSect1').click(function () {\n $('#SPhotSlide1').fadeToggle('slow');\n });\n\n// SECTION 2\n$('#SPhotIsOrb').change(function() { // Used only when form is opened, using the persisted text field (hidden)\n if($('#SPhotIsOrb').val() == 'orb') {\n $('#SPhotRA').fadeTo('slow', 0.3);\n $('#SPhotRA').prop('disabled', true);\n $('#SPhotDec').fadeTo('slow', 0.3);\n $('#SPhotDec').prop('disabled', true);\n $('#SPhotOrbTrackRow').fadeIn('slow');\n } else {\n $('#SPhotRA').fadeTo('slow', 1.0);\n $('#SPhotRA').prop('disabled', false);\n $('#SPhotDec').fadeTo('slow', 1.0);\n $('#SPhotDec').prop('disabled', false);\n $('#SPhotOrbTrack').prop('checked', false); // Force tracking checkbox off, and for persisted forms\n e = { target: null };\n e.target = $('#SPhotOrbTrack')[0];\n config.macros.PersistentForm.onChange(e);\n $('#SPhotOrbTrackRow').fadeOut('slow');\n }\n });\n$('#SPhotSect2').click(function () {\n $('SPhotIsOrb').trigger(jQuery.Event('change'));\n $('#SPhotSlide2').fadeToggle('slow');\n });\n \n// SECTION 3\n//<% if(!acpAutoCal) { %>\n$('#SPhotCal').change(function () {\n if(this.checked) {\n $('#SPhotHotPixRow').fadeIn('slow');\n } else {\n $('#SPhotHotPixRow').fadeOut('slow');\n }\n });\n//<% } %>\n$('#SPhotSect3').click(function () {\n //<% if(!acpAutoCal) { %>\n $('#SPhotCal').trigger(jQuery.Event('change'));\n //<% } %>\n $('#SPhotSlide3').fadeToggle('slow');\n });\n\n// SECTION 4\n$('#SPhotMDown').change(function() {\n if(this.checked) {\n $('#SPhotMoonAvoidRow').fadeOut('slow');\n $('#SPhotMADist').val('');\n e = { target: null };\n e.target = $('#SPhotMADist')[0];\n config.macros.PersistentForm.onChange(e);\n $('#SPhotMAWidth').val('');\n e = { target: null };\n e.target = $('#SPhotMAWidth')[0];\n config.macros.PersistentForm.onChange(e);\n } else {\n $('#SPhotMoonAvoidRow').fadeIn('slow');\n }\n });\n$('#SPhotSect4').click(function () {\n $('#SPhotMDown').trigger(jQuery.Event('change'));\n $('#SPhotSlide4').fadeToggle('slow');\n });\n\n//SECTION 5\n$('#SPhotRepeat').on('input', function() {\n if(parseInt($('#SPhotRepeat').val()) > 1) {\n $('#SPhotMultObs').trigger(jQuery.Event('change'));\n $('#SPhotMultObsRow').fadeIn('slow');\n } else {\n $('#SPhotMultObs').prop('checked', false); // Force values here for persisted form and later re-apparance (typ.)\n $('#SPhotMultObs').trigger(jQuery.Event('change'));\n $('#SPhotMultObsRow').fadeOut('slow'); // Change value before hiding so user sees the change (typ.)\n $('#SPhotBestEfforts').prop('checked', false);\n $('#SPhotBestEffortsRow').fadeOut('slow');\n }\n });\n$('#SPhotMultObs').change(function() {\n if(this.checked) {\n $('#SPhotTimeSpaceRow').fadeIn('slow');\n $('#SPhotBestEffortsRow').fadeIn('slow');\n } else {\n $('#SPhotTimeSpace').val('0');\n $('#SPhotTimeTol').val('0');\n $('#SPhotTimeSpaceRow').fadeOut('slow');\n $('#SPhotBestEffortsRow').fadeOut('slow');\n }\n });\n \n$('#SPhotSect5').click(function () {\n $('#SPhotRepeat').trigger(jQuery.Event('input'));\n $('#SPhotSlide5').fadeToggle('slow');\n });\n\n// SECTION 6 -- NOT PERSISTED, NO NEED FOR INIT ON FORM OPENING\n$('#SPhotFixedTime').change(function() {\n if(this.checked || $('#SPhotRunNow').is(':checked')) {\n $('#SPhotPriority').fadeTo('slow', 0.3);\n $('#SPhotPriority').prop('disabled', true);\n $('#SPhotPriNote1').hide();\n $('#SPhotPriNote2').fadeTo('slow', 0.3);\n $('#SPhotMonitorInt').val(0);\n $('#SPhotMonitorInt').fadeTo('slow', 0.3);\n $('#SPhotMonitorInt').prop('disabled', true);\n $('#SPhotMonNote1').hide();\n $('#SPhotMonNote2').fadeTo('slow', 0.3);\n $('#SPhotMustBefore').val('');\n $('#SPhotMRALabel').prop('innerHTML', 'Force <b>start</b> at:');\n $('#SPhotMRBLabel').prop('innerHTML', 'Force <b>end</b> at:');\n $('#SPhotMRBCmt').prop('innerHTML', '<i>(leave blank to allow normal completion)</i>');\n $('#SPhotRunNowRow').fadeOut('slow');\n $('#SPhotAutoSubmit').prop('checked', true); // Probably wants this to be enabled since it is time critical\n// DC3.LightBox.showAlert("warning", \n// "Don't use Fixed Time for asteroids or comets. The system can calculate " + \n// "the coordinates and tracking rates at image time. The only reason to use " +\n// "Fixed Time is for events that have a hard timing or phase constraint.");\n } else {\n $('#SPhotPriority').fadeTo('slow', 1.0);\n $('#SPhotPriority').prop('disabled', false);\n $('#SPhotPriNote2').hide();\n $('#SPhotPriNote1').fadeTo('slow', 1.0);\n $('#SPhotMonitorInt').fadeTo('slow', 1.0);\n $('#SPhotMonitorInt').prop('disabled', false);\n $('#SPhotMonNote1').fadeTo('slow', 1.0);\n $('#SPhotMonNote2').hide();\n $('#SPhotMRALabel').prop('innerText', 'Must run after:');\n $('#SPhotMRBLabel').prop('innerText', 'Must run before:');\n $('#SPhotMRBCmt').prop('innerHTML', '<i>(leave blank for any time thereafter)</i>');\n $('#SPhotRunNowRow').fadeIn('slow');\n }\n });\n// This handles dimming for both run now and fixed time\n$('#SPhotRunNow').change(function() {\n if(this.checked) {\n $('#SPhotPriority').fadeTo('slow', 0.3);\n $('#SPhotPriority').prop('disabled', true);\n $('#SPhotPriNote1').hide();\n $('#SPhotPriNote2').fadeTo('slow', 0.3);\n $('#SPhotMonitorInt').val('0');\n $('#SPhotMonitorInt').fadeTo('slow', 0.3);\n $('#SPhotMonitorInt').prop('disabled', true);\n $('#SPhotMustAfter').val('');\n $('#SPhotMustAfter').fadeTo('slow', 0.3);\n $('#SPhotMustAfter').prop('disabled', true);\n $('#SPhotMustBefore').val('');\n $('#SPhotMustBefore').fadeTo('slow', 0.3);\n $('#SPhotMustBefore').prop('disabled', true);\n $('#SPhotFixedTime').fadeTo('slow', 0.3);\n $('#SPhotFixedTime').prop('disabled', true);\n $('#SPhotAutoSubmit').prop('checked', true); // He really wants this to be NOW!!!\n DC3.LightBox.showAlert("warning", \n "This will cause all running Plans and any imaging in progress to be " + \n "immediately terminated, resulting in Plan failure(s). This option is " +\n "intended for IMMEDIATE targets of opportunity only.");\n } else {\n $('#SPhotPriority').fadeTo('slow', 1.0);\n $('#SPhotPriority').prop('disabled', false);\n $('#SPhotPriNote2').hide();\n $('#SPhotPriNote1').fadeTo('slow', 1.0);\n $('#SPhotMonitorInt').fadeTo('slow', 1.0);\n $('#SPhotMonitorInt').prop('disabled', false);\n $('#SPhotMustAfter').fadeTo('slow', 1.0);\n $('#SPhotMustAfter').prop('disabled', false);\n $('#SPhotMustBefore').fadeTo('slow', 1.0);\n $('#SPhotMustBefore').prop('disabled', false);\n $('#SPhotFixedTime').fadeTo('slow', 1.0);\n $('#SPhotFixedTime').prop('disabled', false);\n }\n //$('#SPhotFixedTime').trigger(jQuery.Event('change'));\n });\n$('#SPhotSect6').click(function () {\n $('#SPhotSlide6').fadeToggle('slow');\n });\n//\n// LOADING FORM\n// These run when the form is first opened in the item/tiddler. Must initialize\n// all of the interlocking dynamic elements in the sections that load open (1 & 2)\n// This prevents ugly jumping while the form is loading.\n//\n$('#SPhotOrbTrackRow').fadeOut(0);\n$('#SPhotIsOrb').hide(); // Can't be input type="hidden", must persist\n$('#SPhotIsOrb').trigger(jQuery.Event('change')); // We don't have the catSearch result yet, so...\n$('#SPhotHotPixRow').fadeOut(0);\n$('#SPhotTimeSpaceRow').fadeOut(0);\n$('#SPhotCal').trigger(jQuery.Event('change'));\n$('#SPhotMDown').trigger(jQuery.Event('change'));\n$('#SPhotRepeat').trigger(jQuery.Event('input'));\n$('#SPhotMultObs').trigger(jQuery.Event('change'));\n$('#SPhotFixedTime').trigger(jQuery.Event('change'));\n\n//Pre-collapse here, do NOT use display:none, validation will fail\n$('#SPhotSlide4').fadeOut(0);\n$('#SPhotSlide5').fadeOut(0);\n$('#SPhotSlide6').fadeOut(0);\n\n//\n// This refreshes the Project list...\n//\nDC3.Lib.fillInnerHTML("/ac/asgenprojlist.asp", "SPhotProject");\n</script>\n
\n!!Summary\nSubmit a request to the scheduler for a time series of images in multiple colors/bands to be done\n*Within a single block of time\n*Multiple sets of images separated in time (//time series//).\n*Optional fixed time initiation with optional forced termination after an interval\nThe form allows considerable flexibility in how the request is structured, so take the time to look at the options and be creative. For example, you can acquire images in B,V,R,I,B,V,R,I... by specifying the B,V,R,I images, then specifying ''Repeat'' greater than one. Leave the ''Time Spacing'' and ''Spacing Tol'' fields set to 0 in order to have the entire repeating sets of images scheduled as a __single Observation__ (a single ACP acquisition run).\n\n@@''NOTE'' With this form, you can easily create a request which will fill the entire night, or worse, be so long it cannot fit into the (rest of) the night and meet constraints.@@\n!!Multiple ~Time-Spaced Observations\nWhen you enter a value greater than 1 into ''Repeat'', you have the option of entering non-zero values into the ''Time Spacing'' and ''Spacing Tol'' fields. Each field takes time values in seconds. In this case, the set of images is repeated periodically as separate Observations (ACP runs) with ''Time Spacing'' seconds between each. @@Scheduler will try to fill the spaces with other work.@@\n!!~Fixed-Time Plans\nIn the Timing and Monitor Mode section, you can force the scheduler to start a Plan at a specific time, overriding its normal decision process. Optionally you can also force it to kill a fixed-time Plan at a specific (later) time. If you specify a fixed time, the scheduler will try to schedule other work around this Plan, including filling in the time space between optional multiple time-spaced Observations (see the previous section). \n!!Other Info\nYou can specify both deep sky and solar system targets, and the latter will have their ephemerides calculated automatically. See [[How to Specify Targets]]. Normally, the request will be entered in a disabled state, requiring you to enable it with the [[Schedule Browser|/sc/index.asp]] before it can run. However, if you check the ''Enable requests immediately'' box your request will be runnable without further action. This does //not// mean it will run immediately, of course.\n\nThe form should be self-evident, but here are a few things to note:\n* Newly created projects won't appear in the Select Project list until click/touch ''Refresh Project List''. It's OK to keep using the same "new" project name repeatedly.\n* Here details on the useful [[Moon Avoid constraint|Moon Avoidance Lorentzian Help]] (section 4). It is ignored if you specify ''Moon Down''.\n* Be very careful using the Timing features (section 6). You can easily create impossible situations. Relax and let the scheduler do its job!\n* The ''Best Efforts'' feature will let you create long requests which will be started when it's known that constraints cannot be met throughout. The Plan will stop when it encounters the first Observation that cannot meet constraints. Maybe you should design the request to run in a known time, and also use the Time Series feature to allow other work to be inserted between Observations. \n* You can force the request to start right now (section 6), but it will kill any run in progress. Also, if constraints aren't met it will fail right now. Again, use with care.
/***\n\n''This plugin was previously called StyleChooser.''\n\n|Name|SelectThemePlugin|\n|Created by|SimonBaird and SaqImtiaz, modified for private use with Share Your Sky! by Bob Denny|\n|Location|Original: http://lewcid.googlepages.com/lewcid.html#SelectThemePlugin, Modified: [[SelectThemePlugin]]|\n|Version|1.2.4a|\n|Requires|~TW2.x|\n!Description\n*An alternative style switcher, can be used to switch just stylesheets and/or pagetemplates, or a combination of both (a theme)\n*you //must// add your own stylesheets and pagetemplates.\n!Usage\n* You must to have fetch or create some styleSheets and pageTemplates to use this plugin.\n**You can either get a ThemePack like BigThemePack which automatically adds themes to ThemeSelect.\n**or create tiddlers with styleSheets and pageTemplates and tag them styleSheets and pageTemplates respectively.\n* Put {{{<<themeSelect style 'Select theme'>>}}} in your SideBarOptions.\n!Creating Theme Packs\n*You can create your own theme pack if you like. Instructions can be found [[here.|CreateThemePack]]\n!History\n* 17-Oct-06 v1.2.5, [rbd] Remove code for TW < 2.0.11. Reformat code and lint. Remove code to select theme in URL. Change hijack from deprecated applyPageTemplate to refreshPageTemplate. Remove code for [none] and [default] items in style chooser, as well as the line below, and make Fire the default theme instead of the built-in ~StyleSheet/~PageTemplate. Add parameter for tooltip on switcher dropdown. Use unicode escapes for drop-arrows so this can be edited in PrimalScript, etc. Various wording changes.\n* 10-Oct-06, v1.2.4a, [rbd] Changed defaults to FireStyleSheet/FirePageTemplate for new ACP application.\n* 08-Sep-06, v1.2.4, fixed bug with TW2.1\n* 15-May-06, v1.2.3, added paramifier so you can put theme on url, eg http://www.somewhere.com/twfile.html#theme:Berry2, thanks Clint (Simon).\n* 28-Apr-o6, v1.2.2, fixed bug with opening TW after deleting themepacks. (Saq)\n* 26-Apr-06, v1.2.1, more code optimization, dropdowns now updated on the fly. (Saq)\n* 25-Apr-06, v1.2.0, added 3rd party ThemePack support, and made various other improvements.(Simon & Saq)\n* 24-Apr-06, v1.1.0, added: no styles and default styles options,<<br>>support for ThemePack, support for tag variations(Saq)\n* 21-Apr-06, v1.0.0, Reworked dropdowns to include option for pagetemplates (Saq)\n* 21-Apr-06, v0.9.0, Rewrote and added Saq's lovely dropdown select (Simon)\n* 20-Apr-06, v0.0.1, Basic switcher working (Simon)\n!Examples\n|!Source|!Output|h\n|{{{<<themeSelect style>>}}} for a dropdown with StyleSheets|<<themeSelect style>>|\n|{{{<<themeSelect pagetemplate>>}}} for a dropdown with PageTemplates|<<themeSelect pagetemplate>>|\n|{{{<<themeSelect style customlabel>>}}} to use a custom label|<<themeSelect style customlabel>>|\n|{{{<<themeSelect style customlabel customtooltip>>}}} to use a custom label and tooltip|<<themeSelect style customlabel customtooltip>>|\n* When applying a stylesheet or template, it also looks for a template or stylesheet respectively based on naming convention, eg MyFunkyStyleSheet and MyFunkyPageTemplate.\n!Notes\n* See also http://www.tiddlytools.com/#SelectStyleSheetPlugin for a more feature-rich style sheet switcher\n! Ideas\n* do ViewTemplate also?\n* Pretty up the [x] bit\n!Code\n***/\n//{{{\nversion.extensions.SelectThemePlugin =\n{\n major: 1, minor: 2, revision: 5,\n date: new Date(2006,10,27),\n type: 'macro',\n source: "http://lewcid.googlepages.com/lewcid.html#SelectTheme"\n};\n// -----------\n// Static data\n// -----------\nconfig.SelectTheme =\n{\n things:\n {\n style:\n {\n tag: ["StyleSheets","StyleSheet","styleSheet","styleSheets","stylesheet","stylesheets"],\n theDefault: "FireStyleSheet", // Default, must exist!\n suffix: "StyleSheet",\n notify: refreshStyles,\n cookie: "txtStyleSheet",\n otherThing: "pagetemplate",\n label: "Choose StyleSheet: ",\n tooltip: "Choose a StyleSheet"\n },\n pagetemplate:\n {\n tag: ["PageTemplates","PageTemplate","pageTemplates","pageTemplate","pagetemplate","pagetemplates"],\n theDefault: "FirePageTemplate", // Default, must exist!\n suffix: "PageTemplate",\n notify: refreshPageTemplate,\n cookie: "txtPageTemplate",\n otherThing: "style",\n label: "Choose PageTemplate: ",\n tooltip: "Choose a PageTemplate"\n }\n }\n};\n\nTiddlyWiki.prototype.removeNotification = function(title,fn)\n{\n for (var i=0;i<this.namedNotifications.length;i++) {\n if((this.namedNotifications[i].name == title) && (this.namedNotifications[i].notify == fn))\n this.namedNotifications.splice(i,1);\n }\n};\n\nvar things = config.SelectTheme.things;\n// var specialCases=config.SelectTheme.specialCases;\n\nfor (var zz in things)\n{\n // make sure we have a value\n if (!config.options[things[zz].cookie])\n config.options[things[zz].cookie] = things[zz].theDefault;\n // remove core notify\n store.removeNotification(things[zz].theDefault,things[zz].notify);\n // and add our one\n store.addNotification(config.options[things[zz].cookie],things[zz].notify);\n}\n\n//checks to see if a tiddler exists in store or as a shadow.\nTiddlyWiki.prototype.isTiddler= function (title)\n{\n return store.tiddlerExists(title) || store.isShadowTiddler(title);\n};\n\n//hijack new core function & make sure template exists\nwindow.refreshPageTemplate_themeSelect=window.refreshPageTemplate;\nwindow.refreshPageTemplate = function(title)\n{\n if(!store.isTiddler(title))\n {\n title = things.pagetemplate.theDefault;\n }\n refreshPageTemplate_themeSelect(title);\n};\n\nTiddlyWiki.prototype.makeActiveTheme = function(what, title, alsoCheckOtherThing)\n{\n var thing = things[what];\n if (!store.isTiddler(title))\n title = thing.theDefault;\n var oldTitle = config.options[thing.cookie];\n // remove old style element from DOM\n if (what == "style")\n {\n var oldStyleElement = document.getElementById(oldTitle);\n oldStyleElement.parentNode.removeChild(oldStyleElement);\n }\n store.removeNotification(oldTitle,thing.notify);\n store.addNotification(title,thing.notify);\n store.notify(title);\n config.options[thing.cookie] = title;\n saveOptionCookie(thing.cookie);\n if (alsoCheckOtherThing)\n this.makeActiveTheme(thing.otherThing,\n title.replace(new RegExp(thing.suffix+"$"),"") + things[thing.otherThing].suffix,\n false);\n};\n\nfunction switchTheme(e)\n{\n if (!e) e = window.event;\n var theTarget = resolveTarget(e);\n var theLink = theTarget;\n var switchTo= theLink.getAttribute("switchTo");\n var mode = theLink.getAttribute("mode");\n if ((config.options[things[mode].cookie])!=switchTo)\n {\n store.makeActiveTheme(mode,switchTo,true);\n }\n return(false);\n}\n\nconfig.macros.themeSelect = { };\nconfig.macros.themeSelect.dropdownchar = (document.all ? "\su25BC" : "\su25BE"); // UTF8!!!\nconfig.macros.themeSelect.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n var arrow = config.macros.themeSelect.dropdownchar;\n var mode = params[0];\n var label = (params[1] ? params[1] : things[mode].label) + arrow;\n var tooltip= params[2] ? params[2] : things[mode].tooltip;\n var cookie = (config.options[things[mode].cookie]);\n var onclick = function(e)\n {\n if (!e) e = window.event;\n var popup = Popup.create(this);\n var tagged=[];\n store.forEachTiddler(function(title,tiddler)\n {\n if ((tiddler.tags).containsAny(things[mode].tag))\n {\n tagged.push(tiddler.title);\n }\n }\n );\n \n //this function used later to create buttons\n var createThemeButton = function(switchTo)\n {\n var theButton = createTiddlyButton(createTiddlyElement(popup,"li"),text,null,switchTheme,useClass);\n theButton.setAttribute("switchTo",switchTo);\n theButton.setAttribute("mode",mode);\n };\n \n //create buttons for all explicit stylesheet tiddlers\n for(var t=0; t<tagged.length; t++)\n {\n var useClass = "tiddlyLinkExisting";\n var text = (tagged[t]).replace((things[mode].suffix),"");\n if (tagged[t] == (cookie) )\n {\n text += " [x]";\n useClass = "currentlySelected";\n }\n createThemeButton(tagged[t]);\n }\n \n // Route events\n Popup.show(popup, false);\n e.cancelBubble = true;\n if (e.stopPropagation)\n e.stopPropagation();\n return(false);\n };\n \n var createdropperButton = function(place)\n {\n var sp = createTiddlyElement(place,"span",null,"ThemeChooserButton");\n var theDropDownBtn = createTiddlyButton(sp,label,tooltip,onclick);\n };\n \n createdropperButton(place);\n \n}; // End of config.macros.themeSelect\n\nsetStylesheet(".popup li a.currentlySelected {background:#ccc;color:black;font-weight:bold;}","currentlySelectedStyle"); // could do better probably...\n\nconfig.macros.layoutChooser=config.macros.themeSelect;\n\nconfig.macros.applyTheme =\n{\n handler: function (place,macroName,params,wikifier,paramString,tiddler)\n {\n var theme = params[0];\n var label = params[1]?params[1]:'Apply theme "' + theme + '"';\n var tooltip = 'Apply the "'+theme+'" theme to this display';\n createTiddlyButton(place,\n label,\n tooltip,\n function() { store.makeActiveTheme("style",theme+things.style.suffix,true); }\n );\n }\n};\n//}}}
<% if(!screenFlats) { %><<slider "" "Sky Flats Help" "Help for Sky Flats" "Helpful information">>\n<% } %>\nSet up the standard flats to be taken when the Dusk Flats and/or Dawn Flats checkboxes are used in the [[Single Object Color Series]] form. The standard flats are also used by the [[Standard Flat Fields]] item.<% if(!screenFlats) { %> @@You can use the [[Sky Flat Analyzer]] tool to help you order your flat filters and binnings to make the most of the twilight time.@@<% } %>\n<html><form id="SFlatPlanForm">\n <table class="noBorder" style="border:0;margin-left:0">\n <tr>\n <th align="left">Use</th>\n <th align="left">Count</th>\n<!--<% if(filtNames) { %>-->\n <th align="left">Filter</th>\n<!--<% } %>-->\n <th align="left">Binning</th>\n<!--<% if(rotAvail) { %>-->\n <th align="left">Sky PA</th>\n<!--<% } %>-->\n </tr>\n <tr id="SFlatRow1">\n <td><input type="checkbox" name="SFlatUse1" id="SFlatUse1" value="yes"></td>\n <td><input type="text" name="SFlatCount1" id="SFlatCount1" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="SFlatFilter1" id="SFlatFilter1"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="SFlatBinning1" id="SFlatBinning1"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="SFlatPA1" id="SFlatPA1" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="SFlatRow2" style="display:none">\n <td><input type="checkbox" name="SFlatUse2" id="SFlatUse2" value="yes"></td>\n <td><input type="text" name="SFlatCount2" id="SFlatCount2" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="SFlatFilter2" id="SFlatFilter2"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="SFlatBinning2" id="SFlatBinning2"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="SFlatPA2" id="SFlatPA2" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="SFlatRow3" style="display:none">\n <td><input type="checkbox" name="SFlatUse3" id="SFlatUse3" value="yes"></td>\n <td><input type="text" name="SFlatCount3" id="SFlatCount3" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="SFlatFilter3" id="SFlatFilter3"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="SFlatBinning3" id="SFlatBinning3"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="SFlatPA3" id="SFlatPA3" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="SFlatRow4" style="display:none">\n <td><input type="checkbox" name="SFlatUse4" id="SFlatUse4" value="yes"></td>\n <td><input type="text" name="SFlatCount4" id="SFlatCount4" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="SFlatFilter4" id="SFlatFilter4"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="SFlatBinning4" id="SFlatBinning4"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="SFlatPA4" id="SFlatPA4" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="SFlatRow5" style="display:none">\n <td><input type="checkbox" name="SFlatUse5" id="SFlatUse5" value="yes"></td>\n <td><input type="text" name="SFlatCount5" id="SFlatCount5" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="SFlatFilter5" id="SFlatFilter5"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="SFlatBinning5" id="SFlatBinning5"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="SFlatPA5" id="SFlatPA5" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="SFlatRow6" style="display:none">\n <td><input type="checkbox" name="SFlatUse6" id="SFlatUse6" value="yes"></td>\n <td><input type="text" name="SFlatCount6" id="SFlatCount6" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="SFlatFilter6" id="SFlatFilter6"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="SFlatBinning6" id="SFlatBinning6"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="SFlatPA6" id="SFlatPA6" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="SFlatRow7" style="display:none">\n <td><input type="checkbox" name="SFlatUse7" id="SFlatUse7" value="yes"></td>\n <td><input type="text" name="SFlatCount7" id="SFlatCount7" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="SFlatFilter7" id="SFlatFilter7"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="SFlatBinning7" id="SFlatBinning7"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="SFlatPA7" id="SFlatPA7" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="SFlatRow8" style="display:none">\n <td><input type="checkbox" name="SFlatUse8" id="SFlatUse8" value="yes"></td>\n <td><input type="text" name="SFlatCount8" id="SFlatCount8" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="SFlatFilter8" id="SFlatFilter8"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="SFlatBinning8" id="SFlatBinning8"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="SFlatPA8" id="SFlatPA8" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="SFlatRow9" style="display:none">\n <td><input type="checkbox" name="SFlatUse9" id="SFlatUse9" value="yes"></td>\n <td><input type="text" name="SFlatCount9" id="SFlatCount9" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="SFlatFilter9" id="SFlatFilter9"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="SFlatBinning9" id="SFlatBinning9"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="SFlatPA9" id="SFlatPA9" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="SFlatRow10" style="display:none">\n <td><input type="checkbox" name="SFlatUse10" id="SFlatUse10" value="yes"></td>\n <td><input type="text" name="SFlatCount10" id="SFlatCount10" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="SFlatFilter10" id="SFlatFilter10"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="SFlatBinning10" id="SFlatBinning10"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="SFlatPA10" id="SFlatPA10" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="SFlatRow11" style="display:none">\n <td><input type="checkbox" name="SFlatUse11" id="SFlatUse11" value="yes"></td>\n <td><input type="text" name="SFlatCount11" id="SFlatCount11" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="SFlatFilter11" id="SFlatFilter11"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="SFlatBinning11" id="SFlatBinning11"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="SFlatPA11" id="SFlatPA11" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="SFlatRow12" style="display:none">\n <td><input type="checkbox" name="SFlatUse12" id="SFlatUse12" value="yes"></td>\n <td><input type="text" name="SFlatCount12" id="SFlatCount12" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="SFlatFilter12" id="SFlatFilter12"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="SFlatBinning12" id="SFlatBinning12"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="SFlatPA12" id="SFlatPA12" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="SFlatRow13" style="display:none">\n <td><input type="checkbox" name="SFlatUse13" id="SFlatUse13" value="yes"></td>\n <td><input type="text" name="SFlatCount13" id="SFlatCount13" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="SFlatFilter13" id="SFlatFilter13"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="SFlatBinning13" id="SFlatBinning13"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="SFlatPA13" id="SFlatPA13" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="SFlatRow14" style="display:none">\n <td><input type="checkbox" name="SFlatUse14" id="SFlatUse14" value="yes"></td>\n <td><input type="text" name="SFlatCount14" id="SFlatCount14" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="SFlatFilter14" id="SFlatFilter14"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="SFlatBinning14" id="SFlatBinning14"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="SFlatPA14" id="SFlatPA14" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="SFlatRow15" style="display:none">\n <td><input type="checkbox" name="SFlatUse15" id="SFlatUse15" value="yes"></td>\n <td><input type="text" name="SFlatCount15" id="SFlatCount15" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="SFlatFilter15" id="SFlatFilter15"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="SFlatBinning15" id="SFlatBinning15"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="SFlatPA15" id="SFlatPA15" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr id="SFlatRow16" style="display:none">\n <td><input type="checkbox" name="SFlatUse16" id="SFlatUse16" value="yes"></td>\n <td><input type="text" name="SFlatCount16" id="SFlatCount16" size="4" value=""></td>\n<!--<% if(filtNames) { %>-->\n <td><select name="SFlatFilter16" id="SFlatFilter16"><%= filterNameOptions() %></select></td>\n<!--<% } %>-->\n <td><select name="SFlatBinning16" id="SFlatBinning16"><%= binningOptions() %></select></td>\n<!--<% if(rotAvail) { %>-->\n <td><input type="text" name="SFlatPA16" id="SFlatPA16" size="4" value="0.0"></td>\n<!--<% } %>-->\n </tr>\n <tr>\n <td colspan="5"><a href="javascript:;" class="button" title="Click to add another row" onclick="DC3.Lib.expandoAddRow('SFlat');">More</a></td>\n </tr>\n<!--<% if(screenFlats) { %>-->\n <input type="hidden" name="SFlatPlanType" value="both" />\n<!--<% } else { %>-->\n <tr>\n <td colspan="5">Saved standard flat plan type:</td>\n </tr>\n <tr>\n <td colspan="5">\n <label><input type="radio" name="SFlatPlanType" value="both" checked />Same at dusk and dawn</label>\n <label><input type="radio" name="SFlatPlanType" value="dusk" />Dusk</label>\n <label><input type="radio" name="SFlatPlanType" value="dawn" />Dawn</label>\n </td>\n </tr>\n<!--<% } %>-->\n </table>\n</form></html><<PersistentForm>><<PostForm "" "/ac/adefflat.asp" "Save Flat Plan" "Upload this flat plan to your plans folder">><<ValidateForm "" "postit">>\n<script>DC3.Lib.expandoInitializeForm('SFlat');</script>
<<RemoteContent '/uploads/aindex.asp' Refresh 'Refresh the file list'>>
<html><a href="<%= feedUri %>"><img src="/im/feed-icon-14x14.png" border="0" title="Subscribe to RSS feed" width="14" height="14" align="right"></a></html><<search>><<closeAll>><<themeSelect style 'select theme' 'Select a color theme for display'>><<fontSize "font: ">><<newTiddler>><<saveChanges>><<upload>>[[Test Live|index.asp]]<<slider chkSliderOptionsPanel OptionsPanel 'options ยป' 'Change advanced options'>>
This just tests the console by printing a message every second. To stop it, use the Stop Run button in the System Status log panel (at the bottom).
<<slider "" "Single Object Help" Help "Helpful information">>\n<html>\n<form>\n <table class="noBorder" style="border:0;margin-left:0">\n <tr>\n <td>Target Name:</td>\n <td><input type="text" name="Target" id="clr_tgt" size="14" value="" validate="required">\n <input type="hidden" name="visOnly" id="clr_visOnly" value="true">\n <input type="text" name="isOrb" id="clr_isOrb"></td>\n <td>\n <a id="clr_getCoords" href="javascript:;"\n onClick="DC3.CatSearch.lookup(DC3.Lib.getPlace(this),\n // Trigger event from a change in the isOrb field which DC3.CatSearch fills in\n (function(msg) { $('#clr_isOrb').trigger(jQuery.Event('change')) }));"\n title="Look up coordinates or calculate planetary ephemeris"> Get Coordinates or Ephemeris</a>\n <a id="clr_getTheSky" style="display:none;" href="javascript:;" onClick="DC3.TheSky.fillFormInfo(DC3.Lib.getPlace(this));" \n title="Fill in the coordinates from the current target in TheSky"> Get Coordinates From TheSky</a>\n </td>\n </tr>\n <tr>\n <td>Right Asc. (hrs):</td>\n <td><input type="text" name="RA" id="clr_ra" size="12" value="" validate="sexanum[0:24],required"></td>\n <td><a id="clr_catSearch" href="javascript:;" onClick="story.displayTiddler(this,'Deep Sky Catalog Search',null,config.options.chkAnimate,false)" title="Open the Deep Sky Catalog Search Item"> Deep Sky Catalog Search</a></td>\n </tr>\n <tr>\n <td>Declination (deg):</td>\n <td><input type="text" name="Dec" id="clr_dec" size="12" value="" validate="sexanum[-90:90],required"></td>\n <td> <i>(coordinates in J2000)</i></td>\n </tr>\n <!--<% if(rotAvail) { %>-->\n <tr>\n <td>Pos. Angle (deg):</td>\n <td><input type="text" name="PA" size="5" value="" validate="between[0:360],required"></td>\n <td> <i>(true/sky PA, required)</i></td>\n </tr>\n <!--<% } %>--> \n <tr id="clr_orbTrackRow">\n <td>Orbital Tracking:</td>\n <td colspan=><input type="checkbox" name="orbTrack" id="clr_orbTrack" value="yes"></td>\n <td> <i>(follow body, if mount supports it)</i></td>\n </tr>\n <!--<% if(!filtNames) { %>-->\n <tr>\n <td colspan="3"><span class="marked">Note: There are no filters on this system</span></td>\n </tr>\n <!--<% } %>-->\n </table>\n <table class="noBorder" style="border:0;margin-left:0;margin-top:0">\n <tr>\n <th>Use</th>\n <th>Count</th>\n <!--<% if(filtNames) { %>-->\n <th>Filter</th>\n <!--<% } %>-->\n <th>Duration</th>\n <th>Binning</th>\n <td> </td>\n </tr>\n <tr id="ColorRow1">\n <td><input type="checkbox" name="ColorUse1" id="ColorUse1" value="yes"></td>\n <td><input type="text" name="ColorCount1" id="ColorCount1" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="ColorFilter1" id="ColorFilter1">\n <%= filterNameOptions() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="ColorExposure1" id="ColorExposure1" size="5" value=""></td>\n <td><select name="ColorBinning1" id="ColorBinning1">\n <%= binningOptions() %>\n </select></td>\n <td><!--<% if(Prefs.Autofocus.Enabled) { %>-->\n \n <input type="checkbox" name="AF" value="yes" title="Focus the system before acquiring the first image">\n Auto focus at start\n </input>\n \n <!--<% } %>-->\n \n <!--<% if(Prefs.CameraPrefs.AutoCalibrate) { %>-->\n <input type="checkbox" checked disabled name="Cal" value="yes" title="Observatory calibrates all images">Auto calibrate</input>\n <!--<% } else { %>-->\n <input type="checkbox" name="Cal" value="yes" title="Apply calibration frames after imaging">Auto calibrate</input>\n <!--<% } %>-->\n </td>\n </tr>\n <tr id="ColorRow2">\n <td><input type="checkbox" name="ColorUse2" id="ColorUse2" value="yes"></td>\n <td><input type="text" name="ColorCount2" id="ColorCount2" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="ColorFilter2" id="ColorFilter2">\n <%= filterNameOptions() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="ColorExposure2" id="ColorExposure2" size="5" value=""></td>\n <td><select name="ColorBinning2" id="ColorBinning2">\n <%= binningOptions() %>\n </select></td>\n <td><!--<% if(Prefs.Autofocus.Enabled) { %>-->\n \n <input type="checkbox" name="PerAF" value="yes" title="Does not do an initial AF at plan start">\n Periodic auto focus\n </input>\n every\n <input type="text" name="PerAFInt" size="4" value="30" validate="between[10:720]">\n minutes\n </input>\n \n <!--<% } %>--></td>\n </tr>\n <tr id="ColorRow3">\n <td><input type="checkbox" name="ColorUse3" id="ColorUse3" value="yes"></td>\n <td><input type="text" name="ColorCount3" id="ColorCount3" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="ColorFilter3" id="ColorFilter3">\n <%= filterNameOptions() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="ColorExposure3" id="ColorExposure3" size="5" value=""></td>\n <td><select name="ColorBinning3" id="ColorBinning3">\n <%= binningOptions() %>\n </select></td>\n <!--<% if(ditherMainPixels) { %>-->\n <td>Dithering: <input type="text" name="Dither" size="5" value="0.0" validate="number,required"> (main imager pixels rms, -1.0 for auto)</td>\n <!--<% } else { %>-->\n <td>Dithering: <input type="text" name="Dither" size="5" value="0.0" validate="number,required"> (pixels rms <img src="/im/tinyInfo.png" width="16" height="16" border="none" align="absmiddle" \n hspace="6" title="If guided: guider pixels. If unguided: main imager pixels."> -1.0 for auto)</td>\n <!--<% } %>-->\n </tr>\n <tr id="ColorRow4">\n <td><input type="checkbox" name="ColorUse4" id="ColorUse4" value="yes"></td>\n <td><input type="text" name="ColorCount4" id="ColorCount4" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="ColorFilter4" id="ColorFilter4">\n <%= filterNameOptions() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="ColorExposure4" id="ColorExposure4" size="5" value=""></td>\n <td><select name="ColorBinning4" id="ColorBinning4">\n <%= binningOptions() %>\n </select></td>\n <td>\n <!--<% if(!screenFlats) { %>-->\n <input type="checkbox" name="DuskFlats" value="yes" title="Requires defaultduskflat or defaultflat">\n Dusk Flats\n </input>\n \n <input type="checkbox" name="DawnFlats" value="yes" title="Requires defaultdawnflat or defaultflat">\n Dawn Flats\n </input>\n <!--<% } else { %>-->\n <input type="checkbox" name="ScreenFlats" value="yes" title="Requires defaultflat">\n Standard screen flats (at end)\n </input>\n <!--<% } %>-->\n <!--<% if(User.IsAdministrator) { %>--> \n \n <input type="checkbox" name="Shutdown" value="yes" title="Ignored if Dawn Flats enabled">\n Shutdown at run end\n </input></td>\n <!--<% } %>--> \n </tr>\n <tr id="ColorRow5" style="display:none">\n <td><input type="checkbox" name="ColorUse5" id="ColorUse5" value="yes"></td>\n <td><input type="text" name="ColorCount5" id="ColorCount5" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="ColorFilter5" id="ColorFilter5">\n <%= filterNameOptions() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="ColorExposure5" id="ColorExposure5" size="5" value=""></td>\n <td><select name="ColorBinning5" id="ColorBinning5">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="ColorRow6" style="display:none">\n <td><input type="checkbox" name="ColorUse6" id="ColorUse6" value="yes"></td>\n <td><input type="text" name="ColorCount6" id="ColorCount6" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="ColorFilter6" id="ColorFilter6">\n <%= filterNameOptions() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="ColorExposure6" id="ColorExposure6" size="5" value=""></td>\n <td><select name="ColorBinning6" id="ColorBinning6">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="ColorRow7" style="display:none">\n <td><input type="checkbox" name="ColorUse7" id="ColorUse7" value="yes"></td>\n <td><input type="text" name="ColorCount7" id="ColorCount7" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="ColorFilter7" id="ColorFilter7">\n <%= filterNameOptions() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="ColorExposure7" id="ColorExposure7" size="5" value=""></td>\n <td><select name="ColorBinning7" id="ColorBinning7">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="ColorRow8" style="display:none">\n <td><input type="checkbox" name="ColorUse8" id="ColorUse8" value="yes"></td>\n <td><input type="text" name="ColorCount8" id="ColorCount8" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="ColorFilter8" id="ColorFilter8">\n <%= filterNameOptions() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="ColorExposure8" id="ColorExposure8" size="5" value=""></td>\n <td><select name="ColorBinning8" id="ColorBinning8">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="ColorRow9" style="display:none">\n <td><input type="checkbox" name="ColorUse9" id="ColorUse9" value="yes"></td>\n <td><input type="text" name="ColorCount9" id="ColorCount9" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="ColorFilter9" id="ColorFilter9">\n <%= filterNameOptions() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="ColorExposure9" id="ColorExposure9" size="5" value=""></td>\n <td><select name="ColorBinning9" id="ColorBinning9">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="ColorRow10" style="display:none">\n <td><input type="checkbox" name="ColorUse10" id="ColorUse10" value="yes"></td>\n <td><input type="text" name="ColorCount10" id="ColorCount10" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="ColorFilter10" id="ColorFilter10">\n <%= filterNameOptions() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="ColorExposure10" id="ColorExposure10" size="5" value=""></td>\n <td><select name="ColorBinning10" id="ColorBinning10">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="ColorRow11" style="display:none">\n <td><input type="checkbox" name="ColorUse11" id="ColorUse11" value="yes"></td>\n <td><input type="text" name="ColorCount11" id="ColorCount11" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="ColorFilter11" id="ColorFilter11">\n <%= filterNameOptions() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="ColorExposure11" id="ColorExposure11" size="5" value=""></td>\n <td><select name="ColorBinning11" id="ColorBinning11">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="ColorRow12" style="display:none">\n <td><input type="checkbox" name="ColorUse12" id="ColorUse12" value="yes"></td>\n <td><input type="text" name="ColorCount12" id="ColorCount12" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="ColorFilter12" id="ColorFilter12">\n <%= filterNameOptions() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="ColorExposure12" id="ColorExposure12" size="5" value=""></td>\n <td><select name="ColorBinning12" id="ColorBinning12">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="ColorRow13" style="display:none">\n <td><input type="checkbox" name="ColorUse13" id="ColorUse13" value="yes"></td>\n <td><input type="text" name="ColorCount13" id="ColorCount13" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="ColorFilter13" id="ColorFilter13">\n <%= filterNameOptions() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="ColorExposure13" id="ColorExposure13" size="5" value=""></td>\n <td><select name="ColorBinning13" id="ColorBinning13">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="ColorRow14" style="display:none">\n <td><input type="checkbox" name="ColorUse14" id="ColorUse14" value="yes"></td>\n <td><input type="text" name="ColorCount14" id="ColorCount14" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="ColorFilter14" id="ColorFilter14">\n <%= filterNameOptions() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="ColorExposure14" id="ColorExposure14" size="5" value=""></td>\n <td><select name="ColorBinning14" id="ColorBinning14">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="ColorRow15" style="display:none">\n <td><input type="checkbox" name="ColorUse15" id="ColorUse15" value="yes"></td>\n <td><input type="text" name="ColorCount15" id="ColorCount15" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="ColorFilter15" id="ColorFilter15">\n <%= filterNameOptions() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="ColorExposure15" id="ColorExposure15" size="5" value=""></td>\n <td><select name="ColorBinning15" id="ColorBinning15">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr id="ColorRow16" style="display:none">\n <td><input type="checkbox" name="ColorUse16" id="ColorUse16" value="yes"></td>\n <td><input type="text" name="ColorCount16" id="ColorCount16" size="4" value=""></td>\n <!--<% if(filtNames) { %>-->\n <td><select name="ColorFilter16" id="ColorFilter16">\n <%= filterNameOptions() %>\n </select></td>\n <!--<% } %>-->\n <td><input type="text" name="ColorExposure16" id="ColorExposure16" size="5" value=""></td>\n <td><select name="ColorBinning16" id="ColorBinning16">\n <%= binningOptions() %>\n </select></td>\n </tr>\n <tr>\n <td colspan="5"><a href="javascript:;" class="button" title="Click to add another row" onclick="DC3.Lib.expandoAddRow('Color');">More</a></td>\n </tr>\n </table>\n</form>\n</html><<PersistentForm>><<PostForm "" "/ac/aacqform.asp" "Acquire Images" "Starts the image acquisition process">><<ValidateForm "" "postit">><script>\nDC3.Lib.expandoInitializeForm("Color");\n// DC3.TheSky.setTargetInfo() and DC3.TheSky.switchLink() depend on the link IDs!\nif(DC3.TheSky.theSkyInfoAvailable()) DC3.TheSky.switchLink("clr");\n\n\n$('#clr_isOrb').change(function() { // Used only when form is opened, using the persisted text field (hidden)\n if($('#clr_isOrb').val() == 'orb') {\n $('#clr_ra').fadeTo('slow', 0.2);\n $('#clr_ra').prop('disabled', true);\n $('#clr_dec').fadeTo('slow', 0.2);\n $('#clr_dec').prop('disabled', true);\n $('#clr_orbTrackRow').fadeIn('slow');\n } else {\n $('#clr_ra').fadeTo('slow', 1.0);\n $('#clr_ra').prop('disabled', false);\n $('#clr_dec').fadeTo('slow', 1.0);\n $('#clr_dec').prop('disabled', false);\n $('#clr_orbTrack').prop('checked', false); // Force tracking checkbox off, and for persisted forms\n var e = { target: null };\n e.target = $('#clr_orbTrack')[0];\n config.macros.PersistentForm.onChange(e);\n $('#clr_orbTrackRow').fadeOut('slow');\n }\n });\n$('#clr_orbTrackRow').fadeOut(0);\n$('#clr_isOrb').hide(); // Can't be input type="hidden", must persist\n$('#clr_isOrb').trigger(jQuery.Event('change')); // We don't have the catSearch result yet, so...\n\n</script>\n
\nThis is one of the forms that allow you to acquire one or more images of a //single target//. The observatory needs two things:\n#The name and possibly the J2000 coordinates <% if(rotAvail) { %>and sky position angle (PA) <% } %>of the target (see below), and\n#the specs of the image(s) you want taken.\nThis form provides you with a way to specify both. Note that coordinates are always J2000 and can be entered in either sexagesimal or decimal. The sexagesimal translator is very adaptable, most anything for delimiters will work.\n\n//Color Series Only//: <% if(screenFlats) { %>The use of Standard Screen Flats requires require a //standard flat plan//. See [[Setup Standard Flat Fields]]. Flats will be acquired (using the light panel or screen) at the end of the run.<% } else { %>The use of Dawn Flats and Dusk Flats require a //standard flat plan//. See [[Setup Standard Flat Fields]]. Also, selecting Dusk Flats will cause the run to wait until the //next// dusk, so you __must start a run with Dusk Flats before dusk!__ After dusk flats, it wall wait until astronomical night to start your live images. Finally, if your image series finishes too late, you'll miss the dawn flats.<% } %>\n!!Deep Sky Objects\nThe catalog has over 70,000 objects. They are indexed with the abbreviated name of the catalog, a space, then the object name/number in the catalog. For example, Messier object 104 is {{{M 104}}}. Note the space! \n\nIf you know the name, but don't know the coordinates, enter the name and click "Get Coordinates or Ephemeris". If the object is found, the coordinates will appear in the fields.\n\nTo browse the catalog, you can use the [[Deep Sky Catalog|Deep Sky Catalog Search]] to search our databases. Of course, the object you want must be visible (above the low-horizon limit), the higher the better. The best way to pick a target is with a planetarium program like Starry Night or ~TheSky. Also, by default, only visible targets will be returned from a search of the [[Deep Sky Catalog|Deep Sky Catalog Search]].\n!!Minor Planets and Comets\nACP has automatic ephemeris calculation based on the Minor Planet Center's orbital elements database. To specify a minor planet, enter {{{MP}}} followed by a space, then the name or number (for numbered minor planets) or the MPC designation (packed or full, for unnumbered minor planets). For example, the following are equivalent:\n*Numbered minor planet: {{{MP 23257}}} or {{{MP Denny}}}\n*Unnumbered minor planet: {{{MP 2004 LB6}}} or {{{MP K04L06B}}}\nTo specify a comet, enter {{{CT}}} followed by a space, then the number, designation, or name of the comet. For example, the following are equivalent:\n*Numbered comet: {{{CT 00244P}}} or {{{CT 244P/Scotti}}}\n*Unnumbered comet: {{{CT CK12J010}}} or {{{C/2012 J1}}}\nNOTE: For the unnumbered comet by name, do not include the discoverer name in parentheses. In the above, the {{{(Catalina)}}} is omitted from {{{C/2012 J1}}}. \n\nTo check your target, click "Get Coordinates or Ephemeris". The message that appears at the bottom of the item will tell you if it was found or not. The RA/Dec will fade out and be zeroes; the real coordinates are calculated at the time the image is taken. The Orbital Tracking checkbox will appear, you can use this to cause the scope to follow the body instead of the stars.\n!!Major Planets\nSimply enter the name of the planet. Moon is not supported.
Turn this on to force newly opened items to //replace// the currently visible one. This can be useful on systems with small displays.
/***\n|''Name:''|SingleOptionsCookiePlugin|\n|''Description:''|Hijack to save options cookies in a single large cookie|\n|''Date:''|Oct 30, 2006|\n|''Source:''|http://solo.dc3.com/tw/index.html#SingleOptionsCookiePlugin|\n|''Author:''|Bob Denny ~DC-3 Dreams, SP|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''Version:''|1.0.0|\n|''~CoreVersion:''|2.0.11, 2.1.0/1/2|\n|''Browser:''|Firefox 1.5/2.0; Internet Explorer 6.0; Safari|\nThis plugin alters the core options behavior, storing all options values in a single cookie. It also has an addition so that options starting with 'pas' are saved, as needed by BidiX's UploadPlugin. The options cookie stuff hijack must be removed from UploadPlugin!\n!Usage\n#Install the plugin.\n#Copy the loadOptionsCookie code to MarkupPostHead and comment it out in the plugin.\n#Assure that the load/save option hijack is commented out of UploadPlugin\n!Notes\nA single cookie is baked by this plugin. It is named {{{tw_opt}}} and has a value that is the concatenation of all persisted options as {{{name:value&name:value...}}}\n\n@@HACK ALERT@@ - After wrestling for 4 hours with trying to fake the UploadPlugin "save password" checkbox, I gave up. The checkbox does nothing and the password is always saved.\n!!Revision History\n<<<\n''2006.10.30 [1.0.0]'' Initial creation\n<<<\n!!MarkupPostHead\nThis must be moved to MarkupPostHead as it must run before main()\n***/\n//{{{\n/*** snip ***\n<script language='JavaScript' type='text/javascript'>\nwindow.loadOptionsCookie_orig_DC3 = window.loadOptionsCookie;\nwindow.loadOptionsCookie = function()\n{\n if(safeMode)\n return;\n var cookies = document.cookie.split(";");\n for(var c = 0; c < cookies.length; c++)\n {\n var p = cookies[c].indexOf("=");\n if(p != -1)\n {\n var name = cookies[c].substr(0,p).trim();\n if(name.substr(0, 6) == "tw_opt") // Found the 'tw_opt' cookie\n {\n var value = cookies[c].substr(p + 1).trim(); // This has all options\n var fc = value.split("&");\n for(var i = 0; i < fc.length; i++)\n {\n p = fc[i].indexOf(":");\n name = fc[i].substr(0, p).trim();\n value = fc[i].substr(p + 1).trim();\n switch(name.substr(0,3))\n {\n case "txt":\n case "pas": // for UploadPlugin\n config.options[name] = unescape(value);\n break;\n case "chk":\n config.options[name] = (value == "true");\n break;\n }\n }\n return; // Don't look at more cookies\n }\n }\n }\n};\n</script>\n*** snip ***/\n/*}}}\n!!Plugin Code\n{{{*/\nversion.extensions.SingleOptionsCookie = {\n major: 1, minor: 0, revision: 0,\n date: new Date(2006, 30, 3), \n type: 'core hijack',\n source: "http://solo.dc3.com/tw/index.html#SingleOptionsCookiePlugin"\n};\n\nwindow.saveOptionCookie_orig_DC3 = window.saveOptionCookie;\nwindow.saveOptionCookie = function(optName)\n{\n if(safeMode)\n return;\n if(window.saveOptionCookie_orig_PasswordTweak) // Unmodified UploadPlugin?\n displayMessage("Options support in UploadPlugin must be disabled!");\n\n\n var cookies = document.cookie.split(";");\n var opts = { };\n for(var c = 0; c < cookies.length; c++)\n {\n var p = cookies[c].indexOf("=");\n if(p != -1)\n {\n var name = cookies[c].substr(0,p).trim();\n if(name.substr(0, 6) == "tw_opt") // Found the 'tw_opt' cookie\n {\n var value = cookies[c].substr(p + 1).trim(); // This has all options\n var fc = value.split("&");\n for(var i = 0; i < fc.length; i++)\n {\n p = fc[i].indexOf(":");\n name = fc[i].substr(0, p).trim();\n value = fc[i].substr(p + 1).trim();\n switch(name.substr(0,3))\n {\n case "txt":\n case "pas": // for UploadPlugin\n opts[name] = unescape(value);\n break;\n case "chk":\n opts[name] = (value == "true");\n break;\n }\n }\n }\n }\n }\n\n opts[optName] = config.options[optName]; // Pick up new value from live options\n c = "tw_opt=";\n var z;\n for(name in opts) \n {\n switch(name.substr(0,3))\n {\n case "txt":\n c += name + ":" + escape(opts[name].toString()) + "&";\n break;\n case "chk":\n c += name + ":" + (opts[name] ? "true" : "false") + "&";\n// if(name == "chkpasUploadPassword") // UploadPlugin Special case!\n// {\n// var z = "pasUploadPassword";\n// if (opts[name])\n// c += z + ":" + escape(config.options[z]) + "&";\n// }\n break;\n case "pas":\n// if (opts["chk" + name]) // More upload weirdness\n c += name + ":" + escape(opts[name].toString()) + "&"; // Only save pas if chk is present\n break;\n }\n }\n c = c.substr(0, c.length - 1); // Remove trailing '&'\n c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";\n document.cookie = c;\n};\n//}}}\n
/***\n|''Name:''|SinglePageModePlugin|\n|''Source:''|http://www.TiddlyTools.com/#SinglePageModePlugin|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nNormally, as you click on the links in TiddlyWiki, more and more tiddlers are displayed on the page. The order of this tiddler display depends upon when and where you have clicked. Some people like this non-linear method of reading the document, while others have reported that when many tiddlers have been opened, it can get somewhat confusing.\n\n!!!!!Usage\n<<<\nSinglePageMode allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one item displayed at a time. When SinglePageMode is enabled, the title of the current tiddler is automatically displayed in the browser window's titlebar and the browser's location URL is updated with a 'permalink' for the current tiddler so that it is easier to create a browser 'bookmark' for the current tiddler.\n\nEven when SinglePageMode is disabled (i.e., displaying multiple tiddlers is permitted), you can reduce the potential for confusion by enable TopOfPageMode, which forces tiddlers to always open at the top of the page instead of being displayed following the tiddler containing the link that was clicked.\n<<<\n!!!!!Configuration\n<<<\nWhen installed, this plugin automatically adds checkboxes in the AdvancedOptions tiddler so you can enable/disable the plugin behavior. For convenience, these checkboxes are also included here:\n\n<<option chkSinglePageMode>> Display one tiddler at a time\n<<option chkTopOfPageMode>> Always open tiddlers at the top of the page\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''SinglePageModePlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for SinglePageMode handling^^\n\nWhen installed, this plugin automatically adds checkboxes in the ''shadow'' AdvancedOptions tiddler so you can enable/disable this behavior. However, if you have customized your AdvancedOptions, you will need to ''manually add these checkboxes to your customized tiddler.''\n<<<\n!!!!!Revision History\n<<<\n''2006.07.04 [2.2.1]'' in hijack for displayTiddlers(), suspend TPM as well as SPM so that DefaultTiddlers displays in the correct order.\n''2006.06.01 [2.2.0]'' added chkTopOfPageMode (TPM) handling\n''2006.02.04 [2.1.1]'' moved global variable declarations to config.* to avoid FireFox 1.5.0.1 crash bug when assigning to globals\n''2005.12.27 [2.1.0]'' hijack displayTiddlers() so that SPM can be suspended during startup while displaying the DefaultTiddlers (or #hash list). Also, corrected initialization for undefined SPM flag to "false", so default behavior is to display multiple tiddlers\n''2005.12.27 [2.0.0]'' Update for TW2.0\n''2005.11.24 [1.1.2]'' When the back and forward buttons are used, the page now changes to match the URL. Based on code added by Clint Checketts\n''2005.10.14 [1.1.1]'' permalink creation now calls encodeTiddlyLink() to handle tiddler titles with spaces in them\n''2005.10.14 [1.1.0]'' added automatic setting of window title and location bar ('auto-permalink'). feature suggestion by David Dickens.\n''2005.10.09 [1.0.1]'' combined documentation and code in a single tiddler\n''2005.08.15 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\nSupport for BACK/FORWARD buttons adapted from code developed by Clint Checketts\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.SinglePageMode= {major: 2, minor: 2, revision: 1, date: new Date(2006,7,3)};\n\nif (config.options.chkSinglePageMode==undefined) config.options.chkSinglePageMode=false;\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSinglePageMode>> Display one tiddler at a time";\n\nif (config.options.chkTopOfPageMode==undefined) config.options.chkTopOfPageMode=false;\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkTopOfPageMode>> Always open tiddlers at the top of the page";\n\nconfig.SPMTimer = 0;\nconfig.lastURL = window.location.hash;\nfunction checkLastURL()\n{\n if (!config.options.chkSinglePageMode)\n { window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }\n if (config.lastURL == window.location.hash)\n return;\n var tiddlerName = convertUTF8ToUnicode(decodeURI(window.location.hash.substr(1)));\n tiddlerName=tiddlerName.replace(/\s[\s[/,"").replace(/\s]\s]/,""); // strip any [[ ]] bracketing\n if (tiddlerName.length) story.displayTiddler(null,tiddlerName,1,null,null);\n}\n\nif (Story.prototype.SPM_coreDisplayTiddler==undefined) Story.prototype.SPM_coreDisplayTiddler=Story.prototype.displayTiddler;\nStory.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)\n{\n if (config.options.chkSinglePageMode) {\n window.location.hash = encodeURIComponent(String.encodeTiddlyLink(title));\n config.lastURL = window.location.hash;\n document.title = wikifyPlain("SiteTitle") + " - " + title;\n story.closeAllTiddlers();\n if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);\n }\n if (config.options.chkTopOfPageMode) { story.closeTiddler(title); window.scrollTo(0,0); srcElement=null; }\n this.SPM_coreDisplayTiddler(srcElement,title,template,animate,slowly)\n}\n\nif (Story.prototype.SPM_coreDisplayTiddlers==undefined) Story.prototype.SPM_coreDisplayTiddlers=Story.prototype.displayTiddlers;\nStory.prototype.displayTiddlers = function(srcElement,titles,template,unused1,unused2,animate,slowly)\n{\n // suspend single-page mode when displaying multiple tiddlers\n var saveSPM=config.options.chkSinglePageMode; config.options.chkSinglePageMode=false;\n var saveTPM=config.options.chkTopOfPageMode; config.options.chkTopOfPageMode=false;\n this.SPM_coreDisplayTiddlers(srcElement,titles,template,unused1,unused2,animate,slowly);\n config.options.chkSinglePageMode=saveSPM; config.options.chkTopOfPageMode=saveTPM;\n}\n//}}}
\n[[Welcome]] <%= User.Name %>
<%= Prefs.SiteName %>
This tool is provided (thanks to [[ACP wizard Dick Berg|http://www.brightskies.us/]]) to help you order your flat plans so that you can capture as many flats as possible as the light fades (dusk) or builds (dawn). The tool scans a sky flat ACP run log file, extracts the exposure information and timing, then produces a graphic showing elapsed time on the horizontal axis and exposure length for each flat on the vertical axis. Analyzing this data can provide insight into ways of shortening the total length of time it takes to collect sky flats. Sky flat logs are typically difficult to analyze because many lines of text are written into the log file.\n\n''Instructions''\nThis tool reads a selected log file generated from a previous sky flat collection session. Use the drop-downs to select the folder and flat log file, and click on {{{Draw Graph}}}.\n\n''Supplied Test Data''\nWe have supplied a set of sample ACP sky flat run logs which you can use to try this tool. In the folder selector below, select {{{Sky Flat Analyzer Test Data}}}. Then select a specific log and click on {{{Draw Graph}}}.\n\n''Interpreting the Graph''\nOrange pips are the TEST exposures, and green pips are the FLAT exposures. The data clusters represent one filter at one binning. Comparing with the log file will identify the cluster.\n\n<<RemoteContent "/ac/aflatanalyzer.asp">>
Fill in the specs for the flat fields you want to acquire. The order of flat sets must be as they would be taken at __dusk__ - with the filter/binning resulting in the __lowest sensitivity used first__ (when the sky is brightest). __Filter sensitivity for sky-flats is not the same as for night imaging__. Often red will be the least sensitive. For sky-flats, you are imaging a blue sky! Also, higher binning is much more sensitive so list your lowest binning levels first, regardless of the filter. \n\n@@''Note:'' You can use the [[Sky Flat Analyzer]] tool to help you order your flat filters and binnings to make the most of the twilight time.@@\n\nFor common LRGB imaging (L at binning 1 and RGB at binning 2) try the order\n# L at binning 1\n# R at binning 2\n# G at binning 2\n# B at binning 2\nNarrow-band filters (~H-Alpha, etc.) should come first since they transmit far less light than color filters.
/***\n|''Name:''|SortableGridPlugin|\n|''Description:''|Provide live sorting of tables by column|\n|''Date:''|Nov 4, 2006|\n|''Source:''|[[SortableGridPlugin|http://solo.dc3.com/tw/plugins.html#SortableGridPlugin]]|\n|''Author:''|Stuart Langridge, Demian Johnson, Bob Denny|\n|''License:''|See Below|\n|''Version:''|1.1.2|\n|''~CoreVersion:''|2.0.11 and 2.1.x|\n|''Browser:''|Firefox 1.5/2.0; Internet Explorer 6.0/7.0; Safari|\n!!Description\n@@Please note that this works only with TiddlyWiki 2.0.11 and 2.1.0/1/2@@\n\nThis plugin provides live sorting of tables by clicking on a column header. To sort in reverse, click the same column header a second time. An arrow in the sort column shows the direction of sorting. \n\nIt works by trying to automatically detect the type of data in a column, then sorting by the rules for that data type. Note that the data in the first row (before sorting for the first time) is used for type detection, so if other data types exist in the column below the first row, the results will be unpredictable. If it //can// recognize the string as prticular type it //will// sort that column by that type. Moral: keep all of your data in a column the same type. The following data types are checked in the order shown (in other words the table shows the precedence of type detection):\n\n|!Type |!Description|\n|Date|Various formats for dates, specifically any string format that can be converted to a date/time by Javascript's Date.Parse() method.|\n|Currency|Any string beginning with $, ยฃ, or โฌ followed by a numeric string (except no leading sign). Note that it does not do currency conversion, the raw currency values are sorted numerically. {{{/^[$|ยฃ|โฌ]{1}\sd*\s.{0,1}\sd+$/}}}|\n|Numeric|Data must consist purely of digits, optional leading plus or minus sign, a single period. Javascript cannot handle the Continental virgule (comma decimal point). {{{/^[\s+|\s-]{0,1}\sd*\s.{0,1}\sd+$/}}}|\n|File Size|Numeric string (except no leading sign) with b, Kb, Mb, or Gb at the end. Sorts according to the actual value represented by the notation. {{{/^\sd*\s.{0,1}\sd+[K|M|G]{0,1}b$}}}|\n|Text|Anything that does not match the formats listed below. Text is sorted without regard to character case.|\n!!Installation\nFollow the usual procedure for installing a plugin: Edit this tiddler, copy, paste into a new tiddler in your TW, and tag it systemConfig. Close, Save, and Shift-Reload your TW's page. The table below (in Example) should have hot column headers and be sortable.\n!!Usage\nTo make a table sortable, append an {{{h}}} to the end of the first row. If the table is thus marked as sortable, the formatter will add a CSS class {{{sortable}}} to the generated {{{<table>}}} element. Thus you can use CSS to alter the appearance of the sortable table and/or its elements.\n!!Example\n|Name |Salary |Extension |Performance |File Size |Start date |h\n|Bloggs, Fred |$12000.00 |1353 |+1.2 |74.2Kb |Aug 19, 2003 21:34:00 |\n|Bloggs, Fred |$12000.00 |1353 |1.2 |3350b |09/18/2003 |\n|Bloggs, Fred |$12000 |1353 |1.200 |55.2Kb |August 18, 2003 |\n|Bloggs, Fred |$12000.00 |1353 |1.2 |2100b |07/18/2003 |\n|Bloggs, Fred |$12000.00 |1353 |01.20 |6.156Mb |08/17/2003 05:43 |\n|Turvey, Kevin |$191200.00 |2342 |-33 |1b |02/05/1979 |\n|Mbogo, Arnold |$32010.12 |2755 |-21.673 |1.2Gb |09/08/1998 |\n|Shakespeare, Bill |ยฃ122000.00|3211 |6 |33.22Gb |12/11/1961 |\n|Shakespeare, Hamlet |ยฃ9000 |9005 |-8 |3Gb |01/01/2002 |\n|Fitz, Marvin |โฌ3300.30 |5554 |+5 |4Kb |05/22/1995 |\n!!Revision History\n<<<\n''2003.11.?? [?.?.?]'' Stuart Langridge (http://www.kryogenix.org/code/browser/sorttable/) - Core code for DHTML sortable tables. Copyright and license for his code has been carried forward and applies to subsequent additions.\n''2006.02.14 [1.0.0]'' Demian Johnson - Initial release, adaptation of Langridge code to TiddlyWiki.\n''2006.09.29 [1.1.0]'' Bob Denny - Add standard-format plugin documentation, reformat and tabify code for readability, refactor references to plugin, add new "file size" detection and sorting, add sterling and euro to currency detection, allow any real numbers including optional sign and either period or comma for decimal point for numeric sorting, make RegExp matching strict for currency and numeric, clean up lint warnings, correct spelling of Hamlet's name.\n''2006.10.19 [1.1.1]'' Bob Denny - Allow use with TW 2.1.1 and 2.1.2, hijack is identical with 2.1.0.\n''2006.11.04 [1.1.2]'' Bob Denny - Oh hell, accept 2.1.x, bit again by 2.1.3 which was OK.\n<<<\n!!Code\n***/\n//{{{\n//\n// Begin SORTABLE.JS\n// This Code is:\n// Code downloaded from the Browser Experiments section of kryogenix.org is \n// licenced under the so-called MIT licence. The license is below.\n// ----------------------------------------\n// Copyright (c) 1997-date Stuart Langridge\n// ----------------------------------------\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this \n// software and associated documentation files (the "Software"), to deal in the Software \n// without restriction, including without limitation the rights to use, copy, modify, merge, \n// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons \n// to whom the Software is furnished to do so, subject to the following conditions:\n//\n// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR \n// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE \n// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR \n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \n// DEALINGS IN THE SOFTWARE.\n//\n// Modified under the same aforementioned terms by Demian Johnston, 2006\n// Further modified under the same aforementioned terms by Bob Denny, 2006: \n// 1. Add flexible date/time \n// 2. Use 'this' instead of full dotted names \n// 3. Re-indent and tabify after being munged by TW/IE bu\n// 4. Add "file size" sensing and sorting. Validate with Javascript Lint \n//\nversion.extensions.PersistentForm = {\n major: 1, minor: 1, revision: 2,\n date: new Date(2006, 11, 4), \n type: 'extension',\n source: "http://solo.dc3.com/tw/plugins.html#SortableGridPlugin"\n};\n//}}}\n\n//{{{\nconfig.macros.sortableGridPlugin = { SORT_COLUMN_INDEX: 0 };\n\nconfig.macros.sortableGridPlugin.ts_makeSortable = function(table) \n{\n var firstRow;\n if (table.rows && table.rows.length > 0) {\n firstRow = table.rows[0];\n }\n if (!firstRow) return;\n \n // We have a first row: assume it's the header, and make its contents clickable links\n for (var i=0;i<firstRow.cells.length;i++) {\n var cell = firstRow.cells[i];\n var txt = config.macros.sortableGridPlugin.ts_getInnerText(cell);\n cell.innerHTML = '<a href="#" class="sortheader" onclick="config.macros.sortableGridPlugin.ts_resortTable(this);return false;">' +\n txt + '<span class="sortarrow"> </span></a>';\n }\n};\n//}}}\n\n//{{{\nconfig.macros.sortableGridPlugin.ts_getInnerText = function(el) \n{\n if (typeof el == "string") return el;\n if (typeof el == "undefined") { return el; }\n if (el.innerText) return el.innerText; //Not needed but it is faster\n var str = "";\n var cs = el.childNodes;\n var l = cs.length;\n for (var i = 0; i < l; i++) {\n switch (cs[i].nodeType) \n {\n case 1: //ELEMENT_NODE\n str += config.macros.sortableGridPlugin.ts_getInnerText(cs[i]);\n break;\n case 3: //TEXT_NODE\n str += cs[i].nodeValue;\n break;\n }\n }\n return str;\n};\n\nconfig.macros.sortableGridPlugin.getParent = function(el, pTagName) \n{\n if (el === null) \n return null;\n else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) // Gecko bug, supposed to be uppercase\n return el;\n else\n return config.macros.sortableGridPlugin.getParent(el.parentNode, pTagName);\n};\n//}}}\n\n//{{{\nconfig.macros.sortableGridPlugin.ts_resortTable = function(lnk) \n{\n var M = config.macros.sortableGridPlugin;\n // get the span\n var span;\n for (var ci = 0; ci < lnk.childNodes.length; ci++) {\n if (lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 'span') \n span = lnk.childNodes[ci];\n }\n var td = lnk.parentNode;\n var column = td.cellIndex;\n var table = M.getParent(td,'TABLE');\n \n // Work out a type for the column\n if (table.rows.length <= 1) return;\n var itm = M.ts_getInnerText(table.rows[1].cells[column]);\n var sortfn = M.ts_sort_caseinsensitive;\n if(!isNaN(Date.parse(itm)))\n sortfn = M.ts_sort_date;\n else if(itm.match(/^[$|ยฃ|โฌ]{1}\sd*\s.{0,1}\sd+$/)) \n sortfn = M.ts_sort_currency;\n else if(itm.match(/^[\s+|\s-]{0,1}\sd*\s.{0,1}\sd+$/)) \n sortfn = M.ts_sort_numeric;\n else if(itm.match(/^\sd*\s.{0,1}\sd+[K|M|G]{0,1}b$/))\n sortfn = M.ts_sort_fileSize;\n M.SORT_COLUMN_INDEX = column;\n var firstRow = new Array();\n var newRows = new Array();\n for (var i = 0; i < table.rows[0].length; i++) { firstRow[i] = table.rows[0][i]; }\n for (var j = 1; j < table.rows.length; j++) { newRows[j-1] = table.rows[j]; }\n \n newRows.sort(sortfn);\n var ARROW;\n if (span.getAttribute("sortdir") == 'down') {\n ARROW = ' ↑';\n newRows.reverse();\n span.setAttribute('sortdir','up');\n } else {\n ARROW = ' ↓';\n span.setAttribute('sortdir','down');\n }\n \n // We appendChild rows that already exist to the tbody, so it moves them \n // rather than creating new ones. Don't do sortbottom rows\n for ( i=0;i<newRows.length;i++) { \n if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) \n table.tBodies[0].appendChild(newRows[i]);\n }\n // do sortbottom rows only\n for ( i=0;i<newRows.length;i++) { \n if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1)) \n table.tBodies[0].appendChild(newRows[i]);\n }\n \n // Delete any other arrows there may be showing\n var allspans = document.getElementsByTagName("span");\n for ( ci=0;ci<allspans.length;ci++) {\n if (allspans[ci].className == 'sortarrow') {\n if (M.getParent(allspans[ci],"table") == M.getParent(lnk,"table")) { // in the same table as us?\n allspans[ci].innerHTML = ' ';\n }\n }\n }\n \n span.innerHTML = ARROW;\n};\n//}}}\n\n//{{{\nconfig.macros.sortableGridPlugin.ts_sort_fileSize = function(a, b) \n{\n var M = config.macros.sortableGridPlugin;\n var convert = function(str)\n {\n var val;\n var i;\n if((i = str.indexOf("Kb")) != -1)\n val = 1024.0 * str.substr(0, i);\n else if((i = str.indexOf("Mb")) != -1)\n val = 1048576.0 * str.substr(0, i);\n else if((i = str.indexOf("Gb")) != -1)\n val = 1073741824.0 * str.substr(0, i);\n else\n val = 1.0 * str.substr(0, str.length - 1);\n return val;\n };\n \n var aa = M.ts_getInnerText(a.cells[M.SORT_COLUMN_INDEX]);\n var bb = M.ts_getInnerText(b.cells[M.SORT_COLUMN_INDEX]);\n var v1 = convert(aa);\n var v2 = convert(bb);\n if(v1 == v2) return 0;\n if(v1 < v2) return -1;\n return 1;\n};\n\nconfig.macros.sortableGridPlugin.ts_sort_date = function(a, b) \n{\n var M = config.macros.sortableGridPlugin;\n // Handles dates per the rules of Date.parse()\n var aa = M.ts_getInnerText(a.cells[M.SORT_COLUMN_INDEX]);\n var bb = M.ts_getInnerText(b.cells[M.SORT_COLUMN_INDEX]);\n var dt1 = Date.parse(aa);\n var dt2 = Date.parse(bb);\n if (dt1 == dt2) return 0;\n if (dt1 < dt2) return -1;\n return 1;\n};\n\nconfig.macros.sortableGridPlugin.ts_sort_currency = function(a, b) \n{ \n var M = config.macros.sortableGridPlugin;\n var aa = M.ts_getInnerText(a.cells[M.SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');\n var bb = M.ts_getInnerText(b.cells[M.SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');\n return parseFloat(aa) - parseFloat(bb);\n};\n\nconfig.macros.sortableGridPlugin.ts_sort_numeric = function(a, b) \n{ \n var M = config.macros.sortableGridPlugin;\n var aa = parseFloat(M.ts_getInnerText(a.cells[M.SORT_COLUMN_INDEX]));\n if (isNaN(aa)) aa = 0;\n var bb = parseFloat(M.ts_getInnerText(b.cells[M.SORT_COLUMN_INDEX])); \n if (isNaN(bb)) bb = 0;\n return aa-bb;\n};\n\nconfig.macros.sortableGridPlugin.ts_sort_caseinsensitive = function(a, b) \n{\n var M = config.macros.sortableGridPlugin;\n var aa = M.ts_getInnerText(a.cells[M.SORT_COLUMN_INDEX]).toLowerCase();\n var bb = M.ts_getInnerText(b.cells[M.SORT_COLUMN_INDEX]).toLowerCase();\n if (aa == bb) return 0;\n if (aa < bb) return -1;\n return 1;\n};\n\n// config.macros.sortableGridPlugin.ts_sort_default = function(a, b) \n// {\n// var M = config.macros.sortableGridPlugin;\n// var aa = M.ts_getInnerText(a.cells[M.SORT_COLUMN_INDEX]);\n// var bb = M.ts_getInnerText(b.cells[M.SORT_COLUMN_INDEX]);\n// if (aa == bb) return 0;\n// if (aa < bb) return -1;\n// return 1;\n// };\n//\n//}}}\n\n//{{{\n// end Code downloaded from the Browser Experiments section of kryogenix.org\n// end Copyright (c) 1997-date Stuart Langridge//\n// END SORTABLE.JS//\n//}}}\n\n//{{{\n//\n//\n// CORE HIJACK WARNINGS: \n// (1) Depends on the table formatter being first in the config.formatters array\n// (2) Version-specifics - test on your version before adding to the logic here!\n//\nif(version.major == 2 && version.minor === 0 && version.revision == 11)\n{\n config.formatters[0].handler = function(w)\n {\n var table = createTiddlyElement(w.output,"table");\n w.nextMatch = w.matchStart;\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n var currRowType = null, nextRowType;\n var rowContainer, rowElement;\n var prevColumns = [];\n var rowCount = 0;\n var want_sortable=0;\n do {\n lookaheadRegExp.lastIndex = w.nextMatch;\n var lookaheadMatch = lookaheadRegExp.exec(w.source);\n var matched = lookaheadMatch && lookaheadMatch.index == w.nextMatch;\n if(matched)\n {\n nextRowType = lookaheadMatch[2];\n if(nextRowType != currRowType)\n rowContainer = createTiddlyElement(table,this.rowTypes[nextRowType]);\n currRowType = nextRowType;\n if(currRowType == "c")\n {\n if(rowCount === 0)\n rowContainer.setAttribute("align","top");\n else\n rowContainer.setAttribute("align","bottom");\n w.nextMatch = w.nextMatch + 1;\n w.subWikify(rowContainer,this.rowTerminator);\n table.insertBefore(rowContainer,table.firstChild);\n }\n else\n {\n var rowClass = (rowCount & 1) ? "oddRow" : "evenRow";\n rowElement = createTiddlyElement(rowContainer,"tr",null,rowClass);\n this.rowHandler(w,rowElement,prevColumns);\n }\n if(currRowType == "h") {\n want_sortable=1;\n }\n rowCount++;\n }\n } while(matched);\n if (want_sortable) {\n table.setAttribute("class","sortable");\n config.macros.sortableGridPlugin.ts_makeSortable(table);\n }\n };\n} \nelse if(version.major == 2 && version.minor == 1)\n{\n config.formatters[0].handler = function(w)\n {\n var table = createTiddlyElement(w.output,"table");\n var prevColumns = [];\n var currRowType = null;\n var rowContainer;\n var rowCount = 0;\n var want_sortable = 0;\n \n w.nextMatch = w.matchStart;\n this.lookaheadRegExp.lastIndex = w.nextMatch;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n while(lookaheadMatch && lookaheadMatch.index == w.nextMatch)\n {\n var nextRowType = lookaheadMatch[2];\n if(nextRowType == "k")\n {\n table.className = lookaheadMatch[1];\n w.nextMatch += lookaheadMatch[0].length+1;\n }\n else\n {\n if(nextRowType != currRowType)\n {\n rowContainer = createTiddlyElement(table,this.rowTypes[nextRowType]);\n currRowType = nextRowType;\n }\n if(currRowType == "c")\n {\n // Caption\n w.nextMatch++;\n if(rowContainer != table.firstChild)\n table.insertBefore(rowContainer,table.firstChild);\n//[rbd lint warn] rowContainer.setAttribute("align",rowCount == 0?"top":"bottom");\n rowContainer.setAttribute("align",rowCount === 0?"top":"bottom");\n w.subWikifyTerm(rowContainer,this.rowTermRegExp);\n }\n else\n {\n this.rowHandler(w,createTiddlyElement(rowContainer,"tr",null,(rowCount&1)?"oddRow":"evenRow"),prevColumns);\n if(currRowType == "h") want_sortable = 1;\n rowCount++;\n }\n }\n this.lookaheadRegExp.lastIndex = w.nextMatch;\n lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n }\n if (want_sortable) {\n table.setAttribute("class","sortable");\n config.macros.sortableGridPlugin.ts_makeSortable(table);\n }\n };\n}\nelse\n alert("SortableGridPlugin works only with TiddlyWiki 2.0.11 and 2.1.x");\n \n//}}}\n
/***\n\n''Inspired by [[TiddlyPom|http://www.warwick.ac.uk/~tuspam/tiddlypom.html]]''\n\n|Name|SplashScreenPlugin|\n|Created by|SaqImtiaz|\n|Location|http://lewcid.googlepages.com/lewcid.html#SplashScreenPlugin|\n|Version|0.21 |\n|Requires|~TW2.08+|\n!Description:\nProvides a simple splash screen that is visible while the TW is loading. \n\n@@WARNING! INSTALLATION CODE NOW COMMENTED OUT@@. See twstore.asp.\n\n!Installation\nCopy the source text of this tiddler to your TW in a new tiddler, tag it with systemConfig and save and reload. The SplashScreen will now be installed and will be visible the next time you reload your TW.\n\n!Customizing\nOnce the SplashScreen has been installed and you have reloaded your TW, the splash screen html will be present in the MarkupPreHead tiddler. You can edit it and customize to your needs.\n\n!History\n* 21-09-06: Comment out initialization for ~ShareYourSky/ASP usage. See twstore.asp for details.\n* 20-07-06 : version 0.21, modified to hide contentWrapper while SplashScreen is displayed.\n* 26-06-06 : version 0.2, first release\n\n!Code\n***/\n//{{{\nvar old_lewcid_splash_restart=restart;\n\nrestart = function()\n{ if (document.getElementById("SplashScreen"))\n document.getElementById("SplashScreen").style.display = "none";\n if (document.getElementById("contentWrapper"))\n document.getElementById("contentWrapper").style.display = "block";\n \n old_lewcid_splash_restart();\n \n/*** REMOVE ONCE INSTALLED \nif (splashScreenInstall)\n {if(config.options.chkAutoSave)\n {saveChanges();}\n displayMessage("TW SplashScreen has been installed, please save and refresh your TW.");\n }\n***/\n}\n\n/*** REMOVE ONCE INSTALLED\nvar oldText = store.getTiddlerText("MarkupPreHead");\nif (oldText.indexOf("SplashScreen")==-1)\n {var siteTitle = store.getTiddlerText("SiteTitle");\n var splasher='\sn\sn<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>'+siteTitle +'</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>';\n if (! store.tiddlerExists("MarkupPreHead"))\n {var myTiddler = store.createTiddler("MarkupPreHead");}\n else\n {var myTiddler = store.getTiddler("MarkupPreHead");}\n myTiddler.set(myTiddler.title,oldText+splasher,config.options.txtUserName,null,null);\n store.setDirty(true);\n var splashScreenInstall = true;\n}\n***/\n//}}}
Acquire automatic flat fields using a previously saved standard flat plan. You can set up standard flats using the [[Setup Standard Flat Fields]] item. <% if(!screenFlats) { %> @@You can use the [[Sky Flat Analyzer]] tool to help you order your flat filters and binnings to make the most of the twilight time.@@<% } %>\n\nThis will start immediately<% if(!screenFlats) { %>, then sit waiting until the next dusk or dawn, whichever comes first, and will use the appropriate standard flat plan (see above)<% } else { %> and use the light panel/screen to acquire the flats. If needed, the dome/roof will be closed while this runs, and if it was open it will be re-opened afterward<% } %>.\n<html><form></form></html>\n<<PostForm "" "/ac/aacqdefflat.asp" "Acquire Standard Flat Fields" "Starts the flat field acquisition process">>
* If you forgot to start Scheduler, or if you have an "Operator Intervention" issue, clicking the link below will quit and restart Scheduler\n* @@Use Caution@@: An Operator Intervention issue may indeed need attention to prevent causing (further) damage\n* Scheduler will begin dispatching as usual, with no knowledge of its previous activity\n<html><a id="utilStartScheduler" \n href="javascript:;" \n op="StartScheduler.js"><b>Start ACP Scheduler</b></a>\n</html>\n<script>\n function _utilOnComplete(text, params) {\n displayMessage(text);\n }\n\n function _util(e) {\n DC3.Ajax.sendRequest("GET", "/ac/arunscript.asp?StartScheduler.js", "", _utilOnComplete, null);\n }\n // Wire up onclick() at run time\n document.getElementById("utilStartScheduler").onclick=_util;\n</script>\n
[[System Status]]\n[[Welcome]]
/***\nThese are styles common to all themes. Usually widgets etc.\n!bValidator jQuery Form Validator Styles\nAuthor: Bojan Mauser [[bValidator jQuery form validation plugin|http://code.google.com/p/bvalidator/]]\n!!Revision History\n<<<\n''2011.09.17 [rbd]'' [[SCHEDULER-691|http://gemini.dc3.com:8472/Gemini/Default.aspx?p=22&i=691]] bValidator (jQuery form validator) styles. Validator used in Scheduler input forms. Incorporate into TW and my [[ValidateFormPlugin]]\n<<<\n!!CSS Rules for bValidator\nThere are 4 styles of popup validation messages\n!!!Gray (the default)\n***/\n/*{{{*/\n/* invalid input */\n.bvalidator_invalid{\n background-color: #FFFFAE;\n}\n\n/* error message */\n.bvalidator_errmsg {\n background-color:#333;\n font-size:10px;\n border:1px solid #999;\n color:#FFF;\n display:none;\n -moz-border-radius:4px;\n -webkit-border-radius:4px;\n -moz-border-radius-bottomleft:0;\n -moz-border-radius-topleft:0;\n -webkit-border-bottom-left-radius:0;\n -webkit-border-top-left-radius:0;\n -moz-box-shadow:0 0 6px #ddd;\n -webkit-box-shadow:0 0 6px #ddd;\n white-space:nowrap;\n padding-top: 2px;\n padding-right: 10px;\n padding-bottom: 2px;\n padding-left: 5px;\n font-family: Arial, Helvetica, sans-serif;\n -moz-opacity:.90;\n filter:alpha(opacity=90);\n opacity:.90; \n}\n\n/* close icon */\n.bvalidator_errmsg .bvalidator_close_icon {\n margin-left: 5px;\n margin-top: -2px;\n font-family: Arial, Helvetica, sans-serif;\n font-weight: bold;\n color:#F96;\n cursor:pointer;\n}\n\n/* arrow */\n.bvalidator_errmsg em {\n display:block;\n border-color: #333 transparent transparent;\n border-style: solid;\n border-width: 10px 10px 0;\n height: 0;\n width: 0;\n position:absolute;\n bottom:-10px;\n left:5px;\n}\n/*}}}*/\n/***\n!!!~PostIt\n<<<\n var optionsPostIt = {\n classNamePrefix: 'bvalidator_postit_',\n offset: {x:-29, y:-10},\n template: '<div class="{errMsgClass}">{message}<div class="bvalidator_postit_pointer"><div class="bvalidator_postit_inner_pointer"></div></div></div>'\n };\n<<<\n***/\n/*{{{*/\n/* invalid input */\n.bvalidator_postit_invalid{\n background-color: #FFFFAE;\n}\n\n/* error message */\n.bvalidator_postit_errmsg {\n background-color:#fffe66;\n font-size:15px;\n color:#000;\n display:none;\n white-space:nowrap;\n padding-top: 2px;\n padding-right: 10px;\n padding-bottom: 2px;\n padding-left: 5px;\n border:2px solid #100b07;\n border-radius: 10px;\n -moz-border-radius: 10px;\n font-family:'Comic Sans MS', 'Trebuchet MS', Trebuchet, Arial, Verdana, Sans-serif;\n -moz-box-shadow:0 0 6px #ddd;\n -webkit-box-shadow:0 0 6px #ddd;\n}\n\n/* arrow */\n.bvalidator_postit_errmsg .bvalidator_postit_pointer, .bvalidator_postit_errmsg .bvalidator_postit_inner_pointer {\n position: absolute;\n width:0;\n height:0;\n border-bottom-width: 0;\n background: none;\n}\n.bvalidator_postit_errmsg .bvalidator_postit_pointer {\n border-left: 7px solid transparent;\n border-right: 7px solid transparent;\n border-top: 14px solid #333;\n bottom: -14px;\n right: auto;\n left: 20px;\n margin-left: -7px;\n bottom: -15px;\n}\n.bvalidator_postit_errmsg .bvalidator_postit_inner_pointer {\n border-left: 5px solid transparent;\n border-right: 5px solid transparent;\n border-top: 5px solid #fffe66;\n bottom: auto;\n top: -16px;\n left: -5px;\n}\n\n\n/* close icon */\n.bvalidator_postit_errmsg .bvalidator_postit_close_icon {\n margin-left: 10px;\n margin-top: -2px;\n font-weight: bold;\n color:#C30;\n cursor:pointer;\n}\n/*}}}*/\n/***\n!!!Gray 2\n<<<\n var optionsGray2 = {\n classNamePrefix: 'bvalidator_gray2_',\n position: {x:'right', y:'center'},\n offset: {x:15, y:0},\n template: '<div class="{errMsgClass}"><div class="bvalidator_gray2_arrow"></div><div class="bvalidator_gray2_cont1">{message}</div></div>' \n };\n<<<\n***/\n/*{{{*/\n/* invalid input */\n.bvalidator_gray2_invalid{\n background-color: #FFFFAE;\n}\n\n/* error message */\n.bvalidator_gray2_errmsg {\n background-color:#333;\n font-size:10px;\n border:1px solid #999;\n color:#FFF;\n display:none;\n -moz-border-radius:4px;\n -webkit-border-radius:4px;\n -moz-border-radius-bottomleft:0;\n -moz-border-radius-topleft:0;\n -webkit-border-bottom-left-radius:0;\n -webkit-border-top-left-radius:0;\n -moz-box-shadow:0 0 6px #ddd;\n -webkit-box-shadow:0 0 6px #ddd;\n white-space:nowrap;\n padding-top: 2px;\n padding-right: 10px;\n padding-bottom: 2px;\n padding-left: 5px;\n font-family: Arial, Helvetica, sans-serif;\n -moz-opacity:.90;\n filter:alpha(opacity=90);\n opacity:.90; \n}\n\n/* close icon */\n.bvalidator_gray2_errmsg .bvalidator_gray2_close_icon {\n margin-left: 5px;\n margin-top: -2px;\n font-family: Arial, Helvetica, sans-serif;\n font-weight: bold;\n color:#F96;\n cursor:pointer;\n}\n\n/* arrow */\n.bvalidator_gray2_errmsg .bvalidator_gray2_arrow {\n display:inline-block;\n border-color: transparent #333 transparent transparent;\n border-style: solid;\n border-width: 10px 10px 10px 0px;\n height: 0;\n width: 0;\n position:relative;\n left:-15px;\n vertical-align:middle;\n}\n\n/* message container */\n.bvalidator_gray2_errmsg .bvalidator_gray2_cont1 {\n display:inline-block;\n vertical-align:middle;\n}\n/*}}}*/\n/***\n!!!Orange\n<<<\n var optionsOrange = {\n classNamePrefix: 'bvalidator_orange_'\n };\n<<<\n***/\n/*{{{*/\n/* invalid input */\n.bvalidator_orange_invalid{\n background-color: #FFC;\n}\n\n/* error message */\n.bvalidator_orange_errmsg {\n background-color:#F90;\n font-size:10px;\n border:1px solid #999;\n color:#333;\n display:none;\n -moz-border-radius:4px;\n -webkit-border-radius:4px;\n -moz-border-radius-bottomleft:0;\n -moz-border-radius-topleft:0;\n -webkit-border-bottom-left-radius:0;\n -webkit-border-top-left-radius:0;\n -moz-box-shadow:0 0 6px #ddd;\n -webkit-box-shadow:0 0 6px #ddd;\n white-space:nowrap;\n padding-top: 2px;\n padding-right: 10px;\n padding-bottom: 2px;\n padding-left: 5px;\n font-family: Arial, Helvetica, sans-serif;\n -moz-opacity:.90;\n filter:alpha(opacity=90);\n opacity:.90;\n font-weight: bold;\n}\n\n/* close icon */\n.bvalidator_orange_errmsg .bvalidator_orange_close_icon {\n margin-left: 5px;\n margin-top: -2px;\n font-family: Verdana, Geneva, sans-serif;\n font-weight: bolder;\n color:#FFF;\n cursor:pointer;\n font-size: 14px;\n}\n\n/* arrow */\n.bvalidator_orange_errmsg em {\n display:block;\n border-color: #F90 transparent transparent;\n border-style: solid;\n border-width: 10px 10px 0;\n height: 0;\n width: 0;\n position:absolute;\n bottom:-10px;\n left:5px;\n}\n/*}}}*/\n/***\n!!!Red\n<<<\n var optionsRed = {\n classNamePrefix: 'bvalidator_red_'\n };\n<<<\n***/\n/*{{{*/\n/* invalid input */\n.bvalidator_red_invalid{\n background-color: #FCC;\n}\n\n/* error message */\n.bvalidator_red_errmsg {\n background-color:#F33;\n font-size:10px;\n border:1px solid #900;\n color:#FFF;\n display:none;\n white-space:nowrap;\n padding-top: 2px;\n padding-right: 10px;\n padding-bottom: 2px;\n padding-left: 5px;\n font-family: Arial, Helvetica, sans-serif;\n -moz-opacity:.90;\n filter:alpha(opacity=90);\n opacity:.90;\n font-weight: bold;\n}\n\n/* close icon */\n.bvalidator_red_errmsg .bvalidator_red_close_icon {\n margin-left: 5px;\n margin-top: -2px;\n font-family: Verdana, Geneva, sans-serif;\n font-weight: bolder;\n color:#000;\n cursor:pointer;\n font-size: 12px;\n}\n\n/* arrow */\n.bvalidator_red_errmsg em {\n display:block;\n border-color: #F33 transparent transparent;\n border-style: solid;\n border-width: 10px 10px 0;\n height: 0;\n width: 0;\n position:absolute;\n bottom:-10px;\n left:5px;\n}\n/*}}}*/\n
/***\nThis was originally a shadow tiddler, but was modified for fonts and thus became a real one. \n!!Revision History\n<<<\n''2011.09.29 [rbd]'' Add tahoma as first/preferred font\n<<<\n***/\n/*{{{*/\n* html .tiddler {\n height: 1%;\n}\n\nbody {\n font-size: .75em;\n font-family: tahoma,arial,helvetica;\n margin: 0;\n padding: 0;\n}\n\nh1,h2,h3,h4,h5 {\n font-weight: bold;\n text-decoration: none;\n padding-left: 0.4em;\n}\n\nh1 {font-size: 1.35em;}\nh2 {font-size: 1.25em;}\nh3 {font-size: 1.1em;}\nh4 {font-size: 1em;}\nh5 {font-size: .9em;}\n\nhr {\n height: 1px;\n}\n\na{\n text-decoration: none;\n}\n\ndt {font-weight: bold;}\n\nol { list-style-type: decimal }\nol ol { list-style-type: lower-alpha }\nol ol ol { list-style-type: lower-roman }\nol ol ol ol { list-style-type: decimal }\nol ol ol ol ol { list-style-type: lower-alpha }\nol ol ol ol ol ol { list-style-type: lower-roman }\nol ol ol ol ol ol ol { list-style-type: decimal }\n\n.txtOptionInput {\n width: 11em;\n}\n\n#contentWrapper .chkOptionInput {\n border: 0;\n}\n\n.externalLink {\n text-decoration: underline;\n}\n\n.indent {margin-left:3em;}\n.outdent {margin-left:3em; text-indent:-3em;}\ncode.escaped {white-space:nowrap;}\n\n.tiddlyLinkExisting {\n font-weight: bold;\n}\n\n.tiddlyLinkNonExisting {\n font-style: italic;\n}\n\n/* the 'a' is required for IE, otherwise it renders the whole tiddler a bold */\na.tiddlyLinkNonExisting.shadow {\n font-weight: bold;\n}\n\n#mainMenu .tiddlyLinkExisting, \n#mainMenu .tiddlyLinkNonExisting,\n#sidebarTabs .tiddlyLinkNonExisting{\n font-weight: normal;\n font-style: normal;\n}\n\n#sidebarTabs .tiddlyLinkExisting {\n font-weight: bold;\n font-style: normal;\n}\n\n.header {\n position: relative;\n}\n\n.header a:hover {\n background: transparent;\n}\n\n.headerShadow {\n position: relative;\n padding: 4.5em 0em 1em 1em;\n left: -1px;\n top: -1px;\n}\n\n.headerForeground {\n position: absolute;\n padding: 4.5em 0em 1em 1em;\n left: 0px;\n top: 0px;\n}\n\n.siteTitle {\n font-size: 3em;\n}\n\n.siteSubtitle {\n font-size: 1.2em;\n}\n\n#mainMenu {\n position: absolute;\n left: 0;\n width: 10em;\n text-align: right;\n line-height: 1.6em;\n padding: 1.5em 0.5em 0.5em 0.5em;\n font-size: 1.1em;\n}\n\n#sidebar {\n position: absolute;\n right: 3px;\n width: 16em;\n font-size: .9em;\n}\n\n#sidebarOptions {\n padding-top: 0.3em;\n}\n\n#sidebarOptions a {\n margin: 0em 0.2em;\n padding: 0.2em 0.3em;\n display: block;\n}\n\n#sidebarOptions input {\n margin: 0.4em 0.5em;\n}\n\n#sidebarOptions .sliderPanel {\n margin-left: 1em;\n padding: 0.5em;\n font-size: .85em;\n}\n\n#sidebarOptions .sliderPanel a {\n font-weight: bold;\n display: inline;\n padding: 0;\n}\n\n#sidebarOptions .sliderPanel input {\n margin: 0 0 .3em 0;\n}\n\n#sidebarTabs .tabContents {\n width: 15em;\n overflow: hidden;\n}\n\n.wizard {\n padding: 0.1em 0em 0em 2em;\n}\n\n.wizard h1 {\n font-size: 2em;\n font-weight: bold;\n background: none;\n padding: 0em 0em 0em 0em;\n margin: 0.4em 0em 0.2em 0em;\n}\n\n.wizard h2 {\n font-size: 1.2em;\n font-weight: bold;\n background: none;\n padding: 0em 0em 0em 0em;\n margin: 0.2em 0em 0.2em 0em;\n}\n\n.wizardStep {\n padding: 1em 1em 1em 1em;\n}\n\n.wizard .button {\n margin: 0.5em 0em 0em 0em;\n font-size: 1.2em;\n}\n\n#messageArea {\nposition:absolute; top:0; right:0; margin: 0.5em; padding: 0.5em;\n}\n\n*[id='messageArea'] {\nposition:fixed !important; z-index:99;}\n\n.messageToolbar {\ndisplay: block;\ntext-align: right;\n}\n\n#messageArea a{\n text-decoration: underline;\n}\n\n.popup {\n font-size: .9em;\n padding: 0.2em;\n list-style: none;\n margin: 0;\n}\n\n.popup hr {\n display: block;\n height: 1px;\n width: auto;\n padding: 0;\n margin: 0.2em 0em;\n}\n\n.listBreak {\n font-size: 1px;\n line-height: 1px;\n}\n\n.listBreak div {\n margin: 2px 0;\n}\n\n.popup li.disabled {\n padding: 0.2em;\n}\n\n.popup li a{\n display: block;\n padding: 0.2em;\n}\n\n.tabset {\n padding: 1em 0em 0em 0.5em;\n}\n\n.tab {\n margin: 0em 0em 0em 0.25em;\n padding: 2px;\n}\n\n.tabContents {\n padding: 0.5em;\n}\n\n.tabContents ul, .tabContents ol {\n margin: 0;\n padding: 0;\n}\n\n.txtMainTab .tabContents li {\n list-style: none;\n}\n\n.tabContents li.listLink {\n margin-left: .75em;\n}\n\n#displayArea {\n margin: 1em 17em 0em 14em;\n}\n\n\n.toolbar {\n text-align: right;\n font-size: .9em;\n visibility: hidden;\n}\n\n.selected .toolbar {\n visibility: visible;\n}\n\n.tiddler {\n padding: 1em 1em 0em 1em;\n}\n\n.missing .viewer,.missing .title {\n font-style: italic;\n}\n\n.title {\n font-size: 1.6em;\n font-weight: bold;\n}\n\n.missing .subtitle {\n display: none;\n}\n\n.subtitle {\n font-size: 1.1em;\n}\n\n.tiddler .button {\n padding: 0.2em 0.4em;\n}\n\n.tagging {\nmargin: 0.5em 0.5em 0.5em 0;\nfloat: left;\ndisplay: none;\n}\n\n.isTag .tagging {\ndisplay: block;\n}\n\n.tagged {\nmargin: 0.5em;\nfloat: right;\n}\n\n.tagging, .tagged {\nfont-size: 0.9em;\npadding: 0.25em;\n}\n\n.tagging ul, .tagged ul {\nlist-style: none;margin: 0.25em;\npadding: 0;\n}\n\n.tagClear {\nclear: both;\n}\n\n.footer {\n font-size: .9em;\n}\n\n.footer li {\ndisplay: inline;\n}\n\n* html .viewer pre {\n width: 99%;\n padding: 0 0 1em 0;\n}\n\n.viewer {\n line-height: 1.4em;\n padding-top: 0.5em;\n}\n\n.viewer .button {\n margin: 0em 0.25em;\n padding: 0em 0.25em;\n}\n\n.viewer blockquote {\n line-height: 1.5em;\n padding-left: 0.8em;\n margin-left: 2.5em;\n}\n\n.viewer ul, .viewer ol{\n margin-left: 0.5em;\n padding-left: 1.5em;\n}\n\n.viewer table {\n border-collapse: collapse;\n margin: 0.8em 1.0em;\n}\n\n.viewer th, .viewer td, .viewer tr,.viewer caption{\n padding: 3px;\n}\n\n.viewer table.listView {\n font-size: 0.85em;\n margin: 0.8em 1.0em;\n}\n\n.viewer table.listView th, .viewer table.listView td, .viewer table.listView tr {\n padding: 0px 3px 0px 3px;\n}\n\n.viewer pre {\n padding: 0.5em;\n margin-left: 0.5em;\n font-size: 1.2em;\n line-height: 1.4em;\n overflow: auto;\n}\n\n.viewer code {\n font-size: 1.2em;\n line-height: 1.4em;\n}\n\n.editor {\nfont-size: 1.1em;\n}\n\n.editor input, .editor textarea {\n display: block;\n width: 100%;\n font: inherit;\n}\n\n.editorFooter {\n padding: 0.25em 0em;\n font-size: .9em;\n}\n\n.editorFooter .button {\npadding-top: 0px; padding-bottom: 0px;}\n\n.fieldsetFix {border: 0;\npadding: 0;\nmargin: 1px 0px 1px 0px;\n}\n\n.sparkline {\n line-height: 1em;\n}\n\n.sparktick {\n outline: 0;\n}\n\n.zoomer {\n font-size: 1.1em;\n position: absolute;\n padding: 1em;\n}\n\n.cascade {\n font-size: 1.1em;\n position: absolute;\n overflow: hidden;\n}\n/*}}}*/
<<slider "" "Submit RTML Request Help" Help "Helpful information">>\n<html><table width="96%" style="border:none;margin:1px;background:transparent"><iframe id="asuploadrtml" src="/ac/asuploadrtml.asp" width="100%" height="0" frameborder="0" scrolling="no" allowtransparency style="border:none;"></iframe></table></html><script>\n// This is for lost refresh on IE6\nif(document.all) { // IE\nvar iFrame = place.getElementsByTagName("iframe")[0];\niFrame .src = iFrame .src;\n}</script>
\nChoose a local file which contains an observing request in the Remote Telescope Markup Language 2.3. Click the ''Submit RTML'' button to upload the RTML file into the schedule database. If you check the ''Enable immediately'' box, the uploaded request will become eligible for scheduling immediately. Otherwise, the new request will be disabled, requiring you to enable it with the [[Schedule Browser|/sc/index.asp]]. \n\nRemote Telescope Markup Language 2.3 is an XML dialect used by ACP Scheduler for loading observing requests into the schedule database. Version 2.3 is a Scheduler-specific superset of the classic RTML. For more info, see the documentation for ACP Scheduler. \n\nThe [[ACP Planner|http://acp.dc3.com/planner.html]] application can generate RTML.
\n<html>\n<form style="margin:4;">\n <input type="hidden" name="Command" value="StopScript">\n </input>\n</form>\n</html><<PostForm "" "ac/astopscript.asp" "Stop Run" "Interrupts the run as soon as possible">>\n<html>\n<textarea readonly style="margin-top:4px;" id="sm_console" class="scriptlog" rows="20" cols="72" wrap="off"></textarea>\n</html>
<<slider "" "System Status Help" Help>><html> <span id="sm_HoverLabel">Hover the mouse over the links to see what they do</span>\n<!-- Main Display -->\n<table id="sm_sysMon" class="noBorder" style="border:0">\n <tr height="100%">\n <td valign="top">\n <table style="margin:0">\n <tr>\n <th colspan="2" scope="col">Observatory</th>\n </tr>\n <tr>\n <td colspan="2" class="telemetry" id="sm_obsStat"><span>n/a</span></td>\n </tr>\n <tr>\n <td class="telemlabel">Local:</td>\n <td id="sm_local" class="telemetry"><span>--:--:--</span></td>\n </tr>\n <tr>\n <td class="telemlabel">UTC:</td>\n <td id="sm_utc" class="telemetry"><span>--:--:--</span></td>\n </tr>\n <tr>\n <td class="telemlabel">LST:</td>\n <td id="sm_lst" class="telemetry"><span>--:--:--</span></td>\n </tr>\n <tr>\n <td class="telemlabel" id="sm_obsOwnerLabel"><span>Owner</span></td>\n <td class="telemetry" id="sm_obsOwner"><span>n/a</span></td>\n </tr>\n <tr>\n <td class="telemlabel" id="sm_obsWeatherLabel"><span>Weather</span></td>\n <td class="telemetry" id="sm_obsWeather"><span>n/a</span></td>\n </tr>\n <tr id="sm_obsShutterRow">\n <td class="telemlabel" id="sm_obsShutterLabel"><span>Shutter</span></td>\n <td class="telemetry" id="sm_obsShutter"><span>n/a</span></td>\n </tr>\n <tr id="sm_obsDomeRow">\n <td class="telemlabel" id="sm_obsDomeLabel"><span>Dome</span></td>\n <td class="telemetry" id="sm_obsDome"><span>n/a</span></td>\n </tr>\n <tr id="sm_obsSchHdrRow" title="Dispatcher Status">\n <th width="110" colspan="2" id="sm_obsSchHdr"><span>Scheduler</span></th>\n </tr>\n <tr id="sm_obsSchStatRow">\n <td class="telemlabel" id="sm_obsSchStatLabel"><span>Status</span></td>\n <td class="telemetry" id="sm_obsSchStat"><span>n/a</span></td>\n </tr>\n </table>\n </td>\n <td valign="top">\n <table style="margin:0">\n <tr>\n <th width="110" colspan="2" id="sm_scopeHdr"><span>Telescope</span></th>\n </tr>\n <tr>\n <td id="sm_scopeStat" class="telemetry" colspan="2"><span>n/a</span></td>\n </tr>\n <tr>\n <td colspan="2"><div class="progBarBg"><div id="sm_slewProg" class="progBarFg"></div></div></td>\n </tr>\n <tr id="sm_haRow" title="-12 to +12">\n <td class="telemlabel">HA:</td>\n <td id="sm_ha" class="telemetry"><span>---:--.-</span></td>\n </tr>\n <tr title="<% if(Prefs.DoLocalTopo) { %>Local Topocentric<% } else { %>J2000<% } %>">\n <td class="telemlabel">RA:</td>\n <td id="sm_ra" class="telemetry"><span>--:--:--.--</span></td>\n </tr>\n <tr title="<% if(Prefs.DoLocalTopo) { %>Local Topocentric<% } else { %>J2000<% } %>">\n <td class="telemlabel">Dec:</td>\n <td id="sm_dec" class="telemetry"><span>---ยฐ--'--.-"</span></td>\n </tr>\n <tr id="sm_paRow" title="True sky PA">\n <td class="telemlabel">PA:</td>\n <td id="sm_pa" class="telemetry"><span>---ยฐ</span></td>\n </tr>\n <tr>\n <td class="telemlabel">Az:</td>\n <td id="sm_az" class="telemetry"><span>---.-ยฐ</span></td>\n </tr>\n <tr>\n <td class="telemlabel">Alt:</td>\n <td id="sm_alt" class="telemetry"><span>--.-ยฐ</span></td>\n </tr>\n <tr id="sm_gemRow" title="Direction looking, opposite of pier side">\n <td class="telemlabel">GEM:</td>\n <td id="sm_gem" class="telemetry"><span>n/a</span></td>\n </tr>\n <tr title="Relative air mass">\n <td class="telemlabel">Air:</td>\n <td id="sm_air" class="telemetry"><span>--.-</span></td>\n </tr>\n </table>\n </td>\n <td valign="top">\n <table style="margin:0">\n <tr>\n <th width="124" colspan="3" id="sm_camHdr"><span>Imager</span></th>\n </tr>\n <tr>\n <td colspan="3" id="sm_camStat" class="telemetry"><span>n/a</span></td>\n </tr>\n <tr>\n <td colspan="3"><div class="progBarBg"><div id="sm_expProg" class="progBarFg"></div></div></td>\n </tr>\n <tr id="sm_imgFiltRow">\n <td width="46" class="telemlabel">Filter</td>\n <td colspan="2" id="sm_imgFilt" class="telemetry"><span>n/a</span></td>\n </tr>\n <tr>\n <td width="46" class="telemlabel">Binning </td>\n <td colspan="2" id="sm_imgBin" class="telemetry"><span>-:1</span></td>\n </tr>\n <tr id="sm_imgTempRow">\n <td width="46" class="telemlabel" id="sm_imgTempLabel"><span>Cooler</span></td>\n <td colspan="2" id="sm_imgTemp" class="telemetry"><span>---</span></td>\n </tr>\n <tr id="sm_imgGuiderRow1">\n <th colspan="3">Guider</th>\n </tr>\n <tr id="sm_imgGuiderRow2">\n <td colspan="3" id="sm_guideStat" class="telemetry"><span>n/a</span></td>\n </tr>\n <tr id="sm_imgGuiderRow3">\n <td colspan="2" class="telemlabel">Interval (sec)</td>\n <td class="telemetry" id="sm_guideInt" style="text-align:right; width: 3em;"><span>--.--</span></td>\n </tr>\n <tr id="sm_imgGuiderRow4" >\n <td class="telemlabel">Error</td>\n <td class="telemlabel">Ex:</td>\n <td class="telemetry" id="sm_guideX" style="text-align:right; width: 3em;"><span>--.--</span></td>\n </tr>\n <tr id="sm_imgGuiderRow5">\n <td class="telemlabel"> (pix)</td>\n <td class="telemlabel">Ey:</td>\n <td class="telemetry" id="sm_guideY" style="text-align:right; width: 3em;"><span>--.--</span></td>\n </tr>\n </table>\n </td>\n <td valign="top">\n <table style="margin:0">\n <tr>\n <th width="128"colspan="2">Activity</th>\n </tr>\n <tr>\n <td colspan="2" class="telemetry" id="sm_actStat"><span>n/a</span></td>\n </tr>\n <tr title="FWHM of last image">\n <td width="44" class="telemlabel">FWHM</td>\n <td class="telemetry" id="sm_lastFWHM"><span>-.-</span></td>\n </tr>\n <tr>\n <td colspan="2" height="128" id="sm_thumb" align="center" valign="middle">\n <canvas id="sm_thumb_cvs" width="128" height="128" title=""/>\n </td>\n </tr>\n <tr>\n <td colspan="2" height="84" id="sm_tbox" align="center" valign="middle">\n <canvas id="sm_tbox_cvs" width="64" height="64" title=""/>\n </td>\n </tr>\n </table>\n </td>\n <td valign="top">\n <table style="margin:0">\n <tr>\n <th width="158" colspan="2" id="sm_plnTitle">Plan</th>\n </tr>\n <tr>\n <td width="44" class="telemlabel" id="sm_plnSetLabel">Set</td>\n <td width="100" class="telemetry" id="sm_plnSet"><span>-/-</span></td>\n </tr>\n <tr>\n <td width="44" class="telemlabel" id="sm_plnTgtLabel">Target</td>\n <td width="108" class="telemetry" id="sm_plnTgt"><span>n/a (-/-)</span></td>\n </tr>\n <tr>\n <td width="44" class="telemlabel">Repeat</td>\n <td width="108" class="telemetry" id="sm_plnRpt"><span>-/-</span></td>\n </tr>\n <tr id="sm_plnFiltRow">\n <td width="44" class="telemlabel" id="sm_plnFiltLabel">Filter</td>\n <td width="108" class="telemetry" id="sm_plnFilt"><span>n/a (-/-)</span></td>\n </tr>\n <tr>\n <td width="44" class="telemlabel">Count</td>\n <td width="108" class="telemetry" id="sm_plnCnt"><span>-/-</span></td>\n </tr>\n </table>\n <table id="sm_imgGraphArea" style="margin:0" title="+/- 2 pix, 8 min.">\n <tr>\n <th width="158">Tracking Errors</th>\n </tr>\n <tr>\n <td width="158" height="34" valign="center" class="trackGraph" id="sm_trkGraphX"></td> <!-- 34px in sparkline call below -->\n </tr>\n <tr>\n <td width="158" height="34" valign="center" class="trackGraph" id="sm_trkGraphY"></td>\n </tr>\n <tr>\n <td width="158" height="48" valign="center" class="trackGraph"><div align="center" id="sm_trkGraphXY"></div></td>\n </tr>\n </table>\n </td>\n </tr>\n</table>\n<!-- Console Input Form LightBoxes -->\n<div class="lightBoxAlert" id="sm_yesNoLightBox" style="display:none">\n <div class="lightBoxAlertIcon"><img id="lightBoxAlertIcon" src="/im/question.png" alt="?" title="Input Requested"></div>\n <div style="margin-left:56px;margin-top:4px;">\n <form style="margin:0px;" id="sm_yesNoForm" method="post" action="/ac/aconsread.asp">\n <span id="sm_yesNoPrompt"></span> (click one)<br>\n <input type="radio" name="YesNo" value="y" checked>Yes \n <input type="radio" name="YesNo" value="n">No<br>\n <input type="hidden" name="answer_yn">\n </form>\n <input type="button" id="sm_yesNoAnsButton" value="Answer">\n </div>\n</div>\n<div class="lightBoxAlert" id="sm_readLineLightBox" style="display:none">\n <div class="lightBoxAlertIcon"><img id="lightBoxAlertIcon" src="/im/question.png" alt="?" title="Input Requested"></div>\n <div style="margin-left:56px;margin-top:4px;">\n <form style="margin:0px;" id="sm_readLineForm" method="post" action="/ac/aconsread.asp">\n <span id="sm_readLinePrompt"></span><br>\n <input type="text" id="sm_readLineText" name="response" size="30"><br>\n <input type="hidden" id="sm_readLineButtonData" name="??">\n </form>\n <input type="button" id="sm_readLineOKButton" value="OK">\n <span id="sm_readLineCancelSpan" style="display:none"> \n <input type="button" id="sm_readLineCancelButton" value="Cancel">\n </span>\n </div>\n</div>\n<!-- End of HTML -->\n</html><<slider "SysMonConsole" "SysMonConsoleSlider" "Show/Hide Run Log and Abort Control" "Shows a live running log of activity">><script>\n//--- Browser-side script ---\n\n // ====================================\n // JSON workers (see asystemstatus.asp)\n //=====================================\n function _s(id, escVal) { // Fill in element\n // Note that jQuery notation not used here (e.g. $('#' + id);) as\n // it really slows the startup (and refresh) of the displays.\n var elem = document.getElementById(id);\n var val = unescape(escVal);\n var span = elem.firstChild; // Inner <span> has appearance\n if(span && val.substr(0, 1) == '@') { // Possible appearance code\n switch(val.substr(1, 2)) {\n case 'an':\n span.className = "telemActive";\n span.setAttribute("flash", "off");\n val = val.substr(3);\n break;\n case 'af':\n span.className = "telemActive";\n span.setAttribute("flash", "on");\n val = val.substr(3);\n break;\n case 'wn':\n span.className = "telemWarn";\n span.setAttribute("flash", "off");\n val = val.substr(3);\n break;\n case 'wf':\n span.className = "telemWarn";\n span.setAttribute("flash", "on");\n val = val.substr(3);\n break;\n case 'in':\n case 'if':\n span.className = "telemOff";\n span.setAttribute("flash", "off");\n val = val.substr(3);\n break;\n default: // Pass anytning else on\n break;\n }\n span.innerHTML = val; // Content goes in span\n }\n else\n elem.innerHTML = val; // Element gets content\n }\n // This is in a slider sub-tiddler, but still accessible!\n function _c(escVal) { // Same here, for textarea\n try { // May not exist (slider hidden)\n var ta = document.getElementById('sm_console');\n var lData = unescape(escVal);\n ta.value = lData.substr(2); // Display all after auto-scroll indicator\n if(lData.substr(0, 2) == "@s") // If obs is busy\n ta.scrollTop = ta.scrollHeight - ta.clientHeight; // Auto-scroll to bottom\n } catch(ex) { }\n }\n function _p(id, val) { // Prog-bar fractional length\n var barElem = document.getElementById(id);\n var tw = barElem.parentNode.offsetWidth;\n barElem.style.width = parseInt(val * tw) + "px";\n }\n function _vr(id, val) { // Set table row visibility\n var elem = document.getElementById(id);\n elem.style.display = (val ? "table-row" : "none");\n }\n function _vb(id, val) { // Set block visibility\n var elem = document.getElementById(id);\n elem.style.display = (val ? "block" : "none");\n }\n function _vi(id, val) { // Set inline visibility\n var elem = document.getElementById(id);\n elem.style.display = (val ? "inline" : "none");\n }\n // ----------------\n // Canvas functions (main thumbnail, popup, guider image)\n // ----------------\n function _th(id, src) // Draw the thumbnail into the given canvas\n {\n var canvas = document.getElementById(id); // This must be a <canvas> duh\n var ctx = canvas.getContext("2d");\n if (src !== "")\n {\n var imgObj = new Image();\n imgObj.onload = function()\n {\n var x = (canvas.width - imgObj.width) / 2;\n var y = (canvas.height - imgObj.height) / 2;\n ctx.drawImage(imgObj, x, y);\n };\n imgObj.src = src;\n }\n else\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n \n function _pv(id, path, w, h, title) // Wire canvas for LightBox popup of real image\n {\n var canvas = document.getElementById(id);\n if(path !== "") {\n canvas.onclick = function() { _lbp(path, w, h); };\n canvas.title = title;\n } else {\n canvas.onclick = function() { return; };\n canvas.title = "";\n }\n }\n \n // ------------------\n // Lightbox functions\n // ------------------\n function _l(escVal) { // Show simple LightBox\n DC3.LightBox.showContent(unescape(escVal));\n }\n function _a(icon, escVal) { // Show LightBox Alert\n DC3.LightBox.showAlert(icon, unescape(escVal)); \n }\n function _aw(icon, escVal) { // Show LightBox Web Console Alert\n DC3.LightBox.showAlert(icon, unescape(escVal), _consPostAlertOk); // Close sends POST back to aconsread.asp\n }\n function _lbp(path, w, h) { // Show popup image with given dimensions\n DC3.LightBox.showContent("<img src='" + path + "' width='" + w + "' height='" + h + "' />");\n }\n function _lh() { // Make any current LightBox disappear\n DC3.LightBox.hideBox();\n }\n function _y(escPrompt) { // Show Console Yes/No LightBox\n document.getElementById("sm_yesNoPrompt").innerHTML = unescape(escPrompt);\n document.getElementById("sm_yesNoAnsButton").onclick = _consPostYesNoForm;\n DC3.LightBox.showBox("sm_yesNoLightBox");\n }\n function _r(escPrompt, cancel) { // Show Console Read Line LightBox\n document.getElementById("sm_readLineOKButton").onclick = _consPostReadLineFormOk;\n if(cancel) {\n document.getElementById("sm_readLineCancelSpan").style.display = '';\n document.getElementById("sm_readLineCancelButton").onclick = _consPostReadLineFormCancel;\n } else {\n document.getElementById("sm_readLineCancelSpan").style.display = 'none';\n document.getElementById("sm_readLineCancelButton").onclick = null;\n }\n document.getElementById("sm_readLinePrompt").innerHTML = unescape(escPrompt);\n if(!DC3.LightBox.showing()) document.getElementById("sm_readLineText").value = "";\n DC3.LightBox.showBox("sm_readLineLightBox");\n }\n // ----------------\n // Flasher function\n // ----------------\n function _smFlasher() {\n DC3.Lib.sysMonFlashTimerID = null; // Timer has expired\n var outer = document.getElementById("sm_sysMon");\n if(!outer) // Tiddler closed or editing\n return; // Exit now with no timer set\n var spans = outer.getElementsByTagName("span");\n for(var i = 0; i < spans.length; i++) {\n var span = spans[i];\n if(span.attributes['flash'] && span.attributes['flash'].value == 'on') {\n if(span.attributes['onClass'] && span.attributes['onClass'].value !== "") {\n span.className = span.attributes['onClass'].value;\n span.attributes['onClass'].value = "";\n } else {\n span.setAttribute('onClass', span.className);\n span.className = "telemOff";\n }\n }\n }\n if(DC3.Lib.sysMonFlashTimerID === null) // Unless already active timer (????)\n DC3.Lib.sysMonFlashTimerID = setTimeout(_smFlasher, 200);\n }\n // -----------------------------------\n // Dome/shutter control AJAX interface (variable labels and cmd links)\n // -----------------------------------\n function _shutterCtlOnComplete(text, params) {\n displayMessage(text);\n _sendRequest(false); // Force immediate update (typ.)\n }\n function _shutterCtl(e) {\n if(!e) e = window.event;\n var tgt = resolveTarget(e);\n var tiptxt = tgt.getAttribute("title");\n if(!config.browser.isTouchInterface || confirm(tiptxt))\n { \n var op = resolveTarget(e).getAttribute("op"); // Link has op="xx"? (typ.)\n var qs = op ? "?" + op : ""; // Include as query string (typ.)\n DC3.Ajax.sendRequest("GET", "/ac/ashutterctl.asp" + qs, "", _shutterCtlOnComplete, null);\n }\n }\n function _domeCtlOnComplete(text, params) {\n displayMessage(text);\n _sendRequest(false);\n }\n function _domeCtl(e) {\n if(!e) e = window.event;\n var op = resolveTarget(e).getAttribute("op");\n var tgt = resolveTarget(e);\n var tiptxt = tgt.getAttribute("title");\n if(!config.browser.isTouchInterface || confirm(tiptxt))\n { \n var qs = op ? "?" + op : "";\n DC3.Ajax.sendRequest("GET", "/ac/adomectl.asp" + qs, "", _domeCtlOnComplete, null);\n }\n }\n function _schedCtlOnComplete(text, params) {\n displayMessage(text);\n _sendRequest(false);\n }\n function _schedCtl(e) {\n if(!e) e = window.event;\n var op = resolveTarget(e).getAttribute("op");\n var tgt = resolveTarget(e);\n var tiptxt = tgt.getAttribute("title");\n if(!config.browser.isTouchInterface || confirm(tiptxt))\n { \n var qs = op ? "?" + op : "";\n DC3.Ajax.sendRequest("GET", "/ac/aschctrl.asp" + qs, "", _schedCtlOnComplete, null);\n }\n }\n // ------------------------------\n // Scope conn.disc AJAX interface\n // ------------------------------\n function _scopeCtlOnComplete(text, params) {\n DC3.LightBox.hideBox(); // Harmless if park-box wasn't shown\n displayMessage(text);\n _sendRequest(false);\n }\n function _scopeCtlDiscPark(e) {\n var qs, ms;\n if(document.getElementById("sm_yesNoForm").elements[0].checked) {\n ms = "Parking and disconnecting";\n qs = "discpark";\n } else {\n ms = "Disconnecting";\n qs = "disc";\n }\n displayMessage( ms + " the scope...");\n DC3.Ajax.sendRequest("GET", "/ac/ascopeconn.asp?" + qs, "", _scopeCtlOnComplete, null);\n DC3.LightBox.hideBox();\n }\n function _scopeCtl(e) {\n if(!e) e = window.event;\n var tgt = resolveTarget(e);\n var tiptxt = tgt.getAttribute("title");\n if(!config.browser.isTouchInterface || confirm(tiptxt))\n { \n var op = resolveTarget(e).getAttribute("op");\n var qs = op ? "?" + op : "";\n if(op == "conn") {\n displayMessage("Connecting scope, please wait...");\n DC3.Ajax.sendRequest("GET", "/ac/ascopeconn.asp" + qs, "", _scopeCtlOnComplete, null);\n } else {\n // Can't use embedded ASP to check CanPark here\n document.getElementById("sm_yesNoPrompt").innerHTML = "Park the telescope?";\n document.getElementById("sm_yesNoAnsButton").onclick = _scopeCtlDiscPark;\n DC3.LightBox.showBox("sm_yesNoLightBox", null); // Do nothing if box is closed\n }\n }\n }\n // Camera conn.disc AJAX interface\n function _camCtlOnComplete(text, params) {\n displayMessage(text);\n _sendRequest(false);\n }\n function _camCtl(e) {\n if(!e) e = window.event;\n var tgt = resolveTarget(e);\n var tiptxt = tgt.getAttribute("title");\n if(!config.browser.isTouchInterface || confirm(tiptxt))\n { \n var op = resolveTarget(e).getAttribute("op");\n var qs = op ? "?" + op : "";\n // Checking row visibility for cameras with no temp control\n if(op == "disc" && (document.getElementById("sm_imgTempRow").style.display != "none") &&\n (document.getElementById("sm_imgTemp").firstChild.innerHTML.search(/Off/) == -1)) {\n DC3.LightBox.showAlert("warning", "Warm and turn off the cooler first.");\n } else {\n DC3.Ajax.sendRequest("GET", "/ac/acamconn.asp" + qs, "", _camCtlOnComplete, null);\n }\n }\n }\n // Cooler control AJAX interface\n function _tempCtlOnComplete(text, params) {\n displayMessage(text);\n _sendRequest(false);\n }\n function _tempCtl(e) {\n if(!e) e = window.event;\n var tgt = resolveTarget(e);\n var tiptxt = tgt.getAttribute("title");\n if(!config.browser.isTouchInterface || confirm(tiptxt))\n { \n var op = resolveTarget(e).getAttribute("op");\n var qs;\n if(op == "temp") {\n qs = prompt("New cooler temperature or \s"off\s":", "");\n if(qs === "") return; // Cancelled\n qs = "?" + escape(qs);\n } else {\n qs = "?" + op; // For now only "on"\n }\n DC3.Ajax.sendRequest("GET", "/ac/atempctrl.asp" + qs, "", _tempCtlOnComplete, null);\n }\n }\n // Weather conn.disc AJAX interface\n function _wxCtlOnComplete(text, params) {\n displayMessage(text);\n _sendRequest(false);\n }\n function _wxCtl(e) {\n if(!e) e = window.event;\n var tgt = resolveTarget(e);\n var tiptxt = tgt.getAttribute("title");\n if(!config.browser.isTouchInterface || confirm(tiptxt))\n { \n var op = resolveTarget(e).getAttribute("op");\n var qs = op ? "?" + op : "";\n DC3.Ajax.sendRequest("GET", "/ac/awxconn.asp" + qs, "", _wxCtlOnComplete, null);\n }\n }\n // Console I/O AJAX interface\n function _consPostFormOnComplete(text, params) {\n var t = text.trim();\n if(t === "")\n displayMessage(t);\n else\n displayMessage("Message sent.");\n DC3.LightBox.hideBox();\n }\n function _consPostYesNoForm(e) {\n var form = document.getElementById("sm_yesNoForm");\n DC3.Ajax.postForm(form, form.action, _consPostFormOnComplete, null);\n }\n function _consPostReadLineFormOk(e) {\n var form = document.getElementById("sm_readLineForm");\n document.getElementById("sm_readLineButtonData").name = "answer_rd_ok";\n DC3.Ajax.postForm(form, form.action, _consPostFormOnComplete, null);\n }\n function _consPostReadLineFormCancel(e) {\n var form = document.getElementById("sm_readLineForm");\n document.getElementById("sm_readLineButtonData").name = "answer_rd_can";\n DC3.Ajax.postForm(form, form.action, _consPostFormOnComplete, null);\n }\n function _consPostAlertOk() { // Not event, set as lightbox callback\n DC3.Ajax.sendRequest("POST", "/ac/aconsread.asp", "", _consPostFormOnComplete, null);\n return true; // Go ahead and close lightbox\n }\n // AJAX interface (Depends on global DC3.Lib.sysMonTimerID)\n function _smOnComplete(json, params) {\n try { // Dies if closed or editing\n eval(json); // (also toss any other JSON errors)\n var clr = $('span.telemActive').css('color'); // Graph lines same color as active telemetry text\n //\n // Insert jQuery sparkline objects into place http://omnipotent.net/jquery.sparkline/\n // NOTES: Width is 158 pixels, defaultPixelsPerValue = 2 (scale of X axis) so there\n // should be 79 values in the lists. This is set in asystemstatus as the \n // constant MAXTRKPTS = 79. At 6 sec per point, this is 7.9 minutes, eh?\n //\n $('#sm_trkGraphX').sparkline('html', \n { \n type:'line',\n lineWidth:'2',\n spotRadius:'2',\n minSpotColor:false,\n maxSpotColor:false,\n lineColor:clr,\n fillColor:false,\n height:'34px',\n chartRangeMin:'-2',\n chartRangeMax:'2',\n chartRangeClip:true,\n defaultPixelsPerValue:2\n });\n $('#sm_trkGraphY').sparkline('html', \n { \n type:'line', \n lineWidth:'2',\n spotRadius:'2',\n minSpotColor:false,\n maxSpotColor:false,\n lineColor:clr,\n fillColor:false, \n height:'34px',\n chartRangeMin:'-2',\n chartRangeMax:'2',\n chartRangeClip:true,\n defaultPixelsPerValue:2 \n });\n $('#sm_trkGraphXY').sparkline('html', \n { \n type:'line', \n lineWidth:'1',\n spotRadius:'2',\n minSpotColor:false,\n maxSpotColor:false,\n lineColor:clr,\n fillColor:false, \n height:'48px',\n width:'48px',\n chartRangeMin:'-2',\n chartRangeMax:'2',\n chartRangeMinX:'0',\n chartRangeMaxX:'4'\n });\n } catch(ex) { }\n \n // Update dynamic links' event hookups (should use jQuery!!)\n var elem = document.getElementById("sm_logOff"); // May not exist (typ.)\n if(elem) elem.onclick = DC3.Lib.logOff; // Logoff in library now\n elem = document.getElementById("sm_shutterCtlLink");\n if(elem) elem.onclick = _shutterCtl;\n elem = document.getElementById("sm_domeCtlLink");\n if(elem) elem.onclick = _domeCtl;\n elem = document.getElementById("sm_schCtlLink");\n if(elem) elem.onclick = _schedCtl;\n elem = document.getElementById("sm_scopeConnLink");\n if(elem) elem.onclick = _scopeCtl;\n elem = document.getElementById("sm_camConnLink");\n if(elem) elem.onclick = _camCtl;\n elem = document.getElementById("sm_camTempLink");\n if(elem) elem.onclick = _tempCtl;\n elem = document.getElementById("sm_wxCtlLink");\n if(elem) elem.onclick = _wxCtl;\n\n if(DC3.Lib.sysMonRefreshTimerID === null) // Unless already active timer (????)\n DC3.Lib.sysMonRefreshTimerID = setTimeout(_sendRequest, 5000);\n }\n function _sendRequest(init) { // True if this is initial call opening tiddler\n if(DC3.Lib.sysMonRefreshTimerID) // Allow pre-emptive refresh call\n clearTimeout(DC3.Lib.sysMonRefreshTimerID); // ...for immediate refresh\n DC3.Lib.sysMonRefreshTimerID = null; // Timer's done now\n if(document.getElementById("sm_scopeStat")) { // Gone if editing or closed\n // init will be an event or null if called back from timer\n // look for explicit bool true to detect call for init\n // POST prevents caching (the ajax lib adds Cache-Control too.\n var complParams = { };\n DC3.Ajax.sendRequest("POST", "/ac/asystemstatus.asp" + \n ((typeof init == "boolean" && init) ? "?init" : ""), \n "", _smOnComplete, complParams);\n }\n }\n // Initial call on opening the tiddler\n // Dynamic links - repeated in _sm_onComplete()\n var elem = document.getElementById("sm_logOff"); // May not exist (typ.)\n if(elem) elem.onclick = DC3.Lib.logOff; // Logoff in library now\n elem = document.getElementById("sm_shutterCtlLink");\n if(elem) elem.onclick = _shutterCtl;\n elem = document.getElementById("sm_domeCtlLink");\n if(elem) elem.onclick = _domeCtl;\n elem = document.getElementById("sm_schCtlLink");\n if(elem) elem.onclick = _schedCtl;\n elem = document.getElementById("sm_scopeConnLink");\n if(elem) elem.onclick = _scopeCtl;\n elem = document.getElementById("sm_camConnLink");\n if(elem) elem.onclick = _camCtl;\n elem = document.getElementById("sm_camTempLink");\n if(elem) elem.onclick = _tempCtl;\n elem = document.getElementById("sm_wxCtlLink");\n if(elem) elem.onclick = _wxCtl;\n \n elem = document.getElementById("sm_HoverLabel");\n if(config.browser.isTouchInterface)\n elem.innerHTML = "Touch the links to see what they do and be asked if you want to do it</i>";\n else\n elem.innerHTML = "Hover the mouse over the links to see what they do";\n \n if(DC3.Lib.sysMonRefreshTimerID === null) _sendRequest(true); // Don't start multiple timer cycles!\n if(DC3.Lib.sysMonFlashTimerID === null) _smFlasher();\n</script>\n
\nMostly self-explanatory, but there are a few things to be aware of:\n* The Owner label is a link. Click it to release the observatory.\n* The button at the bottom shows the detailed Run Log during observing. \n* If the Run Log is visible, you'll also see a button with which you can abort the run.\nThanks to ~DC-3 Dreams customer and software developer [[Russell Archer|http://www.rarcher.net]] for the idea of including the [[jQuery|http://jquery.com/]] library and for the guider tracking error feature. We have since used ~JQuery in other places and it is really great.\n<% if(User.IsAdministrator) { %>\n!!Administrators only\nThe following controls/links are available only to Administrators, and when the scheduler is //not// in control:\n* The labels Telescope and Imager are links for connecting and //shutting down// these devices. Shutting down the telescope includes parking and stopping sidereal tracking as well as disconnecting from the control system. Shutting down the imager includes changing the cooler temperature to +10 deg C before disconnecting it from the control system.\n* The Shutter/Roof and Dome labels are links that provide you with dome/roof control. The Dome display (rotation) will not be visible for a roof or clamshell.\n* The Weather label is a link with which you can connect and disconnect the weather server.\n* The Cooler label is a link with which you can turn the cooler on and off or change the temperature.\n<% } %>
Each item (tiddler) in the content has one or more //tags//. Click the tagsโผ link in the toolbar to see which tags are attached to this item (Authoring and deleteUser). Most tags are hidden from users; only a few appear in the final content as Categories. The following buttons provide tag browsing similar to that provided in the tags tab in the right sidebar. To see what the meaning of a tag is, click its button then select "Open tag 'xxx'".\n<<allTags>>\nMore to be written...
/***\n|''Name:''|~TaggerPlugin|\n|''Version:''|1.0.1a (2006-10-27)|\n|''Source:''|http://lewcid.googlepages.com/lewcid.html/#TaggerPlugin|\n|''Author:''|~SaqImtiaz rev by Bob Denny|\n|''Description:''|Provides a drop down listing current tiddler tags, and allowing toggling of tags. Customized to remove 'open tag <tag>' and 'rename-tag <tag>' buttons when being used from an ASP page [Bob Denny]|\n|''Documentation:''|[[TaggerPluginDocumentation]]|\n|''Source Code:''|[[TaggerPluginSource]]|\n|''~TiddlyWiki:''|Version 2.0.8 or better|\n***/\n//{{{\n\nconfig.tagger={\n defaults:{\n label: 'Tags: ',\n tooltip: 'Manage tiddler tags',\n taglist: 'true',\n excludeTags: '',\n notags: 'tiddler has no tags',\n aretags: 'current tiddler tags:',\n toggletext: 'add tags:'\n }\n};\n\nconfig.macros.tagger={};\nconfig.macros.tagger.arrow = (document.all ? "\su25BC":"\su25BE"); // UTF8 the fat one is the only one that works in IE\nconfig.macros.tagger.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n var defaults = config.tagger.defaults;\n var nAV = paramString.parseParams('tagman', null, true);\n var label = ((nAV[0].label)&&(nAV[0].label[0])!='.')?nAV[0].label[0]+this.arrow: defaults.label+this.arrow;\n var tooltip = ((nAV[0].tooltip)&&(nAV[0].tooltip[0])!='.')?nAV[0].tooltip[0]: defaults.tooltip;\n var taglist = ((nAV[0].taglist)&&(nAV[0].taglist[0])!='.')?nAV[0].taglist[0]: defaults.taglist;\n var exclude = ((nAV[0].exclude)&&(nAV[0].exclude[0])!='.')?(nAV[0].exclude[0]).readBracketedList(): defaults.excludeTags.readBracketedList();\n if ((nAV[0].source)&&(nAV[0].source[0])!='.')var source = nAV[0].source[0];\n if (source&&!store.getTiddler(source)) return false;\n\n var onclick = function(e) {\n if (!e) var e = window.event;\n var popup = Popup.create(this);\n var tagsarray = store.getTags();\n var tags=new Array();\n\n for (var i=0; i<tagsarray.length; i++){\n tags.push(tagsarray[i][0]);}\n\n if (source)\n {var sourcetiddler=store.getTiddler(source);\n tags=sourcetiddler.tags.sort();}\n\n var currentTags = tiddler.tags.sort();\n\n var createButtons=function(text,theTag,tooltipPrefix){\n var sp = createTiddlyElement(createTiddlyElement(popup,"li"),"span",null,"tagger");\n var theToggle = createTiddlyButton(sp,text,tooltipPrefix+" '"+theTag+"'",taggerOnToggle,"button","toggleButton");\n theToggle.setAttribute("tiddler",tiddler.title);\n theToggle.setAttribute("tag",theTag);\n insertSpacer(sp);\n if (window.createTagButton_orig_mptw)\n createTagButton_orig_mptw(sp,theTag);\n else\n createTagButton(sp,theTag);\n }\n\n createTiddlyElement(popup,"li",null,"listTitle",(tiddler.tags.length == 0 ? defaults.notags : defaults.aretags));\n\n for (var t=0; t<currentTags.length; t++){\n createButtons("[x]",currentTags[t],"remove tag ");\n }\n\n createTiddlyElement(createTiddlyElement(popup,"li"),"hr");\n\n if (taglist!='false')\n { createTiddlyElement(popup,"li",null,"listTitle",defaults.toggletext);\n for (var i=0; i<tags.length; i++){\n if (!tiddler.tags.contains(tags[i])&&!exclude.contains(tags[i]))\n {createButtons("[ ]",tags[i],"add tag ");\n }\n }\n createTiddlyElement(createTiddlyElement(popup,"li"),"hr");\n }\n\n var newTagButton = createTiddlyButton(createTiddlyElement(popup,"li"),("Create new tag"),null,taggerOnToggle);\n newTagButton.setAttribute("tiddler",tiddler.title);\n if (source) newTagButton.setAttribute("source",source);\n\n Popup.show(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n };\n\n createTiddlyButton(place,label,tooltip,onclick,"button","taggerDrpBtn");\n};\n\nwindow.taggerOnToggle = function(e) {\n var tag = this.getAttribute("tag");\n var title = this.getAttribute("tiddler");\n var tiddler = store.getTiddler(title);\n if (!tag)\n {\n var newtag=prompt("Enter new tag:","");\n if (newtag!=''&&newtag!=null)\n {\n var tag=newtag;\n if (this.getAttribute("source"))\n {var sourcetiddler = store.getTiddler(this.getAttribute("source"));\n sourcetiddler.tags.pushUnique(newtag);}\n }\n else\n {return false;};\n }\n if (!tiddler || !tiddler.tags)\n {store.saveTiddler(title,title,'',config.options.txtUserName,new Date(),tag);}\n else\n {if (tiddler.tags.find(tag)==null)\n {tiddler.tags.push(tag)}\n else if(!newtag)\n {tiddler.tags.splice(tiddler.tags.find(tag),1)};\n store.saveTiddler(tiddler.title,tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tiddler.tags);};\n story.refreshTiddler(title,null,true);\n if(config.options.chkAutoSave)\n saveChanges();\n return false;\n};\n\nsetStylesheet(\n ".tagger a.button {font-weight: bold;display:inline; padding:0px;}\sn"+\n ".tagger #toggleButton {padding-left:2px; padding-right:2px; margin-right:1px; font-size:110%;}\sn"+\n "#nestedtagger {background:#2E5ADF; border: 1px solid #0331BF;}\sn"+\n ".popup .listTitle {color:#000;}\sn"+\n "",\n"TaggerStyles");\n\nwindow.lewcidTiddlerSwapTag = function (tiddler, oldTag, newTag){\n for (var i = 0; i < tiddler.tags.length; i++)\n if (tiddler.tags[i] == oldTag) {\n tiddler.tags[i] = newTag;\n return true;}\n return false;\n}\n\nwindow.lewcidRenameTag = function(e) {\n var tag=this.getAttribute("tag");\n var newtag=prompt("Rename tag '"+tag+"' to:",tag);\n\n if ((newtag==tag)||(newtag==null)) {return false;}\n\n if(store.tiddlerExists(newtag))\n {if(confirm(config.messages.overwriteWarning.format([newtag.toString()])))\n story.closeTiddler(newtag,false,false);\n else\n return null;}\n\n tagged=store.getTaggedTiddlers(tag);\n if (tagged.length!=0){\n for (var j = 0; j < tagged.length; j++)\n lewcidTiddlerSwapTag(tagged[j],tag,newtag);}\n\n if (store.tiddlerExists(tag))\n {store.saveTiddler(tag,newtag);}\n if (document.getElementById("tiddler"+tag))\n {var oldTagTiddler = document.getElementById(story.idPrefix + tag);\n var before= story.positionTiddler(oldTagTiddler);\n var place = document.getElementById(story.container);\n story.closeTiddler(tag,false,false);\n story.createTiddler(place,before,newtag,null);\n story.saveTiddler(newtag);}\n if(config.options.chkAutoSave)\n saveChanges();\n return false;\n}\n\n\nwindow.onClickTag=function(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n\n var nested = (!isNested(theTarget));\n if ((Popup.stack.length > 1)&&(nested==true)) {Popup.removeFrom(1);}\n else if(Popup.stack.length > 0 && nested==false) {Popup.removeFrom(0);};\n\n var theId = (nested==false)? "popup" : "nestedtagger";\n var popup = createTiddlyElement(document.body,"ol",theId,"popup",null);\n Popup.stack.push({root: this, popup: popup});\n\n var tag = this.getAttribute("tag");\n var title = this.getAttribute("tiddler");\n if(popup && tag)\n {\n var tagged = store.getTaggedTiddlers(tag);\n var titles = [];\n var li,r;\n for(r=0;r<tagged.length;r++)\n if(tagged[r].title != title)\n titles.push(tagged[r].title);\n var lingo = config.views.wikified.tag;\n if(titles.length > 0)\n {\n var openAll = createTiddlyButton(createTiddlyElement(popup,"li"),lingo.openAllText.format([tag]),lingo.openAllTooltip,onClickTagOpenAll);\n openAll.setAttribute("tag",tag);\n createTiddlyElement(createTiddlyElement(popup,"li"),"hr");\n for(r=0; r<titles.length; r++)\n {\n createTiddlyLink(createTiddlyElement(popup,"li"),titles[r],true);\n }\n }\n else\n createTiddlyText(createTiddlyElement(popup,"li",null,"disabled"),lingo.popupNone.format([tag]));\n if(document.location.pathname.lastIndexOf(".asp") == -1) // [rbd] Only if authoring, not ASP\n {\n createTiddlyElement(createTiddlyElement(popup,"li"),"hr");\n var h = createTiddlyLink(createTiddlyElement(popup,"li"),tag,false);\n createTiddlyText(h,lingo.openTag.format([tag]));\n createTiddlyElement(createTiddlyElement(popup,"li"),"hr");\n \n var renameTagButton = createTiddlyButton(createTiddlyElement(popup,"li"),("Rename tag '"+tag+"'"),null,lewcidRenameTag);\n renameTagButton.setAttribute("tag",tag);\n }\n }\n Popup.show(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n\nif (!window.isNested)\n window.isNested = function(e) {\n while (e != null) {\n var contentWrapper = document.getElementById("contentWrapper");\n if (contentWrapper == e) return true;\n e = e.parentNode;\n }\n return false;\n };\n\nif(document.location.pathname.lastIndexOf(".asp") == -1)\n {\n config.shadowTiddlers.TaggerPluginDocumentation="The documentation is available [[here.|http://lewcid.googlepages.com/lewcid.html#TaggerPluginDocumentation]]";\n\n config.shadowTiddlers.TaggerPluginSource="The uncompressed source code is available [[here.|http://lewcid.googlepages.com/lewcid.html#TaggerPluginSource]]";\n }\n//}}}
Runs through tests of the "light box" browser displays which appear in response to scripts which ask for input from the user or display messages and wait for the user to indicate that the message has been seen. You'll be asked a couple of questions then shown a message. Nothing you do will make any permanent changes to the observatory, so feel free to run this at will!
This ACP web application is based on [[TiddlyWiki|http://www.tiddlywiki.com/]]. It has been heavily extended via [[plugin]]s and dynamically generated content from ACP's Active Server Pages.
/***\n\n|Name|ToggleSideBarMacro|\n|Created by|SaqImtiaz|\n|Location|http://lewcid.googlepages.com/lewcid.html#ToggleSideBarMacro|\n|Version|1.0|\n|Requires|~TW2.x|\n!Description:\nProvides a button for toggling visibility of the SideBar. You can choose whether the SideBar should initially be hidden or displayed.\n\n!Demo\n<<toggleSideBar "Toggle Sidebar">>\n\n!Usage:\n{{{<<toggleSideBar>>}}} <<toggleSideBar>>\nadditional options:\n{{{<<toggleSideBar label tooltip show/hide>>}}} where:\nlabel = custom label for the button,\ntooltip = custom tooltip for the button,\nshow/hide = use one or the other, determines whether the sidebar is shown at first or not.\n(default is to show the sidebar)\n\nYou can add it to your tiddler toolbar, your MainMenu, or where you like really.\nIf you are using a horizontal MainMenu and want the button to be right aligned, put the following in your StyleSheet:\n{{{ .HideSideBarButton {float:right;} }}}\n\n!History\n*23-07-06: version 1.0: completely rewritten, now works with custom stylesheets too, and easier to customize start behaviour. \n*20-07-06: version 0.11\n*27-04-06: version 0.1: working.\n\n!Code\n***/\n//{{{\nconfig.macros.toggleSideBar={};\n\nconfig.macros.toggleSideBar.settings={\n styleHide : "#sidebar { display: none;}\sn"+"#contentWrapper #displayArea { margin-right: 1em;}\sn"+"",\n styleShow : " ",\n arrow1: "ยซ",\n arrow2: "ยป"\n};\n\nconfig.macros.toggleSideBar.handler=function (place,macroName,params,wikifier,paramString,tiddler)\n{\n var tooltip= params[1]||'toggle sidebar';\n var mode = (params[2] && params[2]=="hide")? "hide":"show";\n var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;\n var label= (params[0]&¶ms[0]!='.')?params[0]+" "+arrow:arrow;\n var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleSideBar,"button HideSideBarButton");\n if (mode == "hide")\n { \n (document.getElementById("sidebar")).setAttribute("toggle","hide");\n setStylesheet(this.settings.styleHide,"ToggleSideBarStyles");\n }\n};\n\nconfig.macros.toggleSideBar.onToggleSideBar = function(){\n var sidebar = document.getElementById("sidebar");\n var settings = config.macros.toggleSideBar.settings;\n if (sidebar.getAttribute("toggle")=='hide')\n {\n setStylesheet(settings.styleShow,"ToggleSideBarStyles");\n sidebar.setAttribute("toggle","show");\n this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);\n }\n else\n { \n setStylesheet(settings.styleHide,"ToggleSideBarStyles");\n sidebar.setAttribute("toggle","hide");\n this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);\n }\n\n return false;\n}\n\nsetStylesheet(".HideSideBarButton .button {font-weight:bold; padding: 0 5px;}\sn","ToggleSideBarButtonStyles");\n\n//}}}
You don't normally have to do this, as ACP learns about your telescope as it observes, and centers targets every time. But if you want to train the corrector, you can run this. You'll be asked if you want to //replace// the pointing model with the new data, or augment the model with the mapping points gathered by this process. You'll also be asked for the number of points to gather. 50 is plenty for this corrector.
* This tool will automatically update both the MPCORB and MPCCOMET files with the current versions of the [[MPCORB and CometEls databases at the Minor Planet Center|https://minorplanetcenter.net/data]].\n* Depending on your Internet speed, it may take 5-10 to minutes complete the update.\n* To monitor progress, open the run log window in [[System Status]].\n<html><a id="utilUpdateMPC" \n href="javascript:;" \n op="UpdateMPCs.js"><b>Update the Minor Planet and Comet databases</b></a>\n</html> @@Click only once@@\n<script>\n function _utilOnComplete(text, params) {\n displayMessage(text);\n }\n\n function _util(e) {\n DC3.Ajax.sendRequest("GET", "/ac/arunscript.asp?updateMPCs.js", "", _utilOnComplete, null);\n }\n // Wire up onclick() at run time\n document.getElementById("utilUpdateMPC").onclick=_util;\n</script>\n
\n| 11/7/2023 16:5:8 | Bob Denny | [[author.html|http://127.0.0.1/author.html]] | [[twstore.asp|http://127.0.0.1/twstore.asp]] | | author.html | author-backup |\n| 13/7/2023 16:34:8 | Bob Denny | [[author.html|http://127.0.0.1/author.html]] | [[twstore.asp|http://127.0.0.1/twstore.asp]] | | author.html | author-backup |\n| 13/7/2023 16:59:6 | Bob Denny | [[author.html|http://127.0.0.1/author.html]] | [[twstore.asp|http://127.0.0.1/twstore.asp]] | | author.html | author-backup | Ok |\n| 13/7/2023 17:1:40 | Bob Denny | [[author.html|http://127.0.0.1/author.html]] | [[twstore.asp|http://127.0.0.1/twstore.asp]] | | author.html | author-backup | Ok |\n| 13/7/2023 17:8:32 | Bob Denny | [[author.html|http://127.0.0.1/author.html]] | [[twstore.asp|http://127.0.0.1/twstore.asp]] | | author.html | author-backup | Ok |\n| 13/7/2023 17:9:12 | Bob Denny | [[author.html|http://127.0.0.1/author.html]] | [[twstore.asp|http://127.0.0.1/twstore.asp]] | | author.html | author-backup |\n| 13/7/2023 17:36:50 | Bob Denny | [[author.html|http://127.0.0.1/author.html]] | [[twstore.asp|http://127.0.0.1/twstore.asp]] | | author.html | author-backup | Ok |\n| 13/7/2023 17:38:20 | Bob Denny | [[author.html|http://127.0.0.1/author.html]] | [[twstore.asp|http://127.0.0.1/twstore.asp]] | | author.html | author-backup |
/***\n|''Name:''|UploadPlugin|\n|''Description:''|Save to web a TiddlyWiki|\n|''Version:''|3.4.5b|\n|''Date:''|Nov 5, 2006|\n|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|\n|''Documentation:''|http://tiddlywiki.bidix.info/#UploadDoc|\n|''Author:''|BidiX (BidiX (at) bidix (dot) info) - R. Denny modified|\n|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|\n|''~CoreVersion:''|2.0.0|\n|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|\n|''Include:''|config.lib.file; config.lib.log; config.lib.options; PasswordTweak|\n|''Require:''|[[UploadService|http://tiddlywiki.bidix.info/#UploadService]]|\n|''Modified:''|R. B. Denny - for RFC compliance in multipart separators. Must be lower case, also line breaks at separators not comply with RFC. Marked [rbd] (2 places). Remove "save password" checkbox and default to saving true. This was necessary because of the double hijack in SingleOptionsCookiePlugin|\n***/\n//{{{\nversion.extensions.UploadPlugin = {\n major: 3, minor: 4, revision: 5, \n date: new Date(2006,10,30),\n source: 'http://tiddlywiki.bidix.info/#UploadPlugin',\n documentation: 'http://tiddlywiki.bidix.info/#UploadDoc',\n author: 'BidiX (BidiX (at) bidix (dot) info',\n license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',\n coreVersion: '2.0.0',\n browser: 'Firefox 1.5; InternetExplorer 6.0; Safari',\n modified: 'R. B. Denny - for RFC compliance aznd special changes'\n};\n//}}}\n\n////+++!![config.lib.file]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.file) config.lib.file= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.file.dirname = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(0, lastpos);\n } else {\n return filePath.substring(0, filePath.lastIndexOf("\s\s"));\n }\n};\nconfig.lib.file.basename = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("#")) != -1) \n filePath = filePath.substring(0, lastpos);\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(lastpos + 1);\n } else\n return filePath.substring(filePath.lastIndexOf("\s\s")+1);\n};\nwindow.basename = function() {return "@@deprecated@@";};\n//}}}\n////===\n\n////+++!![config.lib.log]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.log) config.lib.log= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 1}, \n date: new Date(2006,8,19)\n};\nconfig.lib.Log = function(tiddlerTitle, logHeader) {\n if (version.major < 2)\n this.tiddler = store.tiddlers[tiddlerTitle];\n else\n this.tiddler = store.getTiddler(tiddlerTitle);\n if (!this.tiddler) {\n this.tiddler = new Tiddler();\n this.tiddler.title = tiddlerTitle;\n this.tiddler.text = "| !date | !user | !location |" + logHeader;\n this.tiddler.created = new Date();\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[tiddlerTitle] = this.tiddler;\n else\n store.addTiddler(this.tiddler);\n }\n return this;\n};\n\nconfig.lib.Log.prototype.newLine = function (line) {\n var now = new Date();\n var newText = "| ";\n newText += now.getDate()+"/"+(now.getMonth()+1)+"/"+now.getFullYear() + " ";\n newText += now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()+" | ";\n newText += config.options.txtUserName + " | ";\n var location = document.location.toString();\n var filename = config.lib.file.basename(location);\n if (!filename) filename = '/';\n newText += "[["+filename+"|"+location + "]] |";\n this.tiddler.text = this.tiddler.text + "\sn" + newText;\n this.addToLine(line);\n};\n\nconfig.lib.Log.prototype.addToLine = function (text) {\n this.tiddler.text = this.tiddler.text + text;\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[this.tiddler.tittle] = this.tiddler;\n else {\n store.addTiddler(this.tiddler);\n story.refreshTiddler(this.tiddler.title);\n store.notify(this.tiddler.title, true);\n }\n if (version.major < 2)\n store.notifyAll(); \n};\n//}}}\n////===\n\n////+++!![config.lib.options]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.options) config.lib.options = {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\n\nconfig.lib.options.init = function (name, defaultValue) {\n if (!config.options[name]) {\n config.options[name] = defaultValue;\n saveOptionCookie(name);\n }\n};\n//}}}\n////===\n\n////+++!![PasswordTweak]\n\n//{{{\nversion.extensions.PasswordTweak = {\n major: 1, minor: 0, revision: 3, date: new Date(2006,8,30),\n type: 'tweak',\n source: 'http://tiddlywiki.bidix.info/#PasswordTweak'\n};\n//}}}\n/***\n!!config.macros.option\n***/\n//{{{\nconfig.macros.option.passwordCheckboxLabel = "Save this password on this computer";\nconfig.macros.option.passwordType = "password"; // password | text\n\nconfig.macros.option.onChangeOption = function(e)\n{\n var opt = this.getAttribute("option");\n var elementType,valueField;\n if(opt) {\n switch(opt.substr(0,3)) {\n case "txt":\n elementType = "input";\n valueField = "value";\n break;\n case "pas":\n elementType = "input";\n valueField = "value";\n break;\n case "chk":\n elementType = "input";\n valueField = "checked";\n break;\n }\n config.options[opt] = this[valueField];\n saveOptionCookie(opt);\n var nodes = document.getElementsByTagName(elementType);\n for(var t=0; t<nodes.length; t++) \n {\n var optNode = nodes[t].getAttribute("option");\n if (opt == optNode) \n nodes[t][valueField] = this[valueField];\n }\n }\n return(true);\n};\n\nconfig.macros.option.handler = function(place,macroName,params)\n{\n var opt = params[0];\n if(config.options[opt] === undefined) {\n return;}\n var c;\n switch(opt.substr(0,3)) {\n case "txt":\n c = document.createElement("input");\n c.onkeyup = this.onChangeOption;\n c.setAttribute ("option",opt);\n c.className = "txtOptionInput "+opt;\n place.appendChild(c);\n c.value = config.options[opt];\n break;\n case "pas":\n // input password\n c = document.createElement ("input");\n c.setAttribute("type",config.macros.option.passwordType);\n c.onkeyup = this.onChangeOption;\n c.setAttribute("option",opt);\n c.className = "pasOptionInput "+opt;\n place.appendChild(c);\n c.value = config.options[opt];\n // checkbox link with this password "save this password on this computer"\n// c = document.createElement("input");\n// c.setAttribute("type","checkbox");\n// c.onclick = this.onChangeOption;\n// c.setAttribute("option","chk"+opt);\n// c.className = "chkOptionInput "+opt;\n// place.appendChild(c);\n// c.checked = config.options["chk"+opt];\n// // text savePasswordCheckboxLabel\n// place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));\n break;\n case "chk":\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option",opt);\n c.className = "chkOptionInput "+opt;\n place.appendChild(c);\n c.checked = config.options[opt];\n break;\n }\n};\n//}}}\n/***\n!! Option cookie stuff\n***/\n//{{{\n// window.loadOptionsCookie_orig_PasswordTweak = window.loadOptionsCookie;\n// window.loadOptionsCookie = function()\n// {\n// var cookies = document.cookie.split(";");\n// for(var c=0; c<cookies.length; c++) {\n// var p = cookies[c].indexOf("=");\n// if(p != -1) {\n// var name = cookies[c].substr(0,p).trim();\n// var value = cookies[c].substr(p+1).trim();\n// switch(name.substr(0,3)) {\n// case "txt":\n// config.options[name] = unescape(value);\n// break;\n// case "pas":\n// config.options[name] = unescape(value);\n// break;\n// case "chk":\n// config.options[name] = value == "true";\n// break;\n// }\n// }\n// }\n// };\n// \n// window.saveOptionCookie_orig_PasswordTweak = window.saveOptionCookie;\n// window.saveOptionCookie = function(name)\n// {\n// var c = name + "=";\n// switch(name.substr(0,3)) {\n// case "txt":\n// c += escape(config.options[name].toString());\n// break;\n// case "chk":\n// c += config.options[name] ? "true" : "false";\n// // is there an option link with this chk ?\n// if (config.options[name.substr(3)]) {\n// saveOptionCookie(name.substr(3));\n// }\n// break;\n// case "pas":\n// if (config.options["chk"+name]) {\n// c += escape(config.options[name].toString());\n// } else {\n// c += "";\n// }\n// break;\n// }\n// c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";\n// document.cookie = c;\n// };\n//}}}\n/***\n!! Initializations\n***/\n//{{{\n// define config.options.pasPassword\nif (!config.options.pasPassword) {\n config.options.pasPassword = 'defaultPassword';\n window.saveOptionCookie('pasPassword');\n}\n// since loadCookies is first called befor password definition\n// we need to reload cookies\nwindow.loadOptionsCookie();\n//}}}\n////===\n\n////+++!![config.macros.upload]\n\n//{{{\nconfig.macros.upload = {\n accessKey: "U",\n formName: "UploadPlugin",\n contentType: "text/html;charset=UTF-8",\n defaultStoreScript: "store.php"\n};\n\n// only this two configs need to be translated\nconfig.macros.upload.messages = {\n aboutToUpload: "About to upload TiddlyWiki to %0",\n backupFileStored: "Previous file backuped in %0",\n crossDomain: "Certainly a cross-domain isue: access to an other site isn't allowed",\n errorDownloading: "Error downloading",\n errorUploadingContent: "Error uploading content",\n fileLocked: "Files is locked: You are not allowed to Upload",\n fileNotFound: "file to upload not found",\n fileNotUploaded: "File %0 NOT uploaded",\n mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\n passwordEmpty: "Unable to upload, your password is empty",\n urlParamMissing: "url param missing",\n rssFileNotUploaded: "RssFile %0 NOT uploaded",\n rssFileUploaded: "Rss File uploaded to %0"\n};\n\nconfig.macros.upload.label = {\n promptOption: "Save and Upload this TiddlyWiki with UploadOptions",\n promptParamMacro: "Save and Upload this TiddlyWiki in %0",\n saveLabel: "save to web", \n saveToDisk: "save to disk",\n uploadLabel: "upload" \n};\n\nconfig.macros.upload.handler = function(place,macroName,params){\n // parameters initialization\n var storeUrl = params[0];\n var toFilename = params[1];\n var backupDir = params[2];\n var uploadDir = params[3];\n var username = params[4];\n var password; // for security reason no password as macro parameter\n var label;\n if (document.location.toString().substr(0,4) == "http")\n label = this.label.saveLabel;\n else\n label = this.label.uploadLabel;\n var prompt;\n if (storeUrl) {\n prompt = this.label.promptParamMacro.toString().format([this.toDirUrl(storeUrl, uploadDir, username)]);\n }\n else {\n prompt = this.label.promptOption;\n }\n createTiddlyButton(place, label, prompt, \n function () {\n config.macros.upload.upload(storeUrl, toFilename, uploadDir, backupDir, username, password); \n return false;}, \n null, null, this.accessKey);\n};\nconfig.macros.upload.UploadLog = function() {\n return new config.lib.Log('UploadLog', " !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |" );\n};\nconfig.macros.upload.UploadLog.prototype = config.lib.Log.prototype;\nconfig.macros.upload.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {\n var line = " [[" + config.lib.file.basename(storeUrl) + "|" + storeUrl + "]] | ";\n line += uploadDir + " | " + toFilename + " | " + backupDir + " |";\n this.newLine(line);\n};\nconfig.macros.upload.UploadLog.prototype.endUpload = function() {\n this.addToLine(" Ok |");\n};\nconfig.macros.upload.basename = config.lib.file.basename;\nconfig.macros.upload.dirname = config.lib.file.dirname;\nconfig.macros.upload.toRootUrl = function (storeUrl, username)\n{\n return root = (this.dirname(storeUrl)?this.dirname(storeUrl):this.dirname(document.location.toString()));\n}\nconfig.macros.upload.toDirUrl = function (storeUrl, uploadDir, username)\n{\n var root = this.toRootUrl(storeUrl, username);\n if (uploadDir && uploadDir != '.')\n root = root + '/' + uploadDir;\n return root;\n}\nconfig.macros.upload.toFileUrl = function (storeUrl, toFilename, uploadDir, username)\n{\n return this.toDirUrl(storeUrl, uploadDir, username) + '/' + toFilename;\n}\nconfig.macros.upload.upload = function(storeUrl, toFilename, uploadDir, backupDir, username, password)\n{\n // parameters initialization\n storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);\n toFilename = (toFilename ? toFilename : config.options.txtUploadFilename);\n backupDir = (backupDir ? backupDir : config.options.txtUploadBackupDir);\n uploadDir = (uploadDir ? uploadDir : config.options.txtUploadDir);\n username = (username ? username : config.options.txtUploadUserName);\n password = config.options.pasUploadPassword; // for security reason no password as macro parameter\n if (!password || password === '') {\n alert(config.macros.upload.messages.passwordEmpty);\n return;\n }\n if (storeUrl === '') {\n storeUrl = config.macros.upload.defaultStoreScript;\n }\n if (config.lib.file.dirname(storeUrl) === '') {\n storeUrl = config.lib.file.dirname(document.location.toString())+'/'+storeUrl;\n }\n if (toFilename === '') {\n toFilename = config.lib.file.basename(document.location.toString());\n }\n\n clearMessage();\n // only for forcing the message to display\n if (version.major < 2)\n store.notifyAll();\n if (!storeUrl) {\n alert(config.macros.upload.messages.urlParamMissing);\n return;\n }\n // Check that file is not locked\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n if (BidiX.GroupAuthoring.lock.isLocked() && !BidiX.GroupAuthoring.lock.isMyLock()) {\n alert(config.macros.upload.messages.fileLocked);\n return;\n }\n }\n \n var log = new this.UploadLog();\n log.startUpload(storeUrl, toFilename, uploadDir, backupDir);\n if (document.location.toString().substr(0,5) == "file:") {\n saveChanges();\n }\n var toDir = config.macros.upload.toDirUrl(storeUrl, toFilename, uploadDir, username);\n displayMessage(config.macros.upload.messages.aboutToUpload.format([toDir]), toDir);\n this.uploadChanges(storeUrl, toFilename, uploadDir, backupDir, username, password);\n if(config.options.chkGenerateAnRssFeed) {\n //var rssContent = convertUnicodeToUTF8(generateRss());\n var rssContent = generateRss();\n var rssPath = toFilename.substr(0,toFilename.lastIndexOf(".")) + ".xml";\n this.uploadContent(rssContent, storeUrl, rssPath, uploadDir, '', username, password, \n function (responseText) {\n if (responseText.substring(0,1) != '0') {\n displayMessage(config.macros.upload.messages.rssFileNotUploaded.format([rssPath]));\n }\n else {\n var toFileUrl = config.macros.upload.toFileUrl(storeUrl, rssPath, uploadDir, username);\n displayMessage(config.macros.upload.messages.rssFileUploaded.format(\n [toFileUrl]), toFileUrl);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n });\n }\n return;\n};\n\nconfig.macros.upload.uploadChanges = function(storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var original;\n if (document.location.toString().substr(0,4) == "http") {\n original = this.download(storeUrl, toFilename, uploadDir, backupDir, username, password);\n return;\n }\n else {\n // standard way : Local file\n \n original = loadFile(getLocalPath(document.location.toString()));\n if(window.Components) {\n // it's a mozilla browser\n try {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]\n .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);\n converter.charset = "UTF-8";\n original = converter.ConvertToUnicode(original);\n }\n catch(e) {\n }\n }\n }\n //DEBUG alert(original);\n this.uploadChangesFrom(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password);\n};\n\nconfig.macros.upload.uploadChangesFrom = function(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var startSaveArea = '<div id="' + 'storeArea">'; // Split up into two so that indexOf() of this source doesn't find it\n var endSaveArea = '</d' + 'iv>';\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1))\n {\n alert(config.messages.invalidFileError.format([document.location.toString()]));\n return;\n }\n var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + \n allTiddlersAsHtml() + "\sn\st\st" +\n original.substr(posClosingDiv);\n var newSiteTitle;\n if(version.major < 2){\n newSiteTitle = (getElementText("siteTitle") + " - " + getElementText("siteSubtitle")).htmlEncode();\n } else {\n newSiteTitle = (wikifyPlain ("SiteTitle") + " - " + wikifyPlain ("SiteSubtitle")).htmlEncode();\n }\n\n revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");\n revised = revised.replaceChunk("<!--PRE-HEAD-START--"+">","<!--PRE-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPreHead","") + "\sn");\n revised = revised.replaceChunk("<!--POST-HEAD-START--"+">","<!--POST-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPostHead","") + "\sn");\n revised = revised.replaceChunk("<!--PRE-BODY-START--"+">","<!--PRE-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPreBody","") + "\sn");\n revised = revised.replaceChunk("<!--POST-BODY-START--"+">","<!--POST-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPostBody","") + "\sn");\n\n var response = this.uploadContent(revised, storeUrl, toFilename, uploadDir, backupDir, \n username, password, function (responseText) {\n if (responseText.substring(0,1) != '0') {\n alert(responseText);\n displayMessage(config.macros.upload.messages.fileNotUploaded.format([getLocalPath(document.location.toString())]));\n }\n else {\n if (uploadDir !== '') {\n toFilename = uploadDir + "/" + config.macros.upload.basename(toFilename);\n } else {\n toFilename = config.macros.upload.basename(toFilename);\n }\n var toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);\n if (responseText.indexOf("destfile:") > 0) {\n var destfile = responseText.substring(responseText.indexOf("destfile:")+9, \n responseText.indexOf("\sn", responseText.indexOf("destfile:")));\n toFileUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + destfile;\n }\n else {\n toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);\n }\n displayMessage(config.macros.upload.messages.mainFileUploaded.format(\n [toFileUrl]), toFileUrl);\n if (backupDir && responseText.indexOf("backupfile:") > 0) {\n var backupFile = responseText.substring(responseText.indexOf("backupfile:")+11, \n responseText.indexOf("\sn", responseText.indexOf("backupfile:")));\n toBackupUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + backupFile;\n displayMessage(config.macros.upload.messages.backupFileStored.format(\n [toBackupUrl]), toBackupUrl);\n }\n var log = new config.macros.upload.UploadLog();\n log.endUpload();\n store.setDirty(false);\n // erase local lock\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n BidiX.GroupAuthoring.lock.eraseLock();\n // change mtime with new mtime after upload\n var mtime = responseText.substr(responseText.indexOf("mtime:")+6);\n BidiX.GroupAuthoring.lock.mtime = mtime;\n }\n \n \n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n }\n );\n};\n\nconfig.macros.upload.uploadContent = function(content, storeUrl, toFilename, uploadDir, backupDir, \n username, password, callbackFn) {\n var boundary = "---------------------------"+"aab03x"; //[rbd]\n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n if (window.netscape){\n try {\n if (document.location.toString().substr(0,4) != "http") {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');}\n }\n catch (e) {}\n } \n //DEBUG alert("user["+config.options.txtUploadUserName+"] password[" + config.options.pasUploadPassword + "]");\n // compose headers data\n var sheader = "";\n sheader += "--" + boundary + "\sr\snContent-disposition: form-data; name=\s"";\n sheader += config.macros.upload.formName +"\s"\sr\sn\sr\sn";\n sheader += "backupDir="+backupDir\n +";user=" + username \n +";password=" + password\n +";uploaddir=" + uploadDir;\n // add lock attributes to sheader\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n var l = BidiX.GroupAuthoring.lock.myLock;\n sheader += ";lockuser=" + l.user\n + ";mtime=" + l.mtime\n + ";locktime=" + l.locktime;\n }\n sheader += ";;\sr\sn"; \n sheader += "--" + boundary + "\sr\sn"; //[rbd]\n sheader += "Content-disposition: form-data; name=\s"userfile\s"; filename=\s""+toFilename+"\s"\sr\sn";\n sheader += "Content-Type: " + config.macros.upload.contentType + "\sr\sn";\n sheader += "Content-Length: " + content.length + "\sr\sn\sr\sn";\n // compose trailer data\n var strailer = new String();\n strailer = "\sr\sn--" + boundary + "--\sr\sn";\n //strailer = "--" + boundary + "--\sr\sn";\n var data;\n data = sheader + content + strailer;\n //request.open("POST", storeUrl, true, username, password);\n try {\n request.open("POST", storeUrl, true); \n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if (request.status == 200)\n callbackFn(request.responseText);\n else\n alert(config.macros.upload.messages.errorUploadingContent + "\snStatus: "+request.status.statusText);\n }\n };\n request.setRequestHeader("Content-Length",data.length);\n request.setRequestHeader("Content-Type","multipart/form-data; boundary="+boundary);\n request.send(data); \n};\n\n\nconfig.macros.upload.download = function(uploadUrl, uploadToFilename, uploadDir, uploadBackupDir, \n username, password) {\n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n try {\n if (uploadUrl.substr(0,4) == "http") {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n }\n else {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n }\n } catch (e) { }\n //request.open("GET", document.location.toString(), true, username, password);\n try {\n request.open("GET", document.location.toString(), true);\n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\n \n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if(request.status == 200) {\n config.macros.upload.uploadChangesFrom(request.responseText, uploadUrl, \n uploadToFilename, uploadDir, uploadBackupDir, username, password);\n }\n else\n alert(config.macros.upload.messages.errorDownloading.format(\n [document.location.toString()]) + "\snStatus: "+request.status.statusText);\n }\n };\n request.send(null);\n};\n\n//}}}\n////===\n\n////+++!![Initializations]\n\n//{{{\nconfig.lib.options.init('txtUploadStoreUrl','store.php');\nconfig.lib.options.init('txtUploadFilename','');\nconfig.lib.options.init('txtUploadDir','');\nconfig.lib.options.init('txtUploadBackupDir','');\nconfig.lib.options.init('txtUploadUserName',config.options.txtUserName);\nconfig.lib.options.init('pasUploadPassword','');\nconfig.lib.options.init('chkpasUploadPassword', true);\nsetStylesheet(\n ".pasOptionInput {width: 11em;}\sn"+\n ".txtOptionInput.txtUploadStoreUrl {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadFilename {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadDir {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadBackupDir {width: 25em;}\sn"+\n "",\n "UploadOptionsStyles");\n// if (document.location.toString().substr(0,4) == "http") {\n// config.options.chkAutoSave = false; \n// saveOptionCookie('chkAutoSave');\n// }\nconfig.shadowTiddlers.UploadDoc = "[[Full Documentation|http://tiddlywiki.bidix.info/l#UploadDoc ]]\sn"; \n\n//}}}\n////===\n\n////+++!![Core Hijacking]\n\n//{{{\nconfig.macros.saveChanges.label_orig_UploadPlugin = config.macros.saveChanges.label;\nconfig.macros.saveChanges.label = config.macros.upload.label.saveToDisk;\n\nconfig.macros.saveChanges.handler_orig_UploadPlugin = config.macros.saveChanges.handler;\n\nconfig.macros.saveChanges.handler = function(place)\n{\n if ((!readOnly) && (document.location.toString().substr(0,4) != "http"))\n createTiddlyButton(place,this.label,this.prompt,this.onClick,null,null,this.accessKey);\n};\n\n//}}}\n////===\n
''Tag'': All of the items that the users (observers) see in the final content.
When you first opened this Share Your Sky! web site for @@<%= Prefs.SiteName %>@@, you probably figured out the basics right away. That's the whole idea! But there are some bits of info that can help you make the most out of it.\n*Everything is contained within this one web page, in the form of //micro-content// items that appear and disappear at your command. The nav toolbar that appears along the upper right edge of the //active// item is one way to control what shows.\n*The expandable menus on the left have links that open items. These menus are task-oriented.\n*Some of the micro-content items have a ''Help'' button in them. Clicking it will reveal help relating to that item. Clicking help again hides the help.\n*@@Explore!@@ Start by playing with the toolbar in the upper right of the micro-content items. It's fun, and you'll learn how to make the most of our remote observing system.
This framework includes the [[jQuery|http://jquery.com/]] library which you can use in your ~JavaScript. From their web site:\n<<<\n//jQuery is a fast and concise ~JavaScript library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development. jQuery is designed to change the way that you write ~JavaScript.//\n<<<\nIn addition, there is a vast array of [[jQuery plugins|http://plugins.jquery.com/]] with which you can add visual elements to the ACP web interface. An example of this is the [[jQuery Sparkline plugin|http://omnipotent.net/jquery.sparkline/]] which we use for the guider tracking error graph on the [[System Status]] display. Please note that these are not the same as the plugins that are used within this framework such as the InlineJavascriptPlugin. Thanks to DC-3 Dreams customer and world-class software developer [[Russell Archer|http://www.rarcher.net]] for the idea of including jQuery and for the guider tracking error feature.
\nThese are utility tasks that you can perform given your account privileges. They are implemented using special scripts that run in the control system. For information, as usual, see the run log in System Status.
<<slider "" "UtilHelpSlider" "General Information">> [[System Status]]\n!!Observatory Adjustments\n* <html><a id="utilCenterScope" \n href="javascript:;" \n op="CenterScope.vbs">Determine your scope's true coordinates and center it</a>\n</html> <<slider "" "CenterScopeInfoSlider" Info>>\n* <html><a id="utilLostScope" \n href="javascript:;" \n op="FindLostScope.js">Recover a lost scope using all-sky plate solving</a>\n</html> <<slider "" "LostScopeInfoSlider" Info>>\n* <html><a id="utilAutoFocus" \n href="javascript:;" \n op="AutoFocus.vbs">Focus the optical system using FocusMax</a>\n</html> <<slider "" "AutoFocusInfoSlider" Info>>\n* <html><a id="utilCalibrate" \n href="javascript:;" \n op="CalibrateGuider.vbs">Calibrate the autoguider</a>\n</html> <<slider "" "CalibrateInfoSlider" Info>>\n* <html><a id="utilTrainCorrector" \n href="javascript:;" \n op="Train Corrector.vbs">Train the pointing corrector with all-sky mapping points</a>\n</html> <<slider "" "TrainCorrectorInfoSlider" Info>>\n!!Observatory Measurements\n* <html><a id="utilFindFocalLength" \n href="javascript:;" \n op="FindFocalLength.vbs">Find the true focal length of your imager</a>\n</html> <<slider "" "FindFocalLengthsInfoSlider" Info>>\n* <html><a id="utilFindLimitingMag" \n href="javascript:;" \n op="FindLimitingMagnitude.vbs">Find your limiting magnitude and corresponding exposure duration</a>\n</html> <<slider "" "FindLimitingMagInfoSlider" Info>>\n* <html><a id="utilFocusOffsets" \n href="javascript:;" \n op="FocusOffsets.vbs">Determine and configure your filter focus offsets for ACP</a>\n</html> <<slider "" "FocusOffsetsInfoSlider" Info>>\n!!System Tests\n* <html><a id="utilTestConsole" \n href="javascript:;" \n op="ask.vbs">Test the script console's remote dialogs and alerts</a>\n</html> <<slider "" "TestConsInfoSlider" Info>>\n* <html><a id="utilFindBrightStar" \n href="javascript:;" \n op="FindBrightStar.vbs">Test bright star finder used for calibration and auto-focus</a>\n</html> <<slider "" "FindBrightStarInfoSlider" Info>><% if(Voice.Active) { %>\n* <html><a id="utilVoicePage" \n href="javascript:;" \n op="VoicePage.vbs">Play a spoken voice message at the observatory</a>\n</html> <<slider "" "VoicePageInfoSlider" Info>><% } %>\n* <html><a id="utilSimpleLoop" \n href="javascript:;" \n op="Simple Loop.vbs">Test the script console's logging and interrupts with a simple looping script</a>\n</html> <<slider "" "SimpleLoopInfoSlider" Info>><script>\n function _utilOnComplete(text, params) {\n displayMessage(text);\n }\n function _util(e) {\n if(!e) e = window.event;\n var op = resolveTarget(e).getAttribute("op");\n var qs = op ? "?" + op : "";\n DC3.Ajax.sendRequest("GET", "/ac/arunscript.asp" + qs, "", _utilOnComplete, null);\n }\n var elem;\n // Must wire up onclick() at run time\n document.getElementById("utilCenterScope").onclick=_util;\n document.getElementById("utilLostScope").onclick=_util;\n document.getElementById("utilAutoFocus").onclick=_util;\n document.getElementById("utilCalibrate").onclick=_util;\n document.getElementById("utilTrainCorrector").onclick=_util;\n document.getElementById("utilFindFocalLength").onclick=_util;\n document.getElementById("utilFindLimitingMag").onclick=_util;\n document.getElementById("utilFocusOffsets").onclick=_util;\n document.getElementById("utilTestConsole").onclick=_util;\n document.getElementById("utilFindBrightStar").onclick=_util;\n elem = document.getElementById("utilVoicePage");\n if(elem) elem.onclick=_util;\n document.getElementById("utilSimpleLoop").onclick=_util;\n</script>
/***\n|''Name:''|ValidateFormPlugin|\n|''Description:''|Client-Side Form Validation|\n|''Date:''|Jan 27, 2015|\n|''Source:''|http://solo.dc3.com/tw/index.html#ValidateFormPlugin|\n|''Author:''|Bob Denny ~DC-3 Dreams, SP|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''Version:''|1.2.0|\n|''~CoreVersion:''|2.1.3|\n|''Require:''|[[JQuery 1.6.2|http://jquery.com/]] and the [[jQuery bValidator plugin|http://code.google.com/p/bvalidator/]] v0.55 or later, with Bob Denny enhancements and corrections|\n!!Description\nThis macro activates a form for validation using the Bob Denny enhanced [[jQuery bValidator plugin|http://code.google.com/p/bvalidator/]], a [[JQuery|http://jquery.com/]] plugin that handles form validation. The validation is performed on the 'blur' event of each validated form field. Five styles of popup error message balloons are supported.\n!!Form Search Scope\nThe macro searches for its form within the scope of the macro handler's 'place' parameter. Normally, this is the tiddler viewer area. However, it is possible to include forms within a wikitext object such as a table cell. In this case, only forms within that table cell will be found by the macro (which also needs to be in that same table cell). This has some implications:\n# The form invocation must be within the same scope as the form it is controlling.\n# If only one form appears within a scope it need not be named, and the first parameter (the form name, see below) may be "".\n!!Usage\nCreate one or more forms in the tiddler, using {{{<html>}}} tags to enclose the form as usual. The form does not need to have {{{action}}} or {{{method}}} attributes, {{{<form>}}} is enough. For more info see the PostFormPlugin. If you have more than one form in the scope, you must give each one a name, for example, {{{<form name='form1'>}}}. Add form elements (text fields, checkboxes, etc.). each with a name and a value, per HTML. At the end of the tiddler containing the form(s), invoke the ~ValidateForm macro. Remember the invocation must be in the same scope as the form! The macro has several parameters. If you need to include a parameter as a placeholder, use "":\n\nBecome familiar with the [[bValidator documentation|http://karmela.fsb.hr/~bmauser/bvalidator/documentation.html]], particularly the [[validator actions|http://karmela.fsb.hr/~bmauser/bvalidator/documentation.html#actions]]. Note that the validation attribute name is not {{{data-bvalidator=}}}, but instead {{{validate=}}} (for clarity and conciseness). Also, if you specify a custom validation error message, use {{{val-errmsg=}}} instead of {{{data-bvalidator-msg=}}}. Each form field that is to be validated must have, at a minimum, a {{{validate=}}} attribute that specifies the validation actions.\n!!!Custom Validators for Date/Time and Sexagesimal\nIn addition to the validation actions described in the [[bValidator documentation|http://karmela.fsb.hr/~bmauser/bvalidator/documentation.html#actions]], the ~ValidateFormPlugin adds two additional validators:\n|!Action|!Parameters|!Description|\n|''sexanum''|min, max|Checks if the field contains a decimal //or//sexagesimal number that is greater than or equal to ''min'' and less than or equal to ''max''. Sexagesimal numbers may use any combination of non-numerics as DMS/HMS separators. Two and three part sexagesimal forms are supported.|\n|''jsdatetime''| |Checks if the field contains a date/time string which is in the formats acceptable to JavaScript (English language).|\n!!!Macro Parameters\n|!Param|!Description|\n|''1''|The name of the form, or "". If "" is given, the first form in the scope is validated even though there may be multiple forms in the scope. Hote that it looks for the name="" attribute, not id="". This is for consistency with PostFormPlugin|\n|''2''|(optional) a popup tip style name. Must be "gray", "gray2", "postit", "orange", or "red". If omitted or not any of those values (case matters), the default gray style will be used.|\n!!Example\nHere's a simple form which will require a sexagesimal or decimal number from -90 to 90. The submit button posts to a mythical PHP page (will fail) if the form validates.\n{{{\n<html><form>\nTest: <input type="text" name="sexa" width="40" validate="required,sexanum[-90:90]" value=""></input>\n</form></html><<PostForm "" "formtest.php">><<ValidateForm>>\n}}}\n<html><form>\nTest: <input type="text" name="sexa" width="40" validate="required,sexanum[-90:90]" value=""></input>\n</form></html><<PostForm "" "formtest.php">><<ValidateForm>>\n!!Revision History\n<<<\n''2011.08.29 [1.0.0]'' Initial creation.\n''2011.08.30 [1.0.0]'' Style parameter and slow balloon fade-in\n''2011.09.11 [1.0.0]'' Add idatetime custom validator, remove note about local jQuery.bValidator.js modifications.\n''2012.10.21 [1.1.0]'' Allow 2-part sexagesimal numbers \n''2015.01.27 [1.2.0]'' Allow comma decimal separator\n<<<\n!!Code\n***/\n//{{{\nversion.extensions.ValidateFormPlugin = {\n major: 1, minor: 2, revision: 0,\n date: new Date(2015, 01, 27), \n type: 'macro',\n source: "http://solo.dc3.com/tw/index.html#ValidateFormPlugin"\n};\n\nconfig.macros.ValidateForm = {\n \n _theValidator: null,\n\n getValidator: function() {\n return _theValidator;\n },\n\n handler: function(place, macroName, params, wikifier, paramString, tiddler)\n {\n //\n // Find the form. Either name given in param[0] or if "" then\n // first form in the tiddler.\n //\n var forms = place.getElementsByTagName("form");\n if(forms.length === 0) {\n displayMessage("ValidateForm: No form in tiddler!");\n return;\n }\n var form = null;\n if(forms.length == 1 || params[0] === "") { // Only 1 or unspecified\n form = forms[0]; // First form in the tiddler\n } else {\n for(var i = 0; i < forms.length; i++) {\n if(forms[i].name == params[0]) {\n form = forms[i]; // Named form\n break;\n }\n }\n if(form === null) { // Not found by name\n displayMessage("ValidateForm: No form \s"" + param[0] + "\s"in tiddler!");\n return;\n }\n }\n var style = params[1];\n if(!style) style="gray";\n if(!["gray","gray2","postit","orange","red"].contains(style)) style="gray";\n var opts;\n switch(style)\n {\n case "gray":\n opts = { };\n break;\n case "gray2":\n opts = {\n classNamePrefix: 'bvalidator_gray2_',\n position: {x:'right', y:'center'},\n offset: {x:15, y:0},\n template: '<div class="{errMsgClass}"><div class="bvalidator_gray2_arrow"></div><div class="bvalidator_gray2_cont1">{message}</div></div>' \n };\n break;\n case "postit":\n opts = {\n classNamePrefix: 'bvalidator_postit_',\n offset: {x:-29, y:-10},\n template: '<div class="{errMsgClass}">{message}<div class="bvalidator_postit_pointer"><div class="bvalidator_postit_inner_pointer"></div></div></div>'\n };\n break;\n case "orange":\n opts = {\n classNamePrefix: 'bvalidator_orange_'\n };\n break;\n case "red":\n opts = {\n classNamePrefix: 'bvalidator_red_'\n };\n break; \n }\n opts.showErrMsgSpeed = 'slow';\n opts.validateOn = 'blur';\n opts.validateActionsAttr = 'validate';\n opts.errorMessageAttr = 'val-errmsg';\n //\n // Hook up validator. Using name to be consistent with PostFormPlugin.\n // Renaming the attributes to nicer/descriptive names\n //\n _theValidator= $(form).bValidator(opts);\n form.bValidator = _theValidator; // So PostForm et al. can call us\n //\n // Install the custom validator sexanum for sexagesimal and range check.\n //\n _theValidator.getActions().sexanum = this.sexanum;\n _theValidator.getOptions().errorMessages.en.sexanum = "Please enter a decimal or sexagesimal number between {0} and {1}";\n //\n // Install the custom Javascript date/time validator\n //\n _theValidator.getActions().idatetime = this.idatetime;\n _theValidator.getOptions().errorMessages.en.idatetime = "Please enter a UTC date/time, yyyy/mm/dd hh:mm[:ss]";\n },\n\n //\n // Custom validator for date/time yyyy/mm/dd hh:mm[:ss]\n //\n idatetime: function(v)\n {\n var fstr = v.value;\n if(fstr.search(/\sd\sd\sd\sd\s/\sd+\s/\sd+ +\sd+:\sd\sd/) !== 0) return false;\n var d = null;\n try {\n var d = Date.parse(fstr);\n } catch(ex) {\n return false;\n }\n if(isNaN(d))\n return false;\n return true;\n },\n \n //\n // Custom validator for sexagesimal fields\n //\n sexanum: function(v, min, max)\n {\n var fstr = v.value;\n if(fstr.search(/^[-+]?[0-9]*\s.?[0-9]+/) == -1) { // Must begin with number\n return false;\n }\n var mats = fstr.match(/[-+]?[0-9]*[\s.\s,]?[0-9]+/g); // Must contain at least one number\n if(mats === null) {\n return false;\n }\n var val = 0.0; // Convert per sexagesimal\n for(var i = mats.length - 1; i >= 0; i--) {\n var vpart = parseFloat(mats[i]);\n if(i > 0 && (vpart >= 60.0 || vpart < 0.0)) // Prevent bogus minutes/seconds\n return false;\n val = (val / 60.0) + Math.abs(vpart);\n }\n if(mats[0].substr(0, 1) == "-") val = -val; // If neg, fix up sign\n if(val > max) return false;\n if(val < min) return false;\n return true\n }\n};\n//}}}\n
<div class='toolbar'>\n<span style="padding-right:2em;" macro="tagger label:tags tooltip:'Manage tags'"></span>\n<span macro='toolbar collapseTiddler -closeTiddler closeOthers +editTiddler references jump'></span>\n<span macro='toggleSideBar side-bar'></span>\n</div>\n<div class='title' macro='view title'></div>\n<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date [[DD MMM YYYY]]'></span> (created <span macro='view created date [[DD MMM YYYY]]'></span>)</div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>
Asks you to enter some text, then speaks the text out loud in the observatory. Maybe the operator will hear it. If the observatory computer doesn't have sound (what modern computer doesn't???) then this won't do anything.
<<RemoteContent '/ac/aweather.asp' Refresh 'Refresh the weather info'>>
<<slider "" "Getting Started" "Getting Started" "Helpful information for new users">> <<themeSelect style 'Select a Theme' 'Select a color theme for display'>>\n\nWelcome to <%= Prefs.SiteName %>. If you haven't been here before, click the <<slider "" "Getting Started" "Getting Started" "Helpful information for new users">> button to expose some useful information. Start by looking at the Observatory Information section in the expando-menu to your left. You can also <<themeSelect style 'Select a Theme' 'Select a color theme for display'>> you like. Happy observing!\n
/***\n|''Name:''|XPMenuPlugin|\n|''Description:''|Support for Eric Simmons' DHTML XP Menu|\n|''Date:''|March 16, 2008|\n|''Source:''|http://solo.dc3.com/tw/index.html#XPMenuPlugin|\n|''Author:''|Bob Denny ~DC-3 Dreams, SP|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''Version:''|1.0.3|\n|''~CoreVersion:''|2.0.11, 2.1.0/1/2|\n|''Browser:''|Firefox 1.5/2.0; Internet Explorer 6.0/7.0; Safari|\nTo be written\n!Usage\nCall this macro at the end of the MainMenu that contains the HTML for making the menu.\n!Notes\nThe original Eric Simmons code was modified to run within the TiddlyWiki environment. Many changes were incorporated arising from needing to restrict the scope of the code as well as the element searching to be within the tiddler containing the macro call. This results in a much safer implementation. Changes are //not//marked. To see them, diff with the original Eric Simmons code. There were also almost 100 lint warnings due to undeclared variables and lenient comparisons.\n\nThe mainMenu images for all themes (assuming you have overrides for them in the theme CSS) are loaded by IE6 multiple times. I have seen IE6 queue up 4 or 5 requests for //each image//. This is really disgusting. For some background, I found [[this article|http://www.bazon.net/mishoo/articles.epl?art_id=958]], written by one of the legions of IE haters out there. Yes, most of thee responses are 304 not modified, but it's still ghastly.\n\nFortunately, I found a fix in [[this article|http://www.mister-pixel.com/]] which describes this little bit of JS:\n{{{\ntry {\n document.execCommand("BackgroundImageCache", false, true);\n} catch(err) {}\n}}}\nObvious, right? Those arrogant @#$%^ at Microsoft. Well, anyway, put it into the MarkupPreHead and your cares will vanish.\n!!Revision History\n<<<\n''2006.10.30 [1.0.0]'' Initial creation, from Eric Simmons. See (preserved) original comments in code.\n''2006.10.31 [1.0.1]'' Fixed cookie bug on Firefox (Closed appending). Rename stylesheet to acpsddm.css.\n''2007.12.04 [1.0.2]'' Fixed another cookie bug on FireFox: menu defaulting when no cookie. Cleaned up this logic.\n''2008.03.16 [1.0.3]'' Fixed yet another cookie bug, shows Error in macro on IE when cookie has too few state elements\n<<<\n!Original Code Comments\n//{{{\n\nAuthor: Eric Simmons\nContact: info AT jswitch DOT com\nWebsite: http://www.jswitch.com\nScript featured and available at Dynamic Drive: http://www.dynamicdrive.com\nVersion: 2.1 05/2006 \nBrowser Target: Mozilla 6+/FireFox Netscape 6+, IE 5.0+\nType: XP Style Menus ver 2.1\n\nDISCLAIMER:\nTHIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT\nANY EXPRESS OR IMPLIED WARRANTIES, JSWITCH.COM\nIS NOT RESPONSIBLE FOR ANY ADVERSE AFFECTS TO\nYOUR COMPUTER OR SYSTEMS RUNNING THIS SCRIPT.\n\nLICENSE:\nYOU ARE GRANTED THE RIGHT TO USE THE SCRIPT\nPERSONALLY OR COMMERCIALLY. THE AUTHOR, WEBSITE LINKS \nAND LICENSE INFORMATION IN THE HEADER OF THIS SCRIPT\nMUST NOT BE MODIFIED OR REMOVED. IF PORTIONS OF THE \nCODE ARE TRANSFERED TO ANOTHER SCRIT THE AUTHORS NAME\nAND CONTACT INFORMATION MUST BE STATED IN THE NEW SCRIPT\nBY THE PORTIONS CODE THAT HAVE BEEN TRANSFERED.\n\nv2.2\n-fixed cookie bug\n\nv2.1\n-Mouse events states for title bar\n-object index bug fixes\n-redesigned to look like XP :)\n\nv 2.0\n-W3C HTML 4.01 Transitional compliant\n-Support for initially open menu\n-New fading capability\n-Cookie menu persistence\n-Redesigned code\n\nNotes:\n\nIf you want a menu to be open initially set the style display to\n"inline" in the subMenu class div like this...\n<div class="subMenu" style="display:inline;">\n\nThe fading effect can be disabled by setting the \nthis.doFading var to false. I have only tested this feature on \nie 6, Netscape 1.7, firefox 1 & 1.5\n\nIf the user has cookies enabled the script will bake a cookie ;) on\nthe browser to track the state of the menus. This is good news for those\nof you who don't use frames, you can now have persistent menu states\n\nMake sure you put the java script include tag after all the menus otherwise\nit will not be able find and initialize them. If you have questions, or comments\nabout the XpStyle Menu v2 send me an email.\n\nAnd lastly a plug for myself, If you need some professional help with technical\nweb development please drop me an email, I do contracts for a competitive price. :)\n\nv 1.0\nXP style sliding Menu Bar\n\n//}}}\n!!Code\n***/\n//{{{\nversion.extensions.XPMenuPlugin = {\n major: 1, minor: 0, revision: 3,\n date: new Date(2008, 16, 3), \n type: 'plugin',\n source: "http://solo.dc3.com/tw/index.html#XPMenuPlugin"\n};\n\n// Initialize style sheet from tiddler\nrefreshStyles("XPMenuStyleSheet");\n\nconfig.macros.XPMenu = {\n \n menuObjArray: new Array(),\n numMenuItem: 0,\n slideDelay: 5,\n divHeight: 21,\n moveSlidePix: 7,\n isLocked: null,\n doFading: true,\n\n handler: function(place, macroName, params, wikifier, paramString, tiddler)\n {\n\n this.menuObjArray[0] = new Array();\n this.menuObjArray[1] = new Array();\n this.menuObjArray[2] = new Array();\n this.menuObjArray[3] = new Array();\n this.menuObjArray[4] = new Array();\n this.menuObjArray[5] = new Array();\n this.menuObjArray[6] = new Array();\n this.menuObjArray[7] = new Array();\n \n var divs = place.getElementsByTagName("DIV");\n var mnuCookie = this._getUserCookie("xpMenuCookv2");\n var menuStateAry = null;\n if(mnuCookie !== "")\n menuStateAry = mnuCookie.split(",");\n \n var aryNum = 0;\n for(var dn=0; dn < divs.length;dn++)\n {\n if(String(divs.item(dn).className).substring(0,7) == "topItem")\n { \n var mainMenuDiv = divs.item(dn).parentNode;\n var menuContainerDiv= mainMenuDiv.getElementsByTagName("DIV").item(1);\n var itemContainerDiv= menuContainerDiv.getElementsByTagName("DIV").item(0);\n \n if(!this.doFading)\n {\n \n if (menuContainerDiv.filters) {\n menuContainerDiv.filters.alpha.opacity = 100;\n } else {\n menuContainerDiv.opacity = 1;\n }\n }\n \n // [rbd 2.2b] Use cookie to set open/closed state. If no cookie, defaults are \n // in style sheet via div style= (see note above). [rbd 1.0.3] Check to see\n // if cookie has a state for this menu. If the list is too short (array doesn't\n // have enough elements) again default to the stylesheet. Opening or closing\n // the elements not covered by the cookie will lengthen it to save the state.\n if(menuStateAry !== null && aryNum < menuStateAry.length)\n {\n var itemHeight = parseInt(menuStateAry[aryNum]);\n itemContainerDiv.style.height = itemHeight + "px";\n if(itemHeight === 0) {\n itemContainerDiv.style.display = 'none';\n } else {\n itemContainerDiv.style.display = 'inline';\n }\n }\n \n this._init(divs.item(dn));\n aryNum++;\n }\n } \n },\n\n _init: function(objDiv)\n {\n if (this.isLocked)\n return;\n \n var mainMenuDiv, subMenuDiv, menuContainerDiv, itemContainerDiv, styleRules;\n \n for(var r=0;r < document.styleSheets.length; r++)\n { \n if(document.styleSheets[r].cssRules && document.styleSheets[r].cssRules[0].selectorText == ".navbar") { // For IE/FireFox\n styleRules = document.styleSheets[r].cssRules;\n break;\n }\n if(document.styleSheets[r].rules && document.styleSheets[r].rules[0].selectorText == ".navbar") { // For ???\n styleRules = document.styleSheets[r].rules;\n break;\n }\n }\n \n this.numMenuItem = 0;\n mainMenuDiv = objDiv.parentNode;\n subMenuDiv = mainMenuDiv.getElementsByTagName("DIV").item(0);\n \n menuContainerDiv= mainMenuDiv.getElementsByTagName("DIV").item(1);\n itemContainerDiv= menuContainerDiv.getElementsByTagName("DIV").item(0);\n \n var aLen = this.menuObjArray[0].length;\n for (var i=0 ;i < aLen ; i++)\n {\n if (this.menuObjArray[0][i] == menuContainerDiv)\n {\n break;\n }\n }\n \n if (i == aLen)\n {\n this.menuObjArray[0][i] = menuContainerDiv;\n this.menuObjArray[1][i] = itemContainerDiv;\n this.menuObjArray[5][i] = null; //[sentinel] See SetSlider()\n this.menuObjArray[7][i] = subMenuDiv;\n this.menuObjArray[7][i].onmouseover = this.ChangeStyle;\n this.menuObjArray[7][i].onmouseout = this.ChangeStyle;\n subMenuDiv.onclick = this.SetSlide;\n \n var lastmenuNum = -1;\n for (var b=0;b<itemContainerDiv.childNodes.length;b++)\n {\n if (itemContainerDiv.childNodes.item(b).tagName == "DIV")\n { \n this.numMenuItem ++;\n itemContainerDiv.childNodes.item(b).onmouseover = this.ChangeStyle;\n itemContainerDiv.childNodes.item(b).onmouseout = this.ChangeStyle;\n lastmenuNum = b;\n }\n } \n \n for(r=0;r < styleRules.length; r++)\n {\n var tmpStr1 = String(styleRules[r].selectorText);\n var tmpStr2 = String("." + itemContainerDiv.childNodes.item(lastmenuNum).className);\n if(tmpStr1 == tmpStr2)\n {\n if(NaN != parseInt(styleRules[r].style.height))\n {\n this.divHeight = parseInt(styleRules[r].style.height) + 2;\n break;\n }\n \n }\n }\n \n this.menuObjArray[2][i] = this.numMenuItem;\n this.menuObjArray[3][i] = mainMenuDiv;\n \n if (itemContainerDiv.style.display == "inline")\n {\n this.menuObjArray[4][i] = this.numMenuItem * this.divHeight;\n this.menuObjArray[0][i].style.height = this.numMenuItem * this.divHeight + "px";\n this.menuObjArray[6][i] = true;\n \n if(this.doFading)\n {\n if (this.menuObjArray[0][i].filters)\n this.menuObjArray[0][i].filters.alpha.opacity = 100;\n else\n this.menuObjArray[0][i].style.opacity = 1;\n }\n \n } else {\n // [rbd] - On FireFox this can already be Closed - ??? Well, this fixes it!\n var cname = this.menuObjArray[7][i].className;\n if(cname.indexOf("Close") != cname.length - 5/*"Close".length*/)\n this.menuObjArray[7][i].className = cname + "Close";\n this.menuObjArray[4][i] = 0;\n this.menuObjArray[0][i].style.height = 0 + "px";\n this.menuObjArray[6][i] = false;\n if(this.doFading)\n {\n if (this.menuObjArray[0][i].filters)\n this.menuObjArray[0][i].filters.alpha.opacity = 0;\n else\n this.menuObjArray[0][i].style.opacity = 0.0;\n }\n }\n }//end if\n \n mainMenuDiv = null;\n subMenuDiv = null;\n menuContainerDiv= null;\n itemContainerDiv= null;\n },\n\n \n _updateUserCookie: function(aryIndex)\n {\n var date = new Date();\n date.setTime(date.getTime() + (1000 * 60 * 60 * 24 * 30)); \n document.cookie = "xpMenuCookv2" + "=" + escape(this.menuObjArray[4].toString()) + "; expires=" + date.toGMTString(); \n },\n\n\n _getUserCookie: function(crumbName)\n {\n var colCookie = document.cookie.split("; ");\n \n for (var a=0; a < colCookie.length; a++)\n {\n var colCrumb = colCookie[a].split("="); \n if(colCrumb[0] == crumbName)\n return unescape(colCrumb[1]);\n }\n return "";\n },\n\n\n SetSlide: function()\n { \n var me = config.macros.XPMenu; // Event proc, 'this' is out of scope (typ.)\n if (me.isLocked)\n return;\n else\n me.isLocked = this.parentNode; \n for (var i=0 ;i < me.menuObjArray[0].length; i++)\n {\n if (me.menuObjArray[3][i] == this.parentNode)\n {\n if (me.menuObjArray[5][i] === null) // Requires initialization to null!\n me.menuObjArray[5][i] = setInterval("config.macros.XPMenu.RunSlide(" + i + ")", me.slideDelay);\n break;\n }\n }\n },\n\n \n RunSlide: function(objIndex) \n {\n var me = config.macros.XPMenu;\n if (me.menuObjArray[6][objIndex])\n {\n if(me.doFading)\n {\n if(me.menuObjArray[0][objIndex].filters)\n me.menuObjArray[0][objIndex].filters.alpha.opacity -= 100/ ( ( (me.menuObjArray[2][objIndex] * me.divHeight) / me.moveSlidePix) +1);\n else\n me.menuObjArray[0][objIndex].style.opacity -= 0.9/(((me.menuObjArray[2][objIndex] * me.divHeight) / me.moveSlidePix)+1);\n }\n me.menuObjArray[1][objIndex].style.display = 'none';\n me.menuObjArray[4][objIndex] -= me.moveSlidePix;\n if (me.menuObjArray[4][objIndex] > 0)\n me.menuObjArray[0][objIndex].style.height = me.menuObjArray[4][objIndex] + "px";\n else\n {\n if(me.doFading)\n {\n if(me.menuObjArray[0][objIndex].filters)\n me.menuObjArray[0][objIndex].filters.alpha.opacity = 0;\n else\n me.menuObjArray[0][objIndex].style.opacity = 0;\n }\n \n \n var cName = String(me.menuObjArray[7][objIndex].className);\n //alert(cName);\n \n if (cName.substring(cName.length - 4, cName.length) == "Item")\n {\n me.menuObjArray[7][objIndex].className = me.menuObjArray[7][objIndex].className+"Close";\n }\n \n if (cName.substring(cName.length - 4, cName.length) == "Over")\n {\n me.menuObjArray[7][objIndex].className = cName.substring(0,cName.length - 4);\n me.menuObjArray[7][objIndex].className = me.menuObjArray[7][objIndex].className+"CloseOver";\n }\n \n if (cName.substring(cName.length - 5, cName.length) == "Close")\n {\n me.menuObjArray[7][objIndex].className = cName.substring(0,cName.length - 5);\n me.menuObjArray[7][objIndex].className = me.menuObjArray[7][objIndex].className+"CloseOver";\n }\n \n //cName = String(me.menuObjArray[7][objIndex].className);\n //alert(cName);\n \n me.menuObjArray[4][objIndex] = 0;\n me.menuObjArray[0][objIndex].style.height = 0 + "px";\n clearInterval(me.menuObjArray[5][objIndex]);\n me.menuObjArray[5][objIndex] = null;\n me.menuObjArray[6][objIndex] = false;\n me.isLocked = null;\n me._updateUserCookie(objIndex);\n return 0;\n }\n \n return 0;\n }\n \n if (!me.menuObjArray[6][objIndex])\n {\n if(me.doFading)\n {\n if(me.menuObjArray[0][objIndex].filters)\n me.menuObjArray[0][objIndex].filters.alpha.opacity += 100/ ( ( (me.menuObjArray[2][objIndex] * me.divHeight) / me.moveSlidePix) +1);\n else\n {\n var opcVal = parseFloat(me.menuObjArray[0][objIndex].style.opacity);\n opcVal += 0.9/((me.menuObjArray[2][objIndex] * me.divHeight) / me.moveSlidePix);\n me.menuObjArray[0][objIndex].style.opacity = opcVal;\n }\n }\n me.menuObjArray[4][objIndex] += me.moveSlidePix;\n if (me.menuObjArray[4][objIndex] < (me.menuObjArray[2][objIndex] * me.divHeight))\n me.menuObjArray[0][objIndex].style.height = me.menuObjArray[4][objIndex] + "px";\n else\n {\n if(me.doFading)\n {\n if(me.menuObjArray[0][objIndex].filters)\n me.menuObjArray[0][objIndex].filters.alpha.opacity = 100;\n else\n me.menuObjArray[0][objIndex].style.opacity = 1;\n }\n var strClassName = String(me.menuObjArray[7][objIndex].className);\n me.menuObjArray[4][objIndex] = (me.menuObjArray[2][objIndex] * me.divHeight);\n me.menuObjArray[0][objIndex].style.height = (me.menuObjArray[2][objIndex] * me.divHeight)+ "px"; \n me.menuObjArray[1][objIndex].style.display = 'inline';\n clearInterval(me.menuObjArray[5][objIndex]);\n me.menuObjArray[5][objIndex] = null;\n me.menuObjArray[6][objIndex] = true;\n\n cName = String(me.menuObjArray[7][objIndex].className);\n //alert(cName);\n if (cName.substring(cName.length - 4, cName.length) == "Over")\n {\n //This is NOT a bug, just in need of refactoring :-)\n //me.menuObjArray[7][objIndex].className = cName.substring(0,cName.length - 9);\n //me.menuObjArray[7][objIndex].className = me.menuObjArray[7][objIndex].className+"Over";\n me.menuObjArray[7][objIndex].className = cName.substring(0,cName.length - 9) + "Over"; // [rbd]\n }\n \n if (cName.substring(cName.length - 5, cName.length) == "Close")\n {\n //**BUGBUG** 'i' is not defined here\n //me.menuObjArray[7][i].className = cName.substring(0,cName.length - 5);\n //This is a guess... \n me.menuObjArray[7][objIndex].className = cName.substring(0,cName.length - 5);\n }\n //cName = String(me.menuObjArray[7][objIndex].className);\n //alert(cName);\n me.isLocked = null;\n me._updateUserCookie(objIndex);\n return 0;\n } \n return 0;\n }\n },\n\n ChangeStyle: function(e)\n {\n var className = String(this.className);\n \n if (className.substring(className.length - 4, className.length) == "Over")\n this.className = className.substring(0,className.length - 4);\n else\n this.className = this.className + "Over";\n // alert(me.className);\n }\n};\n//}}}\n
/***\nStyles used by the XPMenuPlugin. These are the base styles, and may be overridden by themes, etc. The mainDiv images should be 135 x 25.\n\n@@WARNING!@@ Do not tag this as ~styleSheet or it will show in the theme selector!\n!!Revision History\n<<<\n''2006.09.16 [rbd]'' Initial edit for ACP5 from original ~XPMenu by Eric Simmons info@jswitch.com. See comments in XPMenuPlugin.\n''2006.09.17 [rbd]'' Change from indenting subitems based on <a...> to new subSubItem scheme. Clean up box model issues for IE and FF.\n''2006.09.20 [rbd]'' Move images to im sub folder\n''2006.10.31 [rbd]'' Move this into a tiddler, activate from new XPMenuPlugin\n''2015.05.19 [rbd]'' ~ACP-1303 Alignment of text in MainMenu top bar\n<<<\n!!To Do\nRestrict scope.\n!!Code\n***/\n/*{{{*/\n\n.navbar {\n}\n.mainDiv {\n width: 135px;\n text-align: left;\n}\n.topItem {\n display: table-cell;\n vertical-align: middle;\n font: 12px arial, helvetica;\n letter-spacing: 0;\n background: url("im/bar-tw-up.png") no-repeat 0 0;\n background-position: center center;\n background-repeat: no-repeat;\n border: none;\n width: 135px;\n height: 25px;\n color: #e0e0e0;\n cursor: pointer;\n text-indent: 10px;\n}\n.topItemOver {\n display: table-cell;\n vertical-align: middle;\n font: 12px arial, helvetica;\n letter-spacing: 0;\n background: url("im/bar-tw-up-on.png") no-repeat 0 0;\n background-position: center center;\n background-repeat: no-repeat;\n height: 25px;\n width: 135px;\n color: #ffffff;\n cursor: pointer;\n text-indent: 10px;\n}\n.topItemClose {\n display: table-cell;\n vertical-align: middle;\n font: 12px arial, helvetica;\n letter-spacing: 0;\n background: url("im/bar-tw-down.png") no-repeat 0 0;\n background-position: center center;\n background-repeat:no-repeat;\n height: 25px;\n width: 135px;\n color: #e0e0e0;\n cursor: pointer;\n text-indent: 10px;\n}\n.topItemCloseOver {\n display: table-cell;\n vertical-align: middle;\n font: 12px arial, helvetica;\n letter-spacing: 0;\n background: url("im/bar-tw-down-on.png") no-repeat 0 0;\n background-position: center center;\n background-repeat: no-repeat;\n height: 25px;\n width: 135px;\n color: #ffffff;\n cursor: pointer;\n text-indent: 10px;\n}\n.dropMenu {\n font: bold 11px arial, helvetica;\n background-color: #d6dff7;\n color: #000;\n border-width: 0 1px 1px 1px;\n filter: alpha(opacity=100);\n margin-bottom: 10px;\n padding-top: 5px;\n}\n.subMenu {\n display: block;\n}\n/*\n * Colors are ignored for hyperlinks which use 'a' style.\n * "Over" highlighting of non-hyperlinks can be done by\n * setting the "xxOver" color to something different\n * and change the cursor maybe?\n */\n.subItem {\n margin-left: 10px;\n margin-top: 2px;\n height: 18px;\n font: 11px arial, helvetica;\n cursor: default;\n color: #000000;\n}\n.subItemOver {\n margin-left: 10px;\n margin-top: 2px;\n height: 18px;\n font: 11px arial, helvetica;\n cursor: default;\n color: #000000; /*#0000cc;*/\n}\n.subSubItem {\n margin-left: 23px;\n margin-top: 2px;\n height: 18px;\n font: 11px arial, helvetica;\n cursor: default;\n color: #000000;\n}\n.subSubItemOver {\n margin-left: 23px;\n margin-top: 2px;\n height: 18px;\n font: 11px arial, helvetica;\n cursor: default;\n color: #000000; /*#0000cc;*/\n}\n.drop {\n border-left: 1px solid black;\n border-right: 1px solid black;\n}\n\n/*}}}*/\n
Causes the item to be completely removed (instead of hidden, per [[hideUser]]) when the final user content is built.
''Tag'': Prevents items from showing in lists (in the sidebar). See also [[excludeSearch]].
''Tag'': Prevents items from being found during searches. See also [[ExcludeLists]].
''Tag'': Causes items to be hidden from the local user ("Use Web Browser" on ACP window) only. These items are visible to remote users.
''Tag'': This is used to hide tags and items in the final user content (as opposed to completely removing them, per [[deleteUser]]). See the ModeSwitchPlugin.
''Tag'': A macro is a [[plugin]] that is called within wikitext. These items will always be tagged [[systemConfig]] as well.
''Tag'': HTML templates used to lay out the page. Change when style/theme is changed.
''Tag'': Plugins are extensions to the basic TiddlyWiki logic on which this web application is based. They will always be tagged [[systemConfig]] as well.
''Tag'': CSS style info for layout etc. There is one for each theme, and one master/shadow.
''Tag'': All of the plugins. This tag triggers plugin processing during loading of the content in the browser. The content of these items is assumed to be ~JavaScript. These items can also be tagged [[macro]] and/or [[plugin]].
''Tag'': Indicates //non-plugin// content that forms part of the system. A tiddler will not (well, //should// not) be tagged [[systemConfig]] and systemContent together.
''Tag'': Javascript and CSS code that is not part of any plugin, but instead is part of a library of such things that can be used by multiple components.