According to [[some|civil3d.wordpress]], VBA is an important part of designing subassemblies and assemblies. Here's a 3 part introductory less on the programming language VBA from AUGI.\n\n__Course Description__\n<<<\nATP064 Focused VBA: Lesson 1 – Intro to VBA. Beginning Concepts and the Development Environment.\n\nCategory: Programming\n\nCourse Title: Focused VBA: Lesson 1 – Intro to VBA\n\nLevel: Beginner\n\nInstructor: Ed Jobe\n\nCourse Start: Saturday, January 8, 2005\n\nStatus: Archived\n\nSince it’s impossible to teach VBA in a single class, the goal of this first class is to get you started on a series of classes designed to provide brief, but focused classes that will give you a good foundation in VBA. Due to job related circumstances, many have to learn VBA as they get time. Hopefully, this series will assist you to accomplish your goals. This first class will get you on your way.\n\nEver buy a brand new car? At first, you might drive it on an outing or show all your friends. But sooner or later, you probably want to read the owners manual so you can find out what all it can do. What do all those buttons do? How often do you change the oil? You may not use all those buttons right away, but you need to know where they are so that you can use them when you need them (or at least remember that you read about it somewhere).\n\nThis first lesson will be like that first look, you want to know your way around the VBA environment. In VBA, it’s called an IDE, for Integrated Development Environment, integrated with the host application that is. You’ll want to take this class so you will feel comfortable working with VBA, performing the basic tasks of programming. That way, when you sit down to do some actual programming, you will be a little more at ease.\nWe’ll also look at how VBA is structured and some how you might use it as one of the tools available to you.\n<<<\n\n[[Download lesson|]]. [[Mirror link|]].
AutoLISP and Visual LISP are tools which allow you to create routines like Macros, simplifying and automating drafting tasks.\n\n__Course Description__\n<<<\nATP067 Learning Visual LISP\n\nCategory: Programming\n\nLevel: Intermediate\n\nInstructor: Peter Jamtgaard\n\nCourse Start: Monday, February 7, 2005\n\nThis course is a presentation of basic AutoLISP and Visual LISP programming. The examples and commentary will help the participants learn to create useful tools to improve drafting productivity.\n<<<\n\n[[Download lesson|]]. [[Mirror link|]].
AUGI and AUGI Training Program (ATP) resources.
From AUGI Hotnews June 2006: [[Autodesk Civil 3D 2007 - Tips & Tricks - June 2006|]]\n\nIncludes:\n#Add Reference Text (//@@very useful@@//)\n#Use view orientation
From AUGI Hotnews July 2006: [[Autodesk Civil 3D Tips & Tricks, Part 2 - July 2006|]].\n\nIncludes:\n#Calculate Label Values with Expressions (//@@very useful@@//)\n#Text Masking
!Welcome to your '''' ~TiddlyWiki!\n''[[|]]'' gives you an instant [[TiddlyWiki|]] hosted on or '''' servers.\n\nWant to work online? No problem, you can go to your '''' URL (which is ) and start editing. Click "save to web" and your changes are saved directly to your '''' home -- no messing about with local files or ftp.\n\nWant to work offline? No problem, your '''' ~TiddlyWiki is a real, fully functioning ~TiddlyWiki that you can save onto your hard drive or USB stick. Use the link below to save to your local computer. As you make changes, use the "save to disk" button to save to your local file. Whenever you're ready to sync up again, just click "save to web".\n\n!To save online\nEnter the upload password provided when you created your ~TiddlyWiki. Then click the "save to web" button below (or in the right side column) to save your ~TiddlyWiki.\nUpload Password: <<option pasUploadPassword>>\n<<upload index.html . . mthompson>>\n\n!To save offline\nTo take this ~TiddlyWiki offline, click [[Download|]]. Save the file locally then open it in your browser.\n\n\n!Learn more about ~TiddlyWiki\nFind out more about ~TiddlyWiki at [[|]]. Also visit [[TiddlyWiki Guides|]] for documentation on learning and using ~TiddlyWiki.\n\nThe [[TiddlyWiki mailing list|]] is an excellent place to ask questions and get help.\n\n!Enjoy!\nWe hope you like using your '''' ~TiddlyWiki. Please email [[|]] with any comments.\n\n----
[[Current|]] and [[archived|]] courses. <html><br><br></html>
Here's a list of general Land Development / Civil 3D and/or books found on Amazon. If you find a link that doesn't work, [[let me know|Message Me]].\n#[[Land Development Handbook, 2002|]]\n#[[Residential Land Development Practices: A Textbook on Developing Land into Finished Lots (Paperback)|]]\n#[[Sustainable Land Management: Challenges, Opportunities, and Trade-Offs (Paperback)|]]\n#[[Conservation Design for Subdivisions: A Practical Guide to Creating Open Space Networks (Paperback)|]]\n#[[NEW Autodesk Civil 3D|]] (not quite published yet)\n#[[Harnessing Autodesk Civil 3D 2006 (Paperback)|]] (Even though it's 2006 there's still going to be a lot of applicable stuff)\n#[[Civil Engineering News (Magazine)|]] (check back for availability)\n#[[The New Transit Town: Best Practices in Transit-Oriented Development (Paperback)|]]\n#...
See [[this link|]] for Autodesk's tutorial on how to drape an image over a surface. This could come in handy someday, you never know.
----\nUpdated to a new Calendar and relabeled old ones to follow a proper scheme in the [[Calendar]] list.\n----\nNew [[blog|Blogs]] added, [[|civil3drocks.blogspot]].\n----
\n__Resources__\n\nUpdate in the [[Books]] section with Dana's "[[The List|Dana's List]]," [[Autodesk Training|Autodesk Training Courseware]], and [[Free Online Trade Publications]] (the latter two are in [[Update]] mode currently).\n----\n\n__Jibberish__\n\nAlso I just got a new keyboard that closely approximates a laptop's. I guess this is the new trend in cheap keyboards; I think I like it.\n----
\n__Updates__\n\nI'm going to take it a little slower with my updating from now on. I've read back through [[some posts|August 5 2006]] and realized I must have been incredibly bored to post so much, but more importantly I've realized that so much information is hard to digest, especially in the format I present. Seems this non-linear format is tougher to get used to than I originally though it would be, but damn isn't it cool?\n\nI'm also going to start paying more attention to these guys: <<tag "To Do">> <<tag "Dev">> <<tag "Update">>.\n\nComments/suggestions/harassments? [[Message Me]]
__Resources__\n\nAdded new resource category, <<tag "Styles">> and a new item to it, [[Stylize Corridor Feature Lines]].\n----\n\nFor my reference: [[]]
__Resources__\n\nAutodesk has just recently (August 17) added a new [[Skill Builders]] titled "[[Label Styles|]]."\n\nNew entry on a performance tweak in [[Help]] titled [[Performance via INDEXCTL]]. Worth reading if you've got a sluggish drawing.\n----\n\n__Blogs__\n\nIt's looking more and more as if the tranformation of the [[|]] blog has become complete. Now you can head to one central location to check out posts from all these Civil3Dorks (hopefully they won't mind me posting their profiles/credentials):\n* Jason Hickey ([[beneaththelines.blogspot]])\n<<<\nHaving been in the Civil Engineering field since 1993, I found the step to Applications Engineer to be a very natural one. I work for ALACAD, an Autodesk reseller located in Birmingham, Alabama. I work with the ISD product line, which includes everything civil-related. I hope you find some of my collected tips, tricks, and observations useful!\n<<<\n* Dana Breig Probert, EIT ([[civil3drocks.blogspot]])\n<<<\nI graduated from Georgia Tech in 1998 with a BS Civil Engineering. Since then I have lived and engineered in Edmonton, Alberta, and the Mid Atlantic USA, mostly focusing on the Delmarva Peninsula. I have 8 years of experience doing Land Development Engineering including site planning, grading, utilities, stormwater management, you name it. For most of that work I used Land Desktop, but in late 2004 I discovered Civil 3D and it changed my life... so now my job is to help everyone in the world use Civil 3D to make their projects better. I was a member of the first ICE class (does that make me an ICE queen?) and I live, eat, sleep and breathe Civil 3D. I am married to a DOT Civil engineer, which means my life is completely boring including Bentley vs. Autodesk discussions over dinner and "Oh wow, it's raining. Let's go make sure our outfall structures are working" \n<<<\n* James Wedding, P.E.\n<<<\nAfter almost 10 years in the land development industry, I've joined Engineered Efficiency Inc. to offer consulting and training to those designing, managing, and constructing our infrastructure.\n<<<\n* Nick Zeeben\n<<<\nGraduated with a 2 year diploma from BCIT. Heavy emphasis on customization and CAD/Management. Have worked in the Production/IT/CAD field since. Spent the last 3 years as Technical Lead at a local reseller.\n<<<\n----\n\n__Site Development__\n\nI've gotten around to using more javascript in this site recently (aside from all the original [[TiddlyWiki|]] javascript of course) and in that spirit I've added the ''Civil 3D Blog Feed'' you now see on the right side of the page. This is simply a sample of [[Civil 3D News Feed]], a collection of all the Civil 3D blog RSS feeds I could find. There are tons of good readers out there but if I may make a recommendation, it would be [[Google Reader|]] simply for its ability to bookmark posts and label feeds.\n----\n\n<<haloscan comments>>\n<<haloscan trackbacks>>
<html><a target="_blank" href=""> <img border=0 src=""></a></html>\n\nAdded a great new wiget from [[|]] which allows me to chat with the users of this site. I can see this being amazingly huge technology in a very short time. Check out [[this article|]] for more info on the release of this cool feature.\n\nSo while you're here, Meebo Chat with me on the right.\n\n----\n\nAddition of a new tag, [[Resources]]. This should help bring the focal point of this site - it is a resource after all - to attention. It's also given me more inspiration to post all the goodies I've collected.\n\n----\n\nThis evening I went a little nuts on the site editing and configuration and added 4 new plugins to the site that should add some great front- and back-side useability to the site, once I get them configured of course.\n\nThey are: \nReminderTiddlers - Adds a reminder to the bottom of any Journal or regular Tiddler\nHaloscanMacro - Adds commenting and talkback functionality to Tiddlers\nStickyDate - Adds a predefined journal when it's date is reached\nNewerTiddlerPlugin - Allows the creation of Tiddler templates, such as the ones you see after following the link at the top of the page.\n\nI also attempted to add in a SiteMap, but that will require figuring out some other time.\n\nOther Tiddly plugins: [[TiddlyWikiPlugin Tag|]]
__Site Development__\n\nI've put in a new ''comments and trackback'' system using [[Haloscan|]]. Give it a try on today's post.\n//Note: You'll need to allow popups on this site//.\n----\n\n__Blogs__\n\nAdded [[]] and [[beneaththelines.autodesk]] to [[Blogs]] and finished updating [[beneaththelines.blogspot]] with the posts that I found most useful (though everything he's written holds value).\n----\n\n<<haloscan comments>>\n<<haloscan trackbacks>>
''ARCHIVED UPDATES''\n\nClick the linked/highlighted days to check out new updates.\n\n|>|>|>|>|>|>| ![[August|August06]] |\n| Sun | Mon | Tue | Wed | Thu | Fri | Sat |\n|>|!|bgcolor(#FFFF7E): [[1|August 1 2006]] |bgcolor(#FFFF7E): [[2|August 2 2006]] |bgcolor(#FFFF7E): [[3|August 3 2006]] |bgcolor(#FFFF7E): [[4|August 4 2006]] |bgcolor(#FFFF7E): [[5|August 5 2006]] |\n|bgcolor(#FFFF7E): [[6|August 6 2006]] | 7 | 8 |bgcolor(#FFFF7E): [[9|August 9 2006]] | 10 | 11 |bgcolor(#eee): 12 |\n|bgcolor(#FFFF7E): [[13|August 13 2006]] | 14 | 15 | 16 | 17 |bgcolor(#FFFF7E): [[18|August 18 2006]] |bgcolor(#FFFF7E): [[19|August 19 2006]] |\n|bgcolor(#FFFF7E): [[20|August 20 2006]] | 21 | 22 |bgcolor(#FFFF7E): [[23|August 23 2006]] | 24 | 25 |bgcolor(#eee): 26 |\n|bgcolor(#eee): 27 | 28 | 29 | 30 | 31 |>|!|
\n__Resources__\n\nI'm working on a new [[Help]] tiddler titled [[Map 3D Memory Management]] detailing how to tweak your memory settings for importing large image files. So far what you'll see in that post is only the help file information from Autodesk. I'll revise and post and update later when I get the time, I just didn't want to forget this tip.\n----\n\n__Autodesk__\n\nKeep an eye out for the brand new Civil 3D 2007 Service Pack 2, due out by Friday. Can you feel the excitement?\n\nLink to the Autodesk download area:\n\n\nAngel's SP2 Coverage:\n\n----\n\n<<haloscan comments>>
__Civil 3D News__\n\nIt looks like a new service pack (SP2) is on it's way for Civil 3D 2007, already. It also looks like quite a lot of buggy crashes have been fixed, which is what this program has needed desperately for quite a long time. Too bad they had to wait until SP2 to fix all these problems instead of releasing quick hotfixes... Anyways, the list of fixes is [[here|]]. Keep an eye out for the release!\n----\n\n__Development__\n\nUpdated the [[To Do]] list with a priority tab-set and some new objectives.\n\nThe SiteMap appears to be functioning well. It only needs a few tweaks now.\n----\n\n__Blogs__\n\nAdded a new [[Blog|Blogs]], [[acecivil3d.blogspot]].\n----\n\n__Resources__\n\nNew resource section [[Autodesk]] for official Autodesk resources. Includes sections [[Skill Builders]], [[C3D 2007 Service Pack 1a]], [[Autodesk Discussion Forums]], and [[Civil 3D White Papers]].\n\nNew resource section [[ReadMe]] for new helpful Civil 3D documents. Three new documents: [[Style Fundamentals]], [[Getting Started - Vault Highlights]], [[Customizing Tool Pallets]], and [[Hydrology and Hydraulic Tasks]].\n\nNew resource section [[Design]] added with notes on [[Knuckles and Cul de Sacs (AU)]], [[Site Grading Essentials (AU)]], and [[Civil 3D White Papers]].\n----\n\n__Site Map__\n\nFor a better view of how things are organized on this site - what with all the recent resource additions - visit the SiteMap.
__Blogs__\n\n[[beneaththelines.blogspot]]\n----\n\n__Resources__\n\nAdded [[Large Subdivision Design]] white paper in [[ReadMe]].\n\nAdded [[Intersection Design (AU)]] and [[Dynamic Corridor Boundaries]] in [[Design]].\n\nCreated new resource tag [[Help]] an moved [[Customizing Tool Pallets]] into it. This will be for items like customizing C3D and tips 'n' tricks.\n----\n\n__Books__\n\nAdded a category for [[Books]] with new entries [[Amazon]], [[Level 1 Training]], and [[Level 2 Training]].\n----\n\n__Updates__\n\nAs you may have noticed, some parts of this site need updating with regards to incomplete content. These items now have a new home in the tag [[Update]] which will help me keep these things in order (and hopefully to a minimum).\n\nAs always, the Blogs and Resources section of this site are in a continual state of update so tagging them [[Update]] would be redundant. Just keep checking back and if you want to know when I've updated, use the [[Calendar]]s. Also note that I may update a journal entry (such as this one) many times each day so it's best to re-read in case you may have missed something.\n----\n\n\nSiteMap
\n__Tips and Tricks__\n\n[[File Dialogue]] added to [[Help]]; discussing a command that will make life simpler in the unlikely event that Civil 3D crashes.\n\n[[Default Template]] added to [[Update]] as something I want to put on the site soon. This will be jettisoned to [[Help]] when finished.\n\n[[Attaching Images to a Surface]] added to [[Autodesk]] [[resources|Resources]].\n----\n\n__Resources__\n\nBecause everyone can use some more design workflows and help... new items for [[civil3drocks.blogspot]]:\n\n[[Cul-de-Sacs with Dana]] added to [[Design]].\n[[Pipe Crossing]] added to [[Design]].\n[[Pipe & Structure Labels]] added to [[Design]].\n[[Urban Land Institue|]].\n\nSome of my university-affiliated colleages might appreciate [[this link|]], an Autodesk website that offers free resources to students with a vaild university email address (from [[civil3d.wordpress]]).\n\nL.A. CAD Whitepapers - [[infrastructure solutions|]].\n\nATP (Augi (Autodesk user group international) Training Program) [[current|]] and [[archived|]] courses. Not a lot of Civil 3D focused material here but you'll still probably find something useful.\n\nNew category [[AUGI]] added to resources along with these ATP courses: [[ATP 064 - Focused VBA Lesson 1: Intro to VBA]] and [[ATP067 - Learning Visual LISP]].\nTiddler for all courses: [[All ATP Courses]].\n----\n\n__Site Issues__\n\nThis isn't a big deal, but if your browser caches this website (ie. stores a temporary copy) @@you may be missing out on some of the recent updates@@ between the period that your browser updates it's cache copy. If you believe this is happening, do a quick refresh when you first visit the page by holding down Ctrl and hitting F5. This will clear your browser's cache of this page and refresh. It works on any webpage.\n----\n\n__CAD Apps__\n\nFree CAD apps from Visit the [[Civil/Survey Directory|]].\n----\n\n\nSiteMap\n[[Update]]
__Resources__\n\nAdded to [[AUGI]] and [[Design]] is [[AUGI Civil 3D Tips & Tricks Part 1]] and [[AUGI Civil 3D Tips & Tricks Part 2]].\n----\n\n\nSiteMap\n[[Update]]
__Resources__\n\nAdded [[Break in the Undo/Redo Chain]] to [[Help]].\n\nMoved [[Default Template]] from [[Update]] to [[Help]].\n\nCheck out [[this link|]]. I'll write up something more extensive when I get the chance.
The (hopefully) obvious [[mega-resource|]] / place to vent.
Links for official Autodesk books/manuals to come...\n#\n#\n#
Suggestions? Send me a message in the [[C3D N Chat|Message Me]] module at the top right of this page (works in online and offline mode).
Have you watched the entire Back to the Future Trilogy? If you're cool like me, the answer is yes. Remeber the part in BTFII where Doc and Marty have returned from the future only to find that Biff had screwed everything to hell? In order to fix the chaos (or "undo" the chaos) they had to travel back in time in the current reality... if they were to travel forward in time theyd' accomplish nothing.\n\nWell it turns out that some of those same time travel principles apply to Autodesk products, specifically the undo/redo funtions. If I want to undo a long string of commands I surely can do it with minimal complications. But beware! If you intend to see "where in time" your undo's have left you by panning/zooming around you must consider that you will be creating an alternate reality within the program. If you choose to interrupt the current undo/redo pattern by panning and zooming you will not be able get back to your starting point and redo.\n\nEveryone loves a good paradox, that's what makes Back to the Future so awesome. Too bad it doesn't work like that in Civil 3D.
Refers to the Autodesk Civil 3D software (R2007).
I'm sure you're aware of the latest service pack but in case you hadn't installed it yet, here are the relevant links:\n\n[[All Downloads for Civil 3D 2007|]]\n\n[[Service Pack 1 A|]]\n\nIt's safe to assume that once you get the service pack all other download and hotfixes are applied automatically, but if you want to be sure, just compare the version info as Autodesk instructs (on the first link above) with each individual hotfix.
Calendars display links to all the journals I've published. The journals contain links to recent activity of that day. If you're looking to navigate the site, this is the best place to start.
Here is a link to all of the news feeds I have collected from various blogs across the 'Net. It's massive and there's a great deal to be learnt, so get started!\n\n[[All Civil 3D Google Reader Feeds|]]<html><br><a href=""><img src=""></img></a></html>\n----\n\nRelated: [[Blogs]]
Here are all the [[Autodesk white papers|]].\nSome are more valuable that others. For this reason, I have posted a select few "goodies" on this site, mostly under ReadMe.
!__Civil3D.com__\n\nThis site can now boast a contributing staff of 4 as a result of a [[recent union|August 19 2006]] of Civil 3D blog authors. This is probably my most visited blog.\n\n@@Visit the [[|]] blog@@.
/***\nJust some bits and pieces\n***/\n//{{{\nconfig.messages.messageClose.text = "X"; // default is "close"\nconfig.views.wikified.defaultText = ""; // default is "The tiddler '%0' doesn't yet exist. Double-click to create it"\nconfig.options.chkHttpReadOnly = false; // Enable editing so that visitors can experiment with it\n//}}}
Here is an excellent post by Dana over at [[civil3drocks.blogspot]]:\n\ndetailing one design route for creating parcels around cul-de-sacs. Be forwarned: there are evil iterations about! ;)\n\nSee also [[Customizing Tool Pallets]].
Ever wanted to customize a tool pallet? This [[document|]], from [[civil3drocks.blogspot]] will get you started.
Check out [[Dana's|civil3drocks.blogspot]] book list [[here|]]. There are some valuable resources there for books on Amazon. Some of her's may overlap with [[mine|Amazon]].
To make a drawing or template your default drawing to open when you hit "new," follow these steps:\n#Open the program options by typing [op] in the command line\n#Change to the files tab\n#Scroll through the options until you get to Template Settings, then expand that item\n#Expand Default Template File Name for QNEW\n#Edit the file address and choose the location of the file you wish to be your default template\n#Hit OK to close the Options window\n\nMake sure that the file you've chosen is in a location that will not move (or at least won't move often enough to be a hassle to change).
[[Resources]] [[September 2006]] [[Civil 3D News Feed]] [[August 2006]]
/**************************************************\n * dom-drag.js\n * 09.25.2001\n *\n **************************************************\n * 10.28.2001 - fixed minor bug where events\n * sometimes fired off the handle, not the root.\n **************************************************/\n/*{{{*/\nvar Drag = {\n obj:null,\n\n init:\n function(o, oRoot, minX, maxX, minY, maxY) {\n o.onmousedown = Drag.start;\n o.root = oRoot && oRoot != null ? oRoot : o ;\n if (isNaN(parseInt("0px";\n if (isNaN(parseInt("0px";\n o.minX = typeof minX != 'undefined' ? minX : null;\n o.minY = typeof minY != 'undefined' ? minY : null;\n o.maxX = typeof maxX != 'undefined' ? maxX : null;\n o.maxY = typeof maxY != 'undefined' ? maxY : null;\n o.root.onDragStart = new Function();\n o.root.onDragEnd = new Function();\n o.root.onDrag = new Function();\n },\n\n start:\n function(e) {\n var o = Drag.obj = this;\n e = Drag.fixE(e);\n var y = parseInt(;\n var x = parseInt(;\n o.root.onDragStart(x, y, Drag.obj.root);\n o.lastMouseX = e.clientX;\n o.lastMouseY = e.clientY;\n if (o.minX != null) o.minMouseX = e.clientX - x + o.minX;\n if (o.maxX != null) o.maxMouseX = o.minMouseX + o.maxX - o.minX;\n if (o.minY != null) o.minMouseY = e.clientY - y + o.minY;\n if (o.maxY != null) o.maxMouseY = o.minMouseY + o.maxY - o.minY;\n document.onmousemove = Drag.drag;\n document.onmouseup = Drag.end;\n["z-index"] = "10";\n return false;\n },\n\n drag:\n function(e) {\n e = Drag.fixE(e);\n var o = Drag.obj;\n var ey = e.clientY;\n var ex = e.clientX;\n var y = parseInt(;\n var x = parseInt(;\n var nx, ny;\n if (o.minX != null) ex = Math.max(ex, o.minMouseX);\n if (o.maxX != null) ex = Math.min(ex, o.maxMouseX);\n if (o.minY != null) ey = Math.max(ey, o.minMouseY);\n if (o.maxY != null) ey = Math.min(ey, o.maxMouseY);\n nx = x + (ex - o.lastMouseX);\n ny = y + (ey - o.lastMouseY);\n["left"] = nx + "px";\n["top"] = ny + "px";\n Drag.obj.lastMouseX = ex;\n Drag.obj.lastMouseY = ey;\n Drag.obj.root.onDrag(nx, ny, Drag.obj.root);\n return false;\n },\n\n end:\n function() {\n document.onmousemove = null;\n document.onmouseup = null;\n["z-index"] = "0";\n Drag.obj.root.onDragEnd(parseInt(["left"]), parseInt(["top"]), Drag.obj.root);\n Drag.obj = null;\n },\n\n fixE:\n function(e) {\n if (typeof e == 'undefined') e = window.event;\n if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;\n if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;\n return e;\n }\n};\n/*}}}*/\n
Autodesk white paper on the workflow for designing dynamic boundaries for corridor models: [[link|]], 11 pages.
<!---\n| Name:|~TagglyTaggingEditTemplate |\n| Version:|1.1 (12-Jan-2006)|\n| Source:||\n| Purpose:|See TagglyTagging for more info|\n| Requires:|You need the CSS in TagglyTaggingStyles to make it look right|\n--->\n<!--{{{-->\n<div class="toolbar" macro="toolbar +saveTiddler closeOthers cancelTiddler deleteTiddler"><span macro='expandEdit'></span></div>\n<div class="title" macro="view title"></div>\n<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>\n<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>\n<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>\n<div class="editor" macro="edit text"></div>\n<div style='text-align: right;' macro='resize'></div>\n<br/>\n<!--}}}-->
/***\n|''Name:''|ExpandEditPlugin|\n|''Author:''|Jon Scully|\n|''License:''|unknown|\n|''~CoreVersion:''|2.1.2|\n!!!!!OBSOLETE\nPlease see [[ResizeEditTextPlugin]] and [[DragPlugin]].\n!!!!!Purpose\nProvide an 'expand' button in edit mode that increases the textarea by 10 rows per click.\n!!!!!Configuration\nAlter [[EditTemplate]] as follows:\n{{{<div class='toolbar' macro='toolbar ...'>}}}@@<span macro='expandEdit'></span>@@{{{</div>}}}\n!!!!!Code\n***/\n/*{{{*/\nconfig.macros.expandEdit = {}\n\nconfig.macros.expandEdit.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n if(!tiddler instanceof Tiddler) return;\n var btn = createTiddlyButton(place,"expand","expand text area",this.onClickExpand);\n btn.setAttribute("newTitle",tiddler.title);\n}\n\nconfig.macros.expandEdit.onClickExpand = function(e) {\n var title = this.getAttribute("newTitle");\n var rows = story.getTiddlerField(title,"text").rows;\n rows += 10;\n story.getTiddlerField(title,"text").rows = rows;\n}\n/*}}}*/\n
Ever had this happen: you're in the middle of a task and for whatever reason C3D crashes? It's a rhetorical question, I know it's happened to you many times. Well a side effect of this is that sometimes when you reopen the program and attempt to open another drawing, you get a command line prompt instead of the much more useful file dialogue box. If you've struggled to fix this but have since forgotten the command or if you're lucky and have avoided it so far but want to be prepared, then take this down:\n\nEnter at the command line:\n{{{\nfiledia 1\n}}}\n//Note: you cannot enter this command while being prompted for the drawing location if filedia=0. Input the command when a drawing is already open, such as your [[Default Template]]//.
<html>\n<iframe src="" scrolling="no" frameBorder="0" height="220" width="215"></iframe>\n</html>
I plan on updating this tiddler with a bunch of cool free engineering-related trade publications from [[this site|]] in the future. For now, browse away for yourself and tell me if you find anything valuable (by sending me an online/offline message in the ''C3D N Chat'' at the top right of this page).
A paper on getting started in Civil 3D 2007:\n\n[[Getting Started|]]\n\nIt's a broad and conceptual look at Civil 3D 2007, 24 pages long mostly highlighting the new Vault integration. It won't really tell you how to do anything but it gives some insight into the program architecture in it's most basic sense.
Welcome to your brand new [[MonkeyPirateTiddlyWiki|]]. This is the standard empty [[TiddlyWiki|]] (version <<version>>) preconfigured with a few bits and pieces from MPTW, in particular the layout, the colours, and the popular [[TagglyTagging|]]. If you're new to ~TagglyTagging then try the (slightly out-of-date) [[FAQ|]] and [[Tutorial|]].\n\nTo get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:\n* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)\n* MainMenu: The menu (usually on the left)\n* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened\nYou'll also need to enter your username for signing your edits: <<option txtUserName>>\n\nTo create your own tiddlers, click 'new tiddler' in the right sidebar. To edit a tiddler click the 'edit' button in the tiddler's toolbar. To save all your tiddlers click 'save changes' in the right sidebar. If you're new to TiddlyWiki check out the formatting info [[here|]].\n\nUse this to import tiddlers from another TiddlyWiki. You can use a local file (click Browse...) or type the url of an online TiddlyWiki.\n<<importTiddlers inline>>\nTo change your colour scheme you can edit the styles in StyleSheet. (Refer to StyleSheetColors and StyleSheetLayout for all styles used).\n\n
/***\n|Name|HaloscanMacro|\n|Created by|JimSpeth|\n|Location||\n|Version|1.1.0|\n|Requires|~TW2.x|\n\n!Description\nComment and trackback support for TiddlyWiki (via Haloscan).\n\n!History\n* 16-Feb-06, version 1.1.0, drastic changes, now uses settings from haloscan account config\n* 31-Jan-06, version 1.0.1, fixed display of counts for default tiddlers\n* 30-Jan-06, version 1.0, initial release\n\n!Examples\n|!Source|!Output|h\n|{{{<<haloscan comments>>}}}|<<haloscan comments>>|\n|{{{<<haloscan trackbacks>>}}}|<<haloscan trackbacks>>|\n\n!Installation\nRegister for a [[Haloscan|]] account. It's free and painless.\nInstall the HaloscanMacro in a new tiddler with a tag of systemConfig (save and reload to activate).\nIn the macro configuration code (below), change //YourName// to your Haloscan account name.\nUse the macro somewhere in a tiddler (see ViewTemplate for an example).\n\n!Settings\nYou can adjust various options for your account in the member configuration area of Haloscan's web site. The macro will use these settings when formatting the links.\n\n!Code\n***/\n//{{{\n\n/* change "YourName" to your Haloscan account name */\nconfig.macros.haloscan = {account: "mthompson", baseURL: ""};\n\nvar haloscanLoaded = 0;\nconfig.macros.haloscan.load = function ()\n{\n if (haloscanLoaded == 1)\n return;\n \n account = config.macros.haloscan.account;\n if (!account || (account == "mthompson"))\n account = store.getTiddlerText("SiteTitle");\n \n var el = document.createElement('script');\n el.language = 'JavaScript'; \n el.type = 'text/javascript'; \n el.src = config.macros.haloscan.baseURL + account;\n document.documentElement.childNodes[0].appendChild(el);\n \n haloscanLoaded = 1;\n}\nconfig.macros.haloscan.load();\n\n/* this totally clobbers document.write, i hope that's ok */\nvar safeWrite = function(s)\n{\n document.written = s;\n return s;\n};\ndocument.write = safeWrite;\n\nconfig.macros.haloscan.refreshDefaultTiddlers = function ()\n{\n var start = store.getTiddlerText("DefaultTiddlers");\n if (start)\n {\n var titles = start.readBracketedList();\n for (var t=titles.length-1; t>=0; t--)\n story.refreshTiddler(titles[t], DEFAULT_VIEW_TEMPLATE, 1);\n }\n}\n\nvar haloscanRefreshed = 0;\nconfig.macros.haloscan.handler = function (place, macroName, params, wikifier, paramString, tiddler)\n{\n if (typeof HaloScan == 'undefined')\n {\n if (haloscanRefreshed == 0)\n {\n setTimeout("config.macros.haloscan.refreshDefaultTiddlers()", 1);\n haloscanRefreshed = 1;\n }\n return;\n }\n \n var id = story.findContainingTiddler(place).id.substr(7);\n var hs_search = new RegExp('\s\sW','gi');\n id = id.replace(hs_search,"_");\n \n account = config.macros.haloscan.account;\n if (!account || (account == "YourName"))\n account = store.getTiddlerText("SiteTitle");\n \n var haloscanError = function (msg)\n {\n createTiddlyError(place, config.messages.macroError.format(["HaloscanMacro"]), config.messages.macroErrorDetails.format(["HaloscanMacro", msg]));\n }\n \n if (params.length == 1)\n {\n if (params[0] == "comments")\n {\n postCount(id);\n commentsLabel = document.written;\n commentsPrompt = "Comments on this tiddler";\n var commentsHandler = function(e) { HaloScan(id); return false; };\n var commentsButton = createTiddlyButton(place, commentsLabel, commentsPrompt, commentsHandler);\n }\n else if (params[0] == "trackbacks")\n {\n postCountTB(id);\n trackbacksLabel = document.written;\n trackbacksPrompt = "Trackbacks for this tiddler";\n var trackbacksHandler = function(e) { HaloScanTB(id); return false; };\n var trackbackButton = createTiddlyButton(place, trackbacksLabel, trackbacksPrompt, trackbacksHandler);\n }\n else\n haloscanError("unknown parameter: " + params[0]);\n }\n else if (params.length == 0)\n haloscanError("missing parameter");\n else\n haloscanError("bad parameter count");\n}\n\n//}}}\n
/***\nTo use, add {{{[[HorizontalMainMenuStyles]]}}} to your StyleSheet tiddler, or you can just paste the CSS in directly. See also HorizontalMainMenu and PageTemplate.\n***/\n/*{{{*/\n\n#topMenu br {display:none; }\n#topMenu { background: #39a; }\n#topMenu { padding:2px; }\n#topMenu .button, #topMenu .tiddlyLink {\n margin-left:0.5em; margin-right:0.5em;\n padding-left:3px; padding-right:3px;\n color:white; font-size:115%;\n}\n#topMenu .button:hover, #topMenu .tiddlyLink:hover { background:#178;}\n\n#displayArea { margin: 1em 15.7em 0em 1em; } /* so we use the freed up space */\n\n/* just in case want some QuickOpenTags in your topMenu */\n#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }\n#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }\n#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }\n\n\n/*}}}*/
<<<\nOne of the common misconceptions about Autodesk ® Civil 3D® software is that engineers cannot use it to perform hydrology and hydraulics (H&H) for land development. Although it does not currently contain specific functions for hydrologic or pipeflow analysis, it can handle many related tasks.\n<<<\n\nAutodesk white paper [[here|]].
/***\n''Import Tiddlers Plugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource:\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|]]^^\n\nWhen many people share and edit copies of the same TiddlyWiki document, the ability to quickly collect all these changes back into a single, updated document that can then be redistributed to the entire group is very important. This plugin lets you selectively combine tiddlers from any two TiddlyWiki documents. It can also be very useful when moving your own tiddlers from document to document (e.g., when upgrading to the latest version of TiddlyWiki, or 'pre-loading' your favorite stylesheets into a new 'empty' TiddlyWiki document.)\n\n!!!!!Inline interface (live)\n<<<\n<<importTiddlers inline>>\n<<<\n!!!!!Macro Syntax\n<<<\n{{{<<importTiddlers>>}}}\ncreates "import tiddlers" link. click to show/hide import control panel\n\n{{{<<importTiddlers inline>>}}}\ncreates import control panel directly in tiddler content\n\n{{{<<importTiddlers filter source quiet ask>>}}}\nnon-interactive 'automatic' import.\n''filter'' determines which tiddlers will be automatically selected for importing. Use one of the following keywords:\n>''"new"'' retrieves only tiddlers that are found in the import source document, but do not yet exist in the destination document\n>''"changes"'' retrieves only tiddlers that exist in both documents for which the import source tiddler is newer than the existing tiddler\n>''"updates"'' retrieves both ''new'' and ''changed'' tiddlers (this is the default action when none is specified)\n>''"all"'' retrieves ALL tiddlers from the import source document, even if they have not been changed.\n''source'' is the location of the imported document. It can be either a local document or an URL:\n>filename is any local path/file, in whatever format your system requires\n>URL is any remote web location that starts with "http://" or "https://"\n''"quiet"'' (optional)\n>supresses all status message during the import processing (e.g., "opening local file...", "found NN tiddlers..." etc). Note that if ANY tiddlers are actualy imported, a final information message will still be displayed (along with the ImportedTiddlers report), even when 'quiet' is specified. This ensures that changes to your document cannot occur without any visible indication at all.\n''"ask"'' (optional)\n>adds interactive confirmation. A browser message box (OK/Cancel) is displayed for each tiddler that will be imported, so that you can manually bypass any tiddlers that you do not want to import.\n\n''Special tag values: importReplace and importPublic''\n\nBy adding these special tags to an existing tiddler, you can precisely control whether or not to allow updates to that tiddler as well as decide which tiddlers in your document can be automatically imported by others.\n*''For maximum safety, the default action is to prevent existing tiddlers from being unintentionally overwritten by incoming tiddlers.'' To allow an existing tiddler to be overwritten by an imported tiddler, you must tag the existing tiddler with ''<<tag importReplace>>''\n*''For maximum privacy, the default action for //outgoing// tiddlers is to NOT automatically share your tiddlers with others.'' To allow a tiddler in your document to be shared via auto-import actions by others, you must tag it with ''<<tag importPublic>>''\n//Note: these tags are only applied when using the auto-import processing. When using the interactive control panel, all tiddlers in the imported document are available in the listbox, regardless of their tag values.//\n<<<\n!!!!!Interactive Usage\n<<<\nWhen used interactively, a control panel is displayed consisting of an "import source document" filename input (text field plus a ''[Browse...]'' button), a listbox of available tiddlers, a "differences only" checkbox, an "add tags" input field and four push buttons: ''[open]'', ''[select all]'', ''[import]'' and ''[close]''.\n\nPress ''[browse]'' to select a TiddlyWiki document file to import. You can also type in the path/filename or a remote document URL (starting with http://)and press ''[open]''. //Note: There may be some delay to permit the browser time to access and load the document before updating the listbox with the titles of all tiddlers that are available to be imported.//\n\nSelect one or more titles from the listbox (hold CTRL or SHIFT while clicking to add/remove the highlight from individual list items). You can press ''[select all]'' to quickly highlight all tiddler titles in the list. Use the ''[-]'', ''[+]'', or ''[=]'' links to adjust the listbox size so you can view more (or less) tiddler titles at one time. When you have chosen the tiddlers you want to import and entered any extra tags, press ''[import]'' to begin copying them to the current TiddlyWiki document.\n\n''select: all, new, changes, or differences''\n\nYou can click on ''all'', ''new'', ''changes'', or ''differences'' to automatically select a subset of tiddlers from the list. This makes it very quick and easy to find and import just the updated tiddlers you are interested in:\n>''"all"'' selects ALL tiddlers from the import source document, even if they have not been changed.\n>''"new"'' selects only tiddlers that are found in the import source document, but do not yet exist in the destination document\n>''"changes"'' selects only tiddlers that exist in both documents but that are newer in the source document\n>''"differences"'' selects all new and existing tiddlers that are different from the destination document (even if destination tiddler is newer)\n\n''Import Tagging:''\n\nTiddlers that have been imported can be automatically tagged, so they will be easier to find later on, after they have been added to your document. New tags are entered into the "add tags" input field, and then //added// to the existing tags for each tiddler as it is imported.\n\n''Skip, Rename, Merge, or Replace:''\n\nWhen importing a tiddler whose title is identical to one that already exists, the import process pauses and the tiddler title is displayed in an input field, along with four push buttons: ''[skip]'', ''[rename]'', ''[merge]'' and ''[replace]''.\n\nTo bypass importing this tiddler, press ''[skip]''. To import the tiddler with a different name (so that both the tiddlers will exist when the import is done), enter a new title in the input field and then press ''[rename]''. Press ''[merge]'' to combine the content from both tiddlers into a single tiddler. Press ''[replace]'' to overwrite the existing tiddler with the imported one, discarding the previous tiddler content.\n\n//Note: if both the title ''and'' modification date/////time match, the imported tiddler is assumed to be identical to the existing one, and will be automatically skipped (i.e., not imported) without asking.//\n\n''Import Report History''\n\nWhen tiddlers are imported, a report is generated into ImportedTiddlers, indicating when the latest import was performed, the number of tiddlers successfully imported, from what location, and by whom. It also includes a list with the title, date and author of each tiddler that was imported.\n\nWhen the import process is completed, the ImportedTiddlers report is automatically displayed for your review. If more tiddlers are subsequently imported, a new report is //added// to ImportedTiddlers, above the previous report (i.e., at the top of the tiddler), so that a reverse-chronological history of imports is maintained.\n\nIf a cumulative record is not desired, the ImportedTiddlers report may be deleted at any time. A new ImportedTiddlers report will be created the next time tiddlers are imported.\n\nNote: You can prevent the ImportedTiddlers report from being generated for any given import activity by clearing the "create a report" checkbox before beginning the import processing.\n\n<<<\n!!!!!Installation\n<<<\ncopy/paste the following tiddlers into your document:\n''ImportTiddlersPlugin'' (tagged with <<tag systemConfig>>)\n\ncreate/edit ''SideBarOptions'': (sidebar menu items) \n^^Add "< < ImportTiddlers > >" macro^^\n\n''Quick Installation Tip #1:''\nIf you are using an unmodified version of TiddlyWiki (core release version <<version>>), you can get a new, empty TiddlyWiki with the Import Tiddlers plugin pre-installed (''[[download from here|TW+ImportExport.html]]''), and then simply import all your content from your old document into this new, empty document.\n<<<\n!!!!!Revision History\n<<<\n''2006.02.17 [2.6.0]''\nRemoved "differences only" listbox display mode, replaced with selection filter 'presets': all/new/changes/differences. Also fixed initialization handling for "add new tags" so that checkbox state is correctly tracked when panel is first displayed.\n''2006.02.16 [2.5.4]''\nadded checkbox options to control "import remote tags" and "keep existing tags" behavior, in addition to existing "add new tags" functionality.\n''2006.02.14 [2.5.3]''\nFF1501 corrected unintended global 't' (loop index) in importReport() and autoImportTiddlers()\n''2006.02.10 [2.5.2]''\ncorrected unintended global variable in importReport().\n''2006.02.05 [2.5.1]''\nmoved globals from window.* to config.macros.importTiddlers.* to avoid FireFox crash bug when referencing globals\n''2006.01.18 [2.5.0]''\nadded checkbox for "create a report". Default is to create/update the ImportedTiddlers report. Clear the checkbox to skip this step.\n''2006.01.15 [2.4.1]''\nadded "importPublic" tag and inverted default so that auto sharing is NOT done unless tagged with importPublic\n''2006.01.15 [2.4.0]''\nAdded support for tagging individual tiddlers with importSkip, importReplace, and/or importPrivate to control which tiddlers can be overwritten or shared with others when using auto-import macro syntax. Defaults are to SKIP overwriting existing tiddlers with imported tiddlers, and ALLOW your tiddlers to be auto-imported by others.\n''2006.01.15 [2.3.2]''\nAdded "ask" parameter to confirm each tiddler before importing (for use with auto-importing)\n''2006.01.15 [2.3.1]''\nStrip TW core scripts from import source content and load just the storeArea into the hidden IFRAME. Makes loading more efficient by reducing the document size and by preventing the import document from executing its TW initialization (including plugins). Seems to resolve the "Found 0 tiddlers" problem. Also, when importing local documents, use convertUTF8ToUnicode() to convert the file contents so support international characters sets.\n''2006.01.12 [2.3.0]''\nReorganized code to use callback function for loading import files to support event-driven I/O via an ASYNCHRONOUS XMLHttpRequest. Let's processing continue while waiting for remote hosts to respond to URL requests. Added non-interactive 'batch' macro mode, using parameters to specify which tiddlers to import, and from what document source. Improved error messages and diagnostics, plus an optional 'quiet' switch for batch mode to eliminate //most// feedback.\n''2006.01.11 [2.2.0]''\nAdded "[by tags]" to list of tiddlers, based on code submitted by BradleyMeck\n''2006.01.09 [2.1.1]''\nWhen a URL is typed in, and then the "open" button is pressed, it generates both an onChange event for the file input and a click event for open button. This results in multiple XMLHttpRequest()'s which seem to jam things up quite a bit. I removed the onChange handling for file input field. To open a file (local or URL), you must now explicitly press the "open" button in the control panel.\n''2006.01.08 [2.1.0]''\nIMPORT FROM ANYWHERE!!! re-write getImportedTiddlers() logic to either read a local file (using local I/O), OR... read a remote file, using a combination of XML and an iframe to permit cross-domain reading of DOM elements. Adapted from example code and techniques courtesy of Jonny LeRoy.\n''2006.01.06 [2.0.2]''\nWhen refreshing list contents, fixed check for tiddlerExists() when "show differences only" is selected, so that imported tiddlers that don't exist in the current file will be recognized as differences and included in the list.\n''2006.01.04 [2.0.1]''\nWhen "show differences only" is NOT checked, import all tiddlers that have been selected even when they have a matching title and date.\n''2005.12.27 [2.0.0]''\nUpdate for TW2.0\nDefer initial panel creation and only register a notification function when panel first is created\n''2005.12.22 [1.3.1]''\ntweak formatting in importReport() and add 'discard report' link to output\n''2005.12.03 [1.3.0]''\nDynamically create/remove importPanel as needed to ensure only one instance of interface elements exists, even if there are multiple instances of macro embedding. Also, dynamically create/recreate importFrame each time an external TW document is loaded for importation (reduces DOM overhead and ensures a 'fresh' frame for each document)\n''2005.11.29 [1.2.1]''\nfixed formatting of 'detail info' in importReport()\n''2005.11.11 [1.2.0]''\nadded 'inline' param to embed controls in a tiddler\n''2005.11.09 [1.1.0]''\nonly load HTML and CSS the first time the macro handler is called. Allows for redundant placement of the macro without creating multiple instances of controls with the same ID's.\n''2005.10.25 [1.0.5]''\nfixed typo in importReport() that prevented reports from being generated\n''2005.10.09 [1.0.4]''\ncombined documentation with plugin code instead of using separate tiddlers\n''2005.08.05 [1.0.3]''\nmoved CSS and HTML definitions into plugin code instead of using separate tiddlers\n''2005.07.27 [1.0.2]''\ncore update 1.2.29: custom overlayStyleSheet() replaced with new core setStylesheet()\n''2005.07.23 [1.0.1]''\nadded parameter checks and corrected addNotification() usage\n''2005.07.20 [1.0.0]''\nInitial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/]]\n<<<\n!!!!!Code\n***/\n\n// // Version\n//{{{\nversion.extensions.importTiddlers = {major: 2, minor: 6, revision: 0, date: new Date(2006,2,17)};\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// // IE needs explicit global scoping for functions/vars called from browser events\n//{{{\nwindow.onClickImportButton=onClickImportButton;\nwindow.loadImportFile=loadImportFile;\nwindow.refreshImportList=refreshImportList;\n//}}}\n\n// // default cookie/option values\n//{{{\nif (!config.options.chkImportReport) config.options.chkImportReport=true;\n//}}}\n\n\n// // ''MACRO DEFINITION''\n\n//{{{\nconfig.macros.importTiddlers = { };\nconfig.macros.importTiddlers = {\n label: "import tiddlers",\n prompt: "Copy tiddlers from another document",\n countMsg: "%0 tiddlers selected for import",\n src: "", // path/filename or URL of document to import\n inbound: null, // hash-indexed array of tiddlers from other document\n newTags: "", // text of tags added to imported tiddlers\n addTags: true, // add new tags to imported tiddlers\n listsize: 8, // # of lines to show in imported tiddler list\n importTags: true, // include tags from remote source document when importing a tiddler\n keepTags: true, // retain existing tags when replacing a tiddler\n index: 0, // current processing index in import list\n sort: "" // sort order for imported tiddler listbox\n};\n\nconfig.macros.importTiddlers.handler = function(place,macroName,params) {\n // LINK WITH FLOATING PANEL\n if (!params[0]) {\n createTiddlyButton(place,this.label,this.prompt,onClickImportMenu);\n return;\n }\n // INLINE TIDDLER CONTENT\n if (params[0]=="inline") {\n createImportPanel(place);\n document.getElementById("importPanel").style.position="static";\n document.getElementById("importPanel").style.display="block";\n return;\n }\n // NON-INTERACTIVE BATCH MODE\n switch (params[0]) {\n case 'all':\n case 'new':\n case 'changes':\n case 'updates':\n var filter=params.shift();\n break;\n default:\n var filter="updates";\n break;\n } \n if (!params[0]||!params[0].length) return; // filename is required\n config.macros.importTiddlers.src=params.shift();\n var quiet=(params[0]=="quiet"); if (quiet) params.shift();\n var ask=(params[0]=="ask"); if (ask) params.shift();\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n // load storeArea from a hidden IFRAME, then apply import rules and add/replace tiddlers\n loadImportFile(config.macros.importTiddlers.src,filter,quiet,ask,autoImportTiddlers);\n}\n//}}}\n\n// // ''READ TIDDLERS FROM ANOTHER DOCUMENT''\n\n//{{{\nfunction loadImportFile(src,filter,quiet,ask,callback) {\n if (!quiet) clearMessage();\n // LOCAL FILE\n if ((src.substr(0,7)!="http://")&&(src.substr(0,8)!="https://")) {\n if (!quiet) displayMessage("Opening local document: "+ src);\n var txt=loadFile(src);\n if(!txt) { if (!quiet) displayMessage("Could not open local document: "+src); }\n else {\n var s="<html><body>"+txt.substr(txt.indexOf('<div id="storeArea">'));\n if (!quiet) displayMessage(txt.length+" bytes in document. ("+s.length+" bytes used for tiddler storage)");\n config.macros.importTiddlers.inbound = readImportedTiddlers(convertUTF8ToUnicode(s));\n var count=config.macros.importTiddlers.inbound?config.macros.importTiddlers.inbound.length:0;\n if (!quiet) displayMessage("Found "+count+" tiddlers in "+src);\n if (callback) callback(src,filter,quiet,ask);\n }\n return;\n }\n // REMOTE FILE\n var x; // XML object\n try {x = new XMLHttpRequest()}\n catch(e) {\n try {x = new ActiveXObject("Msxml2.XMLHTTP")}\n catch (e) {\n try {x = new ActiveXObject("Microsoft.XMLHTTP")}\n catch (e) { return }\n }\n }\n x.onreadystatechange = function() {\n if (x.readyState == 4) {\n if (x.status == 200) {\n var sa="<html><body>"+x.responseText.substr(x.responseText.indexOf('<div id="storeArea">'));\n if (!quiet) displayMessage(x.responseText.length+" bytes in document. ("+sa.length+" bytes used for tiddler storage)");\n config.macros.importTiddlers.inbound = readImportedTiddlers(sa);\n var count=config.macros.importTiddlers.inbound?config.macros.importTiddlers.inbound.length:0;\n if (!quiet) displayMessage("Found "+count+" tiddlers in "+src);\n if (callback) callback(src,filter,quiet,ask);\n }\n else\n if (!quiet) displayMessage("Could not open remote document:"+ src+" (error="+x.status+")");\n }\n }\n if (document.location.protocol=="file:") { // UniversalBrowserRead only works from a local file context\n try {'UniversalBrowserRead')}\n catch (e) { if (!quiet) displayMessage(e.description?e.description:e.toString()); }\n }\n if (!quiet) displayMessage("Opening remote document: "+ src);\n try {\n var url=src+(src.indexOf('?')<0?'?':'&')+'nocache='+Math.random();\n"GET",url,true);\n x.overrideMimeType('text/html');\n x.send(null);\n }\n catch (e) {\n if (!quiet) {\n displayMessage("Could not open remote document: "+src);\n displayMessage(e.description?e.description:e.toString());\n }\n }\n}\n\nfunction readImportedTiddlers(txt)\n{\n var importedTiddlers = [];\n // create frame\n var f=document.getElementById("importFrame");\n if (f) document.body.removeChild(f);\n f=document.createElement("iframe");\n"importFrame";\n"0px";"0px";"0px";\n document.body.appendChild(f);\n // get document\n var d=f.document;\n if (f.contentDocument) d=f.contentDocument; // For NS6\n else if (f.contentWindow) d=f.contentWindow.document; // For IE5.5 and IE6\n // load source into document\n; d.writeln(txt); d.close();\n // read tiddler DIVs from storeArea DOM element \n var importStore = [];\n var importStoreArea = d.getElementById("storeArea");\n if (!importStoreArea || !(importStore=importStoreArea.childNodes) || (importStore.length==0)) { return null; }\n importStoreArea.normalize();\n for(var t = 0; t < importStore.length; t++) {\n var e = importStore[t];\n var title = null;\n if(e.getAttribute)\n title = e.getAttribute("tiddler");\n if(!title && && (,5) == "store"))\n title =;\n if(title && title != "") {\n var theImported = new Tiddler();\n theImported.loadFromDiv(e,title);\n importedTiddlers.push(theImported);\n }\n }\n return importedTiddlers;\n}\n//}}}\n\n// // ''NON-INTERACTIVE IMPORT''\n\n// // import all/new/changed tiddlers into store, replacing or adding tiddlers as needed\n//{{{\nfunction autoImportTiddlers(src,filter,quiet,ask)\n{\n var count=0;\n if (config.macros.importTiddlers.inbound) for (var t=0;t<config.macros.importTiddlers.inbound.length;t++) {\n var theImported = config.macros.importTiddlers.inbound[t];\n var theExisting = store.getTiddler(theImported.title);\n\n // only import tiddlers if tagged with "importPublic"\n if (theImported.tags && theImported.tags.find("importPublic")==null)\n { config.macros.importTiddlers.inbound[t].status=""; continue; } // status=="" means don't show in report\n\n // never import the "ImportedTiddlers" history from the other document...\n if (theImported.title=='ImportedTiddlers')\n { config.macros.importTiddlers.inbound[t].status=""; continue; } // status=="" means don't show in report\n\n // check existing tiddler for importReplace, or systemConfig tags\n config.macros.importTiddlers.inbound[t].status="added"; // default - add any tiddlers not filtered out\n if (store.tiddlerExists(theImported.title)) {\n config.macros.importTiddlers.inbound[t].status="replaced";\n if (!theExisting.tags||(theExisting.tags.find("importReplace")==null))\n { config.macros.importTiddlers.inbound[t].status="not imported - tiddler already exists (use importReplace to allow changes)"; continue; }\n if ((theExisting.tags.find("systemConfig")!=null)||(theImported.tags.find("systemConfig")!=null))\n config.macros.importTiddlers.inbound[t].status+=" - WARNING: an active systemConfig plugin has been added or updated";\n }\n\n // apply the all/new/changes/updates filter \n if (filter!="all") {\n if ((filter=="new") && store.tiddlerExists(theImported.title))\n { config.macros.importTiddlers.inbound[t].status="not imported - tiddler already exists"; continue; }\n if ((filter=="changes") && !store.tiddlerExists(theImported.title))\n { config.macros.importTiddlers.inbound[t].status="not imported - new tiddler"; continue; }\n if (store.tiddlerExists(theImported.title) && ((theExisting.modified.getTime()-theImported.modified.getTime())>=0))\n { config.macros.importTiddlers.inbound[t].status="not imported - tiddler is unchanged"; continue; }\n }\n\n // get confirmation if required\n if (ask && !confirm("Import "+(theExisting?"updated":"new")+" tiddler '"+theImported.title+"'\snfrom "+src))\n { config.macros.importTiddlers.inbound[t].status="skipped - cancelled by user"; continue; }\n\n // DO THE IMPORT!!\n store.addTiddler(theImported); count++;\n }\n importReport(quiet); // generate a report (as needed) and display it if not 'quiet'\n if (count) store.setDirty(true); \n // always show final message when tiddlers were actually imported\n if (!quiet||count) displayMessage("Imported "+count+" tiddler"+(count!=1?"s":"")+" from "+src);\n}\n//}}}\n\n// // ''REPORT GENERATOR''\n\n//{{{\nfunction importReport(quiet)\n{\n if (!config.macros.importTiddlers.inbound) return;\n // DEBUG alert('importReport: start');\n\n // if import was not completed, the Ask panel will still be open... close it now.\n var askpanel=document.getElementById('importAskPanel'); if (askpanel)'none'; \n // get the alphasorted list of tiddlers\n var tiddlers = config.macros.importTiddlers.inbound;\n tiddlers.sort(function (a,b) {if(a['title'] == b['title']) return(0); else return (a['title'] < b['title']) ? -1 : +1; });\n // gather the statistics\n var count=tiddlers.length;\n var added=0; var replaced=0; var renamed=0; var skipped=0; var merged=0;\n for (var t=0; t<count; t++)\n if (tiddlers[t].status)\n {\n if (tiddlers[t].status=='added') added++;\n if (tiddlers[t].status.substr(0,7)=='skipped') skipped++;\n if (tiddlers[t].status.substr(0,6)=='rename') renamed++;\n if (tiddlers[t].status.substr(0,7)=='replace') replaced++;\n if (tiddlers[t].status.substr(0,6)=='merged') merged++;\n }\n var omitted=count-(added+replaced+renamed+skipped+merged);\n // DEBUG alert('stats done: '+count+' total, '+added+' added, '+skipped+' skipped, '+renamed+' renamed, '+replaced+' replaced, '+merged+' merged');\n // skip the report if nothing was imported\n if (added+replaced+renamed+merged==0) return;\n // skip the report if not desired by user\n if (!config.options.chkImportReport) {\n // reset status flags\n for (var t=0; t<count; t++) config.macros.importTiddlers.inbound[t].status="";\n // refresh display since tiddlers have been imported\n store.notifyAll();\n // quick message area summary report\n var msg=(added+replaced+renamed+merged)+' of '+count+' tiddler'+((count!=1)?'s':"");\n msg+=' imported from '+config.macros.importTiddlers.src.replace(/\s\s/g,'/')\n displayMessage(msg);\n return;\n }\n // create the report tiddler (if not already present)\n var tiddler = store.getTiddler('ImportedTiddlers');\n if (!tiddler) // create new report tiddler if it doesn't exist\n {\n tiddler = new Tiddler();\n tiddler.title = 'ImportedTiddlers';\n tiddler.text = "";\n }\n // format the report header\n var now = new Date();\n var newText = "";\n newText += "On "+now.toLocaleString()+", "+config.options.txtUserName+" imported tiddlers from\sn";\n newText += "[["+config.macros.importTiddlers.src+"|"+config.macros.importTiddlers.src+"]]:\sn";\n newText += "<"+"<"+"<\sn";\n newText += "Out of "+count+" tiddler"+((count!=1)?"s ":" ")+" in {{{"+config.macros.importTiddlers.src.replace(/\s\s/g,'/')+"}}}:\sn";\n if (added+renamed>0)\n newText += (added+renamed)+" new tiddler"+(((added+renamed)!=1)?"s were":" was")+" added to your document.\sn";\n if (merged>0)\n newText += merged+" tiddler"+((merged!=1)?"s were":" was")+" merged with "+((merged!=1)?"":"an ")+"existing tiddler"+((merged!=1)?"s":"")+".\sn"; \n if (replaced>0)\n newText += replaced+" existing tiddler"+((replaced!=1)?"s were":" was")+" replaced.\sn"; \n if (skipped>0)\n newText += skipped+" tiddler"+((skipped!=1)?"s were":" was")+" skipped after asking.\sn"; \n if (omitted>0)\n newText += omitted+" tiddler"+((omitted!=1)?"s":"")+((omitted!=1)?" were":" was")+" not imported.\sn";\n if (config.macros.importTiddlers.addTags && config.macros.importTiddlers.newTags.trim().length)\n newText += "imported tiddlers were tagged with: \s""+config.macros.importTiddlers.newTags+"\s"\sn";\n // output the tiddler detail and reset status flags\n for (var t=0; t<count; t++)\n if (tiddlers[t].status!="")\n {\n newText += "#["+"["+tiddlers[t].title+"]"+"]";\n newText += ((tiddlers[t].status!="added")?("^^\sn"+tiddlers[t].status+"^^"):"")+"\sn";\n config.macros.importTiddlers.inbound[t].status="";\n }\n newText += "<"+"<"+"<\sn";\n // output 'discard report' link\n newText += "<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n newText += "onclick=\s"story.closeTiddler('"+tiddler.title+"'); store.deleteTiddler('"+tiddler.title+"');\s" ";\n newText += "value=\s"discard report\s"></html>";\n // update the ImportedTiddlers content and show the tiddler\n tiddler.text = newText+((tiddler.text!="")?'\sn----\sn':"")+tiddler.text;\n tiddler.modifier = config.options.txtUserName;\n tiddler.modified = new Date();\n store.addTiddler(tiddler);\n if (!quiet) story.displayTiddler(null,"ImportedTiddlers",1,null,null,false);\n story.refreshTiddler("ImportedTiddlers",1,true);\n // refresh the display\n store.notifyAll();\n}\n//}}}\n\n// // ''INTERFACE DEFINITION''\n\n// // Handle link click to create/show/hide control panel\n//{{{\nfunction onClickImportMenu(e)\n{\n if (!e) var e = window.event;\n var parent=resolveTarget(e).parentNode;\n var panel = document.getElementById("importPanel");\n if (panel==undefined || panel.parentNode!=parent)\n panel=createImportPanel(parent);\n var isOpen ="block";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n = isOpen ? "none" : "block" ;\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n// // Create control panel: HTML, CSS, register for notification\n//{{{\nfunction createImportPanel(place) {\n var panel=document.getElementById("importPanel");\n if (panel) { panel.parentNode.removeChild(panel); }\n setStylesheet(config.macros.importTiddlers.css,"importTiddlers");\n panel=createTiddlyElement(place,"span","importPanel",null,null)\n panel.innerHTML=config.macros.importTiddlers.html;\n store.addNotification(null,refreshImportList); // refresh listbox after every tiddler change\n refreshImportList();\n return panel;\n}\n//}}}\n\n// // CSS\n//{{{\nconfig.macros.importTiddlers.css = '\s\n#importPanel {\s\n display: none; position:absolute; z-index:11; width:35em; right:105%; top:3em;\s\n padding: 0.5em; margin:0em; text-align:left; font-size: 8pt;\s\n background-color: #eee; color:#000000; \s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px; -moz-border-radius:1em;\s\n}\s\n#importPanel a { color:#009; }\s\n#importPanel input { width: 98%; margin: 1px; font-size:8pt; }\s\n#importPanel select { width: 98%; margin: 1px; font-size:8pt; }\s\n#importPanel .importButton { padding: 0em; margin: 0px; font-size:8pt; }\s\n#importPanel .importListButton { padding:0em 0.25em 0em 0.25em; color: #000000; display:inline }\s\n#importAskPanel { display:none; margin:0.5em 0em 0em 0em; }\s\n';\n//}}}\n\n// // HTML\n//{{{\nconfig.macros.importTiddlers.html = '\s\n<span style="float:left; padding:1px; white-space:nowrap">\s\n import from source document\s\n</span>\s\n<span style="float:right; padding:1px; white-space:nowrap">\s\n <input type=checkbox id="chkImportReport" checked style="height:1em; width:auto"\s\n onClick="config.options[\s'chkImportReport\s']=this.checked;">create a report\s\n</span>\s\n<input type="file" id="fileImportSource" size=56\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;">\s\n<span style="float:left; padding:1px; white-space:nowrap">\s\n select:\s\n <a href="JavaScript:;" id="importSelectAll"\s\n onclick="onClickImportButton(this)" title="select all tiddlers">\s\n &nbsp;all&nbsp;</a>\s\n <a href="JavaScript:;" id="importSelectNew"\s\n onclick="onClickImportButton(this)" title="select tiddlers not already in destination document">\s\n &nbsp;added&nbsp;</a> \s\n <a href="JavaScript:;" id="importSelectChanges"\s\n onclick="onClickImportButton(this)" title="select tiddlers that have been updated in source document">\s\n &nbsp;changes&nbsp;</a> \s\n <a href="JavaScript:;" id="importSelectDifferences"\s\n onclick="onClickImportButton(this)" title="select tiddlers that have been added or are different from existing tiddlers">\s\n &nbsp;differences&nbsp;</a> \s\n <a href="JavaScript:;" id="importToggleFilter"\s\n onclick="onClickImportButton(this)" title="show/hide selection filter">\s\n &nbsp;filter&nbsp;</a> \s\n</span>\s\n<span style="float:right; padding:1px; white-space:nowrap">\s\n <a href="JavaScript:;" id="importListSmaller"\s\n onclick="onClickImportButton(this)" title="reduce list size">\s\n &nbsp;&#150;&nbsp;</a>\s\n <a href="JavaScript:;" id="importListLarger"\s\n onclick="onClickImportButton(this)" title="increase list size">\s\n &nbsp;+&nbsp;</a>\s\n <a href="JavaScript:;" id="importListMaximize"\s\n onclick="onClickImportButton(this)" title="maximize/restore list size">\s\n &nbsp;=&nbsp;</a>\s\n</span>\s\n<select id="importList" size=8 multiple\s\n onchange="setTimeout(\s'refreshImportList(\s'+this.selectedIndex+\s')\s',1)">\s\n <!-- NOTE: delay refresh so list is updated AFTER onchange event is handled -->\s\n</select>\s\n<input type=checkbox id="chkAddTags" checked style="height:1em; width:auto"\s\n onClick="config.macros.importTiddlers.addTags=this.checked;">add new tags &nbsp;\s\n<input type=checkbox id="chkImportTags" checked style="height:1em; width:auto"\s\n onClick="config.macros.importTiddlers.importTags=this.checked;">import source tags &nbsp;\s\n<input type=checkbox id="chkKeepTags" checked style="height:1em; width:auto"\s\n onClick="config.macros.importTiddlers.keepTags=this.checked;">keep existing tags\s\n<input type=text id="txtNewTags" size=15 onKeyUp="config.macros.importTiddlers.newTags=this.value" autocomplete=off>\s\n<div align=center>\s\n <input type=button id="importOpen" class="importButton" style="width:32%" value="open"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importStart" class="importButton" style="width:32%" value="import"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importClose" class="importButton" style="width:32%" value="close"\s\n onclick="onClickImportButton(this)">\s\n</div>\s\n<div id="importAskPanel">\s\n tiddler already exists:\s\n <input type=text id="importNewTitle" size=15 autocomplete=off">\s\n <div align=center>\s\n <input type=button id="importSkip" class="importButton" style="width:23%" value="skip"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importRename" class="importButton" style="width:23%" value="rename"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importMerge" class="importButton" style="width:23%" value="merge"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importReplace" class="importButton" style="width:23%" value="replace"\s\n onclick="onClickImportButton(this)">\s\n </div>\s\n</div>\s\n';\n//}}}\n\n// // refresh listbox\n//{{{\nfunction refreshImportList(selectedIndex)\n{\n var theList = document.getElementById("importList");\n if (!theList) return;\n // if nothing to show, reset list content and size\n if (!config.macros.importTiddlers.inbound) \n {\n while (theList.length > 0) { theList.options[0] = null; }\n theList.options[0]=new Option('please open a document...',"",false,false);\n theList.size=config.macros.importTiddlers.listsize;\n return;\n }\n // get the sort order\n if (!selectedIndex) selectedIndex=0;\n if (selectedIndex==0) config.macros.importTiddlers.sort='title'; // heading\n if (selectedIndex==1) config.macros.importTiddlers.sort='title';\n if (selectedIndex==2) config.macros.importTiddlers.sort='modified';\n if (selectedIndex==3) config.macros.importTiddlers.sort='tags';\n if (selectedIndex>3) {\n // display selected tiddler count\n for (var t=0,count=0; t < theList.options.length; t++) count+=(theList.options[t].selected&&theList.options[t].value!="")?1:0;\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n return; // no refresh needed\n }\n\n // get the alphasorted list of tiddlers (optionally, filter out unchanged tiddlers)\n var tiddlers=config.macros.importTiddlers.inbound;\n tiddlers.sort(function (a,b) {if(a['title'] == b['title']) return(0); else return (a['title'] < b['title']) ? -1 : +1; });\n // clear current list contents\n while (theList.length > 0) { theList.options[0] = null; }\n // add heading and control items to list\n var i=0;\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n theList.options[i++]=new Option(tiddlers.length+' tiddler'+((tiddlers.length!=1)?'s are':' is')+' in the document',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="title" )?">":indent)+' [by title]',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="modified")?">":indent)+' [by date]',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="tags")?">":indent)+' [by tags]',"",false,false);\n // output the tiddler list\n switch(config.macros.importTiddlers.sort)\n {\n case "title":\n for(var t = 0; t < tiddlers.length; t++)\n theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);\n break;\n case "modified":\n // sort descending for newest date first\n tiddlers.sort(function (a,b) {if(a['modified'] == b['modified']) return(0); else return (a['modified'] > b['modified']) ? -1 : +1; });\n var lastSection = "";\n for(var t = 0; t < tiddlers.length; t++) {\n var tiddler = tiddlers[t];\n var theSection = tiddler.modified.toLocaleDateString();\n if (theSection != lastSection) {\n theList.options[i++] = new Option(theSection,"",false,false);\n lastSection = theSection;\n }\n theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);\n }\n break;\n case "tags":\n var theTitles = {}; // all tiddler titles, hash indexed by tag value\n var theTags = new Array();\n for(var t=0; t<tiddlers.length; t++) {\n var title=tiddlers[t].title;\n var tags=tiddlers[t].tags;\n for(var s=0; s<tags.length; s++) {\n if (theTitles[tags[s]]==undefined) { theTags.push(tags[s]); theTitles[tags[s]]=new Array(); }\n theTitles[tags[s]].push(title);\n }\n }\n theTags.sort();\n for(var tagindex=0; tagindex<theTags.length; tagindex++) {\n var theTag=theTags[tagindex];\n theList.options[i++]=new Option(theTag,"",false,false);\n for(var t=0; t<theTitles[theTag].length; t++)\n theList.options[i++]=new Option(indent+indent+theTitles[theTag][t],theTitles[theTag][t],false,false);\n }\n break;\n }\n theList.selectedIndex=selectedIndex; // select current control item\n if (theList.size<config.macros.importTiddlers.listsize) theList.size=config.macros.importTiddlers.listsize;\n if (theList.size>theList.options.length) theList.size=theList.options.length;\n}\n//}}}\n\n// // Control interactions\n//{{{\nfunction onClickImportButton(which)\n{\n // DEBUG alert(;\n var theList = document.getElementById('importList');\n if (!theList) return;\n var thePanel = document.getElementById('importPanel');\n var theAskPanel = document.getElementById('importAskPanel');\n var theNewTitle = document.getElementById('importNewTitle');\n var count=0;\n switch (\n {\n case 'fileImportSource':\n case 'importOpen': // load import source into hidden frame\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n if (config.macros.importTiddlers.src=="") break;\n // Load document into hidden iframe so we can read it's DOM and fill the list\n loadImportFile(config.macros.importTiddlers.src,"all",null,null,function(src,filter,quiet,ask){window.refreshImportList(0);});\n break;\n case 'importSelectAll': // select all tiddler list items (i.e., not headings)\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=true;\n count++;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectNew': // select tiddlers not in current document\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=!store.tiddlerExists(theList.options[t].value);\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectChanges': // select tiddlers that are updated from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value==""||!store.tiddlerExists(theList.options[t].value)) continue;\n for (var i=0; i<config.macros.importTiddlers.inbound.length; i++) // find matching inbound tiddler\n { var inbound=config.macros.importTiddlers.inbound[i]; if (inbound.title==theList.options[t].value) break; }\n theList.options[t].selected=(inbound.modified-store.getTiddler(theList.options[t].value).modified>0); // updated tiddler\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectDifferences': // select tiddlers that are new or different from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value=="") continue;\n if (!store.tiddlerExists(theList.options[t].value)) { theList.options[t].selected=true; count++; continue; }\n for (var i=0; i<config.macros.importTiddlers.inbound.length; i++) // find matching inbound tiddler\n { var inbound=config.macros.importTiddlers.inbound[i]; if (inbound.title==theList.options[t].value) break; }\n theList.options[t].selected=(inbound.modified-store.getTiddler(theList.options[t].value).modified!=0); // changed tiddler\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importToggleFilter': // show/hide filter\n case 'importFilter': // apply filter\n alert("coming soon!");\n break;\n case 'importStart': // initiate the import processing\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.index=0;\n config.macros.importTiddlers.index=importTiddlers(0);\n importStopped();\n break;\n case 'importClose': // unload imported tiddlers or hide the import control panel\n // if imported tiddlers not loaded, close the import control panel\n if (!config.macros.importTiddlers.inbound) {'none'; break; }\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n break;\n case 'importSkip': // don't import the tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n theImported.status='skipped after asking'; // mark item as skipped\n'none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index+1); // resume with NEXT item\n importStopped();\n break;\n case 'importRename': // change name of imported tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n theImported.status = 'renamed from '+theImported.title; // mark item as renamed\n theImported.set(theNewTitle.value,null,null,null,null); // change the tiddler title\n theItem.value = theNewTitle.value; // change the listbox item text\n theItem.text = theNewTitle.value; // change the listbox item text\n'none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with THIS item\n importStopped();\n break;\n case 'importMerge': // join existing and imported tiddler content\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n var theText = theExisting.text+'\sn----\sn^^merged from: [['+config.macros.importTiddlers.src+'#'+theItem.value+'|'+config.macros.importTiddlers.src+'#'+theItem.value+']]^^\sn^^'+theImported.modified.toLocaleString()+' by '+theImported.modifier+'^^\sn'+theImported.text;\n var theDate = new Date();\n var theTags = theExisting.getTags()+' '+theImported.getTags();\n theImported.set(null,theText,null,theDate,theTags);\n theImported.status = 'merged with '+theExisting.title; // mark item as merged\n theImported.status += ' - '+theExisting.modified.formatString("MM/DD/YYYY hh:mm:ss");\n theImported.status += ' by '+theExisting.modifier;\n'none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with this item\n importStopped();\n break;\n case 'importReplace': // substitute imported tiddler for existing tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n theImported.status = 'replaces '+theExisting.title; // mark item for replace\n theImported.status += ' - '+theExisting.modified.formatString("MM/DD/YYYY hh:mm:ss");\n theImported.status += ' by '+theExisting.modifier;\n'none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with THIS item\n importStopped();\n break;\n case 'importListSmaller': // decrease current listbox size, minimum=5\n if (theList.options.length==1) break;\n theList.size-=(theList.size>5)?1:0;\n config.macros.importTiddlers.listsize=theList.size;\n break;\n case 'importListLarger': // increase current listbox size, maximum=number of items in list\n if (theList.options.length==1) break;\n theList.size+=(theList.size<theList.options.length)?1:0;\n config.macros.importTiddlers.listsize=theList.size;\n break;\n case 'importListMaximize': // toggle listbox size between current and maximum\n if (theList.options.length==1) break;\n theList.size=(theList.size==theList.options.length)?config.macros.importTiddlers.listsize:theList.options.length;\n break;\n }\n}\n//}}}\n\n// // re-entrant processing for handling import with interactive collision prompting\n//{{{\nfunction importTiddlers(startIndex)\n{\n if (!config.macros.importTiddlers.inbound) return -1;\n\n var theList = document.getElementById('importList');\n if (!theList) return;\n var t;\n // if starting new import, reset import status flags\n if (startIndex==0)\n for (var t=0;t<config.macros.importTiddlers.inbound.length;t++)\n config.macros.importTiddlers.inbound[t].status="";\n for (var i=startIndex; i<theList.options.length; i++)\n {\n // if list item is not selected or is a heading (i.e., has no value), skip it\n if ((!theList.options[i].selected) || ((t=theList.options[i].value)==""))\n continue;\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==t) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theImported.title);\n // avoid redundant import for tiddlers that are listed multiple times (when 'by tags')\n if (theImported.status=="added")\n continue;\n // don't import the "ImportedTiddlers" history from the other document...\n if (theImported.title=='ImportedTiddlers')\n continue;\n // if tiddler exists and import not marked for replace or merge, stop importing\n if (theExisting && (theImported.status.substr(0,7)!="replace") && (theImported.status.substr(0,5)!="merge"))\n return i;\n // assemble tags (remote + existing + added)\n var newTags = "";\n if (config.macros.importTiddlers.importTags)\n newTags+=theImported.getTags() // import remote tags\n if (config.macros.importTiddlers.keepTags && theExisting)\n newTags+=" "+theExisting.getTags(); // keep existing tags\n if (config.macros.importTiddlers.addTags && config.macros.importTiddlers.newTags.trim().length)\n newTags+=" "+config.macros.importTiddlers.newTags; // add new tags\n theImported.set(null,null,null,null,newTags.trim());\n // set the status to 'added' (if not already set by the 'ask the user' UI)\n theImported.status=(theImported.status=="")?'added':theImported.status;\n // do the import!\n store.addTiddler(theImported);\n store.setDirty(true);\n }\n return(-1); // signals that we really finished the entire list\n}\n//}}}\n\n//{{{\nfunction importStopped()\n{\n var theList = document.getElementById('importList');\n var theNewTitle = document.getElementById('importNewTitle');\n if (!theList) return;\n if (config.macros.importTiddlers.index==-1)\n importReport(); // import finished... generate the report\n else\n {\n // DEBUG alert('import stopped at: '+config.macros.importTiddlers.index);\n // import collision... show the ask panel and set the title edit field\n document.getElementById('importAskPanel').style.display='block';\n theNewTitle.value=theList.options[config.macros.importTiddlers.index].value;\n }\n}\n//}}}\n
An AU 2005 document on [[intersection design|]], 28 pages long.
\nAdded C3D News Feed tiddly\n[[Civil 3D News Feed]]\n----
''ARCHIVED UPDATES''\n\nClick the linked/highlighted days to check out new updates.\n\n|>|>|>|>|>|>| ![[July|July06]] |\n| Sun | Mon | Tue | Wed | Thu | Fri | Sat |\n|>|>|>|>|>|!|bgcolor(##069): 1 |\n|bgcolor(#eee): 2 | 3 | 4 | 5 | 6 | 7 |bgcolor(#eee): 8 |\n|bgcolor(#eee): 9 | 10 | 11 | 12 | 13 | 14 |bgcolor(#FFFF7E): [[15|July 15 2006]] |\n|bgcolor(#eee): 16 | 17 | 18 | 19 | 20 | 21 |bgcolor(#eee): 22 |\n|bgcolor(#eee): 23 | 24 | 25 |bgcolor(#FFFF7E): [[26|July 26 2006]] | 27 | 28 |bgcolor(#eee): 29 |\n|bgcolor(#eee): 30 | 31 |>|>|>|>|!|
----\nUpdated my [[To Do]] list which includes the implementation of a "todo tiddly," ironically enough.\n----\nUpdate to [[Blogs]] with [[this post|civil3d.wordpress]].\n----
[[Civil 3D Knuckles and CuldeSacs|]], 38 pages long with plenty of images.
Autodesk Civil 3D 2007 white paper on concepts and considerations when working with [[large subdivisions|]], 21 pages.
Level 1 C3D books worth checking out. The ones scrached out are the ones our office already has.\n\n#==Digging Into Civil 3D 2007== [[here|]] at a cost of $74.95 as of August 4 2006.\n#==Digging Into Civil 3D 2006== (this item is permanently sold out).\n#
Level 2 C3D books worth checking out. The ones scratched out are the ones our office already has.\n\n#Digging Deeper into Civil 3D 2007\n#\n#
_ <<tag "Blogs">> _ <<tag Calendar>> _ <<tag "Resources">> _ [[SiteMap]] _ ~~<<tag Dev>>~~
\nThis is taken straight from the Autodesk Civil 3D help. I put it all here to make it easier to follow rather than having to open Civil 3D and searching for the article. To access the features this article describes, use the command:\n!MAPIOPTIONS\n**Specify default image correlation settings, display options, detach options, paths, and memory settings\n----\n\n__Concept__\n\nAutodesk Map 3D reserves 25% of the total physical memory (RAM) on your system for inserting images with the Raster Extension. If you increase the default amount, more of the physical memory is used for images and less is available for other operations in Autodesk Map 3D and for other applications you might be running.\n\nIf you require additional memory for your images, the Raster Extension uses a temporary swap file. For example, if you insert a 100 MB file, and the Memory Limit is 8 MB, Autodesk Map 3D stores the remaining 92 MB in a temporary file. You can specify where the swap file is created.\n\nYou can change the following Raster Extension memory settings:\n\n*Temporary File Location — The default directory for the temporary swap files is the Windows temp directory.\n**Tip For best performance, use a local drive for your temporary swap file. It is recommended that you do not use the drive where the operating system is installed as the drive for the swap file unless this is your only local drive. \n*Memory Limit — Specify the maximum amount of computer memory that Autodesk Map 3D can use to store image files.\n**Note The more physical RAM you have, the higher you can make your Memory Limit. The higher the Memory Limit, the less swapping to hard disk occurs and the faster your images load and display. However, do not allocate all available physical RAM because doing so slows overall performance.\n**Note Close and restart Autodesk Map 3D after adjusting these settings.\n\n----\n\n__Procedure__\n\nTo configure memory for images \n\n*Click Setup menu Raster Options.\n*In the Raster Extension Options dialog box, select the Memory tab. \n**To locate a drive for your temporary swap file location, click Browse under Temporary File Location, and locate a drive. \n**To change the amount of memory reserved for inserting images, type a new value in the Memory Limit box. Be careful that you do not use all of your system resources. \n***Note: You can click Default to return this setting to the recommended value. \n*Click OK to accept the changes.\n**You must quit and restart Autodesk Map 3D for these settings to take effect.\n\n----
If for whatever reason you need to contact me or send me some info, use the ~~C3D N Chat~~ module at the right of this page. It works in offline and online mode, so I should hopefully always get your message.
/***\n|Name|NewHereCommand|\n|Source||\n|Version|1.0|\n\nCode originally by ArphenLin. Small tweak by SimonBaird\n\nTo use this you must edit your ViewTemplate and add newHere to the toolbar div, eg\n{{{<div class='toolbar' macro='toolbar ... newHere'></div>}}}\n***/\n\n//{{{\n\nconfig.commands.newHere = {\n text: 'new here',\n tooltip: 'Create a new tiddler tagged as this tiddler',\n handler: function(e,src,title) {\n if (!readOnly) {\n clearMessage();\n var t=document.getElementById('tiddler'+title);\n story.displayTiddler(t,config.macros.newTiddler.title,DEFAULT_EDIT_TEMPLATE);\n story.setTiddlerTag(config.macros.newTiddler.title, title, 0);\n story.focusTiddler(config.macros.newTiddler.title,"title");\n return false;\n }\n }\n};\n\n//}}}
/***\n|''Name:''|NewerTiddlerPlugin|\n|''Version:''|$Revision: 13 $ |\n|''Source:''| |\n|''Author:''|[[Paul Petterson]] |\n|''Type:''|Macro Extension |\n|''Requires:''|TiddlyWiki 1.2.33 or higher |\n!Description\nCreate a 'new tiddler' button with lots more options! Specify the text to show on the button, the name of the new tiddler (with date macro expansion), one or more tags for the new tiddlers, and what text if any to include in the new tiddler body! Uses a named parameter format, simalar to the reminder plugin.\n\nAlso - if the tiddler already exists it won't replace any of it's existing data (like tags).\n\n!Syntax\n* {{{<<newerTiddler button:"Inbox" name:"Inbox YYYY/MM/DD" tags:"Journal, inbox" text:"New stuff for today:">>}}}\n* {{{<<newerTiddler button:"@Action" name:"Action: what" tags:"@Action" text:"Add project and describe action">>}}}\n* {{{<<newerTiddler button:"New Project" name:"Project Name?" tags:"My Projects, My Inbox, Journal" template:"MyTemplate">>}}}\n!!Parameters\n* name:"Name of Tiddler"\n* tags:"Tag1, Tag2, Tag3" - tags for new tiddler, comma seperated //don't use square brackets //({{{[[}}})// for tags!//\n* button:"name for button" - the name to display instead of "new tiddler"\n* body:"what to put in the tiddler body"\n* template:"Name of a tiddler containing the text to use as the body of the new tiddler"\n\n''Note:'' if you sepecify both body and template parameters, then template parameter will be used and the body parameter overridden.\n\n!Sample Output\n* <<newerTiddler button:"Inbox" name:"Inbox YYYY/MM/DD" tags:"Journal inbox" text:"New stuff for today:">>\n* <<newerTiddler button:"@Action" name:"Action: what" tags:"@Action" text:"Add project and describe action">>\n* <<newerTiddler button:"New Project" name:"Project Name?" tags:"[[My Projects]] [[My Inbox]] Journal" template:"MyTemplate">>\n\n!Todo\n<<projectTemplate>>\n\n!Known issues\n* Must use double quotes (") around parameter values if they contain a space, can't use single quotes (').\n* can't use standard bracketted style tags, ust type in the tags space and all and put a comma between them. For example tags:"one big tag, another big tag" uses 2 tags ''one big tag'' and ''another big tag''.\n\n!Notes\n* It works fine, and I use it daily, however I haven't really tested edge cases or multiple platforms. If you run into bugs or problems, let me know!\n\n!Requests\n* Have delta-date specifiers on the name: name:"Inbox YYY/MM/DD+1" ( )\n* Option to just open the tiddler instead of immediately edit it ( )\n* Have date formatters in tags as well as in name (me)\n\n!Revision history\n$History: PaulsNotepad.html $\n * \n * ***************** Version 2 *****************\n * User: paulpet Date: 2/26/06 Time: 7:25p\n * Updated in $/PaulsNotepad3.0.root/PaulsNotepad3.0/PaulsPlugins/systemConfig\n * Port to tw2.0, bug fixes, and simplification!\nv1.0.2 (not released) - fixed small documentation issues.\nv1.0.1 October 13th - fixed a bug occurring only in FF\nv1.0 October 11th - Initial public release\nv0.8 October 10th - Feature complete... \nv0.7 Initial public preview\n\n!Code\n***/\n//{{{\nconfig.macros.newerTiddler = { \nname:"New(er) Tiddler",\ntags:"",\ntext:"Type Tiddler Contents Here.",\nbutton:"new(er) tiddler",\n\nreparse: function( params ) {\n var re = /([^:\s'\s"\ss]+)(?::([^\s'\s":\ss]+)|:[\s'\s"]([^\s'\s"\s\s]*(?:\s\s.[^\s'\s"\s\s]*)*)[\s'\s"])?(?=\ss|$)/g;\n var ret = new Array() ;\n var m ;\n\n while( (m = re.exec( params )) != null )\n ret[ m[1] ] = m[2]?m[2]:m[3]?m[3]:true ;\n\n return ret ;\n},\nhandler: function(place,macroName,params,wikifier,paramString,tiddler) {\n if ( readOnly ) return ;\n\n var input = this.reparse( paramString ) ;\n var tiddlerName = input["name"]?input["name"].trim() ;\n var tiddlerTags = input["tags"]?input["tags"]:config.macros.newerTiddler.tags ;\n var tiddlerBody = input["text"]?input["text"]:config.macros.newerTiddler.text ;\n var buttonText = input["button"]?input["button"]:config.macros.newerTiddler.button ;\n var template = input["template"]?input["template"]:null;\n\n // if there is a template, use it - otherwise use the tiddlerBody text\n if ( template ) {\n tiddlerBody = store.getTiddlerText( template );\n }\n if ( tiddlerBody == null || tiddlerBody.length == 0 )\n tiddlerBody = config.macros.newerTiddler.text ;\n\n var now = new Date() ;\n tiddlerName = now.formatString( tiddlerName ) ;\n \n createTiddlyButton( place, buttonText, "", function() {\n var exists = store.tiddlerExists( tiddlerName );\n var t = store.createTiddler( tiddlerName );\n if ( ! exists )\n t.assign( tiddlerName, tiddlerBody, config.views.wikified.defaultModifier, now, tiddlerTags.readBracketedList() );\n \n story.displayTiddler(null,tiddlerName,DEFAULT_EDIT_TEMPLATE);\n story.focusTiddler(tiddlerName,"title");\n return false;\n });\n}}\n//}}}\n/***\nThis plugin is released under the [[Creative Commons Attribution 2.5 License|]]\n***/\n\n
<!---\nI've just tweaked my gradient colours and the topMenu bit. See HorizontalMainMenu.\n--->\n<!--{{{-->\n<div class='header' macro='gradient vert #000 #069'>\n<div class='headerShadow'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div class='headerForeground'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div id='topMenu' refresh='content' tiddler='MainMenu'></div>\n</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>
Looking for a performance upgrade while working with resource-hogging drawings? Give this a read:\n\nThis is straight from the Autodesk help file:\n<<<\nTo receive the maximum benefit of demand loading, it is recommended that you save any drawings that are used as xrefs with layer and spatial indexes.\n\nA layer index is a list showing which objects are on which layers. This list is used when the program is referencing the drawing in conjunction with demand loading to determine which objects need to be read in and displayed. Objects on frozen layers in a referenced drawing are not read in if the referenced drawing has a layer index and is being demand loaded.\n\nThe spatial index organizes objects based on their location in 3D space. This organization is used to efficiently determine which objects need to be read in when the drawing is being demand loaded and clipped as an xref. If demand loading is turned on, and the drawing is attached as an xref and clipped, the program uses the spatial index in the externally referenced drawing to determine which objects lie within the clip boundary. The program then reads only those objects into the current session.\n\nSpatial and layer indexes are best used in drawings that will be used as xrefs in other drawings where demand loading is enabled. @@Drawings that are not going to be used as xrefs will not benefit from layer and spatial indexing or demand loading@@.\n<<<\n\nSo, if you're looking for a perfomance upgrade and aren't worried about sacrificing the goodness of spacial & layer indexing because you aren't XREFing, then set the following in your drawing or template:\n\n{{{\nINDEXCTL = 0\n}}}\n\nbased on the following:\n<<<\nINDEXCTL\nControls whether layer and spatial indexes are created and saved in drawing files.\n* 0 - No indexes are created \n* 1 - Layer index is created\n* 2 - Spatial index is created \n* 3 - Layer and spatial indexes are created\n<<<\n\nThis attribute is part of the drawing, so you'll either need to change it in every drawing where it applies, or set it in a new/existing template. My recommendation would be to have an XREF template and a non-XREF template, though it may just add unnecessary hassel. It's your call.\n\nThanks to Angel at [[acecivil3d.blogspot]] for [[pointing this out|]].
More from Dana at [[civil3drocks.blogspot]]:\n\na post all about pipe labels and lenghts, structure displays, and structure masking. She also addresses some of the things C3D ''won't'' do.
Another very useful post from [[civil3drocks.blogspot]]:\n\nexplaining a three step process to showing pipe crossings in profile. It goes like this:\n<<<\n1) Add the pipe you would like to see in crossing to the profile using the PIPE tools\n2) Label the pipe (as desired) using the PIPE tools\n3) Label the invert of the pipe crossing using the PROFILE VIEW tools.\n<<<\nbut of course there's more to it so @@go check out her post@@.
//{{{\n\nwindow.applyPageTemplate_orig_ads = window.applyPageTemplate;\n\nwindow.applyPageTemplate = function(title) {\n\n applyPageTemplate_orig_ads(title);\n\n var box = document.getElementById('adsenseBox');\n var box2 = document.getElementById('adsenseBox2');\n var bar = document.getElementById('adsenseBar');\n\n var sidebar = document.getElementById('sidebar');\n var displayArea = document.getElementById('displayArea');\n var tiddlerDisplay = document.getElementById('tiddlerDisplay');\n\n if (sidebar && box && box2) {\n sidebar.insertBefore(box,sidebar.childNodes[0]);\n sidebar.insertBefore(box2,sidebar.childNodes[0]);\n = 'block';\n = 'block';\n }\n\n if (displayArea && bar) {\n //displayArea.insertBefore(bar,displayArea.childNodes[0]);\n displayArea.appendChild(bar);\n = 'block';\n }\n\n};\nsetStylesheet(\n'#adsenseBox { background:#fff; }\sn'+\n'#adsenseBox2 { background:#fff; }\sn'+\n'#adsenseBar { background:#fff; padding-left:0.5em; }\sn'+\n'',\n'adsenseStyles');\n\n//}}}
/***\n| Name:|QuickOpenTagPlugin|\n| Purpose:|Makes tag links into a Taggly style open tag plus a normal style drop down menu|\n| Creator:|SimonBaird|\n| Source:||\n| Requires:|TW 2.x|\n| Version|1.1 (7-Feb-06)|\n\n!History\n* Version 1.1 (07/02/2006)\n** Fix Firefox crashes\n** Updated by ~BidiX[at]\n* Version 1.0 (?/01/2006)\n** First release\n\n***/\n//{{{\n\n//⊻ ⊽ ⋁ ▼ \n\nwindow.createTagButton_orig_mptw = createTagButton;\nwindow.createTagButton = function(place,tag,excludeTiddler) {\n var sp = createTiddlyElement(place,"span",null,"quickopentag");\n createTiddlyLink(sp,tag,true,"button");\n var theTag = createTiddlyButton(sp,config.macros.miniTag.dropdownchar,config.views.wikified.tag.tooltip.format([tag]),onClickTag);\n theTag.setAttribute("tag",tag);\n if(excludeTiddler)\n theTag.setAttribute("tiddler",excludeTiddler);\n return(theTag);\n};\n\nconfig.macros.miniTag = {handler:function(place,macroName,params,wikifier,paramString,tiddler) {\n var tagged = store.getTaggedTiddlers(tiddler.title);\n if (tagged.length > 0) {\n var theTag = createTiddlyButton(place,config.macros.miniTag.dropdownchar,config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);\n theTag.setAttribute("tag",tiddler.title);\n theTag.className = "miniTag";\n }\n}};\n\nconfig.macros.miniTag.dropdownchar = (document.all?"▼":"▾"); // the fat one is the only one that works in IE\n\nconfig.macros.allTags.handler = function(place,macroName,params)\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",this.noTags);\n for (var t=0; t<tags.length; t++)\n {\n var theListItem =createTiddlyElement(theDateList,"li",null,null,null);\n var theLink = createTiddlyLink(theListItem,tags[t][0],true);\n var theCount = " (" + tags[t][1] + ")";\n theLink.appendChild(document.createTextNode(theCount));\n\n var theDropDownBtn = createTiddlyButton(theListItem," "+config.macros.miniTag.dropdownchar,this.tooltip.format([tags[t][0]]),onClickTag);\n theDropDownBtn.setAttribute("tag",tags[t][0]);\n }\n};\n\n\nsetStylesheet(\n ".quickopentag { margin-right:0; border:1px solid #eee; padding:0px; padding-right:0px; padding-left:0px; }\sn"+\n ".quickopentag .tiddlyLink { padding:0px; padding-left:0px; }\sn"+\n ".quickopentag a.button { padding:0px; padding-left:2px; padding-right:2px;}\sn"+\n "a.miniTag {font-size:150%;}\sn"+\n "",\n"QuickOpenTagStyles");\n\n//}}}\n\n/***\n<html>&#x22bb; &#x22bd; &#x22c1; &#x25bc; &#x25be;</html>\n***/\n
/***\n|''Name:''|ReminderPlugin|\n|''Version:''|2.3.8 (Mar 9, 2006)|\n|''Source:''||\n|''Author:''|Jeremy Sheeley(pop1280 [at] excite [dot] com)|\n|''Licence:''|[[BSD open source license]]|\n|''Macros:''|reminder, showreminders, displayTiddlersWithReminders, newReminder|\n|''TiddlyWiki:''|2.0+|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n\n!Description\nThis plugin provides macros for tagging a date with a reminder. Use the {{{reminder}}} macro to do this. The {{{showReminders}}} and {{{displayTiddlersWithReminder}}} macros automatically search through all available tiddlers looking for upcoming reminders.\n\n!Installation\n* Create a new tiddler in your tiddlywiki titled ReminderPlugin and give it the {{{systemConfig}}} tag. The tag is important because it tells TW that this is executable code.\n* Double click this tiddler, and copy all the text from the tiddler's body.\n* Paste the text into the body of the new tiddler in your TW.\n* Save and reload your TW.\n* You can copy some examples into your TW as well. See [[Simple examples]], [[Holidays]], [[showReminders]] and [[Personal Reminders]]\n\n!Syntax:\n|>|See [[ReminderSyntax]] and [[showRemindersSyntax]]|\n\n!Revision history\n* v2.3.8 (Mar 9, 2006)\n**Bug fix: A global variable had snuck in, which was killing FF\n**Feature: You can now use TIDDLER and TIDDLERNAME in a regular reminder format\n* v2.3.6 (Mar 1, 2006)\n**Bug fix: Reminders for today weren't being matched sometimes.\n**Feature: Solidified integration with DatePlugin and CalendarPlugin\n**Feature: Recurring reminders will now return multiple hits in showReminders and the calendar.\n**Feature: Added TIDDLERNAME to the replacements for showReminders format, for plugins that need the title without brackets.\n* v2.3.5 (Feb 8, 2006)\n**Bug fix: Sped up reminders lots. Added a caching mechanism for reminders that have already been matched.\n* v2.3.4 (Feb 7, 2006)\n**Bug fix: Cleaned up code to hopefully prevent the Firefox crash that was causing lots of plugins \nto crash Firefox. Thanks to\n* v2.3.3 (Feb 2, 2006)\n**Feature: newReminder now has drop down lists instead of text boxes.\n**Bug fix: A trailing space in a title would trigger an infinite loop.\n**Bug fix: using tag:"birthday !reminder" would filter differently than tag:"!reminder birthday"\n* v2.3.2 (Jan 21, 2006)\n**Feature: newReminder macro, which will let you easily add a reminder to a tiddler. Thanks to Eric Shulman ( for the code to do this.\n** Bug fix: offsetday was not working sometimes\n** Bug fix: when upgrading to 2.0, I included a bit to exclude tiddlers tagged with excludeSearch. I've reverted back to searching through all tiddlers\n* v2.3.1 (Jan 7, 2006)\n**Feature: 2.0 compatibility\n**Feature AlanH sent some code to make sure that showReminders prints a message if no reminders are found.\n* v2.3.0 (Jan 3, 2006)\n** Bug Fix: Using "Last Sunday (-0)" as a offsetdayofweek wasn't working.\n** Bug Fix: Daylight Savings time broke offset based reminders (for example year:2005 month:8 day:23 recurdays:7 would match Monday instead of Tuesday during DST.\n\n!Code\n***/\n//{{{\n\n//============================================================================\n//============================================================================\n// ReminderPlugin\n//============================================================================\n//============================================================================\n\nversion.extensions.ReminderPlugin = {major: 2, minor: 3, revision: 8, date: new Date(2006,3,9), source: ""};\n\n//============================================================================\n// Configuration\n// Modify this section to change the defaults for \n// leadtime and display strings\n//============================================================================\n\nconfig.macros.reminders = {};\nconfig.macros["reminder"] = {};\nconfig.macros["newReminder"] = {};\nconfig.macros["showReminders"] = {};\nconfig.macros["displayTiddlersWithReminders"] = {};\n\nconfig.macros.reminders["defaultLeadTime"] = [0,6000];\nconfig.macros.reminders["defaultReminderMessage"] = "DIFF: TITLE on DATE ANNIVERSARY";\nconfig.macros.reminders["defaultShowReminderMessage"] = "DIFF: TITLE on DATE ANNIVERSARY -- TIDDLER";\nconfig.macros.reminders["defaultAnniversaryMessage"] = "(DIFF)";\nconfig.macros.reminders["untitledReminder"] = "Untitled Reminder";\nconfig.macros.reminders["noReminderFound"] = "Couldn't find a match for TITLE in the next LEADTIMEUPPER days."\nconfig.macros.reminders["todayString"] = "Today";\nconfig.macros.reminders["tomorrowString"] = "Tomorrow";\nconfig.macros.reminders["ndaysString"] = "DIFF days";\nconfig.macros.reminders["emtpyShowRemindersString"] = "There are no upcoming events";\n\n\n//============================================================================\n// Code\n// You should not need to edit anything \n// below this. Make sure to edit this tiddler and copy \n// the code from the text box, to make sure that \n// tiddler rendering doesn't interfere with the copy \n// and paste.\n//============================================================================\n\n// This line is to preserve 1.2 compatibility\n if (!story) var story=window; \n//this object will hold the cache of reminders, so that we don't\n//recompute the same reminder over again.\nvar reminderCache = {};\n\nconfig.macros.showReminders.handler = function showReminders(place,macroName,params)\n{\n var now = new Date().getMidnight();\n var paramHash = {};\n var leadtime = [0,14];\n paramHash = getParamsForReminder(params);\n var bProvidedDate = (paramHash["year"] != null) || \n (paramHash["month"] != null) || \n (paramHash["day"] != null) || \n (paramHash["dayofweek"] != null);\n if (paramHash["leadtime"] != null)\n {\n leadtime = paramHash["leadtime"];\n if (bProvidedDate)\n {\n //If they've entered a day, we need to make \n //sure to find it. We'll reset the \n //leadtime a few lines down.\n paramHash["leadtime"] = [-10000, 10000];\n }\n }\n var matchedDate = now;\n if (bProvidedDate)\n {\n var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);\n matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); \n }\n\n var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);\n var elem = createTiddlyElement(place,"span",null,null, null);\n var mess = "";\n if (arr.length == 0)\n {\n mess += config.macros.reminders.emtpyShowRemindersString; \n }\n for (var j = 0; j < arr.length; j++)\n {\n if (paramHash["format"] != null)\n {\n arr[j]["params"]["format"] = paramHash["format"];\n }\n else\n {\n arr[j]["params"]["format"] = config.macros.reminders["defaultShowReminderMessage"];\n }\n mess += getReminderMessageForDisplay(arr[j]["diff"], arr[j]["params"], arr[j]["matchedDate"], arr[j]["tiddler"]);\n mess += "\sn";\n }\n wikify(mess, elem, null, null);\n};\n\n\nconfig.macros.displayTiddlersWithReminders.handler = function displayTiddlersWithReminders(place,macroName,params)\n{\n var now = new Date().getMidnight();\n var paramHash = {};\n var leadtime = [0,14];\n paramHash = getParamsForReminder(params);\n var bProvidedDate = (paramHash["year"] != null) || \n (paramHash["month"] != null) || \n (paramHash["day"] != null) || \n (paramHash["dayofweek"] != null);\n if (paramHash["leadtime"] != null)\n {\n leadtime = paramHash["leadtime"];\n if (bProvidedDate)\n {\n //If they've entered a day, we need to make \n //sure to find it. We'll reset the leadtime \n //a few lines down.\n paramHash["leadtime"] = [-10000,10000];\n }\n }\n var matchedDate = now;\n if (bProvidedDate)\n {\n var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);\n matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); \n }\n var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);\n for (var j = 0; j < arr.length; j++)\n {\n displayTiddler(null, arr[j]["tiddler"], 0, null, false, false, false);\n }\n};\n\nconfig.macros.reminder.handler = function reminder(place,macroName,params)\n{\n var dateHash = getParamsForReminder(params);\n if (dateHash["hidden"] != null)\n {\n return;\n }\n var leadTime = dateHash["leadtime"];\n if (leadTime == null)\n {\n leadTime = config.macros.reminders["defaultLeadTime"]; \n }\n var leadTimeLowerBound = new Date().getMidnight().addDays(leadTime[0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(leadTime[1]);\n var matchedDate = findDateForReminder(dateHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound);\n if (!window.story) \n {\n window.story=window; \n }\n if (!store.getTiddler) \n {\n store.getTiddler=function(title) {return this.tiddlers[title];};\n }\n var title = window.story.findContainingTiddler(place).id.substr(7);\n if (matchedDate != null)\n {\n var diff = matchedDate.getDifferenceInDays(new Date().getMidnight());\n var elem = createTiddlyElement(place,"span",null,null, null);\n var mess = getReminderMessageForDisplay(diff, dateHash, matchedDate, title);\n wikify(mess, elem, null, null);\n }\n else\n {\n createTiddlyElement(place,"span",null,null, config.macros.reminders["noReminderFound"].replace("TITLE", dateHash["title"]).replace("LEADTIMEUPPER", leadTime[1]).replace("LEADTIMELOWER", leadTime[0]).replace("TIDDLERNAME", title).replace("TIDDLER", "[[" + title + "]]") );\n }\n};\n\nconfig.macros.newReminder.handler = function newReminder(place,macroName,params)\n{\n var today=new Date().getMidnight();\n var formstring = '<html><form>Year: <select name="year"><option value="">Every year</option>';\n for (var i = 0; i < 5; i++)\n {\n formstring += '<option' + ((i == 0) ? ' selected' : '') + ' value="' + (today.getFullYear() +i) + '">' + (today.getFullYear() + i) + '</option>';\n }\n formstring += '</select>&nbsp;&nbsp;Month:<select name="month"><option value="">Every month</option>';\n for (i = 0; i < 12; i++)\n {\n formstring += '<option' + ((i == today.getMonth()) ? ' selected' : '') + ' value="' + (i+1) + '">' + config.messages.dates.months[i] + '</option>';\n }\n formstring += '</select>&nbsp;&nbsp;Day:<select name="day"><option value="">Every day</option>';\n for (i = 1; i < 32; i++)\n {\n formstring += '<option' + ((i == (today.getDate() )) ? ' selected' : '') + ' value="' + i + '">' + i + '</option>';\n }\n\nformstring += '</select>&nbsp;&nbsp;Reminder Title:<input type="text" size="40" name="title" value="please enter a title" onfocus=";"><input type="button" value="ok" onclick="addReminderToTiddler(this.form)"></form></html>';\n\n var panel = config.macros.slider.createSlider(place,null,"New Reminder","Open a form to add a new reminder to this tiddler");\n wikify(formstring ,panel,null,store.getTiddler(params[1]));\n};\n\n// onclick: process input and insert reminder at 'marker'\nwindow.addReminderToTiddler = function(form) {\n if (!window.story) \n {\n window.story=window; \n }\n if (!store.getTiddler) \n {\n store.getTiddler=function(title) {return this.tiddlers[title];};\n }\n var title = window.story.findContainingTiddler(form).id.substr(7);\n var tiddler=store.getTiddler(title);\n var txt='\sn<<reminder ';\n if (form.year.value != "")\n txt += 'year:'+form.year.value + ' ';\n if (form.month.value != "")\n txt += 'month:'+form.month.value + ' ';\n if ( != "")\n txt += 'day:' + ' ';\n txt += 'title:"'+form.title.value+'" ';\n txt +='>>';\n tiddler.set(null,tiddler.text + txt);\n window.story.refreshTiddler(title,1,true);\n store.setDirty(true);\n};\n\nfunction hasTag(tiddlerTags, tagFilters)\n{\n //Make sure we respond well to empty tiddlerTaglists or tagFilterlists\n if (tagFilters.length==0 || tiddlerTags.length==0)\n {\n return true;\n }\n\n var bHasTag = false;\n \n /*bNoPos says: "'till now there has been no check using a positive filter"\n Imagine a filterlist consisting of 1 negative filter:\n If the filter isn't matched, we want hasTag to be true.\n Yet bHasTag is still false ('cause only positive filters cause bHasTag to change)\n \n If no positive filters are present bNoPos is true, and no negative filters are matched so we have not returned false\n Thus: hasTag returns true.\n \n If at any time a positive filter is encountered, we want at least one of the tags to match it, so we turn bNoPos to false, which\n means bHasTag must be true for hasTag to return true*/\n var bNoPos=true;\n \nfor (var t3 = 0; t3 < tagFilters.length; t3++)\n {\n for(var t2=0; t2<tiddlerTags.length; t2++)\n {\n if (tagFilters[t3].length > 1 && tagFilters[t3].charAt(0) == '!') \n {\n if (tiddlerTags[t2] == tagFilters[t3].substring(1))\n {\n //If at any time a negative filter is matched, we return false\n return false;\n }\n }\n else \n {\n if (bNoPos)\n {\n //We encountered the first positive filter\n bNoPos=false;\n }\n if (tiddlerTags[t2] == tagFilters[t3])\n {\n //A positive filter is matched. As long as no negative filter is matched, hasTag will return true\n bHasTag=true;\n }\n }\n }\n }\n return (bNoPos || bHasTag);\n};\n\n//This function searches all tiddlers for the reminder //macro. It is intended that other plugins (like //calendar) will use this function to query for \n//upcoming reminders.\n//The arguments to this function filter out reminders //based on when they will fire.\n//\n//ARGUMENTS:\n//baseDate is the date that is used as "now". \n//leadtime is a two element int array, with leadtime[0] \n// as the lower bound and leadtime[1] as the\n// upper bound. A reasonable default is [0,14]\n//tags is a space-separated list of tags to use to filter \n// tiddlers. If a tag name begins with an !, then \n// only tiddlers which do not have that tag will \n// be considered. For example "examples holidays" \n// will search for reminders in any tiddlers that \n// are tagged with examples or holidays and \n// "!examples !holidays" will search for reminders \n// in any tiddlers that are not tagged with \n// examples or holidays. Pass in null to search \n// all tiddlers.\n//limit. If limit is null, individual reminders can \n// override the leadtime specified earlier. \n// Pass in 1 in order to override that behavior.\n\nwindow.findTiddlersWithReminders = function findTiddlersWithReminders(baseDate, leadtime, tags, limit)\n{\n//function(searchRegExp,sortField,excludeTag)\n// var macroPattern = "<<([^>\s\s]+)(?:\s\s*)([^>]*)>>";\n var macroPattern = "<<(reminder)(.*)>>";\n var macroRegExp = new RegExp(macroPattern,"mg");\n var matches =,"title","");\n var arr = [];\n var tagsArray = null;\n if (tags != null)\n {\n tagsArray = tags.split(" ");\n }\n for(var t=matches.length-1; t>=0; t--)\n {\n if (tagsArray != null)\n {\n //If they specified tags to filter on, and this tiddler doesn't \n //match, skip it entirely.\n if ( ! hasTag(matches[t].tags, tagsArray))\n {\n continue;\n }\n }\n\n var targetText = matches[t].text;\n do {\n // Get the next formatting match\n var formatMatch = macroRegExp.exec(targetText);\n if(formatMatch && formatMatch[1] != null && formatMatch[1].toLowerCase() == "reminder")\n {\n //Find the matching date.\n \n var params = formatMatch[2] != null ? formatMatch[2].readMacroParams() : {};\n var dateHash = getParamsForReminder(params);\n if (limit != null || dateHash["leadtime"] == null)\n {\n if (leadtime == null)\n dateHash["leadtime"] = leadtime;\n else\n {\n dateHash["leadtime"] = [];\n dateHash["leadtime"][0] = leadtime[0];\n dateHash["leadtime"][1] = leadtime[1];\n }\n }\n if (dateHash["leadtime"] == null)\n dateHash["leadtime"] = config.macros.reminders["defaultLeadTime"]; \n var leadTimeLowerBound = baseDate.addDays(dateHash["leadtime"][0]);\n var leadTimeUpperBound = baseDate.addDays(dateHash["leadtime"][1]);\n var matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);\n while (matchedDate != null)\n {\n var hash = {};\n hash["diff"] = matchedDate.getDifferenceInDays(baseDate);\n hash["matchedDate"] = new Date(matchedDate.getFullYear(), matchedDate.getMonth(), matchedDate.getDate(), 0, 0);\n hash["params"] = cloneParams(dateHash);\n hash["tiddler"] = matches[t].title;\n hash["tags"] = matches[t].tags;\n arr.pushUnique(hash);\n if (dateHash["recurdays"] != null || (dateHash["year"] == null))\n {\n leadTimeLowerBound = leadTimeLowerBound.addDays(matchedDate.getDifferenceInDays(leadTimeLowerBound)+ 1);\n matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);\n }\n else matchedDate = null;\n }\n }\n }while(formatMatch);\n }\n if(arr.length > 1) //Sort the array by number of days remaining.\n {\n arr.sort(function (a,b) {if(a["diff"] == b["diff"]) {return(0);} else {return (a["diff"] < b["diff"]) ? -1 : +1; } });\n }\n return arr;\n};\n\n//This function takes the reminder macro parameters and\n//generates the string that is used for display.\n//This function is not intended to be called by \n//other plugins.\n window.getReminderMessageForDisplay= function getReminderMessageForDisplay(diff, params, matchedDate, tiddlerTitle)\n{\n var anniversaryString = "";\n var reminderTitle = params["title"];\n if (reminderTitle == null)\n {\n reminderTitle = config.macros.reminders["untitledReminder"];\n }\n if (params["firstyear"] != null)\n {\n anniversaryString = config.macros.reminders["defaultAnniversaryMessage"].replace("DIFF", (matchedDate.getFullYear() - params["firstyear"]));\n }\n var mess = "";\n var diffString = "";\n if (diff == 0)\n {\n diffString = config.macros.reminders["todayString"];\n }\n else if (diff == 1)\n {\n diffString = config.macros.reminders["tomorrowString"];\n }\n else\n {\n diffString = config.macros.reminders["ndaysString"].replace("DIFF", diff);\n }\n var format = config.macros.reminders["defaultReminderMessage"];\n if (params["format"] != null)\n {\n format = params["format"];\n }\n mess = format;\n//HACK! -- Avoid replacing DD in TIDDLER with the date\n mess = mess.replace(/TIDDLER/g, "TIDELER");\n mess = matchedDate.formatStringDateOnly(mess);\n mess = mess.replace(/TIDELER/g, "TIDDLER");\n if (tiddlerTitle != null)\n {\n mess = mess.replace(/TIDDLERNAME/g, tiddlerTitle);\n mess = mess.replace(/TIDDLER/g, "[[" + tiddlerTitle + "]]");\n }\n \n mess = mess.replace("DIFF", diffString).replace("TITLE", reminderTitle).replace("DATE", matchedDate.formatString("DDD MMM DD, YYYY")).replace("ANNIVERSARY", anniversaryString);\n return mess;\n};\n\n// Parse out the macro parameters into a hashtable. This\n// handles the arguments for reminder, showReminders and \n// displayTiddlersWithReminders.\nwindow.getParamsForReminder = function getParamsForReminder(params)\n{\n var dateHash = {};\n var type = "";\n var num = 0;\n var title = "";\n for(var t=0; t<params.length; t++)\n {\n var split = params[t].split(":");\n type = split[0].toLowerCase();\n var value = split[1];\n for (var i=2; i < split.length; i++)\n {\n value += ":" + split[i];\n }\n if (type == "nolinks" || type == "limit" || type == "hidden")\n {\n num = 1;\n }\n else if (type == "leadtime")\n {\n var leads = value.split("...");\n if (leads.length == 1)\n {\n leads[1]= leads[0];\n leads[0] = 0;\n }\n leads[0] = parseInt(leads[0], 10);\n leads[1] = parseInt(leads[1], 10);\n num = leads;\n }\n else if (type == "offsetdayofweek")\n {\n if (value.substr(0,1) == "-")\n {\n dateHash["negativeOffsetDayOfWeek"] = 1;\n value = value.substr(1);\n }\n num = parseInt(value, 10);\n }\n else if (type != "title" && type != "tag" && type != "format")\n {\n num = parseInt(value, 10);\n }\n else\n {\n title = value;\n t++;\n while (title.substr(0,1) == '"' && title.substr(title.length - 1,1) != '"' && params[t] != undefined)\n {\n title += " " + params[t++];\n }\n //Trim off the leading and trailing quotes\n if (title.substr(0,1) == "\s"" && title.substr(title.length - 1,1)== "\s"")\n {\n title = title.substr(1, title.length - 2);\n t--;\n }\n num = title;\n }\n dateHash[type] = num;\n }\n //date is synonymous with day\n if (dateHash["day"] == null)\n {\n dateHash["day"] = dateHash["date"];\n }\n return dateHash;\n};\n\n//This function finds the date specified in the reminder \n//parameters. It will return null if no match can be\n//found. This function is not intended to be used by\n//other plugins.\nwindow.findDateForReminder= function findDateForReminder( dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound)\n{\n if (baseDate == null)\n {\n baseDate = new Date().getMidnight();\n }\n var hashKey = baseDate.convertToYYYYMMDDHHMM();\n for (var k in dateHash)\n {\n hashKey += "," + k + "|" + dateHash[k];\n }\n hashKey += "," + leadTimeLowerBound.convertToYYYYMMDDHHMM();\n hashKey += "," + leadTimeUpperBound.convertToYYYYMMDDHHMM();\n if (reminderCache[hashKey] == null)\n {\n //If we don't find a match in this run, then we will\n //cache that the reminder can't be matched.\n reminderCache[hashKey] = false;\n }\n else if (reminderCache[hashKey] == false)\n {\n //We've already tried this date and failed\n return null;\n }\n else\n {\n return reminderCache[hashKey];\n }\n \n var bOffsetSpecified = dateHash["offsetyear"] != null || \n dateHash["offsetmonth"] != null || \n dateHash["offsetday"] != null || \n dateHash["offsetdayofweek"] != null || \n dateHash["recurdays"] != null;\n \n // If we are matching the base date for a dayofweek offset, look for the base date a \n //little further back.\n var tmp1leadTimeLowerBound = leadTimeLowerBound; \n if ( dateHash["offsetdayofweek"] != null)\n {\n tmp1leadTimeLowerBound = leadTimeLowerBound.addDays(-6); \n }\n var matchedDate = baseDate.findMatch(dateHash, tmp1leadTimeLowerBound, leadTimeUpperBound);\n if (matchedDate != null)\n {\n var newMatchedDate = matchedDate;\n if (dateHash["recurdays"] != null)\n {\n while (newMatchedDate.getTime() < leadTimeLowerBound.getTime())\n {\n newMatchedDate = newMatchedDate.addDays(dateHash["recurdays"]);\n }\n }\n else if (dateHash["offsetyear"] != null || \n dateHash["offsetmonth"] != null || \n dateHash["offsetday"] != null || \n dateHash["offsetdayofweek"] != null)\n {\n var tmpdateHash = cloneParams(dateHash);\n tmpdateHash["year"] = dateHash["offsetyear"];\n tmpdateHash["month"] = dateHash["offsetmonth"];\n tmpdateHash["day"] = dateHash["offsetday"];\n tmpdateHash["dayofweek"] = dateHash["offsetdayofweek"];\n var tmpleadTimeLowerBound = leadTimeLowerBound;\n var tmpleadTimeUpperBound = leadTimeUpperBound;\n if (tmpdateHash["offsetdayofweek"] != null)\n {\n if (tmpdateHash["negativeOffsetDayOfWeek"] == 1)\n {\n tmpleadTimeLowerBound = matchedDate.addDays(-6);\n tmpleadTimeUpperBound = matchedDate;\n\n }\n else\n {\n tmpleadTimeLowerBound = matchedDate;\n tmpleadTimeUpperBound = matchedDate.addDays(6);\n }\n\n }\n newMatchedDate = matchedDate.findMatch(tmpdateHash, tmpleadTimeLowerBound, tmpleadTimeUpperBound);\n //The offset couldn't be matched. return null.\n if (newMatchedDate == null)\n {\n return null;\n }\n }\n if (newMatchedDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n reminderCache[hashKey] = newMatchedDate;\n return newMatchedDate;\n }\n }\n return null;\n};\n\n//This does much the same job as findDateForReminder, but\n//this one doesn't deal with offsets or recurring \n//reminders.\nDate.prototype.findMatch = function findMatch(dateHash, leadTimeLowerBound, leadTimeUpperBound)\n{\n\n var bSpecifiedYear = (dateHash["year"] != null);\n var bSpecifiedMonth = (dateHash["month"] != null);\n var bSpecifiedDay = (dateHash["day"] != null);\n var bSpecifiedDayOfWeek = (dateHash["dayofweek"] != null);\n if (bSpecifiedYear && bSpecifiedMonth && bSpecifiedDay)\n {\n return new Date(dateHash["year"], dateHash["month"]-1, dateHash["day"], 0, 0);\n }\n var bMatchedYear = !bSpecifiedYear;\n var bMatchedMonth = !bSpecifiedMonth;\n var bMatchedDay = !bSpecifiedDay;\n var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;\n if (bSpecifiedDay && bSpecifiedMonth && !bSpecifiedYear && !bSpecifiedDayOfWeek)\n {\n\n //Shortcut -- First try this year. If it's too small, try next year.\n var tmpMidnight = this.getMidnight();\n var tmpDate = new Date(this.getFullYear(), dateHash["month"]-1, dateHash["day"], 0,0);\n if (tmpDate.getTime() < leadTimeLowerBound.getTime())\n {\n tmpDate = new Date((this.getFullYear() + 1), dateHash["month"]-1, dateHash["day"], 0,0);\n }\n if ( tmpDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n return tmpDate;\n }\n else\n {\n return null;\n }\n }\n\n var newDate = leadTimeLowerBound; \n while (newDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n var tmp = testDate(newDate, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek);\n if (tmp != null)\n return tmp;\n newDate = newDate.addDays(1);\n }\n};\n\nfunction testDate(testMe, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek)\n{\n var bMatchedYear = !bSpecifiedYear;\n var bMatchedMonth = !bSpecifiedMonth;\n var bMatchedDay = !bSpecifiedDay;\n var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;\n if (bSpecifiedYear)\n {\n bMatchedYear = (dateHash["year"] == testMe.getFullYear());\n }\n if (bSpecifiedMonth)\n {\n bMatchedMonth = ((dateHash["month"] - 1) == testMe.getMonth() );\n }\n if (bSpecifiedDay)\n {\n bMatchedDay = (dateHash["day"] == testMe.getDate());\n }\n if (bSpecifiedDayOfWeek)\n {\n bMatchedDayOfWeek = (dateHash["dayofweek"] == testMe.getDay());\n }\n\n if (bMatchedYear && bMatchedMonth && bMatchedDay && bMatchedDayOfWeek)\n {\n return testMe;\n }\n};\n\n//Returns true if the date is in between two given dates\nDate.prototype.isBetween = function isBetween(lowerBound, upperBound)\n{\n return (this.getTime() >= lowerBound.getTime() && this.getTime() <= upperBound.getTime());\n}\n//Return a new date, with the time set to midnight (0000)\nDate.prototype.getMidnight = function getMidnight()\n{\n return new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0);\n};\n// Add the specified number of days to a date.\nDate.prototype.addDays = function addDays(numberOfDays)\n{\n return new Date(this.getFullYear(), this.getMonth(), this.getDate() + numberOfDays, 0, 0);\n};\n//Return the number of days between two dates.\nDate.prototype.getDifferenceInDays = function getDifferenceInDays(otherDate)\n{\n//I have to do it this way, because this way ignores daylight savings\n var tmpDate = this.addDays(0);\n if (this.getTime() > otherDate.getTime())\n {\n var i = 0;\n for (i = 0; tmpDate.getTime() > otherDate.getTime(); i++)\n {\n tmpDate = tmpDate.addDays(-1);\n }\n return i;\n }\n else\n {\n var i = 0;\n for (i = 0; tmpDate.getTime() < otherDate.getTime(); i++)\n {\n tmpDate = tmpDate.addDays(1);\n }\n return i * -1;\n }\n return 0;\n};\nfunction cloneParams(what) {\n var tmp = {};\n for (var i in what) {\n tmp[i] = what[i];\n }\n return tmp;\n}\n// Substitute date components into a string\nDate.prototype.formatStringDateOnly = function formatStringDateOnly(template)\n{\n template = template.replace("YYYY",this.getFullYear());\n template = template.replace("YY",String.zeroPad(this.getFullYear()-2000,2));\n template = template.replace("MMM",config.messages.dates.months[this.getMonth()]);\n template = template.replace("0MM",String.zeroPad(this.getMonth()+1,2));\n template = template.replace("MM",this.getMonth()+1);\n template = template.replace("DDD",config.messages.dates.days[this.getDay()]);\n template = template.replace("0DD",String.zeroPad(this.getDate(),2));\n template = template.replace("DD",this.getDate());\n return template;\n};\n\n//}}}
/***\n| Name:|RenameTagsPlugin|\n| Purpose:|Allows you to easily rename tags|\n| Creator:|SimonBaird|\n| Source:||\n| Version:|1.0.1 (5-Mar-06)|\n\n!Description\nIf you rename a tiddler/tag that is tagging other tiddlers this plugin will ask you if you want to rename the tag in each tiddler where it is used. This is essential if you use tags and ever want to rename them. To use it, open the tag you want to rename as a tiddler (it's the last option in the tag popup menu), edit it, rename it and click done. You will asked if you want to rename the tag. Click OK to rename the tag in the tiddlers that use it. Click Cancel to not rename the tag.\n\n!Example\nTry renaming [[Plugins]] or [[CSS]] on this site.\n\n!History\n* 1.0.1 (5-Mar-06) - Added feature to allow renaming of tags without side-effect of creating a tiddler\n* 1.0.0 (5-Mar-06) - First working version\n\n!Code\n***/\n//{{{\n\nversion.extensions.RenameTagsPlugin = {\n major: 1, minor: 0, revision: 0,\n date: new Date(2006,3,5),\n source: ""\n};\n\nconfig.macros.RenameTagsPlugin = {};\nconfig.macros.RenameTagsPlugin.prompt = "Rename the tag '%0' to '%1' in %2 tidder%3?";\n\n// these are very useful, perhaps they should be in the core\nif (!store.addTag) {\n store.addTag = function(title,tag) {\n var t=this.getTiddler(title); if (!t || !t.tags) return;\n t.tags.push(tag);\n };\n};\n\nif (!store.removeTag) {\n store.removeTag = function(title,tag) {\n var t=this.getTiddler(title); if (!t || !t.tags) return;\n if (t.tags.find(tag)!=null) t.tags.splice(t.tags.find(tag),1);\n };\n};\n\nstore.saveTiddler_orig_tagrename = store.saveTiddler;\nstore.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags) {\n if (title != newTitle && this.getTaggedTiddlers(title).length > 0) {\n // then we are renaming a tag\n var tagged = this.getTaggedTiddlers(title);\n if (confirm(config.macros.RenameTagsPlugin.prompt.format([title,newTitle,tagged.length,tagged.length>1?"s":""]))) {\n for (var i=0;i<tagged.length;i++) {\n store.removeTag(tagged[i].title,title);\n store.addTag(tagged[i].title,newTitle);\n // if tiddler is visible refresh it to show updated tag\n story.refreshTiddler(tagged[i].title,false,true);\n }\n }\n if (!this.tiddlerExists(title) && newBody == "") {\n // dont create unwanted tiddler\n return null;\n }\n }\n return this.saveTiddler_orig_tagrename(title,newTitle,newBody,modifier,modified,tags);\n}\n\n//}}}\n\n
/***\n|''Name:''|ResizeEditTextPlugin|\n|''Author:''|Jon Scully|\n|''License:''|unknown|\n|''~CoreVersion:''|2.1.2|\n!!!!!Purpose\nProvide a '▼resize▲' button in edit mode that can be dragged up and down to change the textarea size.\n!!!!!Requires\nUnless you are already using [[RearrangeTiddlersPlugin|]], [[ResizeEditTextPlugin]] requires [[DragPlugin]].\n!!!!!Configuration\nPlace the following div at the end of [[EditTemplate]] as follows:\n{{{<div style='text-align: right;' macro='resize'></div>}}}\n!!!!!Code\n***/\n/*{{{*/\nconfig.macros.resize = {}\nconfig.macros.resize.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n if(!tiddler instanceof Tiddler) return;\n var btn = createTiddlyButton(place,"▼resize▲","resize text area",this.onClickResize);\n btn.setAttribute("newTitle",tiddler.title);\n Drag.init(btn, btn, 0, 0, null, null);\n"move";\n btn.onDrag = function(x,y,myElem) {\n var title = this.getAttribute("newTitle");\n if (!="relative")\n {;"relative"; }\n if (y > (myElem.offsetHeight/2)+4) {\n var rows = story.getTiddlerField(title,"text").rows;\n rows++;\n story.getTiddlerField(title,"text").rows = rows;\n["top"] = "0px";\n }\n if (y < 0-(myElem.offsetHeight/2)-4) {\n var rows = story.getTiddlerField(title,"text").rows;\n rows--;\n story.getTiddlerField(title,"text").rows = rows;\n["top"] = "0px";\n }\n };\n btn.onDragEnd = function(x,y,myElem) {\n["top"] = "0px";\n if (this.savedstyle!=undefined)\n;\n }\n}\n/*}}}*/\n
__Of Note__\n\nThanks to the [[Tiddlyspot Blog|]] for featuring me as an "interesting tiddlywiki." (Now I just need to get mentioned in the [[Civil Community|]] and I'm gold.)\n\n----\n\n__Procrastination__\n\nI'm working on my internship report and reading for my [[new nightclass|September 6 2006]] this weekend, but rest assured there will be more new posts soon. In the meantime you can check out pretty much everything here using the [[SiteMap]]. And don't forget to read the [[Civil 3D News Feed]] when you need to fill your brain with <html><abbr title="Autodesk Civil 3D software">Civil 3D</abbr></html>elightfulness.\n\n----\n\n<<haloscan comments>>
__House Cleaning__\n\nThere's not much new, but I did clean up a bunch of the old [[Blog|Blogs]] tiddlers and also added a new one, The Crazy World of Civil 3D: [[cwcivil3d.blogspot]].\n----\n\n__C3DNotebook Statistics__\n\nIf you've at all payed attention to this site and noticed a large number of new pagehits on this site, you can sleep easy tonight knowing it's not artificial inflation. The good folks who host this site at (obviously) have thrown up a link to this site because it's "interesting." Some of the recent visitors may beg to differ, but I think the reason my site is interesting to Tiddlyspot is because it's altered a little beyond the standard template, viz. the "Civil 3D Blog Feed" you see on the right and many other behind-the-scenes improvements.\n\nYou too can tell me what you think of the site using the [[Message Me]] widget just below the blog feed. Thanks if you do.\n----
__Music__\n\nInterested in checking out some new tunes? Try [[this|FineTune Playlist 1]] playlist I've thrown together with some of my favorite bands from a great music service, [[|]].\n----
Click the linked/highlighted days to check out new updates.\n\n|>|>|>|>|>|>| ![[September|September06]] |\n| Sun | Mon | Tue | Wed | Thu | Fri | Sat |\n|>|>|>|>|!| 1 |bgcolor(#eee): 2 |\n|bgcolor(#eee): 3 | 4 | 5 |bgcolor(#FFFF7E): [[6|September 6 2006]] | 7 | 8 |bgcolor(#eee): 9 |\n|bgcolor(#FFFF7E): [[10|September 10 2006]] | 11 | 12 | 13 | 14 | 15 |bgcolor(#eee): 16 |\n|bgcolor(#FFFF7E): [[17|September 17 2006]] | 18 | 19 |bgcolor(#FFFF7E): [[20|September 20 2006]] | 21 | 22 |bgcolor(#eee): 23 |\n|bgcolor(#eee): 24 | 25 | 26 | 27 | 28 | 29 |bgcolor(#eee): 30 |
__Autodesk Communities__\n\nI've been putting off updating this website for too long now. And it's not like nothing's been happening; quite the contrary. First and foremost is the release of the Autodesk Civil Community, It's very easy to get started, just use your Autodesk [[Discussions|]] login info to get in.\n\nAlso new from Autodesk is the [[Students|]] community resource website.\n\n----\n\n__Personal Note__\n\nI've just begun (as of tonight) a weekly nightcourse in political science: international relations. So wish me luck with that, this sort of thing isn't my bag, baby.\n\n----\n\n__Pending Updates__\n\nI'm planning to post a lot of backlogged updates to this website soon. Stay tuned for an evening which doesn't have me preoccupied.\n\n----\n\n<<haloscan comments>>
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<saveChanges>><<upload index.html . . mthompson>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>>
/***\nThis CSS by DaveBirss.\n***/\n/*{{{*/\n\n.tabSelected {\n background: #fff;\n}\n\n.tabUnselected {\n background: #eee;\n}\n\n#sidebar {\n color: #000;\n}\n\n#sidebarOptions {\n background: #fff;\n}\n\n#sidebarOptions .button {\n color: #999;\n}\n\n#sidebarOptions .button:hover {\n color: #000;\n background: #fff;\n border-color:white;\n}\n\n#sidebarOptions .button:active {\n color: #000;\n background: #fff;\n}\n\n#sidebarOptions .sliderPanel {\n background: transparent;\n}\n\n#sidebarOptions .sliderPanel A {\n color: #999;\n}\n\n#sidebarOptions .sliderPanel A:hover {\n color: #000;\n background: #fff;\n}\n\n#sidebarOptions .sliderPanel A:active {\n color: #000;\n background: #fff;\n}\n\n.sidebarSubHeading {\n color: #000;\n}\n\n#sidebarTabs {`\n background: #fff\n}\n\n#sidebarTabs .tabSelected {\n color: #000;\n background: #fff;\n border-top: solid 1px #ccc;\n border-left: solid 1px #ccc;\n border-right: solid 1px #ccc;\n border-bottom: none;\n}\n\n#sidebarTabs .tabUnselected {\n color: #999;\n background: #eee;\n border-top: solid 1px #ccc;\n border-left: solid 1px #ccc;\n border-right: solid 1px #ccc;\n border-bottom: none;\n}\n\n#sidebarTabs .tabContents {\n background: #fff;\n}\n\n\n#sidebarTabs .txtMoreTab .tabSelected {\n background: #fff;\n}\n\n#sidebarTabs .txtMoreTab .tabUnselected {\n background: #eee;\n}\n\n#sidebarTabs .txtMoreTab .tabContents {\n background: #fff;\n}\n\n#sidebarTabs .tabContents .tiddlyLink {\n color: #999;\n}\n\n#sidebarTabs .tabContents .tiddlyLink:hover {\n background: #fff;\n color: #000;\n}\n\n#sidebarTabs .tabContents {\n color: #000;\n}\n\n#sidebarTabs .button {\n color: #666;\n}\n\n#sidebarTabs .tabContents .button:hover {\n color: #000;\n background: #fff;\n}\n\n/*}}}*/
See [[Site Grading Essentials|]], 12 pages long full of helpful pictures and stuff.
|Updates<<siteMap "Calendar">><<siteMap "Message Me">><<siteMap "To Do">>|Information <<siteMap Resources>>|Development <<siteMap "Dev">><<siteMap "Update">>|Weblogs <<siteMap "Blogs">>|\n|noBorder fourCol|k
A non-linear resource arsenal.
Civil 3D Notebook
Here's are Autodesk's [[skill builders|]].\n\n''August 2006''\n3. Label Styles\n<<<\nWork with label styles for alignments and parcels to learn how to modify label content, format, and orientation. In these exercises you will also use an expression in a label, modify dragged state format, and replace a set of labels with a table. (August 2006)\n<<<\n\n''May 2006''\n2. Profile and Profile View Styles and Labels\n<<<\nExamine profile and profile view display and stylization and create and edit various profile and profile view styles and labels. A sample schematic of a profile view is also included providing details on common styles and labels and explaining where to access the styles and labels to control their display. (May 2006)\n<<<\n\n''April 2006''\n1. Setting Superelevation for a Roadway\n<<<\nCreate and edit superelevation settings for an alignment and analyze the effects of superelevation on an alignment, profile, and corridor of a roadway. After creating the settings, you can apply two-lane or four-lane roadway assemblies to create corridors that show the superelevation in the road design. (April 2006)\n<<<\n\nThough they do say to check back often for new Skill Builders, you're better off just reading blogs to see if they notice anything new. I'll try to post it if I notice anything has changed.
/***\n| Name:|StickyDate|\n| Created by:|Rodrigo Fonseca|\n| Location:||\n| Version:|0.1.0 (01-Aug-2006)|\n| Requires:|~TW2.x|\n!Description\nThis is a simple plugin and a macro that allow you to set an arbitrary and permanent modified date to a Tiddler.\nTo use it, insert the macro\n{{{\n<<sd "Aug 1, 2010 10:12:22">>\n}}}\nanywhere in the text of the Tiddler. If there are more than one occurrences, only the first will be considered. The date can be well in the future (as in the example) or in the past. The plugin actually uses the date in the macro to set as the modified date (that's why it's sticky). This is done when saving the Tiddler. The macro makes sure the content does not appear when rendering, but is still editable. (The plugin will not change the date of some tiddlers, mostly system and configuration ones. See the source code for what is filtered).\n\nWhy would you want that? I wanted to create a page with Tiddlers for helping me plan an upcoming trip. By setting the modified date in the Tiddlers to the date at which I wanted my notes to appear, I got a very cool way of listing all tiddlers for a particular day in my trip: flight info, hotel info, notes on what to do, etc.\n\nI hope you find this useful.\n!Installation\n* Copy the code to a new Tiddler and add the systemConfig tag to it. Save and reload the wiki.\n!Notes\n* The format of the string within the quotes is that of a javascript date string, which is accepted by the Date.parse() method. In other words, use something like "Aug 1, 2006 12:34:12". Don't forget the double quotes.\n!History\n* 01-Aug-06, version 1.0.0\n** intitial release\n!Code\n***/\n//{{{\n/* With code from the InstantTimestamp from */\n\nversion.extensions.StickyDatePlugin = {major: 0, minor: 1, revision: 0, date: new Date(2006,8,1), \n source: ""};\n\n/* Create a macro that does nothing with the <<sd "Date">> tag */\ = {};\ = function (place, macroName, params, wikifier, paramString, tiddler) {};\n\nconfig.StickyDate = {\n excludeTags: [\n "noAutoCorrect",\n "CSS",\n "css",\n "systemConfig",\n "zsystemConfig",\n "Plugins",\n "Plugin",\n "plugins",\n "plugin",\n "javascript",\n "code"\n ],\n excludeTiddlers: [\n "StyleSheet",\n "StyleSheetLayout",\n "StyleSheetColors",\n "StyleSheetPrint"\n ]\n}; \n\nif (!Array.prototype.contains)\n Array.prototype.contains = function(item) {\n return (this.find(item) != null);\n };\n\nif (!Array.prototype.containsAny)\n Array.prototype.containsAny = function(items) {\n for (var i=0;i<items.length;i++)\n if (this.contains(items[i]))\n return true;\n return false;\n };\n\nTiddlyWiki.prototype.saveTiddler_sd_saveTiddler = TiddlyWiki.prototype.saveTiddler;\nTiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags) {\n\n tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;\n var conf = config.StickyDate;\n\n if ( !tags.containsAny(conf.excludeTags) \n && !conf.excludeTiddlers.contains(newTitle) ) {\n\n var regex = /\s<\s<\ss*sd\ss+"([^"]+)"\ss*\s>\s>/;\n var matches = regex.exec(newBody);\n var date;\n if (matches != null && matches.length > 1) {\n //alert('Found '+ matches[1]);\n date = new Date(matches[1]);\n if (date.toLocaleString().indexOf('Invalid') == -1) {\n //We have a valid date. Use this instead of the modified date.\n modified = date;\n }\n }\n }\n\n return this.saveTiddler_sd_saveTiddler(title,newTitle,newBody,modifier,modified,tags);\n}\n\n\n\n//}}}\n
Civil 3D 2007 Style fundamentals:\n\n[[C3D 2007 - Style Fundamentals.pdf|]]
/***\nCosmetic fixes that probably should be included in a future TW...\n***/\n/*{{{*/\n.viewer .listTitle { list-style-type:none; margin-left:-2em; }\n.editorFooter .button { padding-top: 0px; padding-bottom:0px; }\n/*}}}*/\n/***\nImportant stuff. See TagglyTaggingStyles and HorizontalMainMenuStyles\n***/\n/*{{{*/\n[[TagglyTaggingStyles]]\n[[HorizontalMainMenuStyles]]\n/*}}}*/\n/***\nClint's fix for weird IE behaviours\n***/\n/*{{{*/\nbody {position:static;}\n.tagClear{margin-top:1em;clear:both;}\n/*}}}*/\n/***\nJust colours, fonts, tweaks etc. See SideBarWhiteAndGrey\n***/\n/*{{{*/\nbody {background:#eee; /* font-size:103%; */}\na{ color: #069; }\na:hover{ background: #069; color: #fff; }\n.popup { background: #069; border: 1px solid #035; }\n.headerForeground a { color: #38a; font-weight:bold;}\n.headerShadow a { font-weight:bold;}\n.headerShadow { left: 2px; top: 2px;}\n.title { padding:0px; margin:0px; }\n.siteSubtitle { padding:0px; margin:0px; padding-left:1.5em; font-weight:bold; }\n.headerForeground .siteSubtitle { color:#38a; }\n.subtitle { font-size:90%; color:#ccc; padding-left:0.25em; }\nh1,h2,h3,h4,h5 { color: #000; background: transparent; }\n.title {color:black; font-size:2em;}\n.shadow .title {color:#999; }\n.viewer pre { background-color:#f8f8ff; border-color:#ddf; }\n.viewer { padding-top:0px; }\n.editor textarea { font-family:monospace; }\n#sidebarOptions { border:1px #ccc solid; }\n.tiddler {\n border-bottom:1px solid #ccc; border-right:1px solid #ccc; padding-bottom:1em; margin-bottom:1em; \n background:#fff; padding-right:1.5em; }\n#messageArea { background-color:#bde; border-color:#8ab; border-width:4px; border-style:dotted; font-size:90%; }\n#messageArea .button { text-decoration:none; font-weight:bold; background:transparent; border:0px; }\n#messageArea .button:hover {background: #acd;}\n[[SideBarWhiteAndGrey]]\n\n.viewer td {vertical-align:top;}\n\n.viewer table.noBorder {border-style:none;}\n.viewer table.noBorder td {border-style:none;}\n.viewer table.threeCol td {width:33%;}\n\n#adsense {\n margin: 1em 15.7em 0em 1em; border:1px solid #ddd;\n background:#f8f8f8; text-align:center;margin-bottom:1em;overflow:hidden;padding:0.5em;} \n\n.sliderPanel { margin-left: 2em; }\n\n.viewer th { background:#ddd; color:black; }\n/*}}}*/\n/*{{{*/\n/* for testing clint's new formatter. eg {{red{asdfaf}}} */\ { color:white; background:red; display:block; padding:1em; } \n\n/* FF doesn't need this. but IE seems to want to make first one white */\n.txtMainTab .tabset { background:#eee; }\n.txtMoreTab .tabset { background:transparent; }\n\n.faq ol li { padding-top:1em; font-size:120%; }\n.faq ol ul li { padding-top:0px; font-size:100%; }\n\n#adsenseBox { background:white; padding:5px 5px; border:1px solid #ccc; margin-bottom:3px; margin-top:3px; }\n#adsenseBox2 { background:white; padding:0px 0px; border:1px solid #ccc; margin-bottom:1em; margin-top:1em; }\n#adsenseBar { text-align:left; background:#fff; padding:1em 1em; border:1px solid #ccc; margin-bottom:1em; margin-top:0; overflow:hidden; }\n\n\n/*}}}*/\n
Type the text for 'Styles'
From AUGI's blog, BLAUGI: ''[[]]''.\n\nThis short but helpful post illustrates two different ways to stylize your feature lines in Civil 3D. I encourage you to read the full post, but here's the skinny:\n<<<\n''Method 1)'' Corridor Properties > Feature Lines tab > Apply a style (create one first) using the "Feature Line Style - Creation dialog box" to specify layer, color, linetype, etc. to set your style.\n\n''Method 2)'' Export the feature lines as polylines and stylize those by adjusting layer and object properties. Check out the post for details on exporting corridor feature lines.\n<<<\nI suspect this should be a great help to those who, like myself, started drafting in new polylines and didn't even think about stylizing what's already right in front of you.\n\n//Thanks DannyCounts//!
Autodesk white page that actually goes into a good level of detail regarding junction or intersection design. [[Link here|]], 30 pages. ''Well'' worth the read if you're new to the game like me.
/***\n''Name:'' TWUpdate\n''Author:'' Tom Otvos\n''Version:'' 0.2\n<<twupdate>>\n***/\n//{{{\n\nversion.extensions.twupdate = {major: 0, minor: 2, revision: 0, date: new Date(2006,3,13,0,0,0,0), source: ""};\n\nconfig.macros.twupdate = { \n label: "update",\n sourceUrl: "", \n lingo: {\n prompt: "Update this TiddlyWiki from", \n warning: "Are you sure you want to update this document with the latest version of TiddlyWiki?\sn\snIf you want to continue, your document will first be saved with a backup.",\n success: "Update was successful. Click on 'OK' to reload the document",\n errNoHttp: "Unable to allocate an HTTP request object for the update",\n progressLoading: "Getting update from",\n progressLoadSuccess: "File successfully loaded",\n progressLoadFailure: "File was not loaded successfully (%0)",\n progressMerging: "Merging with existing document..."\n }\n}\n\nconfig.macros.twupdate.handler = function(place)\n{\n if(!readOnly)\n createTiddlyButton(place, this.label, this.prompt, this.onClick, null, null, null);\n}\n\nconfig.macros.twupdate.onClick = function(e)\n{\n if (!confirm(config.macros.twupdate.lingo.warning)) return;\n\n try {\n // force a save with backup\n var saveBackups = config.options.chkSaveBackups;\n config.options.chkSaveBackups = true;\n saveChanges();\n config.options.chkSaveBackups = saveBackups;\n \n var ajax = new AjaxHelper();\n displayMessage(config.macros.twupdate.lingo.progressLoading);\n ajax.getText(config.macros.twupdate.sourceUrl, config.macros.twupdate.performUpdate); \n }\n catch (e) {\n alert(e);\n }\n\n return false;\n}\n\nconfig.macros.twupdate.performUpdate = function(emptyHtml, status, statusText)\n{\n // note that this is begin called from a callback from an event handler, so\n // "this" is most definitely not defined!\n \n if (status == 200)\n displayMessage(config.macros.twupdate.lingo.progressLoadSuccess);\n else {\n displayMessage(config.macros.twupdate.lingo.progressLoadFailure.format([statusText]));\n return;\n }\n displayMessage(config.macros.twupdate.lingo.progressMerging);\n \n // the bulk of this is cribbed from saveChanges()...\n var originalPath = document.location.toString();\n // Check we were loaded from a file URL\n if (originalPath.substr(0,5) != "file:") {\n alert(config.messages.notFileUrlError);\n if (store.tiddlerExists(config.messages.saveInstructions))\n displayTiddler(null,config.messages.saveInstructions);\n return;\n }\n var localPath = getLocalPath(originalPath);\n\n // Locate the storeArea div's\n var posOpeningDiv = emptyHtml.indexOf(startSaveArea);\n var posClosingDiv = emptyHtml.lastIndexOf(endSaveArea);\n if ((posOpeningDiv == -1) || (posClosingDiv == -1)) {\n alert(config.messages.invalidFileError.format(['empty.html']));\n return;\n }\n\n // Save new file\n var revised = emptyHtml.substr(0,posOpeningDiv + startSaveArea.length) + \n convertUnicodeToUTF8(allTiddlersAsHtml()) + "\sn\st\st" +\n emptyHtml.substr(posClosingDiv);\n var newSiteTitle = convertUnicodeToUTF8((wikifyPlain("SiteTitle") + " - " + wikifyPlain("SiteSubtitle")).htmlEncode());\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 var save = saveFile(localPath, revised);\n if (save) {\n displayMessage(config.messages.mainSaved, "file://" + localPath);\n store.setDirty(false);\n alert(config.macros.twupdate.lingo.success);\n document.location.reload();\n }\n else\n alert(config.messages.mainFailed);\n}\n\nfunction AjaxHelper()\n{\n this.http = null;\n \n try\n {\n this.http = new XMLHttpRequest()\n }\n \n catch(e)\n {\n // if we don't get an internal object, try allocating it using ActiveX, with successive\n // fallbacks to earlier MSXML versions as necessary\n try\n {\n this.http = new ActiveXObject("Msxml2.XMLHTTP.4.0")\n } \n catch(e) \n {\n try\n {\n this.http = new ActiveXObject("MSXML2.XMLHTTP")\n } \n catch(e) \n {\n try\n {\n this.http = new ActiveXObject("Microsoft.XMLHTTP")\n } \n catch(e) \n {\n this.http = null\n }\n }\n }\n }\n \n if (!this.http) throw 'Unable to allocate an HTTP request object';\n}\n\nAjaxHelper.prototype.getText = function(url, callback, async, force)\n{\n if (!this.http) return;\n if (async == undefined) async = true;\n if (force == undefined) force = false;\n // ??? right now, we are not handling "forced" requests\n this._request("GET", url, callback, async, true, false);\n}\n\nAjaxHelper.prototype.getXML = function(url, callback, async, force)\n{\n if (!this.http) return;\n if (async == undefined) async = true;\n if (force == undefined) force = false;\n // ??? right now, we are not handling "forced" requests\n this._request("GET", url, callback, async, true, true);\n}\n\nAjaxHelper.prototype.getHead = function(url, callback, async, force)\n{\n if (!this.http) return;\n if (async == undefined) async = true;\n if (force == undefined) force = false;\n // ??? right now, we are not handling "forced" requests\n this._request("HEAD", url, callback, async, false, false);\n}\n\nAjaxHelper.prototype.abort = function()\n{\n if (this.http) this.http.abort();\n}\n\nAjaxHelper.prototype.setRequestHeader = function(name, value)\n{\n if (this.http) this.http.setRequestHeader(name, value);\n}\n\nAjaxHelper.prototype._request = function(method, url, callback, async, hasResponse, hasResponseXML)\n{\n if (!this.http) return;\n \n // get reference to request object so we can use it in closure\n var xmlHttp = this.http, helper = this;\n xmlHttp.onreadystatechange = function()\n {\n if (!async) return;\n if (xmlHttp.readyState == 4)\n callback((hasResponse ? (hasResponseXML ? xmlHttp.responseXML : xmlHttp.responseText) : null), xmlHttp.status, xmlHttp.statusText, helper._parsedResponseHeaders());\n }\n \n try {\n // need some cross-domain privileges for Firefox\n try {\n"UniversalBrowserRead");\n } \n catch (e) \n {\n }\n \n, url, async);\n xmlHttp.send(null);\n if (!async) callback((hasResponse ? (hasResponseXML ? xmlHttp.responseXML : xmlHttp.responseText) : null), xmlHttp.status, xmlHttp.statusText, this._parsedResponseHeaders());\n }\n \n catch (e)\n {\n alert(e);\n }\n}\n\nAjaxHelper.prototype._parsedResponseHeaders = function()\n{\n if (this.http) {\n var headersArray = new Array();\n var headers = this.http.getAllResponseHeaders().split("\sn");\n for (var i = 0; i < headers.length; i++) {\n var h = headers[i].trim();\n if (h.length == 0) continue;\n // value can have ':' so do not use split here!\n var sep = h.indexOf(':');\n headersArray[h.substring(0, sep).trim()] = h.substr(sep + 1).trim();\n }\n return headersArray;\n }\n else\n return null;\n}\n\n//}}}\n
/***\n|Name|TagglyListPlugin|\n|Created by|SimonBaird|\n|Location||\n|Version|1.1.2 25-Apr-06|\n|Requires|See TagglyTagging|\n\n!History\n* 1.1.2 (25-Apr-2006) embedded TagglyTaggingStyles. No longer need separated tiddler for styles.\n* 1.1.1 (6-Mar-2006) fixed bug with refreshAllVisible closing tiddlers being edited. Thanks Luke Blanshard.\n\n***/\n\n/***\n!Setup and config\n***/\n//{{{\n\nversion.extensions.TagglyListPlugin = {\n major: 1, minor: 1, revision: 2,\n date: new Date(2006,4,25),\n source: ""\n};\n\nconfig.macros.tagglyList = {};\nconfig.macros.tagglyListByTag = {};\nconfig.macros.tagglyListControl = {};\nconfig.macros.tagglyListWithSort = {};\nconfig.macros.hideSomeTags = {};\n\n// change this to your preference\nconfig.macros.tagglyListWithSort.maxCols = 6;\n\nconfig.macros.tagglyList.label = "Tagged as %0:";\n\n// the default sort options. set these to your preference\nconfig.macros.tagglyListWithSort.defaults = {\n sortBy:"title", // title|created|modified\n sortOrder: "asc", // asc|desc\n hideState: "show", // show|hide\n groupState: "nogroup", // nogroup|group\n numCols: 1\n};\n\n// these tags will be ignored by the grouped view\nconfig.macros.tagglyListByTag.excludeTheseTags = [\n "systemConfig",\n "TiddlerTemplates"\n];\n\nconfig.macros.tagglyListControl.tags = {\n title:"sortByTitle", \n modified: "sortByModified", \n created: "sortByCreated",\n asc:"sortAsc", \n desc:"sortDesc",\n hide:"hideTagged", \n show:"showTagged",\n nogroup:"noGroupByTag",\n group:"groupByTag",\n cols1:"list1Cols",\n cols2:"list2Cols",\n cols3:"list3Cols",\n cols4:"list4Cols",\n cols5:"list5Cols",\n cols6:"list6Cols",\n cols7:"list7Cols",\n cols8:"list8Cols",\n cols9:"list9Cols" \n}\n\n// note: should match config.macros.tagglyListControl.tags\nconfig.macros.hideSomeTags.tagsToHide = [\n "sortByTitle",\n "sortByCreated",\n "sortByModified",\n "sortDesc",\n "sortAsc",\n "hideTagged",\n "showTagged",\n "noGroupByTag",\n "groupByTag",\n "list1Cols",\n "list2Cols",\n "list3Cols",\n "list4Cols",\n "list5Cols",\n "list6Cols",\n "list7Cols",\n "list8Cols",\n "list9Cols"\n];\n\n\n//}}}\n/***\n\n!Utils\n***/\n//{{{\n// from Eric\nfunction isTagged(title,tag) {\n var t=store.getTiddler(title); if (!t) return false;\n return (t.tags.find(tag)!=null);\n}\n\n// from Eric\nfunction toggleTag(title,tag) {\n var t=store.getTiddler(title); if (!t || !t.tags) return;\n if (t.tags.find(tag)==null) t.tags.push(tag);\n else t.tags.splice(t.tags.find(tag),1);\n}\n\nfunction addTag(title,tag) {\n var t=store.getTiddler(title); if (!t || !t.tags) return;\n t.tags.push(tag);\n}\n\nfunction removeTag(title,tag) {\n var t=store.getTiddler(title); if (!t || !t.tags) return;\n if (t.tags.find(tag)!=null) t.tags.splice(t.tags.find(tag),1);\n}\n\n// from Udo\nArray.prototype.indexOf = function(item) {\n for (var i = 0; i < this.length; i++) {\n if (this[i] == item) {\n return i;\n }\n }\n return -1;\n};\nArray.prototype.contains = function(item) {\n return (this.indexOf(item) >= 0);\n}\n//}}}\n/***\n\n!tagglyList\ndisplays a list of tagged tiddlers. \nparameters are sortField and sortOrder\n***/\n//{{{\n\n// not used at the moment...\nfunction sortedListOfOtherTags(tiddler,thisTag) {\n var list = tiddler.tags.concat(); // so we are working on a clone..\n for (var i=0;i<config.macros.hideSomeTags.tagsToHide.length;i++) {\n if (list.find(config.macros.hideSomeTags.tagsToHide[i]) != null)\n list.splice(list.find(config.macros.hideSomeTags.tagsToHide[i]),1); // remove hidden ones\n }\n for (var i=0;i<config.macros.tagglyListByTag.excludeTheseTags.length;i++) {\n if (list.find(config.macros.tagglyListByTag.excludeTheseTags[i]) != null)\n list.splice(list.find(config.macros.tagglyListByTag.excludeTheseTags[i]),1); // remove excluded ones\n }\n list.splice(list.find(thisTag),1); // remove thisTag\n return '[[' + list.sort().join("]] [[") + ']]';\n}\n\nfunction sortHelper(a,b) {\n if (a == b) return 0;\n else if (a < b) return -1;\n else return +1;\n}\n\nconfig.macros.tagglyListByTag.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n\n var sortBy = params[0] ? params[0] : "title"; \n var sortOrder = params[1] ? params[1] : "asc";\n\n var result = store.getTaggedTiddlers(tiddler.title,sortBy);\n\n if (sortOrder == "desc")\n result = result.reverse();\n\n var leftOvers = []\n for (var i=0;i<result.length;i++) {\n leftOvers.push(result[i].title);\n }\n\n var allTagsHolder = {};\n for (var i=0;i<result.length;i++) {\n for (var j=0;j<result[i].tags.length;j++) {\n\n if ( \n result[i].tags[j] != tiddler.title // not this tiddler\n && config.macros.hideSomeTags.tagsToHide.find(result[i].tags[j]) == null // not a hidden one\n && config.macros.tagglyListByTag.excludeTheseTags.find(result[i].tags[j]) == null // not excluded\n ) {\n if (!allTagsHolder[result[i].tags[j]])\n allTagsHolder[result[i].tags[j]] = "";\n allTagsHolder[result[i].tags[j]] += "**[["+result[i].title+"]]\sn";\n\n if (leftOvers.find(result[i].title) != null)\n leftOvers.splice(leftOvers.find(result[i].title),1); // remove from leftovers. at the end it will contain the leftovers...\n }\n }\n }\n\n\n var allTags = [];\n for (var t in allTagsHolder)\n allTags.push(t);\n\n allTags.sort(function(a,b) {\n var tidA = store.getTiddler(a);\n var tidB = store.getTiddler(b);\n if (sortBy == "title") return sortHelper(a,b);\n else if (!tidA && !tidB) return 0;\n else if (!tidA) return -1;\n else if (!tidB) return +1;\n else return sortHelper(tidA[sortBy],tidB[sortBy]);\n });\n\n var markup = "";\n\n if (sortOrder == "desc") {\n allTags.reverse();\n }\n else {\n // leftovers first...\n for (var i=0;i<leftOvers.length;i++)\n markup += "*[["+leftOvers[i]+"]]\sn";\n } \n\n for (var i=0;i<allTags.length;i++)\n markup += "*[["+allTags[i]+"]]\sn" + allTagsHolder[allTags[i]];\n\n if (sortOrder == "desc") {\n // leftovers last...\n for (var i=0;i<leftOvers.length;i++)\n markup += "*[["+leftOvers[i]+"]]\sn";\n }\n\n wikify(markup,place);\n}\n\nconfig.macros.tagglyList.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n var sortBy = params[0] ? params[0] : "title"; \n var sortOrder = params[1] ? params[1] : "asc";\n var numCols = params[2] ? params[2] : 1;\n\n var result = store.getTaggedTiddlers(tiddler.title,sortBy);\n if (sortOrder == "desc")\n result = result.reverse();\n\n var listSize = result.length;\n var colSize = listSize/numCols;\n var remainder = listSize % numCols;\n\n var upperColsize;\n var lowerColsize;\n if (colSize != Math.floor(colSize)) {\n // it's not an exact fit so..\n lowerColsize = Math.floor(colSize);\n upperColsize = Math.floor(colSize) + 1;\n }\n else {\n lowerColsize = colSize;\n upperColsize = colSize;\n }\n\n var markup = "";\n var c=0;\n\n var newTaggedTable = createTiddlyElement(place,"table");\n var newTaggedBody = createTiddlyElement(newTaggedTable,"tbody");\n var newTaggedTr = createTiddlyElement(newTaggedBody,"tr");\n\n for (var j=0;j<numCols;j++) {\n var foo = "";\n var thisSize;\n\n if (j<remainder)\n thisSize = upperColsize;\n else\n thisSize = lowerColsize;\n\n for (var i=0;i<thisSize;i++) \n foo += ( "*[[" + result[c++].title + "]]\sn"); // was using splitList.shift() but didn't work in IE;\n\n var newTd = createTiddlyElement(newTaggedTr,"td",null,"tagglyTagging");\n wikify(foo,newTd);\n\n }\n\n};\n\n/* snip for later.....\n //var groupBy = params[3] ? params[3] : "t.title.substr(0,1)";\n //var groupBy = params[3] ? params[3] : "sortedListOfOtherTags(t,tiddler.title)";\n //var groupBy = params[3] ? params[3] : "t.modified";\n var groupBy = null; // for now. groupBy here is working but disabled for now.\n\n var prevGroup = "";\n var thisGroup = "";\n\n if (groupBy) {\n result.sort(function(a,b) {\n var t = a; var aSortVal = eval(groupBy); var aSortVal2 = eval("t".sortBy);\n var t = b; var bSortVal = eval(groupBy); var bSortVal2 = eval("t".sortBy);\n var t = b; var bSortVal2 = eval(groupBy);\n return (aSortVal == bSortVal ?\n (aSortVal2 == bSortVal2 ? 0 : (aSortVal2 < bSortVal2 ? -1 : +1)) // yuck\n : (aSortVal < bSortVal ? -1 : +1));\n });\n }\n\n if (groupBy) {\n thisGroup = eval(groupBy);\n if (thisGroup != prevGroup)\n markup += "*[["+thisGroup+']]\sn';\n markup += "**[["+t.title+']]\sn';\n prevGroup = thisGroup;\n }\n\n\n\n*/\n\n\n//}}}\n\n/***\n\n!tagglyListControl\nUse to make the sort control buttons\n***/\n//{{{\n\nfunction getSortBy(title) {\n var tiddler = store.getTiddler(title);\n var defaultVal = config.macros.tagglyListWithSort.defaults.sortBy;\n if (!tiddler) return defaultVal;\n var usetags = config.macros.tagglyListControl.tags;\n if (tiddler.tags.contains(usetags["title"])) return "title";\n else if (tiddler.tags.contains(usetags["modified"])) return "modified";\n else if (tiddler.tags.contains(usetags["created"])) return "created";\n else return defaultVal;\n}\n\nfunction getSortOrder(title) {\n var tiddler = store.getTiddler(title);\n var defaultVal = config.macros.tagglyListWithSort.defaults.sortOrder;\n if (!tiddler) return defaultVal;\n var usetags = config.macros.tagglyListControl.tags;\n if (tiddler.tags.contains(usetags["asc"])) return "asc";\n else if (tiddler.tags.contains(usetags["desc"])) return "desc";\n else return defaultVal;\n}\n\nfunction getHideState(title) {\n var tiddler = store.getTiddler(title);\n var defaultVal = config.macros.tagglyListWithSort.defaults.hideState;\n if (!tiddler) return defaultVal;\n var usetags = config.macros.tagglyListControl.tags;\n if (tiddler.tags.contains(usetags["hide"])) return "hide";\n else if (tiddler.tags.contains(usetags["show"])) return "show";\n else return defaultVal;\n}\n\nfunction getGroupState(title) {\n var tiddler = store.getTiddler(title);\n var defaultVal = config.macros.tagglyListWithSort.defaults.groupState;\n if (!tiddler) return defaultVal;\n var usetags = config.macros.tagglyListControl.tags;\n if (tiddler.tags.contains(usetags["group"])) return "group";\n else if (tiddler.tags.contains(usetags["nogroup"])) return "nogroup";\n else return defaultVal;\n}\n\nfunction getNumCols(title) {\n var tiddler = store.getTiddler(title);\n var defaultVal = config.macros.tagglyListWithSort.defaults.numCols; // an int\n if (!tiddler) return defaultVal;\n var usetags = config.macros.tagglyListControl.tags;\n for (var i=1;i<=config.macros.tagglyListWithSort.maxCols;i++)\n if (tiddler.tags.contains(usetags["cols"+i])) return i;\n return defaultVal;\n}\n\n\nfunction getSortLabel(title,which) {\n // TODO. the strings here should be definable in config\n var by = getSortBy(title);\n var order = getSortOrder(title);\n var hide = getHideState(title);\n var group = getGroupState(title);\n if (which == "hide") return (hide == "show" ? "−" : "+"); // 0x25b8;\n else if (which == "group") return (group == "group" ? "normal" : "grouped");\n else if (which == "cols") return "cols±"; // &plusmn;\n else if (by == which) return which + (order == "asc" ? "↓" : "↑"); // &uarr; &darr;\n else return which;\n}\n\nfunction handleSortClick(title,which) {\n var currentSortBy = getSortBy(title);\n var currentSortOrder = getSortOrder(title);\n var currentHideState = getHideState(title);\n var currentGroupState = getGroupState(title);\n var currentNumCols = getNumCols(title);\n\n var tags = config.macros.tagglyListControl.tags;\n\n // if it doesn't exist, lets create it..\n if (!store.getTiddler(title))\n store.saveTiddler(title,title,"",config.options.txtUserName,new Date(),null);\n\n if (which == "hide") {\n // toggle hide state\n var newHideState = (currentHideState == "hide" ? "show" : "hide");\n removeTag(title,tags[currentHideState]);\n if (newHideState != config.macros.tagglyListWithSort.defaults.hideState)\n toggleTag(title,tags[newHideState]);\n }\n else if (which == "group") {\n // toggle hide state\n var newGroupState = (currentGroupState == "group" ? "nogroup" : "group");\n removeTag(title,tags[currentGroupState]);\n if (newGroupState != config.macros.tagglyListWithSort.defaults.groupState)\n toggleTag(title,tags[newGroupState]);\n }\n else if (which == "cols") {\n // toggle num cols\n var newNumCols = currentNumCols + 1; // confusing. currentNumCols is an int\n if (newNumCols > config.macros.tagglyListWithSort.maxCols || newNumCols > store.getTaggedTiddlers(title).length)\n newNumCols = 1;\n removeTag(title,tags["cols"+currentNumCols]);\n if (("cols"+newNumCols) != config.macros.tagglyListWithSort.defaults.groupState)\n toggleTag(title,tags["cols"+newNumCols]);\n }\n else if (currentSortBy == which) {\n // toggle sort order\n var newSortOrder = (currentSortOrder == "asc" ? "desc" : "asc");\n removeTag(title,tags[currentSortOrder]);\n if (newSortOrder != config.macros.tagglyListWithSort.defaults.sortOrder)\n toggleTag(title,tags[newSortOrder]);\n }\n else {\n // change sortBy only\n removeTag(title,tags["title"]);\n removeTag(title,tags["created"]);\n removeTag(title,tags["modified"]);\n\n if (which != config.macros.tagglyListWithSort.defaults.sortBy)\n toggleTag(title,tags[which]);\n }\n\n store.setDirty(true); // save is required now.\n story.refreshTiddler(title,false,true); // force=true\n}\n\nconfig.macros.tagglyListControl.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n var onclick = function(e) {\n if (!e) var e = window.event;\n handleSortClick(tiddler.title,params[0]);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return false;\n };\n createTiddlyButton(place,getSortLabel(tiddler.title,params[0]),"Click to change sort options",onclick,params[0]=="hide"?"hidebutton":"button");\n}\n//}}}\n/***\n\n!tagglyListWithSort\nput it all together..\n***/\n//{{{\nconfig.macros.tagglyListWithSort.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n if (tiddler && store.getTaggedTiddlers(tiddler.title).length > 0)\n // todo make this readable\n wikify(\n "<<tagglyListControl hide>>"+\n (getHideState(tiddler.title) != "hide" ? \n '<html><span class="tagglyLabel">'+config.macros.tagglyList.label.format([tiddler.title])+' </span></html>'+\n "<<tagglyListControl title>><<tagglyListControl modified>><<tagglyListControl created>><<tagglyListControl group>>"+(getGroupState(tiddler.title)=="group"?"":"<<tagglyListControl cols>>")+"\sn" + \n "<<tagglyList" + (getGroupState(tiddler.title)=="group"?"ByTag ":" ") + getSortBy(tiddler.title)+" "+getSortOrder(tiddler.title)+" "+getNumCols(tiddler.title)+">>" // hacky\n // + \sn----\sn" +\n //"<<tagglyList "+getSortBy(tiddler.title)+" "+getSortOrder(tiddler.title)+">>"\n : ""),\n place,null,tiddler);\n}\n\nconfig.macros.tagglyTagging = { handler: config.macros.tagglyListWithSort.handler };\n\n\n//}}}\n/***\n\n!hideSomeTags\nSo we don't see the sort tags.\n(note, they are still there when you edit. Will that be too annoying?\n***/\n//{{{\n\n// based on tags.handler\nconfig.macros.hideSomeTags.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n var theList = createTiddlyElement(place,"ul");\n if(params[0] && store.tiddlerExists[params[0]])\n tiddler = store.getTiddler(params[0]);\n var lingo = config.views.wikified.tag;\n var prompt = tiddler.tags.length == 0 ? lingo.labelNoTags : lingo.labelTags;\n createTiddlyElement(theList,"li",null,"listTitle",prompt.format([tiddler.title]));\n for(var t=0; t<tiddler.tags.length; t++)\n if (!this.tagsToHide.contains(tiddler.tags[t])) // this is the only difference from tags.handler...\n createTagButton(createTiddlyElement(theList,"li"),tiddler.tags[t],tiddler.title);\n\n}\n\n//}}}\n/***\n\n!Refresh everything when we save a tiddler. So the tagged lists never get stale. Is this too slow???\n***/\n//{{{\n\nfunction refreshAllVisible() {\n story.forEachTiddler(function(title,element) {\n if (element.getAttribute("dirty") != "true") \n story.refreshTiddler(title,false,true);\n });\n}\n\nstory.saveTiddler_orig_mptw = story.saveTiddler;\nstory.saveTiddler = function(title,minorUpdate) {\n var result = this.saveTiddler_orig_mptw(title,minorUpdate);\n refreshAllVisible();\n return result;\n}\n\nstore.removeTiddler_orig_mptw = store.removeTiddler;\nstore.removeTiddler = function(title) {\n this.removeTiddler_orig_mptw(title);\n refreshAllVisible();\n}\n\nconfig.shadowTiddlers.TagglyTaggingStyles = "/***\snTo use, add {{{[[TagglyTaggingStyles]]}}} to your StyleSheet tiddler, or you can just paste the CSS in directly. See also ViewTemplate, EditTemplate and TagglyTagging.\sn***/\sn/*{{{*/\sn.tagglyTagged li.listTitle { display:none;}\sn.tagglyTagged li { display: inline; font-size:90%; }\sn.tagglyTagged ul { margin:0px; padding:0px; }\sn.tagglyTagging { padding-top:0.5em; }\sn.tagglyTagging li.listTitle { display:none;}\sn.tagglyTagging ul { margin-top:0px; padding-top:0.5em; padding-left:2em; margin-bottom:0px; padding-bottom:0px; }\sn\sn/* .tagglyTagging .tghide { display:inline; } */\sn\sn.tagglyTagging { vertical-align: top; margin:0px; padding:0px; }\sn.tagglyTagging table { margin:0px; padding:0px; }\sn\sn\sn.tagglyTagging .button { display:none; margin-left:3px; margin-right:3px; }\sn.tagglyTagging .button, .tagglyTagging .hidebutton { color:#aaa; font-size:90%; border:0px; padding-left:0.3em;padding-right:0.3em;}\sn.tagglyTagging .button:hover, .hidebutton:hover { background:#eee; color:#888; }\sn.selected .tagglyTagging .button { display:inline; }\sn\sn.tagglyTagging .hidebutton { color:white; } /* has to be there so it takes up space. tweak if you're not using a white tiddler bg */\sn.selected .tagglyTagging .hidebutton { color:#aaa }\sn\sn.tagglyLabel { color:#aaa; font-size:90%; }\sn\sn.tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }\sn.tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}\sn.tagglyTagging ul ul li {margin-left:0.5em; }\sn\sn.editLabel { font-size:90%; padding-top:0.5em; }\sn/*}}}*/\sn";\n\nrefreshStyles("TagglyTaggingStyles");\n\n\n//}}}\n\n// // <html>&#x25b8;&#x25be;&minus;&plusmn;</html>
<<newerTiddler button:"Journal Entry" name:"MMM DD YYYY" tags:"August06" text:"New stuff for today:">>\n\n<<newerTiddler button:"Calendar" name:"MM MMM YYYY" tags:"Calendar" text:"[[Generate a calendar|]]">>\n
<<tabs txtFavourite\n"C3D Notebook" "Priority 1" ToDo1\n"Office Tasks" "Priority 2" ToDo2\n>>
![[C3D Notebook|ToDo1]]\n#==Implement this [[todo Tiddly|]].==\n#==Find a place to host PDF's for viewing in congunction with this website.==\n#==Create a backup of this Wiki.==\n#==Figure out how to slip in javascript code to a TiddlyWiki.==\n#Find a home for this link:\n#Find a home for this link:
![[Office Tasks|ToDo2]]\n#Implement <html><strong>ALL</strong></html> [[Google Notebook|]] stuff with this Wiki.\n#Share this Wiki with the rest of the office and on some public internet websites.\n#Complete my [[Books]] list and cross-reference with Firas's.
Stuff that isn't finished yet but has a more-or-less definite finished goal.
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |\n| 14/7/2006 23:45:58 | YourName | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 14/7/2006 23:46:27 | YourName | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 14/7/2006 23:48:31 | YourName | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 15/7/2006 0:34:21 | YourName | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 15/7/2006 0:34:40 | YourName | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 15/7/2006 12:32:8 | - Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 15/7/2006 12:32:55 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 15/7/2006 12:34:2 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 15/7/2006 13:13:30 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 15/7/2006 13:25:3 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 17/7/2006 23:9:46 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 17/7/2006 23:13:24 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 26/7/2006 6:59:4 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 26/7/2006 7:11:4 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 26/7/2006 7:11:55 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 26/7/2006 7:12:8 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 26/7/2006 7:15:34 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 1/8/2006 19:10:49 | YourName | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 1/8/2006 19:11:8 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 1/8/2006 19:12:47 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 1/8/2006 19:15:14 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 1/8/2006 19:20:19 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 1/8/2006 19:21:21 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 1/8/2006 19:31:3 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 1/8/2006 19:39:35 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 8:6:54 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 12:37:36 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 12:43:22 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 12:44:25 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 12:46:39 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 15:39:33 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 2/8/2006 15:40:45 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 15:42:24 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 18:27:16 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 19:38:50 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 2/8/2006 19:59:59 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 2/8/2006 20:17:23 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 20:30:42 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 2/8/2006 20:40:52 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 20:45:8 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 20:49:57 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 21:0:13 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 2/8/2006 21:4:17 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 21:5:41 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 21:8:25 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 22:34:49 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 22:35:54 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 22:35:56 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 22:37:37 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 2/8/2006 22:39:49 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 23:25:45 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 2/8/2006 23:30:50 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 2/8/2006 23:33:48 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 2/8/2006 23:45:48 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 2/8/2006 23:58:58 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/8/2006 0:8:18 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/8/2006 0:10:14 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/8/2006 0:15:32 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 0:42:10 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 0:45:54 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 0:46:47 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 0:48:9 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 0:49:57 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 0:53:26 | Mitch | [[index.html|]] | [[store.cgi|]] | | index.html | |\n| 3/8/2006 0:53:56 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 1:0:51 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 1:1:33 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 1:1:49 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 7:42:24 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 8:9:39 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 8:18:0 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 8:49:14 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 10:18:30 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 10:27:27 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/8/2006 10:32:52 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 10:34:36 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/8/2006 10:36:38 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 10:58:28 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 10:59:32 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/8/2006 11:34:1 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 11:35:34 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 13:4:49 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 13:11:35 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 13:15:32 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 13:17:41 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 15:35:18 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 16:27:7 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 18:58:29 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 18:59:13 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 19:3:37 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 19:16:37 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/8/2006 19:23:22 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/8/2006 19:28:6 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 19:32:39 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 20:6:7 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 22:59:8 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 23:15:53 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 23:16:42 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 23:29:8 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 3/8/2006 23:34:45 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/8/2006 23:46:41 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 4/8/2006 13:19:23 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 4/8/2006 21:59:12 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 4/8/2006 23:57:11 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 4/8/2006 23:57:48 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/8/2006 0:22:26 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/8/2006 0:35:11 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 5/8/2006 0:52:45 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/8/2006 0:55:41 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 5/8/2006 1:8:50 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 5/8/2006 10:9:50 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/8/2006 13:29:27 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/8/2006 13:56:38 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 5/8/2006 18:55:58 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/8/2006 19:7:12 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/8/2006 19:15:17 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/8/2006 19:23:46 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/8/2006 19:27:54 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/8/2006 20:15:30 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/8/2006 23:4:26 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 6/8/2006 13:40:56 | Mitch | [[mthompson(2).html|file:///I:/08.2006/mthompson(2).html]] | [[store.cgi|]] | . | index.html | . |\n| 6/8/2006 14:9:37 | Mitch | [[mthompson(2).html|file:///I:/08.2006/mthompson(2).html]] | [[store.cgi|]] | . | index.html | . |\n| 6/8/2006 14:10:27 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 6/8/2006 15:12:25 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/8/2006 15:14:42 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 6/8/2006 16:39:46 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 6/8/2006 21:58:19 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 6/8/2006 21:59:48 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 6/8/2006 22:5:55 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 9/8/2006 11:56:58 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 9/8/2006 12:34:43 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 9/8/2006 18:28:7 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 9/8/2006 19:43:57 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 10/8/2006 8:24:59 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 13/8/2006 23:7:3 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 13/8/2006 23:33:42 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 14/8/2006 9:44:3 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 14/8/2006 12:9:20 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 14/8/2006 13:26:38 | YourName | [[mthompson.html|file:///C:/Documents%20and%20Settings/adwilliams/Desktop/mthompson.html]] | [[store.cgi|]] | . | index.html | . |\n| 14/8/2006 13:27:2 | Mitch | [[mthompson.html|file:///C:/Documents%20and%20Settings/adwilliams/Desktop/mthompson.html]] | [[store.cgi|]] | . | index.html | . |\n| 14/8/2006 23:50:37 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 15/8/2006 14:56:6 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 18/8/2006 14:56:3 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 18/8/2006 17:5:15 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 18/8/2006 22:46:36 | YourName | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 18/8/2006 22:47:4 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 18/8/2006 22:49:6 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 18/8/2006 22:51:19 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 19/8/2006 13:8:52 | Mitch | [[mthompson.html|file:///C:/Documents%20and%20Settings/adwilliams/Desktop/mthompson.html]] | [[store.cgi|]] | . | index.html | . |\n| 19/8/2006 13:35:44 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 19/8/2006 16:19:29 | Mitch | [[mthompson.html|file:///C:/Documents%20and%20Settings/adwilliams/Desktop/mthompson.html]] | [[store.cgi|]] | . | index.html | . |\n| 19/8/2006 16:23:58 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 19/8/2006 16:25:59 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 19/8/2006 18:26:25 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 19/8/2006 19:8:26 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 19/8/2006 19:15:10 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 20/8/2006 1:58:7 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 20/8/2006 2:7:49 | YourName | [[mthompson(3).html|file:///I:/08.2006/mthompson(3).html]] | [[store.cgi|]] | . | index.html | . |\n| 20/8/2006 2:7:59 | YourName | [[mthompson(3).html|file:///I:/08.2006/mthompson(3).html]] | [[store.cgi|]] | . | index.html | . |\n| 20/8/2006 2:27:45 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 20/8/2006 2:32:58 | YourName | [[mthompson(3).html|file:///I:/08.2006/mthompson(3).html]] | [[store.cgi|]] | . | index.html | . |\n| 20/8/2006 3:7:22 | YourName | [[mthompson(4).20060820.0842530750.20060820.0845150734.20060820.0854410531.20060820.0905430593.html|file:///I:/08.2006/mthompson(4).20060820.0842530750.20060820.0845150734.20060820.0854410531.20060820.0905430593.html]] | [[store.cgi|]] | . | index.html | . |\n| 20/8/2006 3:17:5 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 20/8/2006 3:28:45 | YourName | [[mthompson(3).html|file:///I:/08.2006/mthompson(3).html]] | [[store.cgi|]] | . | index.html | . |\n| 20/8/2006 16:0:4 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 20/8/2006 16:33:16 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 20/8/2006 21:31:30 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 20/8/2006 21:36:38 | Mitch | [[mthompson(2).html|file:///C:/Documents%20and%20Settings/adwilliams/Desktop/mthompson(2).html]] | [[store.cgi|]] | . | index.html | . |\n| 20/8/2006 23:50:43 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 20/8/2006 23:52:18 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 21/8/2006 12:4:35 | Mitch | [[mthompson.html|file:///C:/Documents%20and%20Settings/adwilliams/Desktop/mthompson.html]] | [[store.cgi|]] | . | index.html | . |\n| 23/8/2006 9:25:36 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 23/8/2006 11:33:55 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 23/8/2006 14:34:4 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 23/8/2006 15:23:13 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 6/9/2006 21:53:43 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 6/9/2006 21:56:34 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 8/9/2006 11:35:41 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 8/9/2006 11:37:48 | Mitch | [[mthompson.html|file:///C:/Documents%20and%20Settings/adwilliams/Desktop/mthompson.html]] | [[store.cgi|]] | . | index.html | . |\n| 10/9/2006 16:52:46 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 17/9/2006 14:45:19 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 17/9/2006 15:11:53 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 17/9/2006 20:22:33 | YourName | [[mthompson.html|file:///I:/09.2006/mthompson.html]] | [[store.cgi|]] | . | index.html | . |\n| 17/9/2006 20:22:53 | YourName | [[mthompson.html|file:///I:/09.2006/mthompson.html]] | [[store.cgi|]] | . | index.html | . |\n| 19/9/2006 16:58:11 | Mitch | [[mthompson.20060919.2125340252.20060919.2255520517.html|file:///C:/Documents%20and%20Settings/adwilliams/Desktop/mthompson.20060919.2125340252.20060919.2255520517.html]] | [[store.cgi|]] | . | index.html | . |\n| 20/9/2006 9:52:18 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 20/9/2006 15:59:8 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 21/9/2006 16:52:54 | Mitch | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 21/9/2006 19:53:7 | Mitch | [[mthompson.20060922.0151330390.html|file:///I:/09.2006/mthompson.20060922.0151330390.html]] | [[store.cgi|]] | . | index.html | . |\n| 18/10/2006 16:52:9 | YourName | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 18/10/2006 16:55:6 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |\n| 18/10/2006 16:57:52 | Mitch | [[index.html|]] | [[store.cgi|]] | . | index.html | . |
/***\n<<tiddler UploadPluginDoc>>\n!Code\n***/\n//{{{\nversion.extensions.UploadPlugin = {\n major: 3, minor: 3, revision: 3, \n date: new Date(2006,6,30),\n type: 'macro',\n source: '',\n docs: ''\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: 0}, \n date: new Date(2006,3,9)\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: 2, date: new Date(2006,3,11),\n type: 'tweak',\n source: ''\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 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 var size = 15;\n if (params[1])\n size = params[1];\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.size = size;\n c.value = config.options[opt];\n place.appendChild(c);\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.size = size;\n c.value = config.options[opt];\n place.appendChild(c);\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 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 place.appendChild(c);\n c.checked = config.options[opt];\n break;\n }\n};\n//}}}\n/***\n!! Option cookie stuff\n***/\n//{{{\nwindow.loadOptionsCookie_orig_PasswordTweak = window.loadOptionsCookie;\nwindow.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\nwindow.saveOptionCookie_orig_PasswordTweak = window.saveOptionCookie;\nwindow.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 errorDownloading: "Error downloading",\n errorUploadingContent: "Error uploading content",\n fileNotFound: "file to upload not found",\n fileNotUploaded: "File %0 NOT uploaded",\n mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\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.dirname(storeUrl)]);\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.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 (storeUrl === '') {\n 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 \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 displayMessage(config.macros.upload.messages.aboutToUpload.format([this.dirname(storeUrl)]), this.dirname(storeUrl));\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 if (uploadDir) {\n rssPath = uploadDir + "/" + config.macros.upload.basename(rssPath);\n } else {\n rssPath = config.macros.upload.basename(rssPath);\n }\n displayMessage(config.macros.upload.messages.rssFileUploaded.format(\n [config.macros.upload.dirname(storeUrl)+"/"+rssPath]), config.macros.upload.dirname(storeUrl)+"/"+rssPath);\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 =, 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"UniversalXPConnect");\n var converter = Components.classes[""]\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 revised = revised.replace(new RegExp("<title>[^<]*</title>", "im"),"<title>"+ newSiteTitle +"</title>");\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 displayMessage(config.macros.upload.messages.mainFileUploaded.format(\n [config.macros.upload.dirname(storeUrl)+"/"+toFilename]), config.macros.upload.dirname(storeUrl)+"/"+toFilename);\n var log = new config.macros.upload.UploadLog();\n log.endUpload();\n store.setDirty(false);\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"; \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'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 + ";;\sr\sn"; \n sheader += "\sr\sn" + "--" + boundary + "\sr\sn";\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 var data;\n data = sheader + content + strailer;\n //"POST", storeUrl, true, username, password);\n"POST", storeUrl, true);\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);\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\ = 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"UniversalBrowserRead");\n }\n else {\n"UniversalXPConnect");\n }\n } catch (e) { }\n //"GET", document.location.toString(), true, username, password);\n"GET", document.location.toString(), true);\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()]));\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.shadowTiddlers.UploadPluginDoc = "[[Full Documentation| ]]\sn"; \n\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| Name:|~TagglyTaggingViewTemplate |\n| Version:|1.2 (16-Jan-2006)|\n| Source:||\n| Purpose:|See TagglyTagging for more info|\n| Requires:|You need the CSS in TagglyTaggingStyles to make it look right|\n!History\n* 16-Jan-06, version 1.2, added tagglyListWithSort\n* 12-Jan-06, version 1.1, first version\n!Notes\nRemove the miniTag if you don't like it or you don't use QuickOpenTagPlugin\n--->\n<!--{{{-->\n<div class="toolbar" macro="toolbar -closeTiddler closeOthers +editTiddler permalink references jump newHere"></div>\n<div class="tagglyTagged" macro="hideSomeTags"></div>\n<div><span class="title" macro="view title"></span><span class="miniTag" macro="miniTag"></span></div>\n<div class='subtitle'>Updated <span macro='view modified date [[DD MMM, YYYY]]'></span></div>\n<div class="viewer" macro="view text wikified"></div>\n<div class="tagglyTagging" macro="tagglyListWithSort"></div>\n<!--}}}-->\n
!__Angel's Civil 3D Thoughts__\n\nUsually an great place to start your reading if you're looking for the more "official" blog postings from Autodesk and other great tips.\n\n@@Check out [[Angel's Civil 3D Thoughts|]]@@.
!__Beneath the Lines (Autodesk)__\n\nA blog I really recommend keeping your eye on is Beneath the Lines (an official Autodesk blog).\n\n@@Visit [[Beneath the Lines|]]@@.
!__Beneath the Lines__\n\nBlog by Jason Hickey. He posts a lot of great tutorials, helpful info, and relevant links; well worth the read.\n\nHere are some links to posts that I found useful:\n*[[Labeling Pipe Invert Elevations in Profile View|]]\n*[[Volumes by Leaps and Bounds|]]\n*[[New Command for Civil 3D 2007|]]\n*[[Volumes can be a Delicate Balancing Act|]]\n*[[Creating a Pipe Network Inference|]]\n*[[Some useful surface setting tips|]]\n*[[Dynamic Notes in Civil 3D 2007|]]\n*[[Symbol manager|]]\n*[[Disappearing dialogue box|]] (see also [[File Dialogue]].)\n\n@@Visit [[Beneath the Lines|]]@@.
!__Land Development Engineering__\n\nHere's a small plug for a blog I recently started reading. Check out Kevin's Land Development Engineering [[here|]].\n\nA guy who uses tiny urls? Now this is a blog I can get behind.\n\n@@Visit [[Land Development Engineering|]]@@.
!__Civil 3D Rocks__\n\nThe queen bee, in my opinion, of both Civil 3D [[weblogging|]] and Autodesk forum [[discussions|]] is Dana Breig Probert. Plus she's really helpful if you've ever got questions.\n\n@@Visit [[Civil 3D Rocks|]]@@.\n\n
!__The Crazy World of Civil 3D__\n\nPosts I found especially intriguing:\n*[[Adding Office Documents to Vault|]]\n*[[Xrefing from Vault|]]\n*[[Deleting Multiple Surface Labels|]]\n*[[Adding PDFs to Vault|]] ... [[Follow up article|]]\n*[[Civil 3D Service Pack 2|]]\n*[[How to double-click edit note labels|]]\n\n@@Visit [[The Crazy World of Civil 3D|]]@@.
/***\n| Name:|SiteMapMacro|\n| Author:|Simon Baird|\n| Location:||\n| Version:|1.0.3, 15-Mar-06|\n\n!!Examples\nSee SiteMap and SliderSiteMap for example usage.\n\n!!Parameters\n* Name of tiddler to start at\n* Max depth (a number) \n* Format (eg, nested, see formats below)\n* Don't show root flag (anything other than null turns it on)\n* Tags - a string containing a bracketed list of tags that we are interested in\n\n!!History\n* 1.0.3 (15-Mar-06)\n** added tag filtering\n* 1.0.2 (15-Mar-06)\n** Added json format and dontshowroot option\n* 1.0.1 (9-Mar-06)\n** Added selectable formats and fixed nested slider format\n* 1.0.0 (8-Mar-06)\n** first release\n\n***/\n//{{{\n\nversion.extensions.SiteMapMacro = {\n major: 1,\n minor: 0,\n revision: 3,\n date: new Date(2006,3,15),\n source: ""\n};\n\nconfig.macros.siteMap = {\n\n formats: {\n bullets: {\n formatString: "%0[[%1]]\sn%2",\n indentString: "*"\n },\n\n // put this in your StyleSheet to make it look good.\n // .sliderPanel { margin-left: 2em; }\n\n sliders: {\n formatString: "[[%1]]+++\sn%2===\sn\sn",\n formatStringLeaf: "[[%1]]\sn"\n },\n\n openSliders: {\n formatString: "[[%1]]++++\sn%2===\sn\sn",\n formatStringLeaf: "[[%1]]\sn"\n },\n\n popups: {\n formatString: "[[%1]]+++^\sn%2===\sn\sn",\n formatStringLeaf: "[[%1]]\sn"\n },\n\n // these don't work too well\n openPopups: {\n formatString: "[[%1]]++++^\sn%2===\sn\sn",\n formatStringLeaf: "[[%1]]\sn"\n },\n \n // this is a little nuts but it works\n json: {\n formatString: '\sn%0{"%1":[%2\sn%0]}',\n formatStringLeaf: '\sn%0"%1"',\n indentString: " ",\n separatorString: ","\n }\n\n\n },\n\n defaultFormat: "bullets",\n\n treeTraverse: function(title,depth,maxdepth,format,dontshowroot,tags,excludetags) {\n\n var tiddler = store.getTiddler(title);\n var tagging = store.getTaggedTiddlers(title);\n\n if (dontshowroot)\n depth = 0;\n\n var indent = "";\n if (this.formats[format].indentString)\n for (var j=0;j<depth;j++)\n indent += this.formats[format].indentString;\n\n var childOutput = "";\n if (!maxdepth || depth < parseInt(maxdepth)) \n for (var i=0;i<tagging.length;i++)\n if (tagging[i].title != title) {\n if (this.formats[format].separatorString && i != 0)\n childOutput += this.formats[format].separatorString;\n childOutput += this.treeTraverse(tagging[i].title,depth+1,maxdepth,format,null,tags,excludetags);\n }\n\n if (childOutput == "" && (\n (tags && tags != "" && !tiddler.tags.containsAll(tags.readBracketedList())) ||\n (excludetags && excludetags != "" && tiddler.tags.containsAny(excludetags.readBracketedList()))\n )\n ) {\n // so prune it cos it doesn't have the right tags and neither do any of it's children\n return "";\n }\n\n if (dontshowroot)\n return childOutput;\n\n if (this.formats[format].formatStringLeaf && childOutput == "") {\n // required for nestedSliders\n return this.formats[format].formatStringLeaf.format([indent,title,childOutput]);\n }\n\n return this.formats[format].formatString.format([indent,title,childOutput]);\n },\n\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n wikify(this.treeTraverse(\n params[0] && params[0] != '.' ? params[0] : tiddler.title, 1, \n params[1] && params[1] != '.' ? params[1] : null, // maxdepth\n params[2] && params[2] != '.' ? params[2] : this.defaultFormat, // format\n params[3] && params[3] != '.' ? params[3] : null, // dontshowroot\n params[4] && params[4] != '.' ? params[4] : null, // tags\n params[5] && params[5] != '.' ? params[5] : null // excludetags\n ),place);\n }\n\n}\n\n//}}}\n
Type the text for 'New Tiddler'