These two landscapes have a story. The first is the 25 inches of snow that we had in New Mexico over winter break. The second is a photo of cormorants at La Jolla Cove.\nThe first landscape shows a color blue that I have tried to capture for a long time- that perfect cobalt that is only seen in cold weather at high altitude. I've often been able to get it on the screen, but never on a print. Perfect luck and perfect weather. This was taken with the 10mm and a polarizing filter.\n<html>\n<IMG SRC="http://heliotrope.ucsd.edu/Photos/Snow.jpg hspace=200px vspace=50px width=500px>\n</html>\n\nThe second photo took a huge effort in terms of printing. The picture represents the full tonal range from absolute white to pitch black. This turns out to be a huge pain in the ass to print. After about nine attemps of varying sizes, I found that the best way to do it (on an Epson R1800) is to tell photoshop to manage the color, use relative colorimetric color transfer, and allow for a dot gain of 30%. What that means is that the printer will only print black and white, will assume that the dots expand by 30%, and uses the black and white to fill the gamut of both printer and image without changing the relative ratios between gray levels. The photo is one of my favorite b+w images, and was taken with the 100mm macro.\n\n<html>\n<IMG SRC="http://heliotrope.ucsd.edu/Photos/Cormorants.jpg hspace=200px vspace=50px width=500px>\n</html>\n
<html>\nTry these on for size. This is the type of exam I think is important- what a great question.<a href="http://photos1.blogger.com/blogger/6554/3226/1600/Capture5G.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 700px;" src="http://photos1.blogger.com/blogger/6554/3226/1600/Capture5G.jpg" alt="" border="0" /></a></html>
<html>\n<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6554/3226/1600/IMG_4732.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 214px; height: 142px;" src="http://photos1.blogger.com/blogger/6554/3226/320/IMG_4732.jpg" alt="" border="0" /></a>Our house has become full of avocados. There are literally avocados on the floor- I found one under the stairs. Naturally, this has caused some rather extreme dietary changes. For example I have discovered the ultimate SoCal lunch:\n3 Avocados.\n1 Coke.\n\nMuch love to Nick for the avocados.\nAlternately, if you find yourself posessing several shopping bags full of avocados, here are some recipe ideas:\n<a href="http://www.deliciouslivingmag.com/recipes/index.cfm?fuseaction=recipedetails&recipeid=453">Avocado Bruschetta</a>\n<a href="http://www.online-cookbook.com/goto/cook/rpage/000113">Avocado Gazpacho</a>\n<a href="http://www.cooksrecipes.com/appetizer/tomato_and_avocado-goat_cheese_crostini_recipe.html">Goat-cheese Crostini</a>\n<a href="http://recipes.epicurean.com/recipe/23092/asian-guacamole.html">Asian Guacamole</a>\n\nRemember, a good avocado is not ripe when you get it- buy them hard, and as they achieve the consistency of low moisture mozzarella cheese, they are ready to eat. Slice one all the way around with a knife, strike the seed with the blade, twist, remove the pit, then score the inside and turn it inside out.\n\nNow, what to read while you eat your avocado? My fall back position is always <a href="http://en.wikipedia.org/wiki/Henry_Miller">Henry Miller</a>, perhaps the most obscene and greatest American (expatriate) author of the 20th century. If you want to be shocked and amazed by a style that causes one to question the value of rationality while at the same time embracing the concept that man must become his own god, try <a href="http://www.amazon.com/gp/product/0802131786/104-4653888-4568758?v=glance&amp;n=283155"><span style="font-style: italic;">Tropic of Cancer</span></a>. As a warning, if you don't love it by page 5 you may as well give it up.\n\nI also advise <a href="http://www.amazon.com/gp/product/0262181916/104-4653888-4568758?v=glance&n=283155"><span style="font-style: italic;">Advice for a Young Investigator</span></a>, by <a href="http://en.wikipedia.org/wiki/Santiago_Ram%C3%B3n_y_Cajal">Ramon y Cajal</a>. This is a great book by a truly great scientist, and if you are in my position he makes a lot of sense. Be sure to look at the section on theorists and other misfits.\n\nLooking for beach reading? <a href="http://www.amazon.com/gp/product/0767915305/104-4653888-4568758?v=glance&n=283155"><span style="font-style: italic;">Sex Lives of Cannibals</span></a>, by Troost. A hilarious travelogue in the style of Bill Bryson/Dave Barry. Easy read, and makes you want to move to the South Pacific and then right back to the US.\n</html>
<html>\n<a href="http://raysmuckles.blogspot.com/">Hey, Chochachos!</a>\n\nThe biggest party ever. If it wasn't thrown by a cartoon character, I would be attending. On the other hand, I think that he has some very good conceptions about what it means to throw a party. To wit:\n"There will be no small beverages. Everyone will be handed an unlabelled magnum-size bottle of whatever they order at the bar, even if it's gin and tonic (the bottle will have a shoulder strap, made out of a modified guitar strap, like a bota bag). This should get everyone enormously honked up and making bold claims by 9pm."\n\nor:\n"Did you say that you want Eggs Benedict? Well, ours is made with a poached ostrich egg, served on top of a ham steak the size of an LP, over a special English muffin flown in from Brazil. It's served with three pints of Hollandaise. I recommend it for groups of 20-30."\n\nI am starting to get some very real ideas for the next house party.\n</html>
<html>\n<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6554/3226/1600/IMG_2540.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/6554/3226/320/IMG_2540.jpg" alt="" border="0" /></a>\nMy big brother is constantly getting into trouble of the most wonderful kind. This guy is perpetually in trouble- my favorite example (perhaps I will have him guest write for this one) is about the time when he went home, to the apartment he had been living in for several months, to find <span style="font-style: italic;">the locks changed</span> and a crazy woman armed with a phalanx of lawyers standing out front, yelling <span style="font-style: italic;">Get out of my house!</span>. Typical day, for Alberto.\n\nTalking to him today, he produced another gem. In the process of helping a member of his female entourage to move, he came across a hideous, stinking couch. According to him, it appeared as though every animal in the ark had relieved itself on it. This is not the sort of thing that an ordinary person would want, but my brother (being the artistic type) wanted the hardwood ends. He took it home, and as was reasonable dismantled it. Now, fast forward a few hours to the outside of Jessica's place, where a woman is screaming about how someone stole her dead husband's? couch. This brought the police over, who determined that yes, Alberto was now the proud posessor of a dead person's couch. Wonderful. Apparently the lady was saving the couch for something, so now my brother is in the process of reassembly- one can bet that he was not extremely cautious in the dissassembly and it may be a perilous task. What does one do with a dead man's couch? Is it automatically art? Is it still junk? I am waiting with baited breath for whatever artistic impulse this incident causes. Not to mention it is totally hilarious, as Dylan (owner of the truck used to transport said couch) is now out of town, leaving Berto with an immobile piece of furniture whose owner hath departed.\n</html>
<html>\n<ahref="http://photos1.blogger.com/blogger/6554/3226/1600/Capture2a.0.jpg"><img style="margin: 0pt 10px 10px 0pt; float: middle; cursor: pointer;" src="http://photos1.blogger.com/blogger/6554/3226/400/Capture2a.jpg" alt="" border="0" /></a><br><br>\nThis one is fantastic. It exemplifies what makes a good physics problem- take a ridiculous situation and get an even more ridiculous method of measurement out of it. In this case, it is the age old "trapped on a desert island" problem, except that the goal is not to escape but to determine the speed of light using only a few items that have washed ashore with you. I provide both question and solutions. Typical physicist mentality- reminds me of the joke where the physicist, the engineer, and the mathematician are imprisoned with no food except cans, and no can opener. Two days in, the engineer has long since built a drill and escaped. The physicist has figured out exactly how to through the cans such that they bounce twice and pop open, and is working a grand unification theory. The mathematician is dead- and, written in next to him, is a note. "If I cannot open these cans, I will die. Proof by contradiction."\n<a href="http://photos1.blogger.com/blogger/6554/3226/1600/Capture1.jpg"><img style="margin: 0pt 10px 80px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/6554/3226/200/Capture1.jpg" alt="" border="0" /></a>\n</html>
<html>\n<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6554/3226/1600/HBar_L.gif"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/6554/3226/320/HBar_L.gif" alt="" border="0" /></a>\naving just finished what was at the same time the hardest and most rewarding period of my life, I am now beginning to piece together my website. To bring you up to speed- UCSD requires for both physics and biophysics that the students take two 4-hour, no-notes, in-class exams to demonstrate that they have a command over the material. Good practice for a reseach career- not. However, it does force you to learn the material <span style="font-style: italic;">cold</span>. Dead to rights, solid, cold. The questions are fundamentally non-trivial, and are typically on a level that is more common to easier take-home exams. Of course, if you fail the departmentals, they stone cold kick you out of graduate school.\nAs a good example, consider the question:<br>\nFor a metal shell, what surface charge (i.e. charge moving on the outside of the shell) will create a uniform magnetic field within? Justify your answer.<br>\n\nOr, try this one on for size.<br>\nA charged particle q moves in a uniform B-field. Derive the allowed quantizations of the particle energies.<br><br>\n\nThis stuff is not easy, and after studying for six weeks, about 10-15 hours a day, I was able to pass. Not at the top of my class, but all that matters is the passing score.<br><br>\n\nInterestingly, after thinking it through, I believe that this was the right thing for the department to do. It would be better, of course, if somehow it were possible to force the students to study, but not test them. In the real world, this will have to do. For the record, the passing rate was around 80%- the odds were not too bad. By putting the fear of being actively dismissed into our hearts and minds, the department allowed us to truly focus on the physical theory. That is a beautiful thing. <br><br>\n\nAs a final note, I send out thanks to those who supported me while I went through this, namely Vera, Robby, my parents/step, Alberto, Dylan, Matt, and JJ. Thank you for being there at a crucial moment.\n</html>
<html>\n<a href="http://photos1.blogger.com/blogger/6554/3226/1600/67_Helmut_Newton_TwoPairsOfLegsInBlackHose.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/6554/3226/200/67_Helmut_Newton_TwoPairsOfLegsInBlackHose.jpg" alt="" border="0" /></a>\n<a href="http://ozivote.cz/data/44/Image3.jpg">Helmut Newton</a> related a story once. He was shooting a job for a Conde Nast publication. It was an editorial job. They needed a <a href="http://en.wikipedia.org/wiki/Double_truck">double truck</a> and three full page shots. This was fairly late in his career and he had nothing to prove to anyone. He went out and shot the job in his usual professional manner and upon returning delivered a roll of 120 black and white film to the art director, a younger fellow who was fairly new to the magazine. Upon seeing the single roll he was furious. "Where is the rest?" he demanded. "Do you expect me chose from only twelve frames!"Helmut replied, "You only need four shots. I am delivering twelve to you!" After which he left the room, the art director shouting that he would never work for that magazine again. Needless to say, they did run the images Helmut shot and he did work for that magazine quite a bit until his death.\nThis illustrates a typical problem that is arising today. As cameras become more and more ubiquitous, everyone has become the <a href="http://www.matthewspencer.com/aub110406a/">paparazzi</a>. I myself often say "I just hold down the shutter button until the card is full." However, having begun to do some professional work, I find it far more effective to nail the shots, expose right, and end up with a higher ratio of keep:thow away. In fact, Helmut Newton has it exactly right. One should expect to keep approximately 1/4 to 1/3 of what you shoot. For me, I currently have about 5000 images kept, and spread out over 5 cameras I have clicked a shutter approximately 22000 times. I'm probably keeping a bit much, considering the quality. This is the difference between the modern digital photographer and the seasoned professional. I have been given the privilege to work with <a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6554/3226/1600/Frankie%27s%20Northup.0.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/6554/3226/200/Frankie%27s%20Northup.jpg" alt="" border="0" /></a>Steve Northup (pictured in the photo), who is a New York Times pro using a camera that I only dream about, the 16.7 megapixel <a href="http://www.dpreview.com/reviews/canoneos1dsmkii/">Canon 1DsMkII</a>. When I asked him how he processes his raw images, he blew me away by responding "I shoot in JPG." Seeing the completely distraught facial expression, he explained to me that he simply gets the exposure right each time.\n\n\nThus, if I want to be a photographer (and this applies to my position in physics as well- what else is microscopy if not a way of taking special photos?) I must learn to understand the light and plan out my shots. My goal is to have the same percentage of keepers (<a href="http://heliotrope.ucsd.edu/Photos/Galleries/b+w/BW%20pipes.jpg">i.e.</a> <a href="http://heliotrope.ucsd.edu/Photos/Galleries/People/VeraEyesFinal.jpg">the</a> <a href="http://heliotrope.ucsd.edu/Photos/Galleries/Places/tilt-shift%20copy.jpg">top</a> <a href="http://heliotrope.ucsd.edu/Photos/Galleries/Flora/Colorized%20V1%20Red%20copy.jpg">25%</a>) but take fewer photos and achieve better images. We will see how it goes.\n<a href="http://ozivote.cz/data/44/Image3.jpg"></a>\n</html>
<html>\n<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6554/3226/1600/IMG_2540.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/6554/3226/320/IMG_2540.jpg" alt="" border="0" /></a>\nMy big brother is constantly getting into trouble of the most wonderful kind. This guy is perpetually in trouble- my favorite example (perhaps I will have him guest write for this one) is about the time when he went home, to the apartment he had been living in for several months, to find <span style="font-style: italic;">the locks changed</span> and a crazy woman armed with a phalanx of lawyers standing out front, yelling <span style="font-style: italic;">Get out of my house!</span>. Typical day, for Alberto.\n\nTalking to him today, he produced another gem. In the process of helping a member of his female entourage to move, he came across a hideous, stinking couch. According to him, it appeared as though every animal in the ark had relieved itself on it. This is not the sort of thing that an ordinary person would want, but my brother (being the artistic type) wanted the hardwood ends. He took it home, and as was reasonable dismantled it. Now, fast forward a few hours to the outside of Jessica's place, where a woman is screaming about how someone stole her dead husband's? couch. This brought the police over, who determined that yes, Alberto was now the proud posessor of a dead person's couch. Wonderful. Apparently the lady was saving the couch for something, so now my brother is in the process of reassembly- one can bet that he was not extremely cautious in the dissassembly and it may be a perilous task. What does one do with a dead man's couch? Is it automatically art? Is it still junk? I am waiting with baited breath for whatever artistic impulse this incident causes. Not to mention it is totally hilarious, as Dylan (owner of the truck used to transport said couch) is now out of town, leaving Berto with an immobile piece of furniture whose owner hath departed.\n</html>
These two landscapes have a story. The first is the 25 inches of snow that we had in New Mexico over winter break. The second is a photo of cormorants at La Jolla Cove.\nThe first landscape shows a color blue that I have tried to capture for a long time- that perfect cobalt that is only seen in cold weather at high altitude. I've often been able to get it on the screen, but never on a print. Perfect luck and perfect weather. This was taken with the 10mm and a polarizing filter.\n<html>\n<IMG SRC="http://heliotrope.ucsd.edu/Photos/Snow.jpg hspace=200px vspace=50px width=500px>\n</html>\n\nThe second photo took a huge effort in terms of printing. The picture represents the full tonal range from absolute white to pitch black. This turns out to be a huge pain in the ass to print. After about nine attemps of varying sizes, I found that the best way to do it (on an Epson R1800) is to tell photoshop to manage the color, use relative colorimetric color transfer, and allow for a dot gain of 30%. What that means is that the printer will only print black and white, will assume that the dots expand by 30%, and uses the black and white to fill the gamut of both printer and image without changing the relative ratios between gray levels. The photo is one of my favorite b+w images, and was taken with the 100mm macro.\n\n<html>\n<IMG SRC="http://heliotrope.ucsd.edu/Photos/Cormorants.jpg hspace=200px vspace=50px width=500px>\n</html>\n
The two images below are generated by the program "ExposurePlot", which can be found at [[ExpPlot|http://www.cpr.demon.nl/prog_plotf.html]]. This is the only way to analyze the thousands of digital images so common to everyone these days.\n<html>\n<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/6554/3226/1600/66704/Focal_length_graph%20%28Large%29%20copy.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/6554/3226/400/385664/Focal_length_graph%20%28Large%29%20copy.jpg" alt="" border="0" /></a>\n<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/6554/3226/1600/89465/Aperture_graph%20%28Large%29%20copy.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/6554/3226/400/247502/Aperture_graph%20%28Large%29%20copy.jpg" alt="" border="0" /></a>\nThis is a fantastic way to determine whether or not one should purchase a different lens or camera combination, as well as to help determin what it is that you need in order to accomplish your photographic objectives. By pointing it at a directory, it scans the EXIF information and reports backs relevant information.\n\nIn my case, this shows that I am almost always using the two extreme edges of my only zoom lens (hence validating my theory that Canon should release a 10mm EF-S f2.8 prime) as well as showing the relevant apertures. Also, considering the amount of time that I have had the macro lens, it is making a solid push in terms of total count.\n</html>
<html>\nIn the spirit of trying to make my changes to the website discernible to the visitors (always a good idea) I have added a note on the front page that this page will carry news. Thus, allow me to present: news.\n\nThis update solely addressed the aging nature of the photos in my galleries, as well as the somewhat less-than-aesthetically pleasing nature of the arrangement. All the galleries are updated, please have a look <a href="http://heliotrope.ucsd.edu/Photos/photoindex.html">here</a>. There are a lot more photos, encompassing the best of my Hawaii trip with Vera and my family, my nightclub work, my freelance work, and a lot of beautiful older stuff that was not posted before.\nHow I generated the html:<br>\n1. Export images at the correct size with <a href="http://picasa.google.com/">Picasa</a>. This let me size everything for web quickly and from my already carefully made jpg abums.<br>\n2. Re-import the exported folders into Picasa for batch renaming. This is crucial to define the order of the files for the page. <a href="http://www.bohemianscientist.org/blog/">Dave Matthews </a>and I were discussing better ways to do this, such as color-finding or edge-finding <a href="http://scholar.google.com/scholar?q=face+recognition&hl=en&amp;lr=&amp;btnG=Search">programs</a> using <a href="http://www.mathworks.com/">MatLab</a>, but this is for another post.<br>\n3. Use <a href="http://ekot.dk/programmer/JPEGCrops/">JPEGCrops </a>to create uniformly sized images. Export the cropped files to a temp folder. If not, you lose information. <br>\n4. Use <a href="http://www.nulidex.com/products/image_catalog.shtml">Image Catalog</a> to generate the custom html based on the assumption that the cropped images are the real thing. This is where we trick the computer- take the generated thumbnails and webpage out of the temp directory and place it back in the original, uncropped image directory. Because the filenames are the same, the cropped thumbnails will lead to the uncropped images. I am happy to supply my image catalog files on request. <br>\n5. Upload to you site with your choice of interface. The lightboxes are generated with <a href="http://www.huddletogether.com/projects/lightbox2/">Lightbox JS V2.0.</a><br>\nNote that all of this software is available free or shareware! Excellent.<br><br>\n\nThe next update will be a major science/equipment literature update, including my presentation at the acoustic society meeting. After that, perhaps I will have less meta-content and more real content.\n</html>
@@color(red):\nTwo good paper picks-@@ one that was pointed out to me by [[DaveMatthews|http://www.bohemianscientist.org/blog/]] and one that was presented at the Salk a little over a year ago.\n!\n[[Fiber2p|http://heliotrope.ucsd.edu/Repository.Papers/mini2p.pdf]] Fritjof Helmchen and Winfried Denk (both //very// involved in the development of the technique of [[TPLSM]]) displayed a bit more realism than usually appears in science, regardless of discipline. One of the great problems with biology is the isolation of variables- as it was told to me once \n'Physics is like WWII, and Biology is like Vietnam. Rather than a well-defined plan, with clear enemies and alliances, the war in biology is fought in the jungles. Friend and foe blend and become confused, many things are going on at once, and control over one region often releases control of another. The way to succeed is to separate your target from the spurious sources." But, that has a problem too- an easy target is often an //atypical// target, and hard to generalize from. Is it really valid to take a neuron whose axon is 1mm wide and generalize what we learn to describe purkinje cells? Is a behaving rat the same as an anesthetized rat? What changes in the regulation of the brain? To this end, D+H developed a lightweight, miniaturized and fiber-fed two photon microscope that can image an awake, behaving animal. Fast movements mess it up, but for whisking and chewing it seems to work fine.\n!\n[[3d2p|http://heliotrope.ucsd.edu/Repository.Papers/3d2p.pdf]] This paper was shown by [[DaveMatthews]] on BohemianScientist. Balazs Rozsa and the Hungarians have built a TPLSM that uses an [[acousto-optic modulator|]] to direct the beam through a series of fiber optic channels, which are then refocused into an objective. The position of the fiber ends determines the focus conditon, and different locations can be scanned with millisecond resolution by choosing different fibers with the acousto-optic modulator. There is a lot of very clever optics done to "chirp" (lower the energy density to avoid Kerr effect, intensity dependent dispersion, and other non-linear effects) and recompress the beam after it travels through the fiber. \n\nOne paper allows for interacting with live animals- the other shows a method for very rapidly switching between sample points. Now, if only there was a way to [[trigger and silence neuron activity|]] in particular circuits with a wavelength not used for laser imaging....
We should go to the movies this weekend. \n\nWhy? There is a [[film|http://www.google.com/search?client=firefox-a&hl=en&q=grindhouse&btnG=Google+Search]] coming out this weekend that features a one-legged stripper with a machine gun instead of a prosthetic leg. Now, I know for some of you that is justification enough to run directly to the theater, camping gear in hand. For the rest, let me put this in context.\n\n Back in the days of drive-ins, there used to be quick-production runs of so called "[[B-movies|http://www.amazon.com/Behold-power-cheese-Best-B-movies/lm/1VT54S8O9YB0Y]]". These were generally the second half of a double feature, another wonderful thing that has gone the way of the dodo in this era of 3 hour epic films. Some of these films (The Fly, Night of the Living Dead) remain cult classics, while others (Motorpsycho, Forbidden Planet) have vanished into comparative obscurity. The artistic legacy of the B-movie was reawakened with the [[lomographic|http://www.lomography.com/]] techniques used in Fight Club, and the scripts and hyper-exaggeration of violence became mainstream again with Kill Bill and Sin City. Thus, high-budget films have come full circle and are imitating their B-movie roots.\n \nNow, Quentin Tarantino and Robert Rodriguez have written and released a brand spanking new double feature: Grindhouse, featuring Planet Terror (Zombies) and Death Proof (High Speed car chases). This should herald the height of lomographic film making, because I suspect that this will be the B-movie to end all B-movies. After this, no one will need to explain why grainy film, badly processed colors, corner vignetting, and one-legged machine gun equipped strippers are necessary to make such a film. \nThis should be at least a four-helicopter-crash movie. I haven't seen it yet, but it is high on the list. As someone who enjoys this sort of thing, I consider it my moral duty to support filmmakers who take a risk and make a movie that //they// want, rather than what might be successful.
Direct link: http://heliotrope.ucsd.edu/Photos/FishTrip/page_0001.html\n\nor see [[notebook.photography]].
<html>\n<img src="http://photos.freenewmexican.com/2004/07/24/2828_640x480.jpg" width=400>\n</html>\nWhile [[TheBohemianScientist|http://www.bohemianscientist.org/blog/]] believes that the closing of a great electronics store clearly demarcates the end of an era, I would simply argue that the era had already ended. A few places [[still exist|http://www.flickr.com/photos/telstar/sets/72157594342200167/]]. The black hole (pictured) is perhaps the undisputed king of the local electronics shop. It is simply too important to discuss as an aside- next time I am there I will photodocument and post about it. \nEven in the last ten years, the parts department at Radioshack has shrunk further and further until you are lucky to find a few standard Molex type connectors and some LEDs. The only reasonable explanation for me is the rapidly increasing complexity of the electronic devices. Electronics have always been complicated, but at least in the 50s you could work out the [[circuits|http://ourworld.compuserve.com/homepages/Bill_Bowden/]] for a lot of things just be looking at the components. \n\nWith the arrival of the [[pic microprocessor|http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=69]] it has become cheap and easy to integrate computer control into everything. I've seen toasters with PIC controllers. The computer control allows for a lot of intangible cleverness- good for devices, but bad for taking things apart and understanding them. \nHowever, with a little bit of extra training, [[more complex electronics|http://heliotrope.ucsd.edu/tech/images/gnarli.JPG]] can still be designed and built by an amateur. Let this be an admonishment to everyone with a broken DVD player and a screwdriver: ''take apart your electronics''. Get familiar with the insides- it can still be understood and should still be played with. Sometimes it can't be put back together, but when it can it often is better than when it began.\n\n''Here is the list of what I made off with:''\n*3 ~HeNe Laser Tubes\n*2 power supplies\n*3 LM317 variable voltage regulators\n*About 75 dichroic mirrors\n*8 Nixie vacuum tube displays!\n*Fluorescent micro-tubes\n*Locks and keys\n*A Navy analog AC voltage meter with a leather strap\n*Various AC-DC converters\n\n@@color(red):[[permalink|http://heliotrope.ucsd.edu/upload/heliolink.html#%5B%5B07.04.19%20The%20end%20of%20Gateway%20electronics.%5D%5D]]
Sorry for all the futzing (sp?) around with the import and export of notes into facebook. After talking to Eric Shulman at http://www.tiddytools.com (an awesome site- go there if you use tiddlywiki or nodelink or whatever) I fixed the bug I was attempting to catch. Now, the "view original post" link actually takes you to the proper location, and I think the other links should be tagged and fixed as well. This will now update, appropriately, at regular intervals.
A classic problem with digital photography arises in the dynamic range of electronic devices, both for display and for capture. The human eye is a remarkable optical device- according to Hecht (1931, 'The Retinal Processes Concerned with Visual Acuity and Color Vision,' pdf unavailable) we can resolve line-pairs in a grating spaced by 0.59 [[arc-minutes|http://en.wikipedia.org/wiki/Arcsecond]]. This figure is approximately in line with what is calculated by the [[NDT|http://www.ndt-ed.org/EducationResources/CommunityCollege/PenetrantTest/Introduction/visualacuity.htm]] and can be derived as follows:\n[img[http://heliotrope.ucsd.edu/Repository.Images/vision.jpg]]\nFor normal vision, 20|20 is defined as being able to distinguish 1 arc-minute, or $1/60$ of a degree. Assuming that an object as shown above subtends half of that, $\sTheta = 1/120$ of a degree. Thus, the minimum height is given by\n\sbegin{equation} \sfrac{X}{2}=d\stan{\sfrac{\sTheta}{2}} \send{equation} \n\nFor a typical object at about a foot, this corresponds to around 3 thousandths of an inch. In other words, pretty sharp. Assuming this is the size of two pixels (a line pair), a 10 inch print held a foot away would have to have around 36 megapixels to be at the limit for the eye. Thus, the eye wins. In fact, this is approaching the limits of what a true 600 dpi printer can do.\n\nThe eye also wins in terms of dynamic range. The eye can adjust contrast on the fly (and thus is more like a video camera than a still camera), but estimates claim that there are 10 million detectable contrast levels (which corresponds to about 24 stops) between starlight and sunlight. According to ''Contrast thresholds of the human eye'' by HR Blackwell (JOSA 1946) in a given scene the human eye can make out around 10-14 stops. Good slide //film// does about 10. My camera does about 8.4. Thus, we have to play games in order to get the best tonal range. One immediate strategy is to take the image in RAW mode, thus taking adantage of all 2^^12^^ different luminances levels the camera can generate. Still, to extend things even further, one can do what is called ''H''igh ''D''ynamic ''R''ange imaging. In this technique, several images are taken in raw mode, each at a different exposure level (usually ranging about 4 stops total) and are recombined into a single 32-bit (2^^32^^ levels!) image. Then, an algorithm built into photoshop CS2 adjust the contrast based on local behavior, such that whichever exposures exhibited the best contrast contribute the most information to the final 16-bit output. This can then be turned into an 8-bit (yuck, only 4056 luminance levels) image for web viewing. \nThis sound worse than it is, because I believe most if not all display devices are 8 bits per channel, and thus cannot display 32 bit images anyway. For printing it matters, as there are 16-bit printers. \n''Here are two HDR examples shot at the BML on campus''\n|[img[http://heliotrope.ucsd.edu/Repository.Images/1.jpg]]|\n|[img[http://heliotrope.ucsd.edu/Repository.Images/2.jpg]]|
|[img[http://www.nikon.co.jp/main/eng/feelnikon/discovery/universcale/img/pic_001.jpg]]|\n|[[universcale (web)|http://www.nikon.co.jp/main/eng/feelnikon/discovery/universcale/index_f.htm]]|\n@@color(red):Take a moment and find your place before you continue. Then you can head to the [[BohemianScientist|http://www.bohemianscientist.org/blog/]] and thank dm for the tip.@@\n!\nThis represents a step forward in the quality of the human race. The concept and presentation are stunningly beautiful and provide literacy about place to anyone without the need for complication. By providing an example of "small" and "big" rather than "huge" and "gigantic" it becomes almost tractable. I only wish you could move in many dimensions- we interact with \nmany orders of magnitude of sound and radiation each day. The electromagnetic spectrum, for example, is infinite (effectively) but shown below are a few of the most common ''18 orders of magnitude''. \n|[img[http://www.yorku.ca/eye/spectrum.gif]]|\nHuman hearing covers 120dB- that is 12 orders of magnitude. However, the Nikon website is the king. Showing 41 orders of magnitude in length, it pretty much has a solid handle on life, the universe, and everything. However, a few caveats:\n\n*It is important to realize that the sub-nanoscale has a regular and daily influence on us. [[String theory|http://en.wikipedia.org/wiki/String_theory]] and membrane theory are beginning to uncover mathematical frameworks that describe entire dimensions of reality (both in the 11d and 26d model) that fit within the picoscale. Thus it could be said that out entire fabric of reality relies upon such length scales- thus, they do have some worth. As for daily life, in the lab of dk, we use a laser that puts out pulses on the order of a femtosecond (10^^-15^^)in time- which correlates to a pulse of light that moves on the order of a 30 micrometer- the width of a cell. \n*As the scale becomes small, [[quantum effects (n.b. the last sentence of the video is wrong)|http://www.youtube.com/watch?v=DfPeprQ7oGc]] begin to dominate. It is important, however, to remember that quantum states belong to everything on that list- thus, the strange things that occur at small length scales may be important in parts of larger organisms, say the brains of a larger primate that walks on two legs and designed the Walkman.\n*The message of scale is important for many reasons- looking at the world today, it is clear that many human beings have forgotten their place in the grander scheme of things. And that place is, by all accounts, undeniably, lost in the middle of a many-order of magnitude range of length scales. We are not special by ourselves- we are special only in our perception of the rest of the universe and the way we study it. Every element on that list, from the globular clusters to the paramecium, has had hundreds of man-years of research devoted in one way or another. Curiousity, and little else, is the saving grace of our minor existence in the unfashionable western spiral arm of this galaxy. \n\n\n\n/%\n|Name|CommentScript|\n|Source|http://www.TiddlyTools.com/#CommentScript|\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires||\n|Overrides||\n|Description|form to enter feedback/comments that are automatically added to tiddler content|\n%//%comment%/+++[add a comment...]>\n <html><textarea id="comment" rows="3" style="width:100%"></textarea>\n <input type="button" value="submit comment" onclick="addTiddlerComment(this.previousSibling.previousSibling);"></html><script>\n place.lastChild.firstChild.value="Enter your comment text here";\n </script>\n===\n<script>\nwindow.addTiddlerComment = function(place) {\n if (!window.story) window.story=window; if (!store.getTiddler) store.getTiddler=function(title) {return this.tiddlers[title]}\n var title = story.findContainingTiddler(place).id.substr(7);\n var tiddler=store.getTiddler(title);\n var pos=tiddler.text.indexOf("/%"+place.id+"%/");\n if (pos==-1) pos=tiddler.text.length;\n var heading="comment from "+config.options.txtUserName+" on "+(new Date()).toLocaleString();\n var newtxt=tiddler.text.substr(0,pos);\n newtxt+="+++!!!!!["+heading+"]>\sn"+place.value+"===\sn";\n newtxt+=tiddler.text.substr(pos);\n store.saveTiddler(tiddler.title,tiddler.title,newtxt,tiddler.modifier,tiddler.modified,tiddler.tags);\n story.refreshTiddler(title,1,true);\n}\n</script>\n
This is a set of recent photos done either indoors, at night, or under light-starved conditions. The moral of the story is that digital can handle high sensitivity photography like almost nothing else. The gain on photographic film (i.e. ISO200+) was increased by simply enlarging the size of the silver nitrate grains that make up the exposable material. With digital, it is a matter of turning up the gain (aka volume) on the pixels. Interestingly enough, the enhanced grain size produced (not surprisingly) a grainy appearance to the film- but turning up the gain on pixels increases shot and readout noise, thus producing a very similar grainy appearance! High speed film, even under the [[best|http://home.wanadoo.nl/pmj/photos/f196-33a.jpg]] circumstances, cannot hold a candle to digital.\n<html> <hide linebreaks>\n<div id="delicious"><iframe style="background-color:#ffffff; border-color:#ffffff; border:none;" width="1000" height="1000" frameborder="0" scrolling="auto" src="http://heliotrope.ucsd.edu/Photos/MinorUpdates/lowlight.html" title="My Del.icio.us links"></iframe></div>\n</html>\n\n\n\n\n\n\n\n\n\n\n\n\n/%\n|Name|CommentScript|\n|Source|http://www.TiddlyTools.com/#CommentScript|\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires||\n|Overrides||\n|Description|form to enter feedback/comments that are automatically added to tiddler content|\n%//%comment%/+++[add a comment...]>\n <html><textarea id="comment" rows="3" style="width:100%"></textarea>\n <input type="button" value="submit comment" onclick="addTiddlerComment(this.previousSibling.previousSibling);"></html><script>\n place.lastChild.firstChild.value="Enter your comment text here";\n </script>\n===\n<script>\nwindow.addTiddlerComment = function(place) {\n if (!window.story) window.story=window; if (!store.getTiddler) store.getTiddler=function(title) {return this.tiddlers[title]}\n var title = story.findContainingTiddler(place).id.substr(7);\n var tiddler=store.getTiddler(title);\n var pos=tiddler.text.indexOf("/%"+place.id+"%/");\n if (pos==-1) pos=tiddler.text.length;\n var heading="comment from "+config.options.txtUserName+" on "+(new Date()).toLocaleString();\n var newtxt=tiddler.text.substr(0,pos);\n newtxt+="+++!!!!!["+heading+"]>\sn"+place.value+"===\sn";\n newtxt+=tiddler.text.substr(pos);\n store.saveTiddler(tiddler.title,tiddler.title,newtxt,tiddler.modifier,tiddler.modified,tiddler.tags);\n story.refreshTiddler(title,1,true);\n}\n</script>\n
|<html><IMG SRC="http://www.michaellight.net/img/photos_sds/00-COVER-SUGAR.jpg align=right></html>|\nMichael Light, in his book //100 suns//, has collected photographs taken by the US Army Signal Corps and the 1352nd Photography Unit (stationed in Hollywood!) from 100 different above-ground nuclear tests. This is something that could have been done in a very morbid or tasteless fashion, but has instead been accomplished in both a beautiful and important way. The pages of the book are black with white text, and it is divided into two sections: desert and ocean. The two sections refer to the Nevada test site and the Marshall Islands (Eniwetok, Bikini, Johnson) where all but 3 of the US above-ground test were performed. The three exceptions are Trinity Site (the location of the first atomic explosion), Hiroshima, and Nagasaki. The photographs are taken primarily by high-speed cameras, including some operated by the unidisputed king of that field, [[Harold Edgerton|http://images.google.com/images?client=firefox-a&rls=org.mozilla:en-US:official&channel=s&hl=en&q=Harold%20Edgerton&btnG=Google+Search&ie=UTF-8&oe=UTF-8&um=1&sa=N&tab=wi]]. The intense patterning and striations of the explosions make for beautiful art in and of themselves.\n\nThere are two items of note that make this an extremely important book. The first is that as you take in the fission images, you become slightly numbed. Then, you turn a page, and there is an image of a //man-made sun.// The many-order-of-magnitude increase in power between fission and fusion devices is shocking, and the images convey that.\nThe second item is this: above ground nucelar testing occurred between July 1945 and November 1962. My (our?) generation was born long after this, and therefore the spectre of nuclear war has always been with us. For our parents, and for the [[scientists|http://en.wikipedia.org/wiki/Manhattan_Project]] who developed the bomb, there was a point in time, on 4:45AM, July 16, 1945, when the view of human capability changed drastically. We have been little exposed to the sword of Damocles that nuclear weapons create, and that biological weapons may succeed; seeing this images provides a sense of how stunning the change must have been.\n\nInterestingly enough, due to my family association with Los Alamos (and in our association with [[Ed Grothus|http://heliotrope.ucsd.edu/upload/heliolink.html#%5B%5B07.04.19%20The%20end%20of%20Gateway%20electronics.%5D%5D]] at the Black Hole) I was given a disk with a set of recently declassified images. ---I include them below.--- n.b. Upon arriving home, the disc appears to be corrupted. F***ing optical data storage. In lew of those images, I will post a few taken at Ground Zero, Trinity Site. I stood at the base of the tower- somewhat a humbling experience.\n|<html><IMG SRC="http://heliotrope.ucsd.edu/Photos/Galleries/Landscapes/Landscapes-33.jpg width=350></html>|<html><IMG SRC="http://heliotrope.ucsd.edu/Repository.Images/DSCN5876.jpg width=350 ></html>|<html><IMG SRC="http://heliotrope.ucsd.edu/Repository.Images/DSCN5874.jpg width=350></html>|\n\nFrom left to right: Initial casing, monument, and the sheared base of the tower that held the bomb.
There are a few fantastic websites (google, dpreview.com, the Gawker Media Group, [[Ishkur's Guide to Electronic Music|http://www.di.fm/edmguide/edmguide.html]] to name a few) in the sea of junk that is the internet. If you are into DIY photography, there is a new site to add to the top of your list. \n<html>\n<a href="http://strobist.blogspot.com/2006/02/welcome-to-strobist.html"><img src="http://photos1.blogger.com/blogger/3792/2480/1600/200x75blk.jpg" width="200" height="75" border="0">\n </html>\nStrobist is the //manual// for off-camera lighting. His most recent post is about shooting [[Ninja|http://strobist.blogspot.com/2007/06/whats-cooler-than-ninja-lots-of-ninjas.html#links]] pictures- how cool is that? \nAnother thing he advises the reader to do is to build a macro studio. This is not as expensive as it sounds- a cardboard box, some tracing paper, and some posterboard does the trick.\n<html>\n<IMG SRC="http://heliotrope.ucsd.edu/photos/macrostudio/Image_0108-1.jpg" width=300>\n</html>\nAs you can see in the setup, the whole trick is in diffusing the light perfectly uniformly. I use a wide variety of cutouts so that I can point the light wherever I want to control the shadow density. NB: You have to have a way of getting your light off the camera. This cannot easily be done without that, but you should be able to do that anyway. Once you visit strobist, you will be ready to do it without hesitation. \n<html>\n<a href="http://heliotrope.ucsd.edu/photos/macrostudio/"><IMG SRC="http://heliotrope.ucsd.edu/photos/macrostudio/Image_0048-1.jpg" width=300>\n</html>\nI was particularly happy about the photos because I had been trying to take pictures of these objects for years, unsuccessfuly.
[[60-fsec pulse generation from a self-mode-locked Ti:sapphire laser|http://heliotrope.ucsd.edu/Repository.Papers/2.opt.letters_spence_kerr.lens_1991.pdf]]\n!Abstract:\n Pulses having durations as short as 60 fsec have been directly generated by a self-mode-locked, dispersioncompensated Ti:sapphire laser. By using an extracavity fiber-prism pulse compressor, pulse durations as short as 45 fsec have been obtained.
[[A Mathematical Theory of Communication|http://heliotrope.ucsd.edu/Repository.Papers/shannon1948.pdf]]\n!\nShannon's seminal 1948 paper on the development of information content and entropy within a physical and thermodynamic framework.
Test
[[All optical thrombotic stroke model for near-surface blood vessels in rat|http://heliotrope.ucsd.edu/Repository.Papers/nishimura_optical-thrombosis.pdf]]\n!Abstract:\nPhotothrombotic microstrokes are produced in rat cortex by 532-nm single-photon optical excitation of an intravenously\ninjected photosensitizer, rose bengal. The dynamics of blood flow and clot formation in the cortical vasculature are\nobserved using two-photon laser scanning microscopy of an intravenously injected fluorescent dye. Flowing and clotted\nvessels are clearly distinguishable in both large and small vessels, down to individual capillaries, using this technique.\nWe find that by tightly focusing the laser light used to excite the photosensitizer, clots can be formed in individual blood\nvessels without affecting neighboring vessels tens of micrometers away. We observe many changes in blood flow as a\nresult of localized clot formation, including upstream vascular dilation, clot clearing, i.e. recanalization, and complete\nreversal of blood flow direction downstream.
[[All-Optical Histology Using Ultrashort Laser Pulses|http://heliotrope.ucsd.edu/Repository.Papers/6.neuron_tsai_optical.histology_2003.pdf]]\n!Abstract:\nAs a means to automate the three-dimensional histological analysis of brain tissue, we demonstrate the use of femtosecond laser pulses to iteratively cut and image fixed as well as fresh tissue. Cuts are accomplished with1 to 10 μJ pulses to ablate tissue with micron precision. We show that the permeability, immunoreactivity, and optical clarity of the tissue is retained after pulsed laser cutting. Further, samples from transgenic mice that express fluorescent proteins retained their fluorescence to within microns of the cut surface. Imaging of exogenous or endogenous fluorescent labels down to 100 μm or more below the cut surface is accomplished with 0.1 to 1 nJ pulses and conventional two-photon laser scanning microscopy. In one example, labeled projection neurons within the full extent of a neocortical column were visualized with micron resolution. In a second example, the microvasculature within a block of neocortex was measured and reconstructed with micron resolution.
[[Anatomical and functional imaging of neurons using 2-photon laser scanning microscopy |http://heliotrope.ucsd.edu/Repository.Papers/2-photon sm Delaney.pdf]]\n!Abstract:\nLight scattering by brain tissue and phototoxicity are major obstacles to the use of high-resolution optical imaging and photo-activation ('uncaging') of bioactive compounds from inactive ('caged') precursors in intact and semi-intact nervous systems. Optical methods based on 2-photon excitation promise to reduce these obstacles (Denk, 1994; Denk et al., 1990, 1994). Here we show a range of imaging modes based on 2-photon laser scanning microscopy (TPLSM) as applicable to problems in neuroscience. Fluorescence images were taken of neurons labeled with ion-sensitive and voltage-sensitive dyes in invertebrate ganglia, mammalian brain slices, and from the intact mammalian brain. Scanning photochemical images with whole-cell current detection (Denk, 94) show how the distribution of neurotransmitter receptors on the surface of specific cells can be mapped. All images show strong optical sectioning and usable images can be obtained at depths greater than 100/zm below the surface of the preparation
Benjamin Migliori\nUCSD Neurophysics\nLab of Dr. David Kleinfeld\nmigliori@ucsd.edu\nhttp://heliotrope.ucsd.edu\n5056995209\n\nIf this file or drive is found, please contact me at the above locations.
@@color(grey):\nBenjamin Migliori\nUCSD Neurophysics\nLab of Dr. David Kleinfeld\nmigliori@ucsd.edu\nhttp://heliotrope.ucsd.edu\n5056995209\n[[curriculum.vitae]]\n@@\n<html> <hide linebreaks>\n<div id="delicious"><iframe style="background-color:#ffffff; border-color:#ffffff; border:none;" width="1000" height="800" frameborder="0" scrolling="auto" src="http://heliotrope.ucsd.edu/me/metext.html" title="My Del.icio.us links"></iframe></div>\n</html>
/***\n''Name:'' Calendar plugin\n''Version:'' 0.5\n''Author:'' SteveRumsby\n\n''Syntax:'' \n{{{<<calendar>>}}} or {{{<<calendar year>>}}} or {{{<<calendar year month>>}}} or {{{<<calendar thismonth>>}}}\n\n''Description:'' \nThe first form produces an full-year calendar for the current year. The second produces a full-year calendar for the given year. The third produces a single month calendar for the given month and year. The fourth form produces a single month calendar for the current month.\nWeekends and holidays are highlighted (see below for how to specify holdays).\n\n''Configuration:''\nModify this section to change the text displayed for the month and day names, to a different language for example. You can also change the format of the tiddler names linked to from each date, and the colours used.\n\n''Changes by ELS 2005.10.30:''\nconfig.macros.calendar.handler()\n^^use "tbody" element for IE compatibility^^\n^^IE returns 2005 for current year, FF returns 105... fix year adjustment accordingly^^\ncreateCalendarDays()\n^^use showDate() function (if defined) to render autostyled date with linked popup^^\ncalendar stylesheet definition\n^^use .calendar class-specific selectors, add text centering and margin settings^^\n***/\n//{{{\nconfig.macros.calendar = {};\n\nconfig.macros.calendar.monthnames = ["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"];\nconfig.macros.calendar.daynames = ["m", "t", "w", "t", "f", "s", "s"];\nconfig.macros.calendar.firstday = 6; \nconfig.macros.calendar.firstweekend = 5;\n\nconfig.macros.calendar.weekendbg = "#9DF9C8";\nconfig.macros.calendar.monthbg = "#6AB3DA";\nconfig.macros.calendar.holidaybg = "#ffc0c0";\n//}}}\n/***\n!Code section:\n***/\n// (you should not need to alter anything below here)//\n//{{{\nconfig.macros.calendar.tiddlerformat = "0DD/0MM/YYYY"; // This used to be changeable - for now, it isn't// <<smiley :-(>> \n\nversion.extensions.calendar = { major: 0, minor: 5, revision: 0, date: new Date(2006, 0, 11)};\nconfig.macros.calendar.monthdays = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nconfig.macros.calendar.holidays = [ ]; // Not sure this is required anymore - use reminders instead\n//}}}\n\n// //Is the given date a holiday?\n//{{{\nfunction calendarIsHoliday(date)\n{\n var longHoliday = date.formatString("0DD/0MM/YYYY");\n var shortHoliday = date.formatString("0DD/0MM");\n\n for(var i = 0; i < config.macros.calendar.holidays.length; i++) {\n if(config.macros.calendar.holidays[i] == longHoliday || config.macros.calendar.holidays[i] == shortHoliday) {\n return true;\n }\n }\n return false;\n}\n//}}}\n\n// //The main entry point - the macro handler.\n// //Decide what sort of calendar we are creating (month or year, and which month or year)\n// // Create the main calendar container and pass that to sub-ordinate functions to create the structure.\n// ELS 2005.10.30: added creation and use of "tbody" for IE compatibility and fixup for year >1900//\n// ELS 2005.10.30: fix year calculation for IE's getYear() function (which returns '2005' instead of '105')//\n//{{{\nconfig.macros.calendar.handler = function(place,macroName,params)\n{\n var calendar = createTiddlyElement(place, "table", null, "calendar", null);\n var tbody = createTiddlyElement(calendar, "tbody", null, null, null);\n var today = new Date();\n var year = today.getYear();\n if (year<1900) year+=1900;\n if (params[0] == "thismonth")\n createCalendarOneMonth(tbody, year, today.getMonth());\n else if (params[0] == "lastmonth") {\n var month = today.getMonth()-1; if (month==-1) { month=11; year--; }\n createCalendarOneMonth(tbody, year, month);\n }\n else if (params[0] == "nextmonth") {\n var month = today.getMonth()+1; if (month>11) { month=0; year++; }\n createCalendarOneMonth(tbody, year, month);\n }\n else {\n if (params[0]) year = params[0];\n if(params[1])\n createCalendarOneMonth(tbody, year, params[1]-1);\n else\n createCalendarYear(tbody, year);\n }\n}\n//}}}\n\n//{{{\nfunction createCalendarOneMonth(calendar, year, mon)\n{\n var row = createTiddlyElement(calendar, "tr", null, "calenderMonthTitle", null);\n createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, true, year, mon);\n row = createTiddlyElement(calendar, "tr", null, "calendarDaysOfWeek", null);\n createCalendarDayHeader(row, 1);\n createCalendarDayRowsSingle(calendar, year, mon);\n}\n//}}}\n\n//{{{\nfunction createCalendarMonth(calendar, year, mon)\n{\n var row = createTiddlyElement(calendar, "tr", null, null, null);\n createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, false, year, mon);\n row = createTiddlyElement(calendar, "tr", null, null, null);\n createCalendarDayHeader(row, 1);\n createCalendarDayRowsSingle(calendar, year, mon);\n}\n//}}}\n\n//{{{\nfunction createCalendarYear(calendar, year)\n{\n var row;\n row = createTiddlyElement(calendar, "tr", null, null, null);\n var back = createTiddlyElement(row, "td", null, null, null);\n var backHandler = function() {\n removeChildren(calendar);\n createCalendarYear(calendar, year-1);\n };\n createTiddlyButton(back, "<", "Back", backHandler);\n back.align = "center";\n\n var yearHeader = createTiddlyElement(row, "td", null, "calendarYear", year);\n yearHeader.align = "center";\n yearHeader.setAttribute("colSpan", 19);\n\n var fwd = createTiddlyElement(row, "td", null, null, null);\n var fwdHandler = function() {\n removeChildren(calendar);\n createCalendarYear(calendar, year+1);\n };\n createTiddlyButton(fwd, ">", "Fwd", fwdHandler);\n fwd.align = "center";\n\n createCalendarMonthRow(calendar, year, 0);\n createCalendarMonthRow(calendar, year, 3);\n createCalendarMonthRow(calendar, year, 6);\n createCalendarMonthRow(calendar, year, 9);\n}\n//}}}\n\n//{{{\nfunction createCalendarMonthRow(cal, year, mon)\n{\n var row = createTiddlyElement(cal, "tr", null, null, null);\n createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon], false, year, mon);\n createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+1], false, year, mon);\n createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+2], false, year, mon);\n row = createTiddlyElement(cal, "tr", null, null, null);\n createCalendarDayHeader(row, 3);\n createCalendarDayRows(cal, year, mon);\n}\n//}}}\n\n//{{{\nfunction createCalendarMonthHeader(cal, row, name, nav, year, mon)\n{\n var month;\n if(nav) {\n var back = createTiddlyElement(row, "td", null, null, null);\n var backHandler = function() {\n var newyear = year;\n var newmon = mon-1;\n if(newmon == -1) { newmon = 11; newyear = newyear-1;}\n removeChildren(cal);\n createCalendarOneMonth(cal, newyear, newmon);\n };\n createTiddlyButton(back, "<", "Back", backHandler);\n back.align = "center";\n back.style.background = config.macros.calendar.monthbg; \n month = createTiddlyElement(row, "td", null, "calendarMonthname", name)\n month.setAttribute("colSpan", 5);\n var fwd = createTiddlyElement(row, "td", null, null, null);\n var fwdHandler = function() {\n var newyear = year;\n var newmon = mon+1;\n if(newmon == 12) { newmon = 0; newyear = newyear+1;}\n removeChildren(cal);\n createCalendarOneMonth(cal, newyear, newmon);\n };\n createTiddlyButton(fwd, ">", "Fwd", fwdHandler);\n fwd.align = "center";\n fwd.style.background = config.macros.calendar.monthbg; \n } else {\n month = createTiddlyElement(row, "td", null, "calendarMonthname", name)\n month.setAttribute("colSpan", 7);\n }\n month.align = "center";\n month.style.background = config.macros.calendar.monthbg;\n}\n//}}}\n\n//{{{\nfunction createCalendarDayHeader(row, num)\n{\n var cell;\n for(var i = 0; i < num; i++) {\n for(var j = 0; j < 7; j++) {\n var d = j + config.macros.calendar.firstday;\n if(d > 6) d = d - 7;\n cell = createTiddlyElement(row, "td", null, null, config.macros.calendar.daynames[d]);\n\n if(d == config.macros.calendar.firstweekend || d == config.macros.calendar.firstweekend+1)\n cell.className = "calendarWeekend";\n }\n }\n}\n//}}}\n\n//{{{\nfunction createCalendarDays(row, col, first, max, year, mon)\n{\n var i;\n for(i = 0; i < col; i++) {\n createTiddlyElement(row, "td", null, null, null);\n }\n var day = first;\n for(i = col; i < 7; i++) {\n var d = i + config.macros.calendar.firstday;\n if(d > 6) d = d - 7;\n var daycell = createTiddlyElement(row, "td", null, null, null);\n var isaWeekend = ((d == config.macros.calendar.firstweekend || d == (config.macros.calendar.firstweekend+1))? true:false);\n\n if(day > 0 && day <= max) {\n var celldate = new Date(year, mon, day);\n // ELS 2005.10.30: use <<date>> macro's showDate() function to create popup\n if (window.showDate) {\n showDate(daycell,celldate,"popup","DD","DD-MMM-YYYY",true, isaWeekend); \n } else {\n if(isaWeekend) daycell.style.background = config.macros.calendar.weekendbg;\n var title = celldate.formatString(config.macros.calendar.tiddlerformat);\n if(calendarIsHoliday(celldate)) {\n daycell.style.background = config.macros.calendar.holidaybg;\n }\n if(window.findTiddlersWithReminders == null) {\n var link = createTiddlyLink(daycell, title, false);\n link.appendChild(document.createTextNode(day));\n } else {\n var button = createTiddlyButton(daycell, day, title, onClickCalendarDate);\n }\n }\n }\n day++;\n }\n}\n//}}}\n\n// //We've clicked on a day in a calendar - create a suitable pop-up of options.\n// //The pop-up should contain:\n// // * a link to create a new entry for that date\n// // * a link to create a new reminder for that date\n// // * an <hr>\n// // * the list of reminders for that date\n//{{{\nfunction onClickCalendarDate(e)\n{\n var button = this;\n var date = button.getAttribute("title");\n var dat = new Date(date.substr(6,4), date.substr(3,2)-1, date.substr(0, 2));\n\n date = dat.formatString(config.macros.calendar.tiddlerformat);\n var popup = createTiddlerPopup(this);\n popup.appendChild(document.createTextNode(date));\n var newReminder = function() {\n var t = store.getTiddlers(date);\n displayTiddler(null, date, 2, null, null, false, false);\n if(t) {\n document.getElementById("editorBody" + date).value += "\sn<<reminder day:" + dat.getDate() +\n " month:" + (dat.getMonth()+1) +\n " year:" + (dat.getYear()+1900) + " title: >>";\n } else {\n document.getElementById("editorBody" + date).value = "<<reminder day:" + dat.getDate() +\n " month:" + (dat.getMonth()+1) +\n " year:" + (dat.getYear()+1900) + " title: >>";\n }\n };\n var link = createTiddlyButton(popup, "New reminder", null, newReminder); \n popup.appendChild(document.createElement("hr"));\n\n var t = findTiddlersWithReminders(dat, 0, null, null);\n for(var i = 0; i < t.length; i++) {\n link = createTiddlyLink(popup, t[i].tiddler, false);\n link.appendChild(document.createTextNode(t[i].tiddler));\n }\n}\n//}}}\n\n//{{{\nfunction calendarMaxDays(year, mon)\n{\n var max = config.macros.calendar.monthdays[mon];\n if(mon == 1 && (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0)) {\n max++;\n }\n return max;\n}\n//}}}\n\n//{{{\nfunction createCalendarDayRows(cal, year, mon)\n{\n var row = createTiddlyElement(cal, "tr", null, null, null);\n\n var first1 = (new Date(year, mon, 1)).getDay() -1 - config.macros.calendar.firstday;\n if(first1 < 0) first1 = first1 + 7;\n var day1 = -first1 + 1;\n var first2 = (new Date(year, mon+1, 1)).getDay() -1 - config.macros.calendar.firstday;\n if(first2 < 0) first2 = first2 + 7;\n var day2 = -first2 + 1;\n var first3 = (new Date(year, mon+2, 1)).getDay() -1 - config.macros.calendar.firstday;\n if(first3 < 0) first3 = first3 + 7;\n var day3 = -first3 + 1;\n\n var max1 = calendarMaxDays(year, mon);\n var max2 = calendarMaxDays(year, mon+1);\n var max3 = calendarMaxDays(year, mon+2);\n\n while(day1 <= max1 || day2 <= max2 || day3 <= max3) {\n row = createTiddlyElement(cal, "tr", null, null, null);\n createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;\n createCalendarDays(row, 0, day2, max2, year, mon+1); day2 += 7;\n createCalendarDays(row, 0, day3, max3, year, mon+2); day3 += 7;\n }\n}\n//}}}\n\n//{{{\nfunction createCalendarDayRowsSingle(cal, year, mon)\n{\n var row = createTiddlyElement(cal, "tr", null, null, null);\n\n var first1 = (new Date(year, mon, 1)).getDay() -1 - config.macros.calendar.firstday;\n if(first1 < 0) first1 = first1+ 7;\n var day1 = -first1 + 1;\n var max1 = calendarMaxDays(year, mon);\n\n while(day1 <= max1) {\n row = createTiddlyElement(cal, "tr", null, null, null);\n createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;\n }\n}\n//}}}\n\n// //ELS 2005.10.30: added styles\n//{{{\nsetStylesheet(".calendar, .calendar table, .calendar th, .calendar tr, .calendar td { font-size:10pt; text-align:center; } .calendar { margin:0px !important; }", "calendarStyles");\n//}}}\n
/***\n|Name|CheckboxPlugin|\n|Source|http://www.TiddlyTools.com/#CheckboxPlugin|\n|Version|2.1.3|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|Add checkboxes to your tiddler content|\n\nCheckbox states can be preserved in the document by either automatically modifying the tiddler content or setting/removing tags on specified tiddlers, or they may be saved as local cookies by assigning an optional 'chkID' to the checkbox. Add custom javascript for programmatic initialization and onClick handling for any checkbox. Also provides access to checkbox DOM element data and tracks the checkbox state in TiddlyWiki's config.options[] internal data.\n\n!!!!!Usage\n<<<\nThe checkbox syntax, including all optional parameters, is contained inside a matched set of [ and ] brackets.\n{{{ [x=id(title|tag){init_script}{onclick_script}] }}}\n\nAn alternative syntax lets you place the optional parameters ''outside'' the [ and ] brackets, and is provided for backward-compatibility with existing content that may include checkbox definitions based on earlier releases of this plugin:\n{{{ [x]=id(title|tag){init_script}{onclick_script} }}}\n\n//{{{\n[ ]or[_] and [x]or[X]\n//}}}\nSimple checkboxes. The current unchecked/checked state is indicated by the character between the {{{[}}} and {{{]}}} brackets ("_" means unchecked, "X" means checked). When you click on a checkbox, the current state is retained by directly modifying the tiddler content to place the corresponding "_" or "X" character in between the brackets\n//{{{\n[x=id]\n//}}}\nAssign an optional ID to the checkbox so you can use {{{document.getElementByID("id")}}} to manipulate the checkbox DOM element, as well as tracking the current checkbox state in {{{config.options["id"]}}}. If the ID starts with "chk" the checkbox state will also be saved in a cookie, so it can be automatically restored whenever the checkbox is re-rendered (overrides any default {{{[x]}}} or {{{[_]}}} value). If a cookie value is kept, the "_" or "X" character in the tiddler content remains unchanged, and is only applied as the default when a cookie-based value is not currently defined.\n//{{{\n[x(title|tag)] or [x(title:tag)]\n//}}}\nInitializes and tracks the current checkbox state by setting or removing ("TogglyTagging") a particular tag value from a specified tiddler. If you omit the tiddler title (and the | or : separator), the specified tag is assigned to the current tiddler. If you omit the tag value, as in {{{(title|)}}}, the default tag, {{{checked}}}, is assumed. Omitting both the title and tag, {{{()}}}, tracks the checkbox state by setting the "checked" tag on the current tiddler. When tag tracking is used, the "_" or "X" character in the tiddler content remains unchanged, and is not used to set or track the checkbox state. If a tiddler title named in the tag does not exist, the checkbox state defaults to //unselected//. When the checkbox is subsequently changed to //selected//, it will automatically (and silently) create the missing tiddler and then add the tag to it. //''NOTE: beginning with version 2.1.2 of this plugin, the "|" separator is the preferred separator between the title and tag name, as it avoids syntactic ambiguity when ":" is used within tiddler titles or tag names.''//\n//{{{\n[x{javascript}{javascript}]\n//}}}\nYou can define optional javascript code segments to add custom initialization and/or 'onClick' handling to a checkbox. The current checkbox state (and it's other DOM attributes) can be set or read from within these code segments by reference to the default context-object, 'this'.\n\nThe first code segment will be executed when the checkbox is initially displayed, so that you can programmatically determine it's starting checked/unchecked state. The second code segment (if present) is executed whenever the checkbox is clicked, so that you can perform programmed responses or intercept and override the checkbox state based on complex logic using the TW core API or custom functions defined in plugins (e.g. testing a particular tiddler title to see if certain tags are set or setting some tags when the checkbox is clicked).\n\nNote: if you want to use the default checkbox initialization processing with a custom onclick function, use this syntax: {{{ [x=id{}{javascript}] }}} \n<<<\n!!!!!Configuration\n<<<\nNormally, when a checkbox state is changed, the affected tiddlers are automatically re-rendered, so that any checkbox-dependent dynamic content can be updated. There are three possible tiddlers to be re-rendered, depending upon where the checkbox is placed, and what kind of storage method it is using.\n*''container'': the tiddler in which the checkbox is displayed. (e.g., this tiddler)\n*''tagged'': the tiddler that is being tagged (e.g., "~MyTask" when tagging "~MyTask:done")\n*''tagging'': the "tag tiddler" (e.g., "~done" when tagging "~MyTask:done")\nYou can set the default refresh handling for all checkboxes in your document by using the following javascript syntax either in a systemConfig plugin, or as an inline script. (Substitute true/false values as desired):\n{{{config.checkbox.refresh = { tagged:true, tagging:true, container:true };}}}\n\nYou can also override these defaults for any given checkbox by using an initialization function to set one or more of the refresh options. For example:\n{{{[_{this.refresh.container=false}]}}}\n<<<\n!!!!!Examples\n<<<\n//{{{\n[X] label\n[_] label\n//}}}\n>checked and unchecked static default values\n>[X] label\n>[_] label\n//{{{\n[_=demo] label\n//}}}\n>document-based value (id='demo', no cookie)\n>[_=demo] label\n//{{{\n[_=chkDemo] label\n//}}}\n>cookie-based value (id='chkDemo')\n>[_=chkDemo] label\n//{{{\n[_(CheckboxPlugin|demotag)]\n[_(CheckboxPlugin|demotag){this.refresh.tagged=this.refresh.container=false}]\n//}}}\n>tag-based value (TogglyTagging)\n>[_(CheckboxPlugin|demotag)] toggle 'demotag' (and refresh tiddler display)\n>[_(CheckboxPlugin|demotag){this.refresh.tagged=this.refresh.container=false}] toggle 'demotag' (no refresh)\n>current tags: <script>return store.getTiddler(story.findContainingTiddler(place).id.substr(7)).tags.toString();</script>\n><script label="click to view current tags">alert(store.getTiddler(story.findContainingTiddler(place).id.substr(7)).tags.toString());return false</script>\n//{{{\n[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state\n//}}}\n>custom init and onClick functions\n>[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state\nRetrieving option values:\nconfig.options['demo']=<script>return config.options['demo']?"true":"false";</script>\nconfig.options['chkDemo']=<script>return config.options['chkDemo']?"true":"false";</script>\n\n!!!!!Installation\nimport (or copy/paste) the following tiddlers into your document:\n''CheckboxPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n2006.05.04 - 2.1.3 fix use of findContainingTiddler() to check for a non-null return value, so that checkboxes won't crash when used outside of tiddler display context (such as in header, sidebar or mainmenu)\n2006.03.11 - 2.1.2 added "|" as delimiter to tag-based storage syntax (e.g. "tiddler|tag") to avoid parsing ambiguity when tiddler titles or tag names contain ":". Using ":" as a delimiter is still supported but is deprecated in favor of the new "|" usage. Based on a problem reported by JeffMason.\n2006.02.25 - 2.1.0 added configuration options to enable/disable forced refresh of tiddlers when toggling tags\n2006.02.23 - 2.0.4 when toggling tags, force refresh of the tiddler containing the checkbox.\n2006.02.23 - 2.0.3 when toggling tags, force refresh of the 'tagged tiddler' so that tag-related tiddler content (such as "to-do" lists) can be re-rendered.\n2006.02.23 - 2.0.2 when using tag-based storage, allow use [[ and ]] to quote tiddler or tag names that contain spaces:\n{{{[x([[Tiddler with spaces]]:[[tag with spaces]])]}}}\n2006.01.10 - 2.0.1 when toggling tags, force refresh of the 'tagging tiddler'. For example, if you toggle the "systemConfig" tag on a plugin, the corresponding "systemConfig" TIDDLER will be automatically refreshed (if currently displayed), so that the 'tagged' list in that tiddler will remain up-to-date.\n2006.01.04 - 2.0.0 update for ~TW2.0\n2005.12.27 - 1.1.2 Fix lookAhead regExp handling for {{{[x=id]}}}, which had been including the "]" in the extracted ID. \nAdded check for "chk" prefix on ID before calling saveOptionCookie()\n2005.12.26 - 1.1.2 Corrected use of toUpperCase() in tiddler re-write code when comparing {{{[X]}}} in tiddler content with checkbox state. Fixes a problem where simple checkboxes could be set, but never cleared.\n2005.12.26 - 1.1.0 Revise syntax so all optional parameters are included INSIDE the [ and ] brackets. Backward compatibility with older syntax is supported, so content changes are not required when upgrading to the current version of this plugin. Based on a suggestion by GeoffSlocock\n2005.12.25 - 1.0.0 added support for tracking checkbox state using tags ("TogglyTagging")\nRevised version number for official post-beta release.\n2005.12.08 - 0.9.3 support separate 'init' and 'onclick' function definitions.\n2005.12.08 - 0.9.2 clean up lookahead pattern\n2005.12.07 - 0.9.1 only update tiddler source content if checkbox state is actually different. Eliminates unnecessary tiddler changes (and 'unsaved changes' warnings)\n2005.12.07 - 0.9.0 initial BETA release\n<<<\n!!!!!Credits\n<<<\nThis feature was created by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.CheckboxPlugin = {major: 2, minor: 1, revision:3 , date: new Date(2006,5,4)};\n//}}}\n\n// // 1.2.x compatibility\n//{{{\nif (!window.story) window.story=window;\nif (!store.getTiddler) store.getTiddler=function(title){return store.tiddlers[title]}\nif (!store.addTiddler) store.addTiddler=function(tiddler){store.tiddlers[tiddler.title]=tiddler}\nif (!store.deleteTiddler) store.deleteTiddler=function(title){delete store.tiddlers[title]}\n//}}}\n\n//{{{\nconfig.checkbox = { refresh: { tagged:true, tagging:true, container:true } };\nconfig.formatters.push( {\n name: "checkbox",\n match: "\s\s[[xX_ ][\s\s]\s\s=\s\s(\s\s{]",\n lookahead: "\s\s[([xX_ ])(\s\s])?(=[^\s\ss\s\s(\s\s]{]+)?(\s\s([^\s\s)]*\s\s))?({[^}]*})?({[^}]*})?(\s\s])?",\n handler: function(w)\n {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n // get params\n var checked=lookaheadMatch[1];\n var id=lookaheadMatch[3];\n var tag=lookaheadMatch[4];\n var fn_init=lookaheadMatch[5];\n var fn_click=lookaheadMatch[6];\n // create checkbox element\n var c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick=onClickCheckbox;\n c.srcpos=w.matchStart+1; // remember location of "X"\n c.container=story.findContainingTiddler(w.output); if (c.container) c.container=c.container.id.substr(7); // tiddler containing checkbox\n c.refresh = { };\n c.refresh.container=config.checkbox.refresh.container;\n c.refresh.tagged=config.checkbox.refresh.tagged;\n c.refresh.tagging=config.checkbox.refresh.tagging;\n w.output.appendChild(c);\n // set default state\n c.checked=(checked.toUpperCase()=="X");\n // get/set state by ID\n if (id) {\n c.id=id.substr(1); // trim off leading "="\n if (config.options[c.id]!=undefined)\n c.checked=config.options[c.id];\n else\n config.options[c.id]=c.checked;\n }\n // get/set state by tag\n if (tag) {\n c.tiddler=c.container;\n c.tag=tag.substr(1,tag.length-2).trim(); // trim off parentheses\n var pos=c.tag.indexOf("|"); if (pos==-1) var pos=c.tag.indexOf(":");\n if (pos==0) { c.tag=tag.substr(1); }\n if (pos>0) { c.tiddler=c.tag.substr(0,pos).replace(/\s[\s[/g,"").replace(/\s]\s]/g,""); c.tag=c.tag.substr(pos+1); }\n c.tag.replace(/\s[\s[/g,"").replace(/\s]\s]/g,"");\n if (!c.tag.length) c.tag="checked";\n var t=store.getTiddler(c.tiddler);\n c.checked = (t && t.tags)?(t.tags.find(c.tag)!=null):false;\n }\n if (fn_init) c.fn_init=fn_init.trim().substr(1,fn_init.length-2); // trim off surrounding { and } delimiters\n if (fn_click) c.fn_click=fn_click.trim().substr(1,fn_click.length-2);\n c.init=true; c.onclick(); c.init=false; // compute initial state and save in tiddler/config/cookie\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n }\n)\n//}}}\n\n//{{{\nfunction onClickCheckbox()\n{\n if (this.fn_init)\n // custom function hook to set initial state (run only once)\n { try { eval(this.fn_init); this.fn_init=null; } catch(e) { displayMessage("Checkbox init error: "+e.toString()); } }\n else if (this.fn_click)\n // custom function hook to override or react to changes in checkbox state\n { try { eval(this.fn_click) } catch(e) { displayMessage("Checkbox click error: "+e.toString()); } }\n if (this.id)\n // save state in config AND cookie (only when ID starts with 'chk')\n { config.options[this.id]=this.checked; if (this.id.substr(0,3)=="chk") saveOptionCookie(this.id); }\n if ((!this.id || this.id.substr(0,3)!="chk") && !this.tag) {\n // save state in tiddler content only if not using cookie or tag tracking\n var t=story.findContainingTiddler(this); if (t) {\n var t=store.getTiddler(t.id.substr(7));\n if (this.checked!=(t.text.substr(this.srcpos,1).toUpperCase()=="X")) { // if changed\n t.set(null,t.text.substr(0,this.srcpos)+(this.checked?"X":"_")+t.text.substr(this.srcpos+1),null,null,t.tags);\n store.setDirty(true);\n }\n }\n }\n if (this.tag) {\n var t=store.getTiddler(this.tiddler);\n if (!t) { t=(new Tiddler()); t.set(this.tiddler,"",config.options.txtUserName,(new Date()),null); store.addTiddler(t); } \n var tagged=(t.tags && t.tags.find(this.tag)!=null);\n if (this.checked && !tagged) { t.tags.push(this.tag); store.setDirty(true); }\n if (!this.checked && tagged) { t.tags.splice(t.tags.find(this.tag),1); store.setDirty(true); }\n // if tag state has been changed, force a display update\n if (this.checked!=tagged) {\n if (this.refresh.tagged) story.refreshTiddler(this.tiddler,null,true); // the TAGGED tiddler\n if (this.refresh.tagging) story.refreshTiddler(this.tag,null,true); // the TAGGING tiddler\n }\n }\n // refresh containing tiddler (but not during initial rendering, or we get an infinite loop!)\n if (!this.init && this.refresh.container && this.container!=this.tiddler)\n story.refreshTiddler(this.container,null,true); // the tiddler CONTAINING the checkbox\n return true;\n}\n//}}}
/%\n|Name|ChecklistScript|\n|Source|http://www.TiddlyTools.com/#ChecklistScript|\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires||\n|Overrides||\n|Description||\n%/5 things to do every day:\n[x(questions)] Ask questions\n[x(answers)] Seek answers\n[x(fun)] Have fun\n[x(difference)] Make a difference\n[x(smile)] Smile\n\n<script label="reset checklist">\n var t=store.getTiddler(story.findContainingTiddler(place).id.substr(7));\n if (t && t.tags) {\n var newTags=[];\n for (var i=0; i<t.tags.length; i++) {\n switch (t.tags[i]) {\n case "questions":\n case "answers":\n case "fun":\n case "difference":\n case "smile":\n break;\n default:\n newTags.push(t.tags[i]);\n }\n }\n store.saveTiddler(t.title,null,null,null,null,newTags);\n story.refreshTiddler(t.title,null,true); // force\n }\n return false;\n</script>
Background: #fff\nForeground: #000\nPrimaryPale: #8cf\nPrimaryLight: #18f\nPrimaryMid: #05F\nPrimaryDark: #014\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #4FF\nSecondaryDark: #f90\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n
/%\n|Name|CommentScript|\n|Source|http://www.TiddlyTools.com/#CommentScript|\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires||\n|Overrides||\n|Description|form to enter feedback/comments that are automatically added to tiddler content|\n%//%comment%/+++[add a comment...]>\n <html><textarea id="comment" rows="3" style="width:100%"></textarea>\n <input type="button" value="submit comment" onclick="addTiddlerComment(this.previousSibling.previousSibling);"></html><script>\n place.lastChild.firstChild.value="Enter your comment text here";\n </script>\n===\n<script>\nwindow.addTiddlerComment = function(place) {\n if (!window.story) window.story=window; if (!store.getTiddler) store.getTiddler=function(title) {return this.tiddlers[title]}\n var title = story.findContainingTiddler(place).id.substr(7);\n var tiddler=store.getTiddler(title);\n var pos=tiddler.text.indexOf("/%"+place.id+"%/");\n if (pos==-1) pos=tiddler.text.length;\n var heading="comment from "+config.options.txtUserName+" on "+(new Date()).toLocaleString();\n var newtxt=tiddler.text.substr(0,pos);\n newtxt+="+++!!!!!["+heading+"]>\sn"+place.value+"===\sn";\n newtxt+=tiddler.text.substr(pos);\n store.saveTiddler(tiddler.title,tiddler.title,newtxt,tiddler.modifier,tiddler.modified,tiddler.tags);\n story.refreshTiddler(title,1,true);\n}\n</script>\n
Username: <<option txtUploadUserName>>\nPassword: <<option pasUploadPassword>>\nCopy/Paste into the blocks: You should only have to do this once.\n<<option txtUploadStoreUrl>> {{{http://heliotrope.ucsd.edu/store.php}}}\n<<option txtUploadDir>> {{{upload}}}\n<<option txtUploadFilename>> {{{heliolink.html}}}\n<<option txtUploadBackupDir>>{{{leave this one blank, please}}}\n<<upload>>\n[[UploadOptions]]\n[[contributors.list]]
/***\n|Name|CoreTweaks|\n|Source|http://www.TiddlyTools.com/#CoreTweaks|\n|Version|none|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides|restart, config.macros.edit.handler, Story.prototype.closeTiddler, Story.prototype.closeAllTiddlers, window.wikify, confirmExit, Slider.prototype.tick, config.commands.closeTiddler.handler, config.commands.closeOthers.handler, config.macros.closeAll.onClick|\n|Description|a small collection of overrides to TW core functions|\n\nThis tiddler contains some quick tweaks and modifications to TW core functions to provide minor changes in standard features or behavior. It is hoped that some of these tweaks may be incorporated into later versions of the TW core, so that these adjustements will be available without needing these add-on definitions.\n----\n***/\n// // {{groupbox small{\n// // This tweak corrects FireFox handling for replaceSelection() so that selected content is actually replaced instead of simply inserting next text.\n//{{{\nfunction replaceSelection(e,text)\n{\n if (e.setSelectionRange) {\n var oldpos = e.selectionStart;\n var isRange=e.selectionEnd-e.selectionStart;\n e.value = e.value.substr(0,e.selectionStart) + text + e.value.substr(e.selectionEnd);\n e.setSelectionRange( isRange?oldpos:oldpos+text.length, oldpos+text.length);\n var linecount = e.value.split('\sn').length;\n var thisline = e.value.substr(0,e.selectionStart).split('\sn').length-1;\n e.scrollTop = Math.floor((thisline-e.rows/2)*e.scrollHeight/linecount);\n }\n else if (document.selection) {\n var range = document.selection.createRange();\n if (range.parentElement() == e) {\n var isCollapsed = range.text == "";\n range.text = text;\n if (!isCollapsed) {\n range.moveStart('character', -text.length);\n range.select();\n }\n }\n }\n}\n//}}}\n// // }}}\n\n// // {{groupbox small{\n// // This tweak reverts restart() to using synchronous display of tiddlers to allow breadcrumbs (or any other sequence-dependent plugin) to be properly handled DURING the restart processing.\n//{{{\nfunction restart()\n{\n invokeParamifier(params,"onstart");\n if(story.isEmpty()) {\n var defaultParams = store.getTiddlerText("DefaultTiddlers").parseParams("open",null,false);\n// invokeParamifierAsync(defaultParams,"onstart");\n invokeParamifier(defaultParams,"onstart");\n }\n window.scrollTo(0,0);\n}\n//}}}\n// // }}}\n\n// // {{groupbox small{\n// // This tweak adds an optional 'rows' parameters to the 'edit' macro (used in EditTemplate). When 'rows' is specified, the field in the tiddler editor is rendered as a multi-line textarea element instead of a single-line input element\n//{{{\nconfig.macros.edit.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n var field = params[0];\n var rows = params[1]; // ELS: optional row count (forces creation of textarea element)\n if((tiddler instanceof Tiddler) && field) {\n story.setDirty(tiddler.title,true);\n if(field != "text" && !rows) { // create single-line input element\n var e = createTiddlyElement(null,"input");\n if(tiddler.isReadOnly())\n e.setAttribute("readOnly","readOnly");\n e.setAttribute("edit",field);\n e.setAttribute("type","text");\n var v = store.getValue(tiddler,field);\n if(!v) \n v = "";\n e.value = v;\n e.setAttribute("size","40");\n e.setAttribute("autocomplete","off");\n place.appendChild(e);\n } else { // create multi-line textarea element\n var wrapper1 = createTiddlyElement(null,"fieldset",null,"fieldsetFix");\n var wrapper2 = createTiddlyElement(wrapper1,"div");\n var e = createTiddlyElement(wrapper2,"textarea");\n if(tiddler.isReadOnly())\n e.setAttribute("readOnly","readOnly");\n var v = store.getValue(tiddler,field);\n if(!v) \n v = "";\n e.value = v;\n var rows = rows?rows:10; // ELS: use specified # of rows if provided, otherwise, default as usual\n var lines = v.match(/\sn/mg);\n var maxLines = Math.max(parseInt(config.options.txtMaxEditRows),5);\n if(lines != null && lines.length > rows)\n rows = lines.length + 5;\n rows = Math.min(rows,maxLines);\n e.setAttribute("rows",rows);\n e.setAttribute("edit",field);\n place.appendChild(wrapper1);\n }\n }\n};\n//}}}\n// // }}}\n// // {{groupbox small{\n// // fix for bug#301, in which FireFox doesn't properly re-display textarea contents when other elements are removed from the DOM, causing the textarea to shift position but leave the textarea contents behind (overlapping other content)\n\n// // This fix adds an optional 'allowAsync' param to closeAll() and closeAllTiddlers(). When TRUE, asynch redisplay handling is used after closing one or more tiddlers, permitting FireFox the opportunity to properly re-render contents of textareas. Various core handlers are also revised so they can use the #301 fix, while still allowing existing plugins functions that require on synchronous handling (e.g., BreadcrumbsPlugin restartHome()) to operate correctly.\n\n// // This fix also includes a small tweak to ensure that when a tiddler in the story column is closed, the previous tiddler is scrolled into view, as suggested by DaveGifford (http://www.giffmex.org)\n//{{{\nStory.prototype.coreTweaks_closeTiddler = Story.prototype.closeTiddler;\nStory.prototype.closeTiddler = function(title,animate,slowly,allowAsync)\n{\n var tiddlerElem = document.getElementById(this.idPrefix + title);\n if(tiddlerElem != null) {\n // make sure previous tiddler is in view\n if (tiddlerElem.previousSibling) window.scrollTo(0,ensureVisible(tiddlerElem.previousSibling));\n clearMessage();\n this.scrubTiddler(tiddlerElem);\n if(anim && config.options.chkAnimate && animate)\n anim.startAnimating(new Slider(tiddlerElem,false,slowly,"all"));\n else {\n // bug #301 fix... set overflow=hidden and use asynch redraw (if allowed)\n tiddlerElem.style.overflow = "hidden";\n if (allowAsync)\n setTimeout(function(){tiddlerElem.parentNode.removeChild(tiddlerElem)},0);\n else\n tiddlerElem.parentNode.removeChild(tiddlerElem);\n }\n }\n}\n// bug #301 fix... optional param, allowAsync, for pass-thru to closeTiddlers()\nStory.prototype.closeAllTiddlers = function(exclude,allowAsync)\n{\n clearMessage();\n this.forEachTiddler(function(title,element) {\n if((title != exclude) && element.getAttribute("dirty") != "true")\n this.closeTiddler(title,false,false,allowAsync); // no animation\n });\n window.scrollTo(0,0);\n}\nconfig.commands.closeTiddler.handler = function(event,src,title)\n{\n story.closeTiddler(title,true,event.shiftKey || event.altKey,true); // bug #301 fix... "close" uses allowAsync\n return false;\n}\nconfig.commands.closeOthers.handler = function(event,src,title)\n{\n story.closeAllTiddlers(title,true); // bug #301 fix... "close others" uses allowAsync\n return false;\n}\nconfig.macros.closeAll.onClick = function(e)\n{\n story.closeAllTiddlers(null,true); // bug #301 fix... "close all" uses allowAsync\n return false;\n}\n//}}}\n// // }}}\n// // {{groupbox small{\n// // This tweak adds URL paramifier handlers for "hide:elementID" and "show:elementID". This is useful for forcing the display state of specific TW page elements, without requiring StyleSheet changes. For example, if your customized StyleSheet hides the sidebar (useful for 'read only' published documents), you can force it to display when you need to edit the document by adding {{{#show:sidebar}}} to the document URL. Alternatively, you might want to supress non-tiddler content when printing by hiding the sidebars and header (e.g., {{{#hide:mainMenu hide:sidebar hide:header}}})\n//{{{\nif (config.paramifiers) { // check for backward-compatibility\n config.paramifiers.hide = { onstart: function(id) { var e=document.getElementById(id); if (e) e.style.display="none"; } };\n config.paramifiers.show = { onstart: function(id) { var e=document.getElementById(id); if (e) e.style.display="block"; } };\n}\n//}}}\n// // }}}\n// // {{groupbox small{\n// // This HIJACK tweak pre-processes source content to convert "backslash-newline" into {{{<<br>>}}} before wikify(), so that literal newlines can be embedded in line-mode wiki syntax (e.g., tables, bullets, etc.). Based on a suggestion from Sitaram Chamarty.\n//{{{\nwindow.coreWikify = wikify;\nwindow.wikify = function(source,output,highlightRegExp,tiddler)\n{\n if (source) source=source.replace(/\s\s\sn\ss*/mg,"<<br>>");\n coreWikify(source,output,highlightRegExp,tiddler)\n}\n//}}}\n// // }}}\n// // {{groupbox small{\n// // This tweak adds a check for any tiddlers that are being actively edited, so that accidental page transitions don't discard tiddler content that has been entered but not yet saved to the 'store' (i.e., by pressing 'done').\n//{{{\nconfig.messages.editing_confirmExit ="There are currently open tiddler editors that may contain unsaved changes.\snIf you continue you will lose those changes";\nfunction confirmExit()\n{\n hadConfirmExit = true;\n if(store && store.isDirty && store.isDirty())\n return config.messages.confirmExit;\n // added by ELS\n var editing=false;\n story.forEachTiddler(function(title,element) { if(element.getAttribute("dirty")=="true") editing=true; });\n if (editing) return config.messages.editing_confirmExit;\n}\n//}}}\n// // }}}\n// // {{groupbox small{\n// // When a slider is opened/closed with animation enabled, the opacity/alphafilter styles are incrementally adjusted to create a "fade-in/fade-out" effect. However, this effect seems to render incredibly slowly on FireFox, and even slower when the background image is a complex JPG photo image, making animation impractical to use. This tweak provides an option to disable the opacity/alphafilter handling, while leaving the 'incremental height' animation intact. The resulting increase in performance makes it possible to leave the animation enabled so that you can benefit from the visual cues it provides.\n//{{{\nif (!config.options.chkEnableFade) config.options.chkEnableFade=false; // ELS: added conditional option for fade-in/fade-out\nSlider.prototype.tick = function()\n{\n this.progress += this.step;\n if(this.progress < 0 || this.progress > 1)\n {\n this.stop();\n return false;\n }\n else\n {\n var f = Animator.slowInSlowOut(this.progress);\n var h = this.realHeight * f;\n this.element.style.height = h + "px";\n if (config.options.chkEnableFade) // ELS: added conditional option for fade-in/fade-out\n {\n this.element.style.opacity = f;\n this.element.style.filter = "alpha(opacity:" + f * 100 +")";\n }\n return true;\n }\n}\n//}}}\n// // }}}
[[Current Flow in Vibrissa Motor Cortex Can Phase-Lock With Exploratory Rhythmic Whisking in Rat |http://heliotrope.ucsd.edu/Repository.Papers/ahrens_kleinfeld_04jnp_spectralmixing.pdf]]\n!Abstract:\nRats explore their environment with rhythmic sweeps of their mystacial vibrissae in the range of 5–15 Hz. We tested if vibrissa primary motor (M1) cortex produces electrical activity that locks to this behavioral output. Rats were trained to whisk in air in search of a food reward. The EMG of the mystacial pad served as a surrogate of vibrissa position, while chronically implanted, 16-channel Si-based probes provided a record of field potentials throughout the depth of vibrissa M1 cortex as well as vibrissa primary somatosensory (S1) cortex. The measured potentials were used to estimate the current source density along the radial axis. We observed that current flow throughout the depth of M1 cortex is coherent with the mystacial EMG, i.e., the two signals co-vary with a defined phase relation. This coherence persists after transection of the infraorbital branch (IoN) of the trigeminal nerve, which provides the sole sensory input from the vibrissae. Furthermore, current flow in vibrissa S1 cortex that is coherent with the mystacial EMG also persists after transection of the IoN, consistent with anatomical pathways between M1 and S1. In combination with a previous observation that rhythmic, intracortical microstimulation of vibrissa M1 cortex can drive normal whisking motion, the present data support the hypothesis that, in principle, M1 cortex can initiate motion of the vibrissae on a cycleby- cycle basis.
[[welcome]]
[[Digital Anatomist|http://www9.biostr.washington.edu/da.html]]\n\nThis provides a comprehensive human brain atlas with annotation.
<<exportTiddlers inline>>
/***\n|Name|ExportTiddlersPlugin|\n|Source|http://www.TiddlyTools.com/#ExportTiddlersPlugin|\n|Version|2.3.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|select and extract tiddlers from your ~TiddlyWiki documents and save them to a local file|\n\nWhen many people edit copies of the same TiddlyWiki document, the ability to easily copy and share these changes so they can then be redistributed to the entire group is very important. This ability is also 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\nExportTiddlersPlugin let you ''select and extract tiddlers from your ~TiddlyWiki documents and save them to a local file'' or a remote server (requires installation of compatible server-side scripting, still under development...). An interactive control panel lets you specify a destination, and then select which tiddlers to export. A convenient 'selection filter' helps you pick desired tiddlers by specifying a combination of modification dates, tags, or tiddler text to be matched or excluded. ''Tiddler data can be output as ~TiddlyWiki "storeArea ~DIVs" that can be imported into another ~TiddlyWiki or as ~RSS-compatible XML that can be published for RSS syndication.''\n\n!!!!!Inline interface (live)\n<<<\n<<exportTiddlers inline>>\n<<<\n!!!!!Usage\n<<<\nOptional "special tiddlers" used by this plugin:\n* SiteUrl^^\nURL for official server-published version of document being viewed (used in XML export)\ndefault: //none//^^\n* SiteHost^^\nhost name/address for remote server (e.g., "www.server.com" or "192.168.1.27")\ndefault: //none//^^\n* SitePost^^\nremote path/filename for submitting changes (e.g., "/cgi-bin/submit.cgi")\ndefault: //none//^^\n* SiteParams^^\narguments (if any) for server-side receiving script\ndefault: //none//^^\n* SiteNotify^^\naddresses (if any) for sending automatic server-side email notices\ndefault: //none//^^\n* SiteID^^\nusername or other authorization identifier for login-controlled access to remote server\ndefault: current TiddlyWiki username (e.g., "YourName")^^\n* SiteDate^^\nstored date/time stamp for most recent published version of document\ndefault: current document.modified value (i.e., the 'file date')^^\n<<<\n!!!!!Example\n<<<\n<<exportTiddlers>>\n<<<\n!!!!!Installation\n<<<\nImport (or copy/paste) the following tiddlers into your document:\n''ExportTiddlersPlugin'' (tagged with <<tag systemConfig>>)\n\ncreate/edit ''SideBarOptions'': (sidebar menu items) \n^^Add {{{<<exportTiddlers>>}}} macro^^\n<<<\n!!!!!Revision History\n<<<\n''2007.04.19 [2.3.0]'' in exportData(), pass SiteURL value as param to saveToRss(). Fixes 'undefined' appearing in tiddler link in XML output. Also, in refreshExportList(), added 'sort by tags'. Also, added 'group select'... selecting a heading (date,author,tag) auto-selects all tiddlers in that group.\n''2007.03.02 [2.2.6]'' in onClickExportButton(), when selecting open tiddlers for TW2.2, look for "storyDisplay" instead of "tiddlerDisplay" but keep fallback to "tiddlerDisplay" for TW2.1 or earlier\n''2007.03.01 [2.2.5]'' removed hijack of store.saveChanges() (was catching save on http:, but there are other solutions that do a much better job of handling save to server.\n|please see [[ExportTiddlersPluginHistory]] for additional revision details|\n''2005.10.09 [0.0.0]'' development started\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n// // version\n//{{{\nversion.extensions.exportTiddlers = {major: 2, minor: 3, revision: 0, date: new Date(2007,4,19)};\n//}}}\n\n// // macro handler\n//{{{\nconfig.macros.exportTiddlers = {\n label: "export tiddlers",\n prompt: "Copy selected tiddlers to an export document",\n newdefault: "export.html",\n datetimefmt: "0MM/0DD/YYYY 0hh:0mm:0ss" // for "filter date/time" edit fields\n};\n\nconfig.macros.exportTiddlers.handler = function(place,macroName,params) {\n if (params[0]!="inline")\n { createTiddlyButton(place,this.label,this.prompt,onClickExportMenu); return; }\n var panel=createExportPanel(place);\n panel.style.position="static";\n panel.style.display="block";\n}\n\nfunction createExportPanel(place) {\n var panel=document.getElementById("exportPanel");\n if (panel) { panel.parentNode.removeChild(panel); }\n setStylesheet(config.macros.exportTiddlers.css,"exportTiddlers");\n panel=createTiddlyElement(place,"span","exportPanel",null,null)\n panel.innerHTML=config.macros.exportTiddlers.html;\n exportShowPanel(document.location.protocol);\n exportInitFilter();\n refreshExportList(0);\n return panel;\n}\n\nfunction onClickExportMenu(e)\n{\n if (!e) var e = window.event;\n var parent=resolveTarget(e).parentNode;\n var panel = document.getElementById("exportPanel");\n if (panel==undefined || panel.parentNode!=parent)\n panel=createExportPanel(parent);\n var isOpen = panel.style.display=="block";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n panel.style.display = isOpen ? "none" : "block" ;\n if (panel.style.display!="none") refreshExportList(0); // update list when panel is made visible\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n// // IE needs explicit scoping for functions called by browser events\n//{{{\nwindow.onClickExportMenu=onClickExportMenu;\nwindow.onClickExportButton=onClickExportButton;\nwindow.exportShowPanel=exportShowPanel;\nwindow.exportShowFilterFields=exportShowFilterFields;\nwindow.refreshExportList=refreshExportList;\n//}}}\n\n// // CSS for floating export control panel\n//{{{\nconfig.macros.exportTiddlers.css = '\s\n#exportPanel {\s\n display: none; position:absolute; z-index:12; width:35em; right:105%; top:6em;\s\n background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\s\n padding: 0.5em; margin:0em; -moz-border-radius:1em;\s\n}\s\n#exportPanel a, #exportPanel td a { color:#009; display:inline; margin:0px; padding:1px; }\s\n#exportPanel table { width:100%; border:0px; padding:0px; margin:0px; font-size:8pt; line-height:110%; background:transparent; }\s\n#exportPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }\s\n#exportPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }\s\n#exportPanel select { width:98%;margin:0px;font-size:8pt;line-height:110%;}\s\n#exportPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%; }\s\n#exportPanel textarea { width:98%;padding:0px;margin:0px;overflow:auto;font-size:8pt; }\s\n#exportPanel .box { border:1px solid black; padding:3px; margin-bottom:5px; background:#f8f8f8; -moz-border-radius:5px; }\s\n#exportPanel .topline { border-top:2px solid black; padding-top:3px; margin-bottom:5px; }\s\n#exportPanel .rad { width:auto;border:0 }\s\n#exportPanel .chk { width:auto;border:0 }\s\n#exportPanel .btn { width:auto; }\s\n#exportPanel .btn1 { width:98%; }\s\n#exportPanel .btn2 { width:48%; }\s\n#exportPanel .btn3 { width:32%; }\s\n#exportPanel .btn4 { width:24%; }\s\n#exportPanel .btn5 { width:19%; }\s\n';\n//}}}\n\n// // HTML for export control panel interface\n//{{{\nconfig.macros.exportTiddlers.html = '\s\n<!-- output target and format -->\s\n<table cellpadding="0" cellspacing="0"><tr><td width=50%>\s\n export to\s\n <select size=1 id="exportTo" onchange="exportShowPanel(this.value);">\s\n <option value="file:" SELECTED>this computer</option>\s\n <option value="http:">web server (http)</option>\s\n <option value="https:">secure web server (https)</option>\s\n <option value="ftp:">file server (ftp)</option>\s\n </select>\s\n</td><td width=50%>\s\n output format\s\n <select id="exportFormat" size=1>\s\n <option value="DIV">TiddlyWiki export file</option>\s\n <option value="TW">TiddlyWiki document</option>\s\n <option value="XML">RSS feed (XML)</option>\s\n </select>\s\n</td></tr></table>\s\n\s\n<!-- export to local file -->\s\n<div id="exportLocalPanel" style="margin-top:5px;">\s\nlocal path/filename<br>\s\n<input type="text" id="exportFilename" size=40 style="width:93%"><input \s\n type="button" id="exportBrowse" value="..." title="select or enter a local folder/file..." style="width:5%" \s\n onclick="this.previousSibling.value=window.promptForExportFilename(this);">\s\n<!--<input type="file" id="exportFilename" size=57 style="width:100%"><br>-->\s\n</div><!--panel-->\s\n\s\n<!-- export to http server -->\s\n<div id="exportHTTPPanel" style="display:none;margin-top:5px;">\s\n<table><tr><td align=left>\s\n server location, script, and parameters<br>\s\n</td><td align=right>\s\n <input type="checkbox" class="chk" id="exportNotify"\s\n onClick="document.getElementById(\s'exportSetNotifyPanel\s').style.display=this.checked?\s'block\s':\s'none\s'"> notify\s\n</td></tr></table>\s\n<input type="text" id="exportHTTPServerURL" onfocus="this.select()"><br>\s\n<div id="exportSetNotifyPanel" style="display:none">\s\n send email notices to<br>\s\n <input type="text" id="exportNotifyTo" onfocus="this.select()"><br>\s\n</div>\s\n</div><!--panel-->\s\n\s\n<!-- export to ftp server -->\s\n<div id="exportFTPPanel" style="display:none;margin-top:5px;">\s\n<table cellpadding="0" cellspacing="0" width="32%"><tr valign="top"><td>\s\n host server<br>\s\n <input type="text" id="exportFTPHost" onfocus="this.select()"><br>\s\n</td><td width="32%">\s\n username<br>\s\n <input type="text" id="exportFTPID" onfocus="this.select()"><br>\s\n</td><td width="32%">\s\n password<br>\s\n <input type="password" id="exportFTPPW" onfocus="this.select()"><br>\s\n</td></tr></table>\s\nFTP path/filename<br>\s\n<input type="text" id="exportFTPFilename" onfocus="this.select()"><br>\s\n</div><!--panel-->\s\n\s\n<!-- notes -->\s\nnotes<br>\s\n<textarea id="exportNotes" rows=3 cols=40 style="height:4em;margin-bottom:5px;" onfocus="this.select()"></textarea> \s\n\s\n<!-- list of tiddlers -->\s\n<table><tr align="left"><td>\s\n select:\s\n <a href="JavaScript:;" id="exportSelectAll"\s\n onclick="onClickExportButton(this)" title="select all tiddlers">\s\n &nbsp;all&nbsp;</a>\s\n <a href="JavaScript:;" id="exportSelectChanges"\s\n onclick="onClickExportButton(this)" title="select tiddlers changed since last save">\s\n &nbsp;changes&nbsp;</a> \s\n <a href="JavaScript:;" id="exportSelectOpened"\s\n onclick="onClickExportButton(this)" title="select tiddlers currently being displayed">\s\n &nbsp;opened&nbsp;</a> \s\n <a href="JavaScript:;" id="exportToggleFilter"\s\n onclick="onClickExportButton(this)" title="show/hide selection filter">\s\n &nbsp;filter&nbsp;</a> \s\n</td><td align="right">\s\n <a href="JavaScript:;" id="exportListSmaller"\s\n onclick="onClickExportButton(this)" title="reduce list size">\s\n &nbsp;&#150;&nbsp;</a>\s\n <a href="JavaScript:;" id="exportListLarger"\s\n onclick="onClickExportButton(this)" title="increase list size">\s\n &nbsp;+&nbsp;</a>\s\n</td></tr></table>\s\n<select id="exportList" multiple size="10" style="margin-bottom:5px;"\s\n onchange="refreshExportList(this.selectedIndex)">\s\n</select><br>\s\n</div><!--box-->\s\n\s\n<!-- selection filter -->\s\n<div id="exportFilterPanel" style="display:none">\s\n<table><tr align="left"><td>\s\n selection filter\s\n</td><td align="right">\s\n <a href="JavaScript:;" id="exportHideFilter"\s\n onclick="onClickExportButton(this)" title="hide selection filter">hide</a>\s\n</td></tr></table>\s\n<div class="box">\s\n<input type="checkbox" class="chk" id="exportFilterStart" value="1"\s\n onclick="exportShowFilterFields(this)"> starting date/time<br>\s\n<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">\s\n <select size=1 id="exportFilterStartBy" onchange="exportShowFilterFields(this);">\s\n <option value="0">today</option>\s\n <option value="1">yesterday</option>\s\n <option value="7">a week ago</option>\s\n <option value="30">a month ago</option>\s\n <option value="site">SiteDate</option>\s\n <option value="file">file date</option>\s\n <option value="other">other (mm/dd/yyyy hh:mm)</option>\s\n </select>\s\n</td><td width="50%">\s\n <input type="text" id="exportStartDate" onfocus="this.select()"\s\n onchange="document.getElementById(\s'exportFilterStartBy\s').value=\s'other\s';">\s\n</td></tr></table>\s\n<input type="checkbox" class="chk" id="exportFilterEnd" value="1"\s\n onclick="exportShowFilterFields(this)"> ending date/time<br>\s\n<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">\s\n <select size=1 id="exportFilterEndBy" onchange="exportShowFilterFields(this);">\s\n <option value="0">today</option>\s\n <option value="1">yesterday</option>\s\n <option value="7">a week ago</option>\s\n <option value="30">a month ago</option>\s\n <option value="site">SiteDate</option>\s\n <option value="file">file date</option>\s\n <option value="other">other (mm/dd/yyyy hh:mm)</option>\s\n </select>\s\n</td><td width="50%">\s\n <input type="text" id="exportEndDate" onfocus="this.select()"\s\n onchange="document.getElementById(\s'exportFilterEndBy\s').value=\s'other\s';">\s\n</td></tr></table>\s\n<input type="checkbox" class="chk" id=exportFilterTags value="1"\s\n onclick="exportShowFilterFields(this)"> match tags<br>\s\n<input type="text" id="exportTags" onfocus="this.select()">\s\n<input type="checkbox" class="chk" id=exportFilterText value="1"\s\n onclick="exportShowFilterFields(this)"> match titles/tiddler text<br>\s\n<input type="text" id="exportText" onfocus="this.select()">\s\n</div> <!--box-->\s\n</div> <!--panel-->\s\n\s\n<!-- action buttons -->\s\n<div style="text-align:center">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportFilter" value="apply filter">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportStart" value="export tiddlers">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportClose" value="close">\s\n</div><!--center-->\s\n';\n//}}}\n\n// // initialize interface\n// // exportShowPanel(which)\n//{{{\nfunction exportShowPanel(which) {\n var index=0; var panel='exportLocalPanel';\n switch (which) {\n case 'file:':\n case undefined:\n index=0; panel='exportLocalPanel'; break;\n case 'http:':\n index=1; panel='exportHTTPPanel'; break;\n case 'https:':\n index=2; panel='exportHTTPPanel'; break;\n case 'ftp:':\n index=3; panel='exportFTPPanel'; break;\n default:\n alert("Sorry, export to "+which+" is not yet available");\n break;\n }\n exportInitPanel(which);\n document.getElementById('exportTo').selectedIndex=index;\n document.getElementById('exportLocalPanel').style.display='none';\n document.getElementById('exportHTTPPanel').style.display='none';\n document.getElementById('exportFTPPanel').style.display='none';\n document.getElementById(panel).style.display='block';\n}\n//}}}\n\n// // exportInitPanel(which)\n//{{{\nfunction exportInitPanel(which) {\n switch (which) {\n case "file:": // LOCAL EXPORT PANEL: file/path:\n // ** no init - security issues in IE **\n break;\n case "http:": // WEB EXPORT PANEL\n case "https:": // SECURE WEB EXPORT PANEL\n // url\n if (store.tiddlerExists("unawiki_download")) {\n var theURL=store.getTiddlerText("unawiki_download");\n theURL=theURL.replace(/\s[\s[download\s|/,'').replace(/\s]\s]/,'');\n var title=(store.tiddlerExists("unawiki_host"))?"unawiki_host":"SiteHost";\n var theHost=store.getTiddlerText(title);\n if (!theHost || !theHost.length) theHost=document.location.host;\n if (!theHost || !theHost.length) theHost=title;\n }\n // server script/params\n var title=(store.tiddlerExists("unawiki_host"))?"unawiki_host":"SiteHost";\n var theHost=store.getTiddlerText(title);\n if (!theHost || !theHost.length) theHost=document.location.host;\n if (!theHost || !theHost.length) theHost=title;\n // get POST\n var title=(store.tiddlerExists("unawiki_post"))?"unawiki_post":"SitePost";\n var thePost=store.getTiddlerText(title);\n if (!thePost || !thePost.length) thePost="/"+title;\n // get PARAMS\n var title=(store.tiddlerExists("unawiki_params"))?"unawiki_params":"SiteParams";\n var theParams=store.getTiddlerText(title);\n if (!theParams|| !theParams.length) theParams=title;\n var serverURL = which+"//"+theHost+thePost+"?"+theParams;\n document.getElementById("exportHTTPServerURL").value=serverURL;\n // get NOTIFY\n var theAddresses=store.getTiddlerText("SiteNotify");\n if (!theAddresses|| !theAddresses.length) theAddresses="SiteNotify";\n document.getElementById("exportNotifyTo").value=theAddresses;\n break;\n case "ftp:": // FTP EXPORT PANEL\n // host\n var siteHost=store.getTiddlerText("SiteHost");\n if (!siteHost || !siteHost.length) siteHost=document.location.host;\n if (!siteHost || !siteHost.length) siteHost="SiteHost";\n document.getElementById("exportFTPHost").value=siteHost;\n // username\n var siteID=store.getTiddlerText("SiteID");\n if (!siteID || !siteID.length) siteID=config.options.txtUserName;\n document.getElementById("exportFTPID").value=siteID;\n // password\n document.getElementById("exportFTPPW").value="";\n // file/path\n document.getElementById("exportFTPFilename").value="";\n break;\n }\n}\n//}}}\n\n// // exportInitFilter()\n//{{{\nfunction exportInitFilter() {\n // start date\n document.getElementById("exportFilterStart").checked=false;\n document.getElementById("exportStartDate").value="";\n // end date\n document.getElementById("exportFilterEnd").checked=false;\n document.getElementById("exportEndDate").value="";\n // tags\n document.getElementById("exportFilterTags").checked=false;\n document.getElementById("exportTags").value="";\n // text\n document.getElementById("exportFilterText").checked=false;\n document.getElementById("exportText").value="";\n // show/hide filter input fields\n exportShowFilterFields();\n}\n//}}}\n\n// // exportShowFilterFields(which)\n//{{{\nfunction exportShowFilterFields(which) {\n var show;\n\n show=document.getElementById('exportFilterStart').checked;\n document.getElementById('exportFilterStartBy').style.display=show?"block":"none";\n document.getElementById('exportStartDate').style.display=show?"block":"none";\n var val=document.getElementById('exportFilterStartBy').value;\n document.getElementById('exportStartDate').value\n =getFilterDate(val,'exportStartDate').formatString(config.macros.exportTiddlers.datetimefmt);\n if (which && (which.id=='exportFilterStartBy') && (val=='other'))\n document.getElementById('exportStartDate').focus();\n\n show=document.getElementById('exportFilterEnd').checked;\n document.getElementById('exportFilterEndBy').style.display=show?"block":"none";\n document.getElementById('exportEndDate').style.display=show?"block":"none";\n var val=document.getElementById('exportFilterEndBy').value;\n document.getElementById('exportEndDate').value\n =getFilterDate(val,'exportEndDate').formatString(config.macros.exportTiddlers.datetimefmt);\n if (which && (which.id=='exportFilterEndBy') && (val=='other'))\n document.getElementById('exportEndDate').focus();\n\n show=document.getElementById('exportFilterTags').checked;\n document.getElementById('exportTags').style.display=show?"block":"none";\n\n show=document.getElementById('exportFilterText').checked;\n document.getElementById('exportText').style.display=show?"block":"none";\n}\n//}}}\n\n// // onClickExportButton(which): control interactions\n//{{{\nfunction onClickExportButton(which)\n{\n // DEBUG alert(which.id);\n var theList=document.getElementById('exportList'); if (!theList) return;\n var count = 0;\n var total = store.getTiddlers('title').length;\n switch (which.id)\n {\n case 'exportFilter':\n count=filterExportList();\n var panel=document.getElementById('exportFilterPanel');\n if (count==-1) { panel.style.display='block'; break; }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage("filtered "+formatExportMessage(count,total));\n if (count==0) { alert("No tiddlers were selected"); panel.style.display='block'; }\n break;\n case 'exportStart':\n exportTiddlers();\n break;\n case 'exportHideFilter':\n case 'exportToggleFilter':\n var panel=document.getElementById('exportFilterPanel')\n panel.style.display=(panel.style.display=='block')?'none':'block';\n break;\n case 'exportSelectChanges':\n var lastmod=new Date(document.lastModified);\n for (var t = 0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n var tiddler=store.getTiddler(theList.options[t].value); if (!tiddler) continue;\n theList.options[t].selected=(tiddler.modified>lastmod);\n count += (tiddler.modified>lastmod)?1:0;\n }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(formatExportMessage(count,total));\n if (count==0) alert("There are no unsaved changes");\n break;\n case 'exportSelectAll':\n for (var t = 0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=true;\n count += 1;\n }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(formatExportMessage(count,count));\n break;\n case 'exportSelectOpened':\n for (var t = 0; t < theList.options.length; t++) theList.options[t].selected=false;\n var tiddlerDisplay = document.getElementById("tiddlerDisplay"); // for TW2.1-\n if (!tiddlerDisplay) tiddlerDisplay = document.getElementById("storyDisplay"); // for TW2.2+\n for (var t=0;t<tiddlerDisplay.childNodes.length;t++) {\n var tiddler=tiddlerDisplay.childNodes[t].id.substr(7);\n for (var i = 0; i < theList.options.length; i++) {\n if (theList.options[i].value!=tiddler) continue;\n theList.options[i].selected=true; count++; break;\n }\n }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(formatExportMessage(count,total));\n if (count==0) alert("There are no tiddlers currently opened");\n break;\n case 'exportListSmaller': // decrease current listbox size\n var min=5;\n theList.size-=(theList.size>min)?1:0;\n break;\n case 'exportListLarger': // increase current listbox size\n var max=(theList.options.length>25)?theList.options.length:25;\n theList.size+=(theList.size<max)?1:0;\n break;\n case 'exportClose':\n document.getElementById('exportPanel').style.display='none';\n break;\n }\n}\n//}}}\n\n// // list display\n//{{{\nfunction formatExportMessage(count,total)\n{\n var txt=total+' tiddler'+((total!=1)?'s':'')+" - ";\n txt += (count==0)?"none":(count==total)?"all":count;\n txt += " selected for export";\n return txt;\n}\n\nfunction refreshExportList(selectedIndex)\n{\n var theList = document.getElementById("exportList");\n var sort;\n if (!theList) return;\n // get the sort order\n if (!selectedIndex) selectedIndex=0;\n if (selectedIndex==0) sort='modified';\n if (selectedIndex==1) sort='title';\n if (selectedIndex==2) sort='modified';\n if (selectedIndex==3) sort='modifier';\n if (selectedIndex==4) sort='tags';\n\n // unselect headings and count number of tiddlers actually selected\n for (var t=0,count=0; t < theList.options.length; t++) {\n if (!theList.options[t].selected) continue;\n if (theList.options[t].value!="")\n count++;\n else { // if heading is selected, deselect it, and then select and count all in section\n theList.options[t].selected=false;\n for ( t++; t<theList.options.length && theList.options[t].value!=""; t++) {\n theList.options[t].selected=true;\n count++;\n }\n }\n }\n\n // disable "export" button if no tiddlers selected\n document.getElementById("exportStart").disabled=(count==0);\n // show selection count\n var tiddlers = store.getTiddlers('title');\n if (theList.options.length) { clearMessage(); displayMessage(formatExportMessage(count,tiddlers.length)); }\n\n // if a [command] item, reload list... otherwise, no further refresh needed\n if (selectedIndex>4) return;\n\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++]=\n new Option(tiddlers.length+" tiddlers in document", "",false,false);\n theList.options[i++]=\n new Option(((sort=="title" )?">":indent)+' [by title]', "",false,false);\n theList.options[i++]=\n new Option(((sort=="modified")?">":indent)+' [by date]', "",false,false);\n theList.options[i++]=\n new Option(((sort=="modifier")?">":indent)+' [by author]', "",false,false);\n theList.options[i++]=\n new Option(((sort=="tags" )?">":indent)+' [by tags]', "",false,false);\n // output the tiddler list\n switch(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 "modifier":\n case "modified":\n var tiddlers = store.getTiddlers(sort);\n // sort descending for newest date first\n tiddlers.sort(function (a,b) {if(a[sort] == b[sort]) return(0); else return (a[sort] > b[sort]) ? -1 : +1; });\n var lastSection = "";\n for(var t = 0; t < tiddlers.length; t++)\n {\n var tiddler = tiddlers[t];\n var theSection = "";\n if (sort=="modified") theSection=tiddler.modified.toLocaleDateString();\n if (sort=="modifier") theSection=tiddler.modifier;\n if (theSection != lastSection)\n {\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 if (!tags || !tags.length) {\n if (theTitles["untagged"]==undefined) { theTags.push("untagged"); theTitles["untagged"]=new Array(); }\n theTitles["untagged"].push(title);\n }\n else 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}\n//}}}\n\n// // list filtering\n//{{{\nfunction getFilterDate(val,id)\n{\n var result=0;\n switch (val) {\n case 'site':\n var timestamp=store.getTiddlerText("SiteDate");\n if (!timestamp) timestamp=document.lastModified;\n result=new Date(timestamp);\n break;\n case 'file':\n result=new Date(document.lastModified);\n break;\n case 'other':\n result=new Date(document.getElementById(id).value);\n break;\n default: // today=0, yesterday=1, one week=7, two weeks=14, a month=31\n var now=new Date(); var tz=now.getTimezoneOffset()*60000; now-=tz;\n var oneday=86400000;\n if (id=='exportStartDate')\n result=new Date((Math.floor(now/oneday)-val)*oneday+tz);\n else\n result=new Date((Math.floor(now/oneday)-val+1)*oneday+tz-1);\n break;\n }\n // DEBUG alert('getFilterDate('+val+','+id+')=='+result+"\snnow="+now);\n return result;\n}\n\nfunction filterExportList()\n{\n var theList = document.getElementById("exportList"); if (!theList) return -1;\n\n var filterStart=document.getElementById("exportFilterStart").checked;\n var val=document.getElementById("exportFilterStartBy").value;\n var startDate=getFilterDate(val,'exportStartDate');\n\n var filterEnd=document.getElementById("exportFilterEnd").checked;\n var val=document.getElementById("exportFilterEndBy").value;\n var endDate=getFilterDate(val,'exportEndDate');\n\n var filterTags=document.getElementById("exportFilterTags").checked;\n var tags=document.getElementById("exportTags").value;\n\n var filterText=document.getElementById("exportFilterText").checked;\n var text=document.getElementById("exportText").value;\n\n if (!(filterStart||filterEnd||filterTags||filterText)) {\n alert("Please set the selection filter");\n document.getElementById('exportFilterPanel').style.display="block";\n return -1;\n }\n if (filterStart&&filterEnd&&(startDate>endDate)) {\n var msg="starting date/time:\sn"\n msg+=startDate.toLocaleString()+"\sn";\n msg+="is later than ending date/time:\sn"\n msg+=endDate.toLocaleString()\n alert(msg);\n return -1;\n }\n\n // scan list and select tiddlers that match all applicable criteria\n var total=0;\n var count=0;\n for (var i=0; i<theList.options.length; i++) {\n // get item, skip non-tiddler list items (section headings)\n var opt=theList.options[i]; if (opt.value=="") continue;\n // get tiddler, skip missing tiddlers (this should NOT happen)\n var tiddler=store.getTiddler(opt.value); if (!tiddler) continue; \n var sel=true;\n if ( (filterStart && tiddler.modified<startDate)\n || (filterEnd && tiddler.modified>endDate)\n || (filterTags && !matchTags(tiddler,tags))\n || (filterText && (tiddler.text.indexOf(text)==-1) && (tiddler.title.indexOf(text)==-1)))\n sel=false;\n opt.selected=sel;\n count+=sel?1:0;\n total++;\n }\n return count;\n}\n//}}}\n\n//{{{\nfunction matchTags(tiddler,cond)\n{\n if (!cond||!cond.trim().length) return false;\n\n // build a regex of all tags as a big-old regex that \n // OR's the tags together (tag1|tag2|tag3...) in length order\n var tgs = store.getTags();\n if ( tgs.length == 0 ) return results ;\n var tags = tgs.sort( function(a,b){return (a[0].length<b[0].length)-(a[0].length>b[0].length);});\n var exp = "(" + tags.join("|") + ")" ;\n exp = exp.replace( /(,[\sd]+)/g, "" ) ;\n var regex = new RegExp( exp, "ig" );\n\n // build a string such that an expression that looks like this: tag1 AND tag2 OR NOT tag3\n // turns into : /tag1/.test(...) && /tag2/.test(...) || ! /tag2/.test(...)\n cond = cond.replace( regex, "/$1\s\s|/.test(tiddlerTags)" );\n cond = cond.replace( /\ssand\ss/ig, " && " ) ;\n cond = cond.replace( /\ssor\ss/ig, " || " ) ;\n cond = cond.replace( /\ss?not\ss/ig, " ! " ) ;\n\n // if a boolean uses a tag that doesn't exist - it will get left alone \n // (we only turn existing tags into actual tests).\n // replace anything that wasn't found as a tag, AND, OR, or NOT with the string "false"\n // if the tag doesn't exist then /tag/.test(...) will always return false.\n cond = cond.replace( /(\ss|^)+[^\s/\s|&!][^\ss]*/g, "false" ) ;\n\n // make a string of the tags in the tiddler and eval the 'cond' string against that string \n // if it's TRUE then the tiddler qualifies!\n var tiddlerTags = (tiddler.tags?tiddler.tags.join("|"):"")+"|" ;\n try { if ( eval( cond ) ) return true; }\n catch( e ) { displayMessage("Error in tag filter '" + e + "'" ); }\n return false;\n}\n//}}}\n\n// // output data formatting\n// // exportHeader(format)\n//{{{\nfunction exportHeader(format)\n{\n switch (format) {\n case "TW": return exportTWHeader();\n case "DIV": return exportDIVHeader();\n case "XML": return exportXMLHeader();\n }\n}\n//}}}\n\n// // exportFooter(format)\n//{{{\nfunction exportFooter(format)\n{\n switch (format) {\n case "TW": return exportDIVFooter();\n case "DIV": return exportDIVFooter();\n case "XML": return exportXMLFooter();\n }\n}\n//}}}\n\n// // exportTWHeader()\n//{{{\nfunction exportTWHeader()\n{\n // Get the URL of the document\n var originalPath = document.location.href;\n // Check we were loaded from a file URL\n if(originalPath.substr(0,5) != "file:")\n { alert(config.messages.notFileUrlError); return; }\n // Remove any location part of the URL\n var hashPos = originalPath.indexOf("#"); if(hashPos != -1) originalPath = originalPath.substr(0,hashPos);\n // Convert to a native file format assuming\n // "file:///x:/path/path/path..." - pc local file --> "x:\spath\spath\spath..."\n // "file://///server/share/path/path/path..." - FireFox pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n // "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."\n // "file://server/share/path/path/path..." - pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n var localPath;\n if(originalPath.charAt(9) == ":") // pc local file\n localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file://///") == 0) // FireFox pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file:///") == 0) // mac/unix local file\n localPath = unescape(originalPath.substr(7));\n else if(originalPath.indexOf("file:/") == 0) // mac/unix local file\n localPath = unescape(originalPath.substr(5));\n else // pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\s\s");\n // Load the original file\n var original = loadFile(localPath);\n if(original == null)\n { alert(config.messages.cantSaveError); return; }\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 { alert(config.messages.invalidFileError.format([localPath])); return; }\n return original.substr(0,posOpeningDiv+startSaveArea.length)\n}\n//}}}\n\n// // exportDIVHeader()\n//{{{\nfunction exportDIVHeader()\n{\n var out=[];\n var now = new Date();\n var title = convertUnicodeToUTF8(wikifyPlain("SiteTitle").htmlEncode());\n var subtitle = convertUnicodeToUTF8(wikifyPlain("SiteSubtitle").htmlEncode());\n var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());\n var twver = version.major+"."+version.minor+"."+version.revision;\n var pver = version.extensions.exportTiddlers.major+"."\n +version.extensions.exportTiddlers.minor+"."+version.extensions.exportTiddlers.revision;\n out.push("<html><body>");\n out.push("<style type=\s"text/css\s">");\n out.push("#storeArea {display:block;margin:1em;}");\n out.push("#storeArea div");\n out.push("{padding:0.5em;margin:1em;border:2px solid black;height:10em;overflow:auto;}");\n out.push("#javascriptWarning");\n out.push("{width:100%;text-align:left;background-color:#eeeeee;padding:1em;}");\n out.push("</style>");\n out.push("<div id=\s"javascriptWarning\s">");\n out.push("TiddlyWiki export file<br>");\n out.push("Source"+": <b>"+convertUnicodeToUTF8(document.location.href)+"</b><br>");\n out.push("Title: <b>"+title+"</b><br>");\n out.push("Subtitle: <b>"+subtitle+"</b><br>");\n out.push("Created: <b>"+now.toLocaleString()+"</b> by <b>"+user+"</b><br>");\n out.push("TiddlyWiki "+twver+" / "+"ExportTiddlersPlugin "+pver+"<br>");\n out.push("Notes:<hr><pre>"+document.getElementById("exportNotes").value.replace(regexpNewLine,"<br>")+"</pre>");\n out.push("</div>");\n out.push("<div id=\s"storeArea\s">");\n return out;\n}\n//}}}\n\n// // exportDIVFooter()\n//{{{\nfunction exportDIVFooter()\n{\n var out=[];\n out.push("</div><!--POST-BODY-START-->\sn<!--POST-BODY-END--></body></html>");\n return out;\n}\n//}}}\n\n// // exportXMLHeader()\n//{{{\nfunction exportXMLHeader()\n{\n var out=[];\n var now = new Date();\n var u = store.getTiddlerText("SiteUrl",null);\n var title = convertUnicodeToUTF8(wikifyPlain("SiteTitle").htmlEncode());\n var subtitle = convertUnicodeToUTF8(wikifyPlain("SiteSubtitle").htmlEncode());\n var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());\n var twver = version.major+"."+version.minor+"."+version.revision;\n var pver = version.extensions.exportTiddlers.major+"."\n +version.extensions.exportTiddlers.minor+"."+version.extensions.exportTiddlers.revision;\n out.push("<" + "?xml version=\s"1.0\s"?" + ">");\n out.push("<rss version=\s"2.0\s">");\n out.push("<channel>");\n out.push("<title>" + title + "</title>");\n if(u) out.push("<link>" + convertUnicodeToUTF8(u.htmlEncode()) + "</link>");\n out.push("<description>" + subtitle + "</description>");\n out.push("<language>en-us</language>");\n out.push("<copyright>Copyright " + now.getFullYear() + " " + user + "</copyright>");\n out.push("<pubDate>" + now.toGMTString() + "</pubDate>");\n out.push("<lastBuildDate>" + now.toGMTString() + "</lastBuildDate>");\n out.push("<docs>http://blogs.law.harvard.edu/tech/rss</docs>");\n out.push("<generator>TiddlyWiki "+twver+" plus ExportTiddlersPlugin "+pver+"</generator>");\n return out;\n}\n//}}}\n\n// // exportXMLFooter()\n//{{{\nfunction exportXMLFooter()\n{\n var out=[];\n out.push("</channel></rss>");\n return out;\n}\n//}}}\n\n// // exportData()\n//{{{\nfunction exportData(theList,theFormat)\n{\n // scan export listbox and collect DIVs or XML for selected tiddler content\n var out=[];\n for (var i=0; i<theList.options.length; i++) {\n // get item, skip non-selected items and section headings\n var opt=theList.options[i]; if (!opt.selected||(opt.value=="")) continue;\n // get tiddler, skip missing tiddlers (this should NOT happen)\n var thisTiddler=store.getTiddler(opt.value); if (!thisTiddler) continue; \n if (theFormat=="TW") out.push(convertUnicodeToUTF8(thisTiddler.saveToDiv()));\n if (theFormat=="DIV") out.push(convertUnicodeToUTF8(thisTiddler.title+"\sn"+thisTiddler.saveToDiv()));\n if (theFormat=="XML") out.push(convertUnicodeToUTF8(thisTiddler.saveToRss(store.getTiddlerText("SiteUrl",""))));\n }\n return out;\n}\n//}}}\n\n// // exportTiddlers(): output selected data to local or server\n//{{{\nfunction exportTiddlers()\n{\n var theList = document.getElementById("exportList"); if (!theList) return;\n\n // get the export settings\n var theProtocol = document.getElementById("exportTo").value;\n var theFormat = document.getElementById("exportFormat").value;\n\n // assemble output: header + tiddlers + footer\n var theData=exportData(theList,theFormat);\n var count=theData.length;\n var out=[]; var txt=out.concat(exportHeader(theFormat),theData,exportFooter(theFormat)).join("\sn");\n var msg="";\n switch (theProtocol) {\n case "file:":\n var theTarget = document.getElementById("exportFilename").value.trim();\n if (!theTarget.length) msg = "A local path/filename is required\sn";\n if (!msg && saveFile(theTarget,txt))\n msg=count+" tiddler"+((count!=1)?"s":"")+" exported to local file";\n else if (!msg)\n msg+="An error occurred while saving to "+theTarget;\n break;\n case "http:":\n case "https:":\n var theTarget = document.getElementById("exportHTTPServerURL").value.trim();\n if (!theTarget.length) msg = "A server URL is required\sn";\n if (document.getElementById('exportNotify').checked)\n theTarget+="&notify="+encodeURIComponent(document.getElementById('exportNotifyTo').value);\n if (document.getElementById('exportNotes').value.trim().length)\n theTarget+="&notes="+encodeURIComponent(document.getElementById('exportNotes').value);\n if (!msg && exportPost(theTarget+encodeURIComponent(txt)))\n msg=count+" tiddler"+((count!=1)?"s":"")+" exported to "+theProtocol+" server";\n else if (!msg)\n msg+="An error occurred while saving to "+theTarget;\n break;\n case "ftp:":\n default:\n msg="Sorry, export to "+theLocation+" is not yet available";\n break;\n }\n clearMessage(); displayMessage(msg,theTarget);\n}\n//}}}\n\n// // exportPost(url): cross-domain post uses hidden iframe to submit url and capture responses\n//{{{\nfunction exportPost(url)\n{\n var f=document.getElementById("exportFrame"); if (f) document.body.removeChild(f);\n f=document.createElement("iframe"); f.id="exportFrame";\n f.style.width="0px"; f.style.height="0px"; f.style.border="0px";\n document.body.appendChild(f);\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 d.location.replace(url);\n return true;\n}\n//}}}\n\n// // promptForFilename(msg,path,file) uses platform/browser specific functions to get local filespec\n//{{{\nfunction promptForExportFilename(here)\n{\n var msg=here.title; // use tooltip as dialog box message\n var path=getLocalPath(document.location.href);\n var slashpos=path.lastIndexOf("/"); if (slashpos==-1) slashpos=path.lastIndexOf("\s\s"); \n if (slashpos!=-1) path = path.substr(0,slashpos+1); // remove filename from path, leave the trailing slash\n var file=config.macros.exportTiddlers.newdefault;\n var result="";\n if(window.Components) { // moz\n try {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');\n var nsIFilePicker = window.Components.interfaces.nsIFilePicker;\n var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);\n picker.init(window, msg, nsIFilePicker.modeSave);\n var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);\n thispath.initWithPath(path);\n picker.displayDirectory=thispath;\n picker.defaultExtension='html';\n picker.defaultString=file;\n picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);\n if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;\n }\n catch(e) { alert('error during local file access: '+e.toString()) }\n }\n else { // IE\n try { // XP only\n var s = new ActiveXObject('UserAccounts.CommonDialog');\n s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';\n s.FilterIndex=3; // default to HTML files;\n s.InitialDir=path;\n s.FileName=file;\n if (s.showOpen()) var result=s.FileName;\n }\n catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE\n }\n return result;\n}\n//}}}
[[Generation of ultrahigh peak power pulses by chirped pulse amplification|http://heliotrope.ucsd.edu/Repository.Papers/mourou_chirp-pulse.pdf]]\n!Abstract:\nSingle picosecond pulses have been amplified to the terawatt level by a table-top-size Nd:glass amplifier by using the technique of chirped pulse amplification (CPA). The divergence of the beam is twice the diffraction limit, making the brightness of this source equal to $~2×10^{18}$ W/(cm-sr), which is thought to be the highest brightness yet reported. The CPA technique allows the efficient energy extraction from extremely compact amplifier systems. Amplification of chirped pulses over nine orders of magnitude, i.e. from nanojoule to the joule level, has been demonstrated.\n
To get started with this blank nodelink:: , you'll need to modify the following nodes:\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 nodes that you want to appear when the nodelink:: is opened\nYou'll also need to enter your username for signing your edits: <<option txtUserName>>
/***\n|Name|HTMLFormattingPlugin|\n|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|\n|Version|2.1.4|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides|'HTML' formatter|\n|Description|Use wiki syntax formatting inside of HTML content|\n\nThe shorthand Wiki-style formatting syntax of ~TiddlyWiki is very convenient and enables most content to be reasonably well presented. However, there are times when tried-and-true HTML formatting syntax allows more more precise control of the content display.\n\nWhen HTML formatting syntax is embedded within a tiddler (in between {{{<}}}{{{html>}}} and {{{<}}}{{{/html>}}} markers) TiddlyWiki passes this content to the browser for processing as 'native' HTML. However, TiddlyWiki does not also process the HTML source content for any embedded wiki-formatting syntax it may contain. This means that while you can use HTML formatted content, you cannot mix wiki-formatted content within the HTML formatting.\n!!!!!Usage\n<<<\nThe ~HTMLFormatting plugin allows you to freely ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.\n\nWhen a tiddler is about to be displayed, ~TiddlyWiki looks for tiddler content contained within ''<{{{html}}}>'' and ''<{{{/html}}}>'' HTML tags. This content (if any) is passed directly to the browser's internal "rendering engine" to process as ~HTML-formatted content. Once the HTML formatting has been processed, all the pieces of text occuring in between the HTML formatting are then processed by the ~TiddlyWiki rendering engine, one piece at a time, so that normal wiki-style formatting can be applied to the individual text pieces.\n<<<\n!!!!!Line breaks\n<<<\nOne major difference between Wiki formatting and HTML formatting is how "line breaks" are processed. Wiki formatting treats all line breaks as literal content to be displayed //as-is//. However, because HTML normally ignores line breaks and actually processes them as simple "word separators" instead, many people who write HTML include extra line breaks in their documents, just to make the "source code" easier to read.\n\nEven though you can use HTML tags within your tiddler content, the default treatment for line breaks still follows the Wiki-style rule (i.e., all new lines are displayed as-is). When adding HTML content to a tiddler (especially if you cut-and-paste it from another web page), you should take care to avoid adding extra line breaks to the text.\n\nIf removing all the extra line breaks from your HTML content would be a big hassle, you can quickly //override the default Wiki-style line break rule// so that the line breaks use the standard HTML rules instead. Placing a ''<{{{hide linebreaks}}}>'' tag within the tiddler's HTML content changes all line breaks to spaces before rendering the content, so that the literal line breaks will be processed as simple word-breaks instead.\n\nNote: this does //not// alter the actual tiddler content that is stored in the document, just the manner in which it is displayed. Any line breaks contained in the tiddler will still be there when you edit its content. Also, to include a literal line break when the ''<{{{hide linebreaks}}}>'' tag is present, you will need to use a ''<{{{br}}}>'' or ''<{{{p}}}>'' HTML tag instead of simply typing a line break.\n<<<\n!!!!!How it works\n<<<\nThe TW core support for HTML does not let you put ANY wiki-style syntax (including TW macros) *inside* the {{{<html>...</html>}}} block. Everything between {{{<html>}}} and {{{</html>}}} is handed to the browser for processing and that is it. Fortunately, this plugin ADDS the ability to let you put wiki-syntax (including macros) inside the html. It does this by first giving the tiddler source content to the browser to process the HTML, and then handling any wiki-based syntax that remains afterward.\n\nHowever, not all wiki syntax can be safely passed through the browser's parser. Specifically, any TW macros inside the HTML will get 'eaten' by the browser since the macro brackets, {{{<<...>>}}} use the "<" and ">" that normally delimit the HTML/XML syntax recognized by the browser's parser.\n\nSimilarly, you can't use InlineJavascript within the HTML because the {{{<script>...</script>}}} syntax will also be consumed by the browser and there will be nothing left to process afterward. Note: unfortunately, even though the browser removes the {{{<script>...</script>}}} sequence, it doesn't actually execute the embedded javascript code that it removes, so any scripts contained inside of <html> blocks in TW are currently being ignored. :-(\n\nAs a work-around to allow TW *macros* (but not inline scripts) to exist inside of <html> formatted blocks of content, the plugin first converts the {{{<<}}} and {{{>>}}} into "%%(" and ")%%", making them "indigestible" so they can pass unchanged through the belly of the beast (the browser's HTML parser).\n\nAfter the browser has done its job, the wiki syntax sequences (including the "undigested" macros) are contained in #text nodes in the browser-generated DOM elements. The plugin then recursively locates and processes each #text node, converts the %%( and )%% back into {{{<<}}} and {{{>>}}}, passes the result to wikify() for further rendering of the wiki-formatted syntax into a containing SPAN that replaces the previous #text node. At the end of this process, none of the encoded %%( and )%% sequences remain in the rendered tiddler output.\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''HTMLFormattingPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for HTMLFormatting handling^^\n<<<\n!!!!!Revision History\n<<<\n''2006.09.10 [2.1.4]'' update formatter for 2.1 compatibility (use this.lookaheadRegExp instead of temp variable)\n''2006.05.28 [2.1.3]'' in wikifyTextNodes(), decode the *value* of TEXTAREA nodes, but don't wikify() its children. (thanks to "ayj" for bug report)\n''2006.02.19 [2.1.2]'' in wikifyTextNodes(), put SPAN element into tiddler DOM (replacing text node), BEFORE wikifying the text content. This ensures that the 'place' passed to any macros is correctly defined when the macro is evaluated, so that calls to story.findContainingTiddler(place) will work as expected. (Thanks for bug report from GeoffSlocock)\n''2006.02.05 [2.1.1]'' wrapped wikifier hijack in init function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals\n''2005.12.01 [2.1.0]'' don't wikify #TEXT nodes inside SELECT and TEXTAREA elements\n''2005.11.06 [2.0.1]'' code cleanup\n''2005.10.31 [2.0.0]'' replaced hijack wikify() with hijack config.formatters["html"] and simplified recursive WikifyTextNodes() code\n''2005.10.09 [1.0.2]'' combined documentation and code into a single tiddler\n''2005.08.05 [1.0.1]'' moved HTML and CSS definitions into plugin code instead of using separate tiddlers\n''2005.07.26 [1.0.1]'' Re-released as a plugin. Added <{{{html}}}>...</{{{nohtml}}}> and <{{{hide newlines}}}> handling\n''2005.07.20 [1.0.0]'' Initial Release (as code adaptation)\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.HTMLFormatting = {major: 2, minor: 1, revision: 4, date: new Date(2006,9,10)};\n\n// find the formatter for HTML and replace the handler\ninitHTMLFormatter();\nfunction initHTMLFormatter()\n{\n for (var i=0; i<config.formatters.length && config.formatters[i].name!="html"; i++);\n if (i<config.formatters.length) config.formatters[i].handler=function(w) {\n if (!this.lookaheadRegExp) // fixup for TW2.0.x\n this.lookaheadRegExp = new RegExp(this.lookahead,"mg");\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n var html=lookaheadMatch[1];\n // optionally suppress wiki-style literal handling of newlines\n // strip any carriage returns added by Internet Explorer's textarea edit field\n // encode newlines as \sn so Internet Explorer's HTML parser won't eat them\n // encode macro brackets (<< and >>) so HTML parser won't eat them\n if (html.indexOf('<hide linebreaks>')!=-1) html=html.replace(regexpNewLine,' ');\n html=html.replace(regexpCarriageReturn,'');\n html=html.replace(regexpNewLine,'\s\sn');\n html=html.replace(/<</g,'%%(').replace(/>>/g,')%%');\n // create span to hold HTML\n // parse HTML and normalize the results\n // walk node tree and call wikify() on each text node\n var e = createTiddlyElement(w.output,"span");\n e.innerHTML=html;\n e.normalize(); \n wikifyTextNodes(e);\n // advance to next parse position\n w.nextMatch = this.lookaheadRegExp.lastIndex;\n }\n }\n}\n\n// wikify text nodes remaining after HTML content is processed (pre-order recursion)\nfunction wikifyTextNodes(theNode)\n{\n // textarea node doesn't get wikified, just decoded... \n if (theNode.nodeName.toLowerCase()=='textarea')\n theNode.value=theNode.value.replace(/\s%%\s(/g,'<<').replace(/\s)\s%%/g,'>>').replace(regexpBackSlashEn,'\sn');\n else for (var i=0;i<theNode.childNodes.length;i++) {\n var theChild=theNode.childNodes.item(i);\n if (theChild.nodeName.toLowerCase()=='option') continue;\n if (theChild.nodeName.toLowerCase()=='select') continue;\n wikifyTextNodes(theChild);\n if (theChild.nodeName=='#text') {\n var txt=theChild.nodeValue;\n // decode macro brackets and newlines\n txt=txt.replace(/\s%%\s(/g,'<<').replace(/\s)\s%%/g,'>>').replace(regexpBackSlashEn,'\sn');\n // replace text node with wikified() span\n var newNode=createTiddlyElement(null,"span");\n theNode.replaceChild(newNode,theChild);\n wikify(txt,newNode);\n }\n }\n}\n//}}}
[[High Power Ultrafast Lasers|http://heliotrope.ucsd.edu/Repository.Papers/2.rev.sci.inst_backus_ultrafast_1998.pdf]]\n!Abstract:\nIn this article, we review progress in the development of high peak-power ultrafast lasers, and\ndiscuss in detail the design issues which determine the performance of these systems. Presently,\nlasers capable of generating terawatt peak powers with unprecedented short pulse duration can now\nbe built on a single optical table in a small-scale laboratory, while large-scale lasers can generate\npeak power of over a petawatt. This progress is made possible by the use of the chirped-pulse\namplification technique, combined with the use of broad-bandwidth laser materials such as\nTi:sapphire, and the development of techniques for generating and propagating very short ~10–30\nfs! duration light pulses. We also briefly summarize some of the new scientific advances made\npossible by this technology, such as the generation of coherent femtosecond x-ray pulses, and the\ngeneration of mev-energy electron beams and high-energy ions.\n\n
If you are interested in becoming a contributing member, please send me an email and I will get you a password and login. Then, you can follow the direction in [[ContributorUpload]]. If you are already a contributor, then you can head directly to the content.\n\nTo add comments to things rather than edit where there is no comment window:\n\nGo to [[CommentScript]]\nCopy the contents.\nPaste them into the node you wish to comment.\nAdd comments!
To upload a TiddlyWiki on your web server:\n#Import all tiddlers tagged with Upload from http://TiddlyWiki.bidix.info/#Upload\n#Install UploadPlugin as explain in [[InstallingPlugins|http://www.tiddlywiki.com/#InstallingPlugins]]\n#Install an UploadService on your web server by configuring one of this scripts [[store.php]] or [[store.cgi]]\n#set an {{{<<upload>>}}} button for example in your SideBarOptions\n#Set UploadOptions in conformity with your UploadService\n#click on <<upload>> button\n
<<importTiddlers inline>>\n\n@@color(red):papers@@\n<<loadTiddlers "label:load papers from %0" "prompt:ready?" "tag:papers" file:///F:/nodelink/nodelink.html>>\n\n@@color(red):heliolinkExport@@\n<<loadTiddlers "label:load export files from %0" "prompt:ready?" "tag:heliolinkExport" file:///F:/nodelink/nodelink.html>>
/***\n|Name|ImportTiddlersPlugin|\n|Source|http://www.TiddlyTools.com/#ImportTiddlersPlugin|\n|Version|3.2.1|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides|config.macros.importTiddlers.handler|\n|Description|interactive controls for import/export with filtering. Also provides macro for automated updates or one-click installations of tiddlers from remote sources|\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. It can also be very extremely helpful 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\nThis plugin lets you selectively combine tiddlers from any two TiddlyWiki documents. An interactive control panel lets you pick a document to import from, and then select which tiddlers to import, with prompting for skip, rename, merge or replace actions when importing tiddlers that match existing titles. Automatically add tags to imported tiddlers so they are easy to find later on. Generates a detailed report of import 'history' in ImportedTiddlers.\n!!!!!Interactive interface\n<<<\n{{{<<importTiddlers>>}}} or {{{<<importTiddlers core>>}}}\ninvokes the built-in importTiddlers macro (TW2.1.x+). If installed in documents using TW2.0.x or earlier, fallback is to use 'link' display (see below)\n\n{{{<<importTiddlers link>>}}}\ncreates "import tiddlers" link that when clicked to show/hide import control panel\n\n{{{<<importTiddlers inline>>}}}\ncreates import control panel directly in tiddler content\n\n<<importTiddlers inline>>\n\nPress ''[browse]'' to select a TiddlyWiki document file to import, and then press ''[open]''. Alternatively, you can type in the path/filename or a remote document URL (starting with http://). When you have entered the desired source location, press ''[load]'' to retrieve the tiddlers from the remote source. //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!!!!!non-interactive 'load tiddlers' macro\n<<<\nUseful for automated installation/update of plugins and other tiddler content.\n\n{{{<<loadTiddlers "label:load tiddlers from %0" http://www.tiddlytools.com/example.html confirm>>}}}\n<<loadTiddlers "label:load tiddlers from %0" http://www.tiddlytools.com/example.html confirm>>\n\nSyntax:\n{{{<<loadTiddlers label:text prompt:text filter source quiet confirm tag tag tag...>>}}}\n\n''label:text'' and ''prompt:text''\n>defines link text and tooltip (prompt) that can be clicked to trigger the load tiddler processing. If a label is NOT provided, then no link is created and the loadTiddlers function is performed whenever the containing tiddler is rendered.\n''filter'' (optional) determines which tiddlers will be automatically selected for importing. Use one of the following keywords:\n>''"all"'' retrieves ALL tiddlers from the import source document, even if they have not been changed.\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>''"tiddler:~TiddlerName"'' retrieves only the specific tiddler named in the parameter.\n>''"tag:text"'' retrieves only the tiddlers tagged with the indicated text.\n>> Note: ''if an existing tiddler is tagged with 'noReload', then it will not be overwritten'', even if the inbound tiddler has been selected by the filtering process. This allows you to make local changes to imported tiddlers while ensuring that those changes won't be lost due to automatic tiddler updates retrieved from the import source document.\n''source'' (required) is the location of the imported document. It can be either a local document path/filename in whatever format your system requires, or a remote web location (starting with "http://" or "https://")\n>use the keyword ''ask'' to prompt for a source location whenever the macro is invoked\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''"confirm"'' (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''"tag tag tag..."'' (optional)\n>any remaining parameters are used as tag values to be added to each imported tiddler (i.e., "tag-on-import")\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''2007.02.24 [3.2.1]'' re-labeled control panel "open" button to "load" to avoid confusion with "open" button in system-provided Browse... dialog. (i.e., "browse, open, open" becomes "browse, open, load")\n''2007.02.09 [3.2.0]'' loadTiddlers: added support for "noReload" tag (prevents overwriting existing tiddler, even if inbound tiddler is newer)\n''2007.02.08 [3.1.3]'' loadTiddlers: added missing code and documentation for "newTags" handling (a feature change from long, long ago that somehow got lost!)\n''2006.11.14 [3.1.2]'' fix macro handler parameter declaration (double-pasted param list corrupts IE)\n''2006.11.13 [3.1.1]'' use apply() method to invoke hijacked core handler\n''2006.11.13 [3.1.0]'' hijack TW2.1 built-in importTiddlers.handler() so it can co-exist with the plugin interface 'panel'. Use macro without params (or use 'core' keyword) to display built-in core interface. Use new "link" param to embed "import tiddlers" link that shows floating panel when clicked. Renamed a few plugin utility functions so they don't collide with core internal functions. More code restructuring to come.\n''2006.10.12 [3.0.8]'' in readTiddlersFromHTML(), fallback to find end of store area by matching "/body" when POST-BODY-START is not present (backward compatibility for older documents)\n''2006.09.10 [3.0.7]'' in readTiddlersFromHTML(), find end of store area by matching "POST-BODY-START" instead of "/body" \n''2006.08.16 [3.0.6]'' Use higher-level store.saveTiddler() instead of store.addTiddler() to avoid conflicts with ZW and other adaptations that hijack low-level tiddler handling. Also, in CreateImportPanel(), no longer register notify to "refresh listbox after every tiddler change" (left over from old 'auto-filtered' list handling). Thanks to Bob McElrath for report/solution.\n''2006.07.29 [3.0.5]'' added noChangeMsg to loadTiddlers processing. if not 'quiet' mode, reports skipped tiddlers.\n''2006.04.18 [3.0.4]'' in loadTiddlers.handler, fixed parsing of "prompt:" param. Also, corrected parameters mismatch in loadTiddlers() callback function definition (order of params was wrong, resulting in filters NOT being applied)\n''2006.04.12 [3.0.3]'' moved many display messages to macro properties for easier L10N translations via 'lingo' definitions.\n''2006.04.12 [3.0.2]'' additional refactoring of 'core candidate' code. Proposed API now defines "loadRemoteFile()" for XMLHttpRequest processing with built in fallback for handling local filesystem access, and readTiddlersFromHTML() to process the resulting source HTML content.\n''2006.04.04 [3.0.1]'' in refreshImportList(), when using [by tags], tiddlers without tags are now included in a new "untagged" psuedo-tag list section\n''2006.04.04 [3.0.0]'' Separate non-interactive {{{<<importTiddlers...>>}}} macro functionality for incorporation into TW2.1 core and renamed as {{{<<loadTiddlers>>}}} macro. New parameters for loadTiddlers: ''label:text'' and ''prompt:text'' for link creation, ''ask'' for filename/URL, ''tag:text'' for filtering, "confirm" for accept/reject of individual inbound tiddlers. Also, ImportedTiddlers report generator output has been simplified and "importReplace/importPublic" tags and associated "force" param (which were rarely, if ever, used) has been dropped.\n''2006.03.30 [2.9.1]'' when extracting store area from remote URL, look for "</body>" instead of "</body>\sn</html>" so it will match even if the "\sn" is absent from the source.\n''2006.03.30 [2.9.0]'' added optional 'force' macro param. When present, autoImportTiddlers() bypasses the checks for importPublic and importReplace. Based on a request from Tom Otvos.\n''2006.03.28 [2.8.1]'' in loadImportFile(), added checks to see if 'netscape' and 'x.overrideMimeType()' are defined (IE does *not* define these values, so we bypass this code)\nAlso, when extracting store area from remote URL, explicitly look for "</body>\sn</html>" to exclude any extra content that may have been added to the end of the file by hosting environments such as GeoCities. Thanks to Tom Otvos for finding these bugs and suggesting some fixes.\n''2006.02.21 [2.8.0]'' added support for "tiddler:TiddlerName" filtering parameter in auto-import processing\n''2006.02.21 [2.7.1]'' Clean up layout problems with IE. (Use tables for alignment instead of SPANs styled with float:left and float:right)\n''2006.02.21 [2.7.0]'' Added "local file" and "web server" radio buttons for selecting dynamic import source controls in ImportPanel. Default file control is replaced with URL text input field when "web server" is selected. Default remote document URL is defined in SiteURL tiddler. Also, added option for prepending SiteProxy URL as prefix to remote URL to mask cross-domain document access (requires compatible server-side script)\n''2006.02.17 [2.6.0]'' Removed "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]'' added 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]'' FF1501 corrected unintended global 't' (loop index) in importReport() and autoImportTiddlers()\n''2006.02.10 [2.5.2]'' corrected unintended global variable in importReport().\n''2006.02.05 [2.5.1]'' moved globals from window.* to config.macros.importTiddlers.* to avoid FireFox 1.5.0.1 crash bug when referencing globals\n''2006.01.18 [2.5.0]'' added 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]'' added "importPublic" tag and inverted default so that auto sharing is NOT done unless tagged with importPublic\n''2006.01.15 [2.4.0]'' Added 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]'' Added "ask" parameter to confirm each tiddler before importing (for use with auto-importing)\n''2006.01.15 [2.3.1]'' Strip 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]'' Reorganized 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]'' Added "[by tags]" to list of tiddlers, based on code submitted by BradleyMeck\n''2006.01.09 [2.1.1]'' When 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]'' IMPORT 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]'' When 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]'' When "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]'' Update 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]'' tweak formatting in importReport() and add 'discard report' link to output\n''2005.12.03 [1.3.0]'' Dynamically 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]'' fixed formatting of 'detail info' in importReport()\n''2005.11.11 [1.2.0]'' added 'inline' param to embed controls in a tiddler\n''2005.11.09 [1.1.0]'' only 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]'' fixed typo in importReport() that prevented reports from being generated\n''2005.10.09 [1.0.4]'' combined documentation with plugin code instead of using separate tiddlers\n''2005.08.05 [1.0.3]'' moved CSS and HTML definitions into plugin code instead of using separate tiddlers\n''2005.07.27 [1.0.2]'' core update 1.2.29: custom overlayStyleSheet() replaced with new core setStylesheet()\n''2005.07.23 [1.0.1]'' added parameter checks and corrected addNotification() usage\n''2005.07.20 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n// // ''MACRO DEFINITION''\n//{{{\n// Version\nversion.extensions.importTiddlers = {major: 3, minor: 2, revision: 1, date: new Date(2007,02,24)};\n\n// IE needs explicit global scoping for functions/vars called from browser events\nwindow.onClickImportButton=onClickImportButton;\nwindow.refreshImportList=refreshImportList;\n\n// default cookie/option values\nif (!config.options.chkImportReport) config.options.chkImportReport=true;\n\n// fixups for TW2.0.x and earlier\nif (window.merge==undefined) window.merge=function(dst,src,preserveExisting)\n { for (p in src) if (!preserveExisting||dst[p]===undefined) dst[p]=src[p]; return dst; }\nif (config.macros.importTiddlers==undefined) config.macros.importTiddlers={ };\n\nmerge(config.macros.importTiddlers,{\n label: "import tiddlers",\n prompt: "Copy tiddlers from another document",\n foundMsg: "Found %0 tiddlers in %1",\n countMsg: "%0 tiddlers selected for import",\n importedMsg: "Imported %0 of %1 tiddlers from %2",\n src: "", // path/filename or URL of document to import (retrieved from SiteUrl tiddler)\n proxy: "", // URL for remote proxy script (retrieved from SiteProxy tiddler)\n useProxy: false, // use specific proxy script in front of remote URL\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\nif (config.macros.importTiddlers.coreHandler==undefined)\n config.macros.importTiddlers.coreHandler=config.macros.importTiddlers.handler; // save built-in handler\n\nconfig.macros.importTiddlers.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n if (!params[0] || params[0].toLowerCase()=='core') { // default to built in\n if (config.macros.importTiddlers.coreHandler)\n config.macros.importTiddlers.coreHandler.apply(this,arguments);\n else \n createTiddlyButton(place,this.label,this.prompt,onClickImportMenu);\n }\n else if (params[0]=='link') // show link to floating panel\n createTiddlyButton(place,this.label,this.prompt,onClickImportMenu);\n else if (params[0]=='inline') {// show panel as INLINE tiddler content\n createImportPanel(place);\n document.getElementById("importPanel").style.position="static";\n document.getElementById("importPanel").style.display="block";\n }\n else config.macros.loadTiddlers.handler(place,macroName,params); // any other params: loadtiddlers\n}\n//}}}\n\n// // ''INTERFACE DEFINITION''\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 = panel.style.display=="block";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n panel.style.display = 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\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 refreshImportList();\n var siteURL=store.getTiddlerText("SiteUrl"); if (!siteURL) siteURL="";\n document.getElementById("importSourceURL").value=siteURL;\n config.macros.importTiddlers.src=siteURL;\n var siteProxy=store.getTiddlerText("SiteProxy"); if (!siteProxy) siteProxy="SiteProxy";\n document.getElementById("importSiteProxy").value=siteProxy;\n config.macros.importTiddlers.proxy=siteProxy;\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 background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\s\n padding: 0.5em; margin:0em; -moz-border-radius:1em;\s\n}\s\n#importPanel a, #importPanel td a { color:#009; display:inline; margin:0px; padding:1px; }\s\n#importPanel table { width:100%; border:0px; padding:0px; margin:0px; font-size:8pt; line-height:110%; background:transparent; }\s\n#importPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }\s\n#importPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }\s\n#importPanel select { width:98%;margin:0px;font-size:8pt;line-height:110%;}\s\n#importPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%}\s\n#importPanel .box { border:1px solid black; padding:3px; margin-bottom:5px; background:#f8f8f8; -moz-border-radius:5px;}\s\n#importPanel .topline { border-top:2px solid black; padding-top:3px; margin-bottom:5px; }\s\n#importPanel .rad { width:auto; }\s\n#importPanel .chk { width:auto; margin:1px;border:0; }\s\n#importPanel .btn { width:auto; }\s\n#importPanel .btn1 { width:98%; }\s\n#importPanel .btn2 { width:48%; }\s\n#importPanel .btn3 { width:32%; }\s\n#importPanel .btn4 { width:24%; }\s\n#importPanel .btn5 { width:19%; }\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#importCollisionPanel { display:none; margin:0.5em 0em 0em 0em; }\s\n';\n//}}}\n\n// // HTML \n//{{{\nconfig.macros.importTiddlers.html = '\s\n<!-- source and report -->\s\n<table><tr><td align=left>\s\n import from\s\n <input type="radio" class="rad" name="importFrom" value="file" CHECKED\s\n onClick="document.getElementById(\s'importLocalPanel\s').style.display=this.checked?\s'block\s':\s'none\s';\s\n document.getElementById(\s'importHTTPPanel\s').style.display=!this.checked?\s'block\s':\s'none\s'"> local file\s\n <input type="radio" class="rad" name="importFrom" value="http"\s\n onClick="document.getElementById(\s'importLocalPanel\s').style.display=!this.checked?\s'block\s':\s'none\s';\s\n document.getElementById(\s'importHTTPPanel\s').style.display=this.checked?\s'block\s':\s'none\s'"> web server\s\n</td><td align=right>\s\n <input type=checkbox class="chk" id="chkImportReport" checked\s\n onClick="config.options[\s'chkImportReport\s']=this.checked;"> create a report\s\n</td></tr></table>\s\n<!-- import from local file -->\s\n<div id="importLocalPanel" style="display:block;margin-bottom:5px;margin-top:5px;padding-top:3px;border-top:1px solid #999">\s\nlocal document path/filename:<br>\s\n<input type="file" id="fileImportSource" size=57 style="width:100%"\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;">\s\n</div><!--panel-->\s\n\s\n<!-- import from http server -->\s\n<div id="importHTTPPanel" style="display:none;margin-bottom:5px;margin-top:5px;padding-top:3px;border-top:1px solid #999">\s\n<table><tr><td align=left>\s\n remote document URL:<br>\s\n</td><td align=right>\s\n <input type="checkbox" class="chk" id="importUseProxy"\s\n onClick="config.macros.importTiddlers.useProxy=this.checked;\s\n document.getElementById(\s'importSiteProxy\s').style.display=this.checked?\s'block\s':\s'none\s'"> use a proxy script\s\n</td></tr></table>\s\n<input type="text" id="importSiteProxy" style="display:none;margin-bottom:1px" onfocus="this.select()" value="SiteProxy"\s\n onKeyUp="config.macros.importTiddlers.proxy=this.value"\s\n onChange="config.macros.importTiddlers.proxy=this.value;">\s\n<input type="text" id="importSourceURL" onfocus="this.select()" value="SiteUrl"\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;">\s\n</div><!--panel-->\s\n\s\n<table><tr><td align=left>\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</td><td align=right>\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</td></tr></table>\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 class="chk" id="chkAddTags" checked\s\n onClick="config.macros.importTiddlers.addTags=this.checked;">add new tags &nbsp;\s\n<input type=checkbox class="chk" id="chkImportTags" checked\s\n onClick="config.macros.importTiddlers.importTags=this.checked;">import source tags &nbsp;\s\n<input type=checkbox class="chk" id="chkKeepTags" checked\s\n onClick="config.macros.importTiddlers.keepTags=this.checked;">keep existing tags<br>\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="importLoad" class="importButton" style="width:32%" value="load"\s\n title="load listbox with tiddlers from source document"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importStart" class="importButton" style="width:32%" value="import"\s\n title="add selected source tiddlers to the current document"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importClose" class="importButton" style="width:32%" value="close"\s\n title="clear listbox or close control panel"\s\n onclick="onClickImportButton(this)">\s\n</div>\s\n<div id="importCollisionPanel">\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 title="do not import this tiddler"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importRename" class="importButton" style="width:23%" value="rename"\s\n title="rename the incoming tiddler"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importMerge" class="importButton" style="width:23%" value="merge"\s\n title="append the incoming tiddler to the existing tiddler"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importReplace" class="importButton" style="width:23%" value="replace"\s\n title="discard the existing tiddler"\s\n onclick="onClickImportButton(this)">\s\n </div>\s\n</div>\s\n';\n//}}}\n\n// // Control interactions\n//{{{\nfunction onClickImportButton(which)\n{\n // DEBUG alert(which.id);\n var theList = document.getElementById('importList');\n if (!theList) return;\n var thePanel = document.getElementById('importPanel');\n var theCollisionPanel = document.getElementById('importCollisionPanel');\n var theNewTitle = document.getElementById('importNewTitle');\n var count=0;\n switch (which.id)\n {\n case 'fileImportSource':\n case 'importLoad': // 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 config.macros.importTiddlers.loadRemoteFile(config.macros.importTiddlers.src, function(src,txt) {\n var tiddlers = readTiddlersFromHTML(txt);\n var count=tiddlers?tiddlers.length:0;\n displayMessage(config.macros.importTiddlers.foundMsg.format([count,src]));\n config.macros.importTiddlers.inbound=tiddlers;\n window.refreshImportList(0);\n });\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) { thePanel.style.display='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 theCollisionPanel.style.display='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 theCollisionPanel.style.display='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: ';\n theText +='[['+config.macros.importTiddlers.src+'#'+theItem.value+'|'+config.macros.importTiddlers.src+'#'+theItem.value+']]^^\sn';\n theText +='^^'+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 0hh:0mm:0ss");\n theImported.status += ' by '+theExisting.modifier;\n theCollisionPanel.style.display='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 0hh:0mm:0ss");\n theImported.status += ' by '+theExisting.modifier;\n theCollisionPanel.style.display='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// // 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 if (!tags || !tags.length) {\n if (theTitles["untagged"]==undefined) { theTags.push("untagged"); theTitles["untagged"]=new Array(); }\n theTitles["untagged"].push(title);\n }\n else 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// // 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 inbound = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(inbound.title);\n // avoid redundant import for tiddlers that are listed multiple times (when 'by tags')\n if (inbound.status=="added")\n continue;\n // don't import the "ImportedTiddlers" history from the other document...\n if (inbound.title=='ImportedTiddlers')\n continue;\n // if tiddler exists and import not marked for replace or merge, stop importing\n if (theExisting && (inbound.status.substr(0,7)!="replace") && (inbound.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+=inbound.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 inbound.set(null,null,null,null,newTags.trim());\n // set the status to 'added' (if not already set by the 'ask the user' UI)\n inbound.status=(inbound.status=="")?'added':inbound.status;\n // do the import!\n // OLD: store.addTiddler(in); store.setDirty(true);\n store.saveTiddler(inbound.title, inbound.title, inbound.text, inbound.modifier, inbound.modified, inbound.tags);\n store.fetchTiddler(inbound.title).created = inbound.created; // force creation date to imported value\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 collision panel and set the title edit field\n document.getElementById('importCollisionPanel').style.display='block';\n theNewTitle.value=theList.options[config.macros.importTiddlers.index].value;\n }\n}\n//}}}\n\n// // ''REPORT GENERATOR''\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 collision panel will still be open... close it now.\n var panel=document.getElementById('importCollisionPanel'); if (panel) panel.style.display='none';\n\n // get the alphasorted list of tiddlers\n var tiddlers = config.macros.importTiddlers.inbound;\n // gather the statistics\n var count=0;\n for (var t=0; t<tiddlers.length; t++)\n if (tiddlers[t].status && tiddlers[t].status.trim().length && tiddlers[t].status.substr(0,7)!="skipped") count++;\n\n // generate a report\n if (count && config.options.chkImportReport) {\n // get/create the report tiddler\n var theReport = store.getTiddler('ImportedTiddlers');\n if (!theReport) { theReport= new Tiddler(); theReport.title = 'ImportedTiddlers'; theReport.text = ""; }\n // format the report content\n var now = new Date();\n var newText = "On "+now.toLocaleString()+", "+config.options.txtUserName\n newText +=" imported "+count+" tiddler"+(count==1?"":"s")+" from\sn[["+config.macros.importTiddlers.src+"|"+config.macros.importTiddlers.src+"]]:\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 newText += "<<<\sn";\n for (var t=0; t<tiddlers.length; t++) if (tiddlers[t].status) newText += "#[["+tiddlers[t].title+"]] - "+tiddlers[t].status+"\sn";\n newText += "<<<\sn";\n// 20060918 ELS: DON'T ADD "discard" BUTTON TO REPORT\n// newText += "<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n// newText += "onclick=\s"story.closeTiddler('"+theReport.title+"'); store.deleteTiddler('"+theReport.title+"');\s" ";\n// newText += "value=\s"discard report\s"></html>";\n // update the ImportedTiddlers content and show the tiddler\n theReport.text = newText+((theReport.text!="")?'\sn----\sn':"")+theReport.text;\n theReport.modifier = config.options.txtUserName;\n theReport.modified = new Date();\n // OLD: store.addTiddler(theReport);\n store.saveTiddler(theReport.title, theReport.title, theReport.text, theReport.modifier, theReport.modified, theReport.tags);\n if (!quiet) { story.displayTiddler(null,theReport.title,1,null,null,false); story.refreshTiddler(theReport.title,1,true); }\n }\n\n // reset status flags\n for (var t=0; t<config.macros.importTiddlers.inbound.length; t++) config.macros.importTiddlers.inbound[t].status="";\n\n // refresh display if tiddlers have been loaded\n if (count) { store.setDirty(true); store.notifyAll(); }\n\n // always show final message when tiddlers were actually loaded\n if (count) displayMessage(config.macros.importTiddlers.importedMsg.format([count,tiddlers.length,config.macros.importTiddlers.src]));\n}\n//}}}\n\n/***\n!!!!! non-interactive 'load tiddlers' macro\n***/\n//{{{\n// default cookie/option values\nif (!config.options.chkImportReport) config.options.chkImportReport=true;\n\nconfig.macros.loadTiddlers = {\n label: "",\n prompt: "add/update tiddlers from '%0'",\n lockedTag: "noReload", // if existing tiddler has this tag value, don't overwrite it, even if inbound tiddler is newer\n askMsg: "Please enter a local path/filename or a remote URL",\n openMsg: "Opening %0",\n openErrMsg: "Could not open %0 - error=%1",\n readMsg: "Read %0 bytes from %1",\n foundMsg: "Found %0 tiddlers in %1",\n nochangeMsg: "'%0' is up-to-date... skipped.",\n lockedMsg: "'%0' is tagged '%1'... skipped.",\n skippedMsg: "skipped (cancelled by user)",\n loadedMsg: "Loaded %0 of %1 tiddlers from %2",\n newTags: []\n};\n\nconfig.macros.loadTiddlers.handler = function(place,macroName,params) {\n var label=(params[0] && params[0].substr(0,6)=='label:')?params.shift().substr(6):this.label;\n var prompt=(params[0] && params[0].substr(0,7)=='prompt:')?params.shift().substr(7):this.prompt;\n var filter="updates";\n if (params[0] && (params[0]=='all' || params[0]=='new' || params[0]=='changes' || params[0]=='updates'\n || params[0].substr(0,8)=='tiddler:' || params[0].substr(0,4)=='tag:'))\n filter=params.shift();\n var src=params.shift(); if (!src || !src.length) return; // filename is required\n var quiet=(params[0]=="quiet"); if (quiet) params.shift();\n var ask=(params[0]=="confirm"); if (ask) params.shift();\n var force=(params[0]=="force"); if (force) params.shift();\n if (params[0]) this.newTags=params; // any remaining params are used as "autotags"\n if (label.trim().length) {\n // link triggers load tiddlers from another file/URL and then applies filtering rules to add/replace tiddlers in the store\n createTiddlyButton(place,label.format([src]),prompt.format([src]), function() {\n if (src=="ask") src=prompt(config.macros.loadTiddlers.askMsg);\n config.macros.importTiddlers.loadRemoteFile(src,loadTiddlers,quiet,ask,filter,force);\n })\n }\n else {\n // load tiddlers from another file/URL and then apply filtering rules to add/replace tiddlers in the store\n if (src=="ask") src=prompt(this.askMsg);\n config.macros.importTiddlers.loadRemoteFile(src,loadTiddlers,quiet,ask,filter,force);\n }\n}\n\nfunction loadTiddlers(src,html,quiet,ask,filter,force)\n{\n var tiddlers = readTiddlersFromHTML(html);\n var count=tiddlers?tiddlers.length:0;\n if (!quiet) displayMessage(config.macros.loadTiddlers.foundMsg.format([count,src]));\n var count=0;\n if (tiddlers) for (var t=0;t<tiddlers.length;t++) {\n var inbound = tiddlers[t];\n var theExisting = store.getTiddler(inbound.title);\n if (inbound.title=='ImportedTiddlers')\n continue; // skip "ImportedTiddlers" history from the other document...\n if (theExisting && theExisting.tags.contains(config.macros.loadTiddlers.lockedTag)) {\n if (!quiet) displayMessage(config.macros.loadTiddlers.lockedMsg.format([theExisting.title,config.macros.loadTiddlers.lockedTag]));\n continue; // skip existing tiddler if tagged with 'noReload'\n }\n // apply the all/new/changes/updates filter (if any)\n if (filter && filter!="all") {\n if ((filter=="new") && theExisting) // skip existing tiddlers\n continue;\n if ((filter=="changes") && !theExisting) // skip new tiddlers\n continue;\n if ((filter.substr(0,4)=="tag:") && inbound.tags.find(filter.substr(4))==null) // must match specific tag value\n continue;\n if ((filter.substr(0,8)=="tiddler:") && inbound.title!=filter.substr(8)) // must match specific tiddler name\n continue;\n if (!force && store.tiddlerExists(inbound.title) && ((theExisting.modified.getTime()-inbound.modified.getTime())>=0))\n { if (!quiet) displayMessage(config.macros.loadTiddlers.nochangeMsg.format([inbound.title])); continue; }\n }\n // get confirmation if required\n if (ask && !confirm((theExisting?"Update":"Add")+" tiddler '"+inbound.title+"'\snfrom "+src))\n { tiddlers[t].status=config.macros.loadTiddlers.skippedMsg; continue; }\n // DO IT!\n // OLD: store.addTiddler(in);\n var tags=Array.concat(inbound.tags,config.macros.loadTiddlers.newTags);\n store.saveTiddler(inbound.title, inbound.title, inbound.text, inbound.modifier, inbound.modified, tags);\n store.fetchTiddler(inbound.title).created = inbound.created; // force creation date to imported value\n tiddlers[t].status=theExisting?"updated":"added"\n count++;\n }\n if (count) {\n // refresh display\n store.setDirty(true);\n store.notifyAll();\n // generate a report\n if (config.options.chkImportReport) {\n // get/create the report tiddler\n var theReport = store.getTiddler('ImportedTiddlers');\n if (!theReport) { theReport= new Tiddler(); theReport.title = 'ImportedTiddlers'; theReport.text = ""; }\n // format the report content\n var now = new Date();\n var newText = "On "+now.toLocaleString()+", "+config.options.txtUserName+" loaded "+count+" tiddlers from\sn[["+src+"|"+src+"]]:\sn";\n newText += "<<<\sn";\n for (var t=0; t<tiddlers.length; t++) if (tiddlers[t].status) newText += "#[["+tiddlers[t].title+"]] - "+tiddlers[t].status+"\sn";\n newText += "<<<\sn";\n// 20060918 ELS: DON'T ADD "discard" BUTTON TO REPORT\n// newText += "<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n// newText += "onclick=\s"story.closeTiddler('"+theReport.title+"'); store.deleteTiddler('"+theReport.title+"');\s" ";\n// newText += "value=\s"discard report\s"></html>";\n // update the ImportedTiddlers content and show the tiddler\n theReport.text = newText+((theReport.text!="")?'\sn----\sn':"")+theReport.text;\n theReport.modifier = config.options.txtUserName;\n theReport.modified = new Date();\n // OLD: store.addTiddler(theReport);\n store.saveTiddler(theReport.title, theReport.title, theReport.text, theReport.modifier, theReport.modified, theReport.tags);\n if (!quiet) { story.displayTiddler(null,theReport.title,1,null,null,false); story.refreshTiddler(theReport.title,1,true); }\n }\n }\n // always show final message when tiddlers were actually loaded\n if (!quiet||count) displayMessage(config.macros.loadTiddlers.loadedMsg.format([count,tiddlers.length,src]));\n}\n\nconfig.macros.importTiddlers.loadRemoteFile = function(src,callback,quiet,ask,filter,force) {\n if (src==undefined || !src.length) return null; // filename is required\n if (!quiet) clearMessage();\n if (!quiet) displayMessage(config.macros.loadTiddlers.openMsg.format([src]));\n if (src.substr(0,4)!="http" && src.substr(0,4)!="file") { // if not a URL, fallback to read from local filesystem\n var txt=loadFile(src);\n if ((txt==null)||(txt==false)) // file didn't load\n { if (!quiet) displayMessage(config.macros.loadTiddlers.openErrMsg.format([src,"(unknown)"])); }\n else {\n if (!quiet) displayMessage(config.macros.loadTiddlers.readMsg.format([txt.length,src]));\n if (callback) callback(src,convertUTF8ToUnicode(txt),quiet,ask,filter,force);\n }\n }\n else {\n var x; // get an request object\n try {x = new XMLHttpRequest()} // moz\n catch(e) {\n try {x = new ActiveXObject("Msxml2.XMLHTTP")} // IE 6\n catch (e) {\n try {x = new ActiveXObject("Microsoft.XMLHTTP")} // IE 5\n catch (e) { return }\n }\n }\n // setup callback function to handle server response(s)\n x.onreadystatechange = function() {\n if (x.readyState == 4) {\n if (x.status==0 || x.status == 200) {\n if (!quiet) displayMessage(config.macros.loadTiddlers.readMsg.format([x.responseText.length,src]));\n if (callback) callback(src,x.responseText,quiet,ask,filter,force);\n }\n else {\n if (!quiet) displayMessage(config.macros.loadTiddlers.openErrMsg.format([src,x.status]));\n }\n }\n }\n // get privileges to read another document's DOM via http:// or file:// (moz-only)\n if (typeof(netscape)!="undefined") {\n try { netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); }\n catch (e) { if (!quiet) displayMessage(e.description?e.description:e.toString()); }\n }\n // send the HTTP request\n try {\n var url=src+(src.indexOf('?')<0?'?':'&')+'nocache='+Math.random();\n x.open("GET",src,true);\n if (x.overrideMimeType) x.overrideMimeType('text/html');\n x.send(null);\n }\n catch (e) {\n if (!quiet) {\n displayMessage(config.macros.loadTiddlers.openErrMsg.format([src,"(unknown)"]));\n displayMessage(e.description?e.description:e.toString());\n }\n }\n }\n}\n\nfunction readTiddlersFromHTML(html)\n{\n // extract store area from html \n var start=html.indexOf('<div id="storeArea">');\n var end=html.indexOf("<!--POST-BODY-START--"+">",start);\n if (end==-1) var end=html.indexOf("</body"+">",start); // backward-compatibility for older documents\n var sa="<html><body>"+html.substring(start,end)+"</body></html>";\n\n // load html into iframe document\n var f=document.getElementById("loaderFrame"); if (f) document.body.removeChild(f);\n f=document.createElement("iframe"); f.id="loaderFrame";\n f.style.width="0px"; f.style.height="0px"; f.style.border="0px";\n document.body.appendChild(f);\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 d.open(); d.writeln(sa); d.close();\n\n // read tiddler DIVs from storeArea DOM element \n var sa = d.getElementById("storeArea");\n if (!sa) return null;\n sa.normalize();\n var nodes = sa.childNodes;\n if (!nodes || !nodes.length) return null;\n var tiddlers = [];\n for(var t = 0; t < nodes.length; t++) {\n var title = null;\n if(nodes[t].getAttribute)\n title = nodes[t].getAttribute("tiddler");\n if(!title && nodes[t].id && (nodes[t].id.substr(0,5) == "store"))\n title = nodes[t].id.substr(5);\n if(title && title != "")\n tiddlers.push((new Tiddler()).loadFromDiv(nodes[t],title));\n }\n return tiddlers;\n}\n//}}}
On Sunday, May 13, 2007 12:12:57 PM, BenjaminMigliori imported 1 tiddler from\n[[F:\snodelink\snodelink.html|F:\snodelink\snodelink.html]]:\n<<<\n#[[journal.links]] - added\n<<<\n\n----\nOn Wednesday, May 09, 2007 12:34:51 AM, BenjaminMigliori imported 1 tiddler from\n[[F:\snodelink\snodelink.html|F:\snodelink\snodelink.html]]:\n<<<\n#[[07.05.08 100 Suns]] - added\n<<<\n\n----\nOn Sunday, April 22, 2007 12:14:04 AM, Benjamin Migliori imported 1 tiddler from\n[[F:\snodelink\snodelink.html|F:\snodelink\snodelink.html]]:\n<<<\n#[[07.04.21 HDR Imaging and the resolution of the eye]] - added\n<<<\n\n----\nOn Friday, April 20, 2007 12:02:31 AM, BenjaminMigliori imported 1 tiddler from\n[[http://www.tiddlytools.com|http://www.tiddlytools.com]]:\n<<<\n#[[ExportTiddlersPlugin]] - replaces ExportTiddlersPlugin - 4/17/2007 17:21:00 by BenjaminMigliori\n<<<\n\n----\nOn Thursday, April 19, 2007 6:04:19 PM, BenjaminMigliori imported 1 tiddler from\n[[F:\snodelink\snodelink.html|F:\snodelink\snodelink.html]]:\n<<<\n#[[07.04.19 The end of Gateway electronics.]] - added\n<<<\n\n----\nOn Sunday, April 15, 2007 11:24:11 PM, Benjamin Migliori imported 3 tiddlers from\n[[G:\snodelink\snodelink.html|G:\snodelink\snodelink.html]]:\n<<<\n#[[07.04.16 FishPicks Posted!]] - added\n#[[07.04.14 The Grindhouse: pre-viewing/invitation.]] - added\n#[[07.04.14 Fiber and 3d2p microscopy]] - added\n<<<\n\n----\nOn Friday, April 13, 2007 5:21:19 PM, BenjaminMigliori imported 1 tiddler from\n[[F:\snodelink\snodelink.html|F:\snodelink\snodelink.html]]:\n<<<\n#[[Webpage Gallery Setup]] - added\n<<<\n\n----\nOn Friday, April 13, 2007 10:18:53 AM, BenjaminMigliori imported 1 tiddler from\n[[http://www.tiddlywiki.com/|http://www.tiddlywiki.com/]]:\n<<<\n#[[HTMLFormattingPlugin]] - added\n<<<\n\n----\nOn Friday, April 13, 2007 10:18:37 AM, BenjaminMigliori imported 1 tiddler from\n[[http://www.tiddlywiki.com/|http://www.tiddlywiki.com/]]:\n<<<\n#[[CommentScript]] - replaces CommentScript - 4/13/2007 10:18:16 by BenjaminMigliori\n<<<\n\n----\nOn Friday, April 13, 2007 10:17:45 AM, BenjaminMigliori imported 1 tiddler from\n[[http://www.tiddlytools.com|http://www.tiddlytools.com]]:\n<<<\n#[[CommentScript]] - replaces CommentScript - 4/13/2007 00:57:00 by BenjaminMigliori\n<<<\n\n----\nOn Friday, April 13, 2007 12:16:34 AM, BenjaminMigliori loaded 15 tiddlers from\n[[file:///F:/nodelink/nodelink.html|file:///F:/nodelink/nodelink.html]]:\n<<<\n#[[60-fsec pulse generation from a self-mode-locked Ti:sapphire laser ]] - added\n#[[All optical thrombotic stroke model for near-surface blood vessels in rat]] - added\n#[[All-Optical Histology Using Ultrashort Laser Pulses ]] - added\n#[[Anatomical and functional imaging of neurons using 2-photon laser scanning microscopy ]] - added\n#[[Current Flow in Vibrissa Motor Cortex Can Phase-Lock With Exploratory Rhythmic Whisking in Rat ]] - added\n#[[Generation of ultrahigh peak power pulses by chirped pulse amplification]] - added\n#[[High Power Ultrafast Lasers]] - added\n#[[Mode locking of Ti:A1203 lasers and self-focusing: a Gaussian approximation ]] - added\n#[[New Developments in Multiphoton Microscopy]] - added\n#[[Random access three-dimensional two-photon microscopy]] - added\n#[[Self-starting Kerr-lens mode locking of a Ti:sapphire laser]] - added\n#[[Targeted Disruption of Deep Lying Neocortical Microvessels]] - added\n#[[Targeted disruption of deep-lying neocortical microvessels in rat using ultrashort laser pulses ]] - added\n#[[Two-photon laser scanning fluorescence microscopy]] - added\n#[[Ultrafast laser induced microexplosions: explosive dynamics and sub-micrometer structures]] - added\n<<<\n\n----\nOn Friday, April 13, 2007 12:10:28 AM, BenjaminMigliori loaded 1 tiddlers from\n[[file:///F:/nodelink/nodelink.html|file:///F:/nodelink/nodelink.html]]:\n<<<\n#[[A Mathematical Theory of Communication]] - added\n<<<\n\n----\nOn Friday, April 13, 2007 12:00:11 AM, BenjaminMigliori imported 1 tiddler from\n[[F:\sheliolink\srescue2.html|F:\sheliolink\srescue2.html]]:\n<<<\n#[[MainMenu]] - replaces MainMenu - 4/10/2007 22:49:00 by BenjaminMigliori\n<<<\n\n----\nOn Thursday, April 12, 2007 11:58:53 PM, BenjaminMigliori imported 15 tiddlers from\n[[F:\sheliolink\srescue.html|F:\sheliolink\srescue.html]]:\n<<<\n#[[06.06.26 Excellent Physics Problem]] - added\n#[[06.06.27 Books to read and food to eat]] - added\n#[[06.06.29 Best Party Idea]] - added\n#[[06.06.30 Story about my brother]] - added\n#[[06.08.01 Another elegant physics problem]] - replaces 06.08.01 Another elegant physics problem - 4/10/2007 22:28:00 by BenjaminMigliori\n#[[07.01.23 Two Landscapes]] - added\n#[[Benjamin Migliori]] - replaces Benjamin Migliori - 3/16/2007 22:40:00 by Benjamin Migliori\n#[[BenjaminMigliori]] - added\n#[[ContributorUpload]] - replaces ContributorUpload - 4/11/2007 00:04:00 by BenjaminMigliori\n#[[HTMLFormattingPlugin]] - replaces HTMLFormattingPlugin - 9/10/2006 11:39:00 by ELSDesignStudios\n#[[Import Interface]] - replaces Import Interface - 3/16/2007 14:07:00 by Benjamin Migliori\n#[[Paper Repository]] - added\n#[[RinTools]] - replaces RinTools - 4/12/2007 15:00:00 by BenjaminMigliori\n#[[contributors.list]] - added\n#[[vi.car.ious]] - added\n<<<\n\n----\nOn Wednesday, April 11, 2007 11:07:35 PM, BenjaminMigliori imported 1 tiddler from\n[[http://www.tiddlywiki.com/|http://www.tiddlywiki.com/]]:\n<<<\n#[[HTMLFormattingPlugin]] - added\n<<<\n\n----\nOn Tuesday, April 10, 2007 1:57:04 PM, Benjamin Migliori imported 1 tiddler from\n[[http://www.tiddlytools.com|http://www.tiddlytools.com]]:\n<<<\n#[[ToggleReadOnly]] - added\n<<<\n\n----\nOn Tuesday, April 10, 2007 11:13:56 AM, Benjamin Migliori imported 13 tiddlers from\n[[http://TiddlyWiki.bidix.info/#Upload|http://TiddlyWiki.bidix.info/#Upload]]:\n<<<\n#[[HowToUpload]] - added\n#[[UploadDoc]] - added\n#[[UploadForm]] - added\n#[[UploadOptions]] - added\n#[[UploadPlugin]] - added\n#[[UploadPluginDoc]] - added\n#[[UploadPluginMsgEN]] - added\n#[[UploadPluginMsgFR]] - added\n#[[UploadPluginTweak]] - added\n#[[config.rb]] - added\n#[[store.cgi]] - added\n#[[store.php]] - added\n#[[upload_test.php]] - added\n<<<\n\n----\nOn Monday, April 09, 2007 9:05:35 PM, YourName imported 1 tiddler from\n[[http://www.tiddlytools.com|http://www.tiddlytools.com]]:\n<<<\n#[[CoreTweaks]] - added\n<<<\n\n----\nOn Monday, April 09, 2007 2:02:28 PM, Benjamin Migliori imported 13 tiddlers from\n[[http://tiddlywiki.bidix.info/#UploadPlugin|http://tiddlywiki.bidix.info/#UploadPlugin]]:\n<<<\n#[[HowToUpload]] - added\n#[[UploadDoc]] - added\n#[[UploadForm]] - added\n#[[UploadOptions]] - added\n#[[UploadPlugin]] - replaces UploadPlugin - 10/15/2006 01:04:00 by BidiX\n#[[UploadPluginDoc]] - replaces UploadPluginDoc - 10/11/2006 12:32:00 by BidiX\n#[[UploadPluginMsgEN]] - added\n#[[UploadPluginMsgFR]] - added\n#[[UploadPluginTweak]] - added\n#[[config.rb]] - added\n#[[store.cgi]] - added\n#[[store.php]] - added\n#[[upload_test.php]] - added\n<<<\n\n----\nOn Monday, April 09, 2007 1:58:39 PM, Benjamin Migliori imported 2 tiddlers from\n[[http://tiddlywiki.bidix.info/#UploadDoc|http://tiddlywiki.bidix.info/#UploadDoc]]:\n<<<\n#[[UploadPlugin]] - added\n#[[UploadPluginDoc]] - added\n<<<\n\n----\nOn Monday, April 09, 2007 1:33:23 PM, Benjamin Migliori imported 1 tiddler from\n[[http://www.tiddlytools.com|http://www.tiddlytools.com]]:\n<<<\n#[[ToggleReadOnly]] - added\n<<<\n\n----\nOn Monday, April 09, 2007 12:16:34 PM, Benjamin Migliori imported 4 tiddlers from\n[[http://www.tiddlytools.com|http://www.tiddlytools.com]]:\n<<<\n#[[CommentScript]] - added\n#[[InlineJavascriptPlugin]] - added\n#[[LoadTiddlersPlugin]] - added\n#[[MiniBrowser]] - added\n<<<\n\n----\nOn Monday, April 09, 2007 12:04:40 PM, Benjamin Migliori imported 1 tiddler from\n[[F:\snodelink\snodelink.html|F:\snodelink\snodelink.html]]:\n<<<\n#[[ColorPalette]] - replaces ColorPalette - 4/1/2007 19:32:00 by Vera Trofimenko\n<<<\n\n----\nOn Sunday, April 01, 2007 7:27:30 PM, Vera Trofimenko imported 1 tiddler from\n[[F:\snodelink\snodelink.html|F:\snodelink\snodelink.html]]:\n<<<\n#[[ColorPalette]] - added\n<<<\n\n----\nOn Sunday, April 01, 2007 7:26:29 PM, Vera Trofimenko imported 1 tiddler from\n[[F:\snodelink\snodelink.html|F:\snodelink\snodelink.html]]:\n<<<\n#[[Common Imaging Issues]] - added\n<<<\n\n----\nOn Friday, March 30, 2007 10:34:11 AM, imported 1 tiddler from\n[[F:\snodelink\snodelink.html|F:\snodelink\snodelink.html]]:\n<<<\n#[[TEA]] - added\n<<<\n
/***\n|Name|InlineJavascriptPlugin|\n|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|\n|Version|1.6.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|Insert Javascript executable code directly into your tiddler content.|\n\n''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.\n!!!!!Usage\n<<<\nWhen installed, this plugin adds new wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be treated as embedded javascript and executed each time the tiddler is rendered.\n\n''Deferred execution from an 'onClick' link''\nBy including a {{{label="..."}}} parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered. You may also include a {{{title="..."}}} parameter to specify the 'tooltip' text that will appear whenever the mouse is moved over the onClick link text\n\n''External script source files:''\nYou can also load javascript from an external source URL, by including a src="..." parameter in the initial {{{<script>}}} marker (e.g., {{{<script src="demo.js"></script>}}}). This is particularly useful when incorporating third-party javascript libraries for use in custom extensions and plugins. The 'foreign' javascript code remains isolated in a separate file that can be easily replaced whenever an updated library file becomes available.\n\n''Display script source in tiddler output''\nBy including the keyword parameter "show", in the initial {{{<script>}}} marker, the plugin will include the script source code in the output that it displays in the tiddler.\n\n''Defining javascript functions and libraries:''\nAlthough the external javascript file is loaded while the tiddler content is being rendered, any functions it defines will not be available for use until //after// the rendering has been completed. Thus, you cannot load a library and //immediately// use it's functions within the same tiddler. However, once that tiddler has been loaded, the library functions can be freely used in any tiddler (even the one in which it was initially loaded).\n\nTo ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that will be rendered as soon as your TiddlyWiki document is opened. For example, you could put your {{{<script src="..."></script>}}} syntax into a tiddler called LoadScripts, and then add {{{<<tiddler LoadScripts>>}}} in your MainMenu tiddler.\n\nSince the MainMenu is always rendered immediately upon opening your document, the library will always be loaded before any other tiddlers that rely upon the functions it defines. Loading an external javascript library does not produce any direct output in the tiddler, so these definitions should have no impact on the appearance of your MainMenu.\n\n''Creating dynamic tiddler content''\nAn important difference between this implementation of embedded scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document:\n* In a typical web document, you use the document.write() function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.\n* However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and completely replaces the entire ~TiddlyWiki document in your browser window.\n* To allow these scripts to work unmodified, the plugin automatically converts all occurences of document.write() so that the output is inserted into the tiddler content instead of replacing the entire ~TiddlyWiki document.\n\nIf your script does not use document.write() to create dynamically embedded content within a tiddler, your javascript can, as an alternative, explicitly return a text value that the plugin can then pass through the wikify() rendering engine to insert into the tiddler display. For example, using {{{return "thistext"}}} will produce the same output as {{{document.write("thistext")}}}.\n\n//Note: your script code is automatically 'wrapped' inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler. To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.//\n\n''Accessing the ~TiddlyWiki DOM''\nThe plugin provides one pre-defined variable, 'place', that is passed in to your javascript code so that it can have direct access to the containing DOM element into which the tiddler output is currently being rendered.\n\nAccess to this DOM element allows you to create scripts that can:\n* vary their actions based upon the specific location in which they are embedded\n* access 'tiddler-relative' information (use findContainingTiddler(place))\n* perform direct DOM manipulations (when returning wikified text is not enough)\n<<<\n!!!!!Examples\n<<<\nan "alert" message box:\n><script show>\n alert('InlineJavascriptPlugin: this is a demonstration message');\n</script>\ndynamic output:\n><script show>\n return (new Date()).toString();\n</script>\nwikified dynamic output:\n><script show>\n return "link to current user: [["+config.options.txtUserName+"]]";\n</script>\ndynamic output using 'place' to get size information for current tiddler:\n><script show>\n if (!window.story) window.story=window;\n var title=story.findContainingTiddler(place).id.substr(7);\n return title+" is using "+store.getTiddlerText(title).length+" bytes";\n</script>\ncreating an 'onclick' button/link that runs a script:\n><script label="click here" title="clicking this link will show an 'alert' box" show>\n if (!window.story) window.story=window;\n alert("Hello World!\snlinktext='"+place.firstChild.data+"'\sntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");\n</script>\nloading a script from a source url:\n>http://www.TiddlyTools.com/demo.js contains:\n>>{{{function demo() { alert('this output is from demo(), defined in demo.js') } }}}\n>>{{{alert('InlineJavascriptPlugin: demo.js has been loaded'); }}}\n><script src="demo.js" show>\n return "loading demo.js..."\n</script>\n><script label="click to execute demo() function" show>\n demo()\n</script>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''InlineJavascriptPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2007.02.19 [1.6.0]'' added support for title="..." to specify mouseover tooltip when using an onclick (label="...") script\n''2006.10.16 [1.5.2]'' add newline before closing '}' in 'function out_' wrapper. Fixes error caused when last line of script is a comment.\n''2006.06.01 [1.5.1]'' when calling wikify() on script return value, pass hightlightRegExp and tiddler params so macros that rely on these values can render properly\n''2006.04.19 [1.5.0]'' added 'show' parameter to force display of javascript source code in tiddler output\n''2006.01.05 [1.4.0]'' added support 'onclick' scripts. When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked. 'place' value is set to match the clicked button/link element.\n''2005.12.13 [1.3.1]'' when catching eval error in IE, e.description contains the error text, instead of e.toString(). Fixed error reporting so IE shows the correct response text. Based on a suggestion by UdoBorkowski\n''2005.11.09 [1.3.0]'' for 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content. Based on a suggestion by BradleyMeck\n''2005.11.08 [1.2.0]'' handle loading of javascript from an external URL via src="..." syntax\n''2005.11.08 [1.1.0]'' pass 'place' param into scripts to provide direct DOM access \n''2005.11.08 [1.0.0]'' initial release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.inlineJavascript= {major: 1, minor: 6, revision: 0, date: new Date(2007,2,19)};\n\nconfig.formatters.push( {\n name: "inlineJavascript",\n match: "\s\s<script",\n lookahead: "\s\s<script(?: src=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?(?: label=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?(?: title=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?( show)?\s\s>((?:.|\s\sn)*?)\s\s</script\s\s>",\n\n handler: function(w) {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n if (lookaheadMatch[1]) { // load a script library\n // make script tag, set src, add to body to execute, then remove for cleanup\n var script = document.createElement("script"); script.src = lookaheadMatch[1];\n document.body.appendChild(script); document.body.removeChild(script);\n }\n if (lookaheadMatch[5]) { // there is script code\n if (lookaheadMatch[4]) // show inline script code in tiddler output\n wikify("{{{\sn"+lookaheadMatch[0]+"\sn}}}\sn",w.output);\n if (lookaheadMatch[2]) { // create a link to an 'onclick' script\n // add a link, define click handler, save code in link (pass 'place'), set link attributes\n var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",lookaheadMatch[2]);\n link.onclick=function(){try{return(eval(this.code))}catch(e){alert(e.description?e.description:e.toString())}}\n link.code="function _out(place){"+lookaheadMatch[5]+"\sn};_out(this);"\n link.setAttribute("title",lookaheadMatch[3]?lookaheadMatch[3]:"");\n link.setAttribute("href","javascript:;");\n link.style.cursor="pointer";\n }\n else { // run inline script code\n var code="function _out(place){"+lookaheadMatch[5]+"\sn};_out(w.output);"\n code=code.replace(/document.write\s(/gi,'place.innerHTML+=(');\n try { var out = eval(code); } catch(e) { out = e.description?e.description:e.toString(); }\n if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);\n }\n }\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n} )\n//}}}
/***\n|Launch Application Plugin|\n|Authors: Lyall Pearce, modified by Bradley Meck|\n|Bug Finders: HarryC|\n|Source: http://bradleymeck.tiddlyspot.com/#LaunchApplicationPlugin|\n|License: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|Version: 1.1.0|\n|Description: Launch an application from within TiddlyWiki using a button|\n|Usage: {{{<<LaunchApplication "buttonLabel" "tooltip" "application" "argument1" "argument2"...>>}}}|\n\n!Example\n@@PLEASE DO NOT USE THIS IF YOU ARE WORRIED ABOUT SECURITY,\nTIDDLYSPOT, LYALL PEARCE AND MYSELF ARE NOT RESPONSIBLE FOR ANY MIS-USE OF THIS PLUGIN@@\n<<LaunchApplication "Open Notepad" "Text Editing"\n"file:///C:\sDocuments and Settings\sBenjamin Migliori\sDesktop\sNew Folder (3)\spsftp.exe" "open physics-shell.ucsd.edu">>\n{{{<<LaunchApplication "PSFTP TXT FILES" "UPLOAD TXT"\n"file:///C:/Windows/notepad.exe">>}}}\n\n{{{\n<<LaunchApplication "C Drive" "Folder" "file:///c:/">>\n}}}\n<<LaunchApplication "C Drive" "Folder" "file:///c:/">>\n\n!To Do\n*Support true XPaths\n**relative paths\n***{{{..}}} : parent-directory\n***{{{/}}} : root-directory\n**wild-cards\n***{{{*}}} : unknown-name\n\n!Revisions\n*11/07/2006 : Problem with application parameters was fixed in IE.\n*11/06/2006 : Problem with application parameters appeared again. Fixed in Firefox for now. Thanks to HarryC for bringing up the bug.\n*11/04/2006 : Problem with application parameters was fixed so that they work now.\n*10/29/2006 : Removed Alert of the address being launched and added support for non-application files in Firefox. Fixed a problem from the current directory being recieved by the W.Shell object by using decodeURI. Added absolute paths if the URL has "file:///" as its beginning. Clicking did not return false and was firing beforeUnLoad(), fixed that.\n*10/28/2006 : Added Support for Firefox in Windows (changes how nsILocalFile is recieved) and changes the functions to use decodeURI for more compatibility.\n\n***/\n//{{{\nversion.extensions.LaunchApplication = {major: 1, minor: 1, revision: 0, date: new Date(2006,11,07)};\nconfig.macros.LaunchApplication = {};\n\nfunction LaunchApplication(appToLaunch,appParams) {\n if(! appToLaunch)\n return;\n if(config.browser.isIE) {\n // want where the tiddly is actually located, excluding tiddly html file\n var tiddlyBaseDir = self.location.pathname.substring(0,self.location.pathname.lastIndexOf("\s\s")+1);\n if(!tiddlyBaseDir || tiddlyBaseDir == "") {\n tiddlyBaseDir = self.location.pathname.substring(0,self.location.pathname.lastIndexOf("/")+1);\n }\n // if Returns with a leading slash, we don't want that.\n if(tiddlyBaseDir.substring(0,1) == "/") {\n tiddlyBaseDir = tiddlyBaseDir.substring(1);\n }\n var theShell = new ActiveXObject("WScript.Shell");\n if(theShell) {\n // the app name may have a directory component, need that too\n // as we want to start with current working dir as the location\n // of the app.\n if(appToLaunch.indexOf("file:///") == 0)\n {\n tiddlyBaseDir = "";\n appToLaunch = appToLaunch.substring(8);\n }\n var appDir = appToLaunch.substring(0, appToLaunch.lastIndexOf("\s\s"));\n if(! appDir || appDir == "") {\n appDir = appToLaunch.substring(0, appToLaunch.lastIndexOf("/"));\n }\n appParams = appParams.length>0?" \s""+appParams.join("\s" \s"")+"\s"":"";\n theShell.CurrentDirectory = decodeURI(tiddlyBaseDir + appDir);\n var commandString = ('"' +decodeURI(tiddlyBaseDir+appToLaunch) + '" ' + appParams);\n pluginInfo.log.push(commandString);\n theShell.run(commandString);\n } else {\n pluginInfo.log.push("WScript.Shell object not created");\n }\n } else {\n // want where the tiddly is actually located, excluding tiddly html file\n var tiddlyBaseDir = self.location.href.substring(0,self.location.href.lastIndexOf("\s\s")+1);\n if(!tiddlyBaseDir || tiddlyBaseDir == "") {\n tiddlyBaseDir = self.location.href.substring(0,self.location.href.lastIndexOf("/")+1);\n }\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);\n if(appToLaunch.indexOf("file:///") == 0)\n {\n tiddlyBaseDir = "";\n appToLaunch = appToLaunch.substring(8);\n }\n file.initWithPath(decodeURI(tiddlyBaseDir+appToLaunch).replace(/\s//g,"\s\s"))\n if (file.isFile() && file.isExecutable()) {\n var process = Components.classes['@mozilla.org/process/util;1'].createInstance(Components.interfaces.nsIProcess);\n process.init(file);\n process.run(false, appParams, appParams.length);\n }\n else\n {\n file.launch();\n }\n }\n};\n\nconfig.macros.LaunchApplication.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n // 0=ButtonText, 1=toolTop, 2=AppToLaunch, 3...AppParameters\n if (params[0] && params[1] && params[2]) {\n var theButton = createTiddlyButton(place, params[0], params[1], onClickLaunchApplication);\n theButton.setAttribute("appToLaunch", params[2]);\n var appParams = [];\n for (var i = 3; i <params.length; i++) {\n appParams.push(params[i]);\n }\n theButton.appParameters = appParams;\n return;\n }\n}\n\nfunction onClickLaunchApplication(e) {\n var theAppToLaunch = this.getAttribute("appToLaunch");\n\n var theAppParams = this.appParameters ;\n LaunchApplication(theAppToLaunch,theAppParams);\n return false;\n }\n\n//}}}\n
{{{Usage: <<LaunchApplication "buttonLabel" "tooltip" "application" "argument1" "argument2"...>>}}}
[[new items]]::\n[[vi.cario.us]]::\n[[cu.rio.us]]::\n[[notebook.public]]\n[[notebook.photography]]\n[[notebook.science]]\n@@color(green):''<<tiddlerbox "paper.repository" "Paper Repository" ""600 600>>''@@\n\n[[ContributorUpload]]::\n[[CommentScript]]\n
/***\n===============================================================================\nAuthor : Dawn Ahukanna\nVersion : $Id: Macro_messageLib.js 444 2007-01-25 12:17:46Z dahukanna $\n===============================================================================\n----\n''Name:'' _MessageLibrary\n''Summary:'' <<getPlugin _MessageLibrary summary>>\n''Description:'' <<getPlugin _MessageLibrary description>>\n''Version:'' <<getPlugin _MessageLibrary>> \n''Date:'' <<getPlugin _MessageLibrary date>>\n''Author:'' <<getPlugin _MessageLibrary author>>\n''Source:'' <<getPlugin _MessageLibrary code>>\n''Documentation:'' <<getPlugin _MessageLibrary doc>>\n''License:'' [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]\n''TiddlyWiki:'' 2.1.x\n''Browsers:'' IE 6.0, FF 1.5.x, FF 2.0.x\n''~CoreVersion:'' <<getPlugin _MessageLibrary coreVersion>>\n----\n!Code\n***/\n//{{{\nversion.extensions._MessageLibrary= {major: 2, minor: 1, revision: 0, date: new Date("Jan 2, 2007"), code: "http://project.dahukanna.net/tiddlywiki/twextensions.htm#_MessageLibrary", doc: "http://project.dahukanna.net/tiddlywiki/twextensions.htm#_MessageLibraryDoc", author:"DawnAhukanna dawn[at]dahukanna[dot]net", summary:"_MessageLibrary for TiddlyWiki version 2.1.3 or above.", description: "Message library uses variables so that you can change the word tiddler to an alternative word like 'thought', 'note' or whatever you want your tiddlers to be called.\sn This is done once defining the alternative names in the 'messageType' object and replacing the target words throughout the TiddlyWiki document. (e.g. 'This tiddler doesn't exist' would be changed to 'This thought doesn't exist').", coreVersion: "2.1.0"};\nvar messageType = {lower: "node", lowerPlural: "nodes", mixed: "Node", mixedPlural: "Nodes", wikiName: "nodelink::", downloadURL: "#"};\n//Override messages in config.message text. \n// Messages\nconfig.messages.customConfigError="Error in systemConfig " + messageType.lower + " '%1' - %0";\nconfig.messages.savedSnapshotError="It appears that this " + messageType.wikiName + " has been incorrectly saved. Please see http:// " + messageType.downloadURL + " for details";\nconfig.messages.undefinedTiddlerToolTip="The " + messageType.lower + " '%0' doesn't yet exist";\nconfig.messages.shadowedTiddlerToolTip="The " + messageType.lower + " '%0' doesn't yet exist, but has a pre-defined shadow value";\nconfig.messages.noTags="There are no tagged " + messageType.lowerPlural;\nconfig.messages.notFileUrlError="You need to save this " + messageType.wikiName + " to a file before you can save changes";\nconfig.messages.cantSaveError="It's not possible to save changes. This could be because your browser doesn't support saving (instead, use FireFox if you can), or because the pathname to your " + messageType.wikiName + " file contains illegal characters";\nconfig.messages.invalidFileError="The original file '%0' does not appear to be a valid " + messageType.wikiName;\nconfig.messages.mainSaved="Main " + messageType.wikiName + " file saved";\nconfig.messages.mainFailed="Failed to save main " + messageType.wikiName + " file. Your changes have not been saved";\nconfig.messages.overwriteWarning="A " + messageType.lower + " named '%0' already exists. Choose OK to overwrite it";\nconfig.messages.unsavedChangesWarning="WARNING! There are unsaved changes in " + messageType.wikiName + "\sn\snChoose OK to save\snChoose CANCEL to discard";\nconfig.messages.confirmExit="--------------------------------\sn\snThere are unsaved changes in " + messageType.wikiName + ". If you continue you will lose those changes\sn\sn--------------------------------";\nconfig.messages.unsupportedTWFormat="Unsupported " + messageType.wikiName + " format '%0'";\nconfig.messages.tiddlerSaveError="Error when saving " + messageType.lower + " '%0'";\nconfig.messages.tiddlerLoadError="Error when loading " + messageType.lower + " '%0'";\n//Override messages in config.views text.\nconfig.views.wikified.tag.tooltip="Show " + messageType.lowerPlural + " tagged with '%0'";\nconfig.views.wikified.tag.openAllText="Open all " + messageType.lowerPlural;\nconfig.views.wikified.tag.openAllTooltip="Open all of these " + messageType.lowerPlural;\nconfig.views.wikified.tag.popupNone="No other " + messageType.lowerPlural + " tagged with '%0'";\nconfig.views.wikified.defaultText="The " + messageType.lower + " '%0' doesn't yet exist. Double-click to create it";\nconfig.views.wikified.shadowModifier="(built-in shadow " + messageType.lower + ")";\nconfig.views.editor.tagChooser.tooltip="Choose existing tags to add to this " + messageType.lower;\n//Override messages in config.commands text.\nconfig.commands.closeTiddler.tooltip="Close this " + messageType.lower;\nconfig.commands.closeOthers.tooltip="Close all other " + messageType.lowerPlural;\nconfig.commands.editTiddler.tooltip="Edit this " + messageType.lower;\nconfig.commands.editTiddler.readOnlyTooltip="View the source of this " + messageType.lower;\nconfig.commands.permalink.tooltip="Permalink for this " + messageType.lower;\nconfig.commands.references.tooltip="Show " + messageType.lowerPlural +" that link to this one";\nconfig.commands.jump.tooltip="Jump to another open " + messageType.lower;\nconfig.commands.saveTiddler.tooltip="Save changes to this " + messageType.lower;\nconfig.commands.cancelTiddler.tooltip="Undo changes to this " + messageType.lower;\nconfig.commands.cancelTiddler.readOnlyTooltip="View this " + messageType.lower + " normally";\nconfig.commands.deleteTiddler.tooltip="Delete this " + messageType.lower;\n//Override messages in config.macros text. \nconfig.macros.search.prompt="Search this " + messageType.wikiName;\nconfig.macros.search.successMsg="%0 " + messageType.lowerPlural + " found matching %1";\nconfig.macros.search.failureMsg="No " + messageType.lowerPlural + " found matching %0";\nconfig.macros.tagging.tooltip="List of " + messageType.lowerPlural + " tagged with '%0'";\nconfig.macros.allTags.tooltip="Show " + messageType.lowerPlural + " tagged with '%0'";\nconfig.macros.allTags.noTags="There are no tagged " + messageType.lowerPlural;\nconfig.macros.list.all.prompt="All " + messageType.lowerPlural + " in alphabetical order";\nconfig.macros.list.missing.prompt=messageType.mixedPlural + " that have links to them but are not defined";\nconfig.macros.list.orphans.prompt=messageType.mixedPlural + " that are not linked to from any other " + messageType.lowerPlural;\nconfig.macros.list.shadowed.prompt=messageType.mixedPlural + " shadowed with default contents";\nconfig.macros.closeAll.prompt="Close all displayed " + messageType.lowerPlural + " (except any that are being edited)";\nconfig.macros.permaview.prompt="Link to an URL that retrieves all the currently displayed " + messageType.lowerPlural;\nconfig.macros.saveChanges.prompt="Save all " + messageType.lowerPlural + " to create a new " + messageType.wikiName;\nconfig.macros.plugins.confirmDeleteText="Are you sure you want to delete these " + messageType.lowerPlural + ":\sn\sn%0";\nconfig.macros.refreshDisplay.prompt="Redraw the entire " + messageType.wikiName + " display";\nconfig.macros.importTiddlers.readOnlyWarning="You cannot import " + messageType.lowerPlural + " into a read-only " + messageType.wikiName + ". Try opening the " + messageType.wikiName + " file from a file:// URL";\nconfig.macros.importTiddlers.confirmOverwriteText="Are you sure you want to overwrite these " + messageType.lowerPlural + ":\sn\sn%0";\nconfig.macros.importTiddlers.wizardTitle="Import "+ messageType.lowerPlural + " from another tiddlywiki file";\nconfig.macros.importTiddlers.step1="Step 1: Locate the tiddlywiki file";\nconfig.macros.importTiddlers.step2="Step 2: Loading the tiddlywiki file";\nconfig.macros.importTiddlers.step3="Step 3: Choose the "+ messageType.lowerPlural + " to import";\nconfig.macros.importTiddlers.step4="%0 "+ messageType.lower + "(s) imported";\nconfig.macros.importTiddlers.listViewTemplate.actions[1].caption="Import these "+ messageType.lowerPlural;\n// Come back for new item.\nconfig.macros.newTiddler.label="new " + messageType.lower;\nconfig.macros.newTiddler.prompt="Create a new " + messageType.lower;\nconfig.macros.newTiddler.title="New " + messageType.mixed;\nconfig.macros.newJournal.label="new journal";\nconfig.macros.newJournal.prompt="Create a new " + messageType.lower + " from the current date and time";\n//Overide config.shadowTiddlers messages.\nconfig.shadowTiddlers.SideBarOptions="<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change " + messageType.wikiName + " advanced options'>>";\nconfig.shadowTiddlers.AdvancedOptions="<<option chkGenerateAnRssFeed>> GenerateAnRssFeed\sn<<option chkOpenInNewWindow>> OpenLinksInNewWindow\sn<<option chkSaveEmptyTemplate>> SaveEmptyTemplate\sn<<option chkToggleLinks>> Clicking on links to " + messageType.lowerPlural + " that are already open causes them to close\sn^^(override with Control or other modifier key)^^\sn<<option chkHttpReadOnly>> HideEditingFeatures when viewed over HTTP\sn<<option chkForceMinorUpdate>> Treat edits as MinorChanges by preserving date and time\sn^^(override with Shift key when clicking 'done' or by pressing Ctrl-Shift-Enter^^\sn<<option chkConfirmDelete>> ConfirmBeforeDeleting \sn Maximum number of lines in a " + messageType.lower + " edit box: <<option txtMaxEditRows>> \sn Folder name for backup files: <<option txtBackupFolder>> \sn<<option chkInsertTabs>> Use tab key to insert tab characters instead of jumping to next field";\nconfig.shadowTiddlers.OptionsPanel="These InterfaceOptions for customising " + messageType.wikiName + " are saved in your browser\sn\snYour username for signing your edits. Write it as a WikiWord (eg JoeBloggs)\sn\sn<<option txtUserName>>\sn<<option chkSaveBackups>> SaveBackups\sn<<option chkAutoSave>> AutoSave\sn<<option chkRegExpSearch>> RegExpSearch\sn<<option chkCaseSensitiveSearch>> CaseSensitiveSearch\sn<<option chkAnimate>> EnableAnimations\sn\sn----\snAdvancedOptions\snPluginManager\snImportTiddlers";\nconfig.shadowTiddlers.SideBarTabs="<<tabs txtMainTab Timeline Timeline TabTimeline All 'All " + messageType.lowerPlural + "' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>";\nconfig.shadowTiddlers.TabMore="<<tabs txtMoreTab Missing 'Missing " + messageType.lowerPlural + "' TabMoreMissing Orphans 'Orphaned " + messageType.lowerPlural + "' TabMoreOrphans Shadowed 'Shadowed " + messageType.lowerPlural + "' TabMoreShadowed>>";\nconfig.shadowTiddlers.GettingStarted="To get started with this blank " + messageType.wikiName + " , you'll need to modify the following " + messageType.lowerPlural + ":\sn* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)\sn* MainMenu: The menu (usually on the left)\sn* DefaultTiddlers: Contains the names of the " + messageType.lowerPlural + " that you want to appear when the " + messageType.wikiName + " is opened\snYou'll also need to enter your username for signing your edits: <<option txtUserName>>";\n//}}}\n//----
/%\n|Name|MiniBrowser|\n|Source|http://www.TiddlyTools.com/#MiniBrowser|\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires|InlineJavascriptPlugin, MiniBrowserList|\n|Overrides||\n|Description|use an 'inline frame' to display another site inside a tiddler with navigation buttons and a dropdown list of favorite URLs.|\n\nUsage:\n<<tiddler MiniBrowser with: id>>\n\nwhere:\n id - (optional) specifies an ID to assign to the DOM element for the embedded IFRAME. If you want to have **more than one** MiniBrowser displayed at a time, you MUST provide an ID, so that each MiniBrowser can be uniquely identified within the DOM structure.\n\nNote: MiniBrowserList can be *empty*, but must already exist for you to ADD a favorite to the list. If you don't copy the sample list from TiddlyTools, be sure to create this tiddler in your own document if you intend to use the MiniBrowser's "favorites" droplist.\n\n%/<html><form target="browser_$1" style="margin:0;padding:0"\n onsubmit="this.action=this.url.value; this.form.done.disabled=false" style="margin:0;padding:0"><nobr><!--\n--><input type="button" value="<" title="back" style="font-size:8pt;width:3%"\n onclick="try{window.frames['browser_$1'].history.go(-1)}catch(e){window.history.go(-1)}" ><!--\n--><input type="button" value=">" title="forward" style="font-size:8pt;width:3%"\n onclick="try{window.frames['browser_$1'].history.go(+1)}catch(e){window.history.go(+1)}"><!--\n--><input type="button" value="+" title="refresh"style="font-size:8pt;width:3%"\n onclick="window.frames['browser_$1'].location.reload()"><!--\n--><input type="button" value="x" title="stop"style="font-size:8pt;width:3%"\n onclick="window.stop()"><!--\n--><select name="bookmarks" id="browser_bookmarks_$1" size="1" style="font-size:8pt;width:21%"\n onchange="var f=document.getElementById('browser_$1'); if (!this.value.length) return window.miniBrowserResetSize(); else window.miniBrowserSetSize(this.form); this.form.url.value=this.value; this.form.action=this.value; this.form.submit(); this.form.done.disabled=false">\n<option value="">bookmarks...</option>\n</select><!--\n--><input type="button" value="add" title="add this URL to the MiniBrowser bookmarks" style="font-size:8pt;width:5%"\n onclick="window.miniBrowserAddBookmark(this.form.url);"><!--\n--><input type="button" value="del" title="remove this URL from the MiniBrowser bookmarks" style="font-size:8pt;width:5%"\n onclick="window.miniBrowserDeleteBookmark(this.form.bookmarks);"><!--\n--><input type="button" value="edit" title="edit the MiniBrowser bookmarks list definition" style="font-size:8pt;width:5%"\n onclick="story.displayTiddler(null,'MiniBrowserList',2)"><!--\n--><input type="text" name="url" size="60" value="" style="font-size:8pt;width:35%"\n onfocus="this.select();" onkeyup="var k=event.keyCode; if (k==13|k==10) this.form.go.click();"><!--\n--><input type="button" name="go" value="go" title="view this URL" style="font-size:8pt;width:4%"\n onclick="if(!this.form.url.value.length) return; window.miniBrowserSetSize(this.form); this.form.action=this.form.url.value; this.form.submit(); this.form.done.disabled=false"><!--\n--><input type="button" value="open" title="open this URL in a separate window" style="font-size:8pt;width:6%"\n onclick="if(this.form.url.value.length) window.open(this.form.url.value)"><!--\n--><input type="button" value="done" name="done" title="stop viewing this URL" disabled style="font-size:8pt;width:6%"\n onclick="this.form.url.value=''; this.form.bookmarks.selectedIndex=0; window.miniBrowserResetSize(); this.disabled=true;">\n<iframe name="browser_$1" id="browser_$1" style="width:100%;height:1em;display:none;background:#fff;border:1px solid"></iframe><div id="browser_resize_$1" style="text-align:center;marginTop:2px;display:none;font-size:8pt"><!--\n--> size: <input type="text" name="w" size="3" value="100%" style="font-size:8pt;"\n onfocus="this.select()"><!--\n-->x<input type="text" name="h" size="3" value="400" style="font-size:8pt;"\n onfocus="this.select()"><!--\n--> <input type="button" value="set" style="font-size:8pt;"\n onclick="var w=this.form.w.value.trim(); if (!w||!w.length) w='100%'; var h=this.form.h.value.trim(); if (!h||!h.length) h='400'; if (!w.replace(/[0-9]*/,'').length) w+='px'; if (!h.replace(/[0-9]*/,'').length) h+='px'; var f=document.getElementById('browser_$1'); f.style.width=w; f.style.height=h;"><!--\n--><input type="button" value="reset" style="font-size:8pt;"\n onclick="var w='100%'; var h='400'; var f=document.getElementById('browser_$1'); f.style.width=w; f.style.height=h+'px'; this.form.w.value=w; this.form.h.value=h;"><!--\n--><input type="button" value="fit" title="resize to fit containing window" style="font-size:8pt;"\n onclick="window.miniBrowserFitSize(this)"><!--\n--></div></nobr></form></html><script>\n\n // load bookmarks droplist from HR-separated "MiniBrowserList" tiddler contents\n var here=document.getElementById("browser_bookmarks_$1");\n while (here.length) here.options[0]=null; // remove current list items\n here.options[here.length]=new Option("bookmarks...","",true,true);\n var list=store.getTiddlerText("MiniBrowserList");\n if (list && list.trim().length) {\n var parts=list.split("\sn----\sn");\n for (var p=0; p<parts.length; p++) {\n var lines=parts[p].split("\sn");\n var label=lines.shift(); // 1st line=display text\n var value=lines.shift(); // 2nd line=item value\n var indent=value&&value.length?"\sxa0\sxa0":"";\n here.options[here.length]=new Option(indent+label,value,false,false);\n }\n }\n\nwindow.miniBrowserSetSize = function(form) {\n var f=document.getElementById('browser_$1');\n var w=form.w.value.trim(); if (!w||!w.length) w='100%'; if (!w.replace(/[0-9]*/,'').length) w+='px'; \n var h=form.h.value.trim(); if (!h||!h.length) h='400'; if (!h.replace(/[0-9]*/,'').length) h+='px';\n f.style.width=w; f.style.height=h; f.style.display="block";\n document.getElementById('browser_resize_$1').style.display="block";\n return false;\n}\n\nwindow.miniBrowserResetSize = function() {\n var f=document.getElementById('browser_$1');\n if (f.src.length) f.src="";\n f.style.width='100%'; f.style.height='1em'; f.style.display="none";\n document.getElementById('browser_resize_$1').style.display="none";\n return false;\n}\nwindow.miniBrowserFitSize = function(place) {\n var trim=88; // fudge factor for controls + padding + borders. ADJUST TO FIT LAYOUT\n var t=story.findContainingTiddler(place);\n if (!t) { t=place; while (t && t.className!='floatingPanel') t=t.parentNode; } if (!t) return;\n var w="100%"; // horizontal stretching via CSS works, but vertical stretching doesn't... so:\n var h=(t.offsetHeight-trim); // workaround: get containing panel/tiddler height and subtract "trim" height\n place.form.w.value=w; place.form.h.value=h; // update width/height input fields\n var f=document.getElementById('browser_$1');\n f.style.width=w; f.style.height=h+"px";\n}\n\nwindow.miniBrowserAddBookmark = function(place) {\n var v=place.value; if (!v.length) return;\n var d=prompt("Please enter a description for\sn"+place.value); if (!d || !d.length) return;\n var t = store.getTiddler("MiniBrowserList"); t.set(null,"%0\sn%1\sn----\sn%2".format([d,v,t.text]));\n var here=story.findContainingTiddler(place);\n if (here) story.refreshTiddler(here.getAttribute("tiddler"),1,true);\n story.refreshTiddler("MiniBrowserList",1,true);\n story.refreshTiddler("MiniBrowser",1,true);\n store.setDirty(true);\n}\n\nwindow.miniBrowserDeleteBookmark = function(place) {\n var v=place.value; if (!v.length) return;\n var d=place.options[place.selectedIndex].text; if (!d.length) return;\n var t = store.getTiddler("MiniBrowserList");\n if (!confirm("Are you sure you want to remove this MiniBrowser bookmark?\sn\sn"+d+"\sn"+v)) return;\n var pat='%0\sn%1\sn----\sn'.format([d.replace(/\sxa0/g,''),v]); var re=new RegExp(pat,"i");\n t.set(null,t.text.replace(re,""));\n var here=story.findContainingTiddler(place);\n if (here) story.refreshTiddler(here.getAttribute("tiddler"),1,true);\n story.refreshTiddler("MiniBrowserList",1,true);\n story.refreshTiddler("MiniBrowser",1,true);\n store.setDirty(true);\n}\n</script><<tiddler HideTiddlerTags>>
[[Mode locking of Ti:A1203 lasers and self-focusing: a Gaussian approximation |http://heliotrope.ucsd.edu/Repository.Papers/3.optics.letters_squier_kerr.lens_1991.pdf]]\n!Abstract:\nWe present an ABCD matrix model showing that self-focusing in the laser rod leads to modifications of the Gaussian beam parameters in cw-pumped Ti:Al203 lasers. Stabilization of self-mode-locking should result from these beam perturbations. Experimental measurements of beam modifications supporting this model are presented. The role of gain guiding is studied, and the limitations of the model are discussed.
[[New developments in multiphoton microscopy|http://heliotrope.ucsd.edu/Repository.Papers/Denk_CurrOpinNeurobiol_2002.pdf]]\n!Abstract:\nMultiphoton laser-scanning microscopy is still developing rapidly, both technologically and by broadening its range of application. Technical progress has been made in the optimization of fluorophores, in increasing the imaging depth of multiphoton microscopy, and in microscope miniaturization. These advances further facilitate the study of neuronal structure and signaling in living and even in behaving animals, in particular in combination with the expression of fluorescent proteins. In addition, nonlinear optical contrast mechanisms other than multiphoton excitation of fluorescence are being explored. \n
<!--{{{-->\n<div class='titleLine'>\n <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\n <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n\n <div class="headerOptions">\n <span macro="search"></span>\n <span macro="slider chkSliderOptionsPanel OptionsPanel options 'Change TiddlyWiki advanced options'"></span>\n </div>\n</div>\n\n<div class='header'>\n <div id='rinTopMenu' refresh='content' tiddler='RinTopMenu'></div>\n</div>\n\n<div id='messageArea'></div>\n\n<div id='bodyWrapper'>\n <div id='rinSidebar'>\n <div class='sidebarBlock'>\n <h3>::nav</h3>\n <div refresh='content' tiddler='MainMenu'></div>\n </div>\n\n <div class='sidebarBlock'>\n <h3>::meta</h3>\n <div refresh='content' tiddler='RinTools'></div>\n </div>\n \n <div class='sidebarBlock'>\n <div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n </div>\n </div>\n\n <div id='displayArea'>\n <div id='tiddlerDisplay'></div>\n </div>\n <div id='contentFooter'><p>TiddlyWiki was created by <a href="http://www.tidlywiki.com" title="TiddlyWiki">Jeremy Ruston</a> and TiddlyRin was created by <a href="http://www.checkettsweb.com" title="Checketts Web">Clint Checketts</a></p></div>\n</div>\n<!--}}}-->
![[Paper Repository]]\nArchive of relevant papers, tagged by author, subject, journal. The papers are stored in the directory \nhttp://heliotrope.ucsd.edu/Repository.Papers/\nPhysics \n><<tagging pape