\nThis text is based on the following paper\n\n''What properties characterize the hub proteins of the protein-protein interaction network of //Saccharomyces cerevisiae//?''\n ''Diana Ekman, Sara Light, Åsa K Björklund and Arne Elofsson''\n\n\n''Genome biology 2006''\n\nView this paper: http://genomebiology.com/2006/7/6/R45\n
\nUnlike most proteins, Hub proteins have many interaction partners. The study is based on hub proteins of [[Saccheromyces cervisiae|http://www.yeastgenome.org/]] genome. Properties of hubs are characterized with the help of comparative study between not only party hubs, date hubs with non hubs but also it is based on two different datasets for example [[Database of Interacting Proteins|http://dip.doe-mbi.ucla.edu/]] (DIP) and [[filtered Yeast Interactome|http://www.pubmedcentral.nih.gov/articlerender.fcgi?artid=1464412]] (FYI).\n\nThe unknown function of the protein could be identified by observing the interaction of that protein. There are some conventional techniques to identify protein complexes like [[Tandem-affinity Purification|http://en.wikipedia.org/wiki/Tandem_Affinity_Purification]] (TAP) ''[1]'', [[Mass spectrometry|http://en.wikipedia.org/wiki/Mass_spectrometry]] (MS), [[Yeats two hybrid method|http://www.biologicalprocedures.com/bpo/arts/1/16/m16.htm]]''[2]''. By analyzing these protein complexes large subset of interaction characterized so as to investigate [[topology|http://www.genome.org/cgi/content/full/14/7/1310/DC1]] and evolution of the network is investigated.\nThe identified Saccheromyces cerevisiae protein protein Interactome network (PPIN) shows statstically important[[power-law distribution|http://en.wikipedia.org/wiki/Power_law]]''[3]''. Which are supported by typical characteristics such as,\nFew proteins are highly connected (hubs)\nMost proteins interact with few proteins.\n\nAlthough the coverage of PPIN is low, and correctness of topology is questioned''[4]'', highly connected proteins can certainly be characterized by certain properties. For instance,\n• Hubs are more likely to be essential to S. cerevisiae compared to their counterparts, non hubs''[4]''.\n• Hub proteins could be interesting [[drug targets|http://www.medicalnewstoday.com/medicalnews.php?newsid=67851]]''[5]''.\n• Hubs of PPIN of S. cerevisiae evolve slowly because larger portion of proteins are involved in the interactions''[6]''.\n\nHubs are classified into 2 different hub types based on the expression profile.''[7]''\n1. Static hubs ( Party hubs)\nFound in static complexes where they interact with their partners same time. These hubs thought to be chief part of functional complexes. [[Phylogenetic distribution|http://cat.inist.fr/?aModele=afficheN&cpsidt=2052126]] is broader in these types of hubs.''[8]''\n2. Dynamic hubs (Date hubs)\nBind to their partners at different times or locations. Act as organizing connections between semi-autonomous modules. Therefore, are more important with respect to the topology of network.''[7]'' And as a result, small physical change in these hubs leads to further major change in the genome.\n\nTo study the connectivity properties of hubs in yeast interactome, results of two different datasets DIP and FYI ''[9-10]'' are observed and adjusted. Conclusively, using [[COG|http://www.ncbi.nlm.nih.gov/COG/]]''[11]'' database it is conceived that high connectivity is observed in protein involved in\n• Information storage and processing\n• Cellular processing and signaling.\n
1. Duplicality of hubs are similar to that of other proteins.\n2. Number of retained party hub duplicates has decreased relative to the duplicates of non-hubs during the evolution of S. cerevisiae, possibly dosage sensitivity of party hubs has increased.\n3. The question of high connectivity of hubs can be explained by interaction in the network.\n4. There is an enrichment of multi-domain proteins among the hub proteins compared to non-hub proteins.\n5. Presence of repeated and multiple domains can explain their interactions to some extent.\n6. There are different properties of party hubs and date hubs.
As discussed earlier there is high complexity in eukaryotes than prokaryotes. Because there are more number of domain combination in eukaryotes. Additionally it has been shown that proportion of [[multi-domain proteins|http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=pubmed&cmd=Retrieve&list_uids=15093836]] in hubs is larger than shorter non hubs. Repeating domains typically function as binders. Ex. [[WD40|http://www.biochem.northwestern.edu/holmgren/Glossary/Definitions/Def-W/WD40_repeat.html repeat. They take part in the processes like formation of [[multiple protein complex|]], [[transcription regulation|http://en.wikipedia.org/wiki/Gene_regulation#Regulation_of_transcription]]''[18]''. Therefore they are expected to be associated with high connectivity.\nDisordered regions are suggested to be important for rapidly reversible binding found mainly in proteins with high connectivity. And it is predicted that hubs contained more disordered regions than [[non hubs|]], especially [[date hubs|]]. Therefore, these regions are more useful for date hubs.\n
Since PPIN is susceptible to intentional attack on hubs''[13]'', to make hubs robust, there is a possibility of S. cerevisiae genome to contain duplication of hubs. But, duplication in the genome may lead to [[genomic imbalance|http://www.pubmedcentral.nih.gov/articlerender.fcgi?artid=1501280]]''[14]''. When it is investigated the recent distribution of paralogs evolved (named inparalogs''[15]'') after a split between two species, occurred 330 to 440 million years ago. And results showed that fewer proteins have inparalogs compared to other proteins. Whole genome duplication (WGD comprises of inparalogs) event occurred in S. cerevisiae genome 100 million years ago. And because of the concentration imbalance is yet to develop, the [[ohnologs|http://www.genome.org/cgi/content/full/15/10/1456]] ''[16]'' (paralogs originating from WGD) are likely to be retained in genome. Therefore it is concluded that balanced dosage of complex components after WGD event was insufficient to promote party hub retention. After duplication both partners are likely to gain or lost more interacting partners. Paralogs possibly provide mutational robustness to PPIN.''[17]''\n
Previous study indicates that protein with high connectivity binds with proteins with low connectivity''[19]''. And nature of connection between party and date hubs will be different. Compared to date hubs which has lasting connections party hubs often tend to interact with each other. And party hubs represent [[functional modules|http://www.pnas.org/cgi/content/abstract/99/9/5890]] as well.\nIt is investigated that if hubs are specialized in binding with other proteins or their diverse domain composition play vital role. If duplication is the reason for increasing number of interactions, then many neighbors will be [[paralogs|http://en.wikipedia.org/wiki/Homology_(biology)#Paralogy]]''[20]''. E.g. [[Septin ring|http://www.molbiolcell.org/cgi/content/full/16/8/3455]]. However, only a small fraction of interaction are explained by interaction with paralogs and these interactions are often lost after duplication also''[21]''. A domain recurring in all neighbor proteins could provide a binding site. Therefore most frequently shared domain (MFSD) is studied. And reach to the final results that,\n• Hubs often do not interact with paralogous groups.\n• Multi-domain proteins have more diverse binding partners.\n• Partner flexibility seems to be higher in proteins with disordered regions or domain repeats.\n
The recent observation showed that party hubs are found more in [[eukaryotes|http://en.wikipedia.org/wiki/Eukaryote]] than [[prokaryotes|http://en.wikipedia.org/wiki/Prokaryotes]]''[8]''. And larger portion of hubs have eukaryotic [[ortholog|http://en.wikipedia.org/wiki/Ortholog]]. To throw some light on protein age, [[Pfam|http://www.sanger.ac.uk/Software/Pfam/]] ''[12]'' domains are assigned to all the proteins and classified. Later, orthologs are analyzed. In conclusion, it is found that party hubs are often older than non hubs. And because of the high connectivity of party hubs it is conclude that unlike non hubs, party hubs are not related with metabolic function.
1. Gavin AC, Bosche M, Krause R, Grandi P, Marzioch M, Bauer A, Schultz J, Rick JM, Michon AM, Cruciat CM, Remor M, et al.: Functional organization of the yeast proteome by systematic analysis of protein complexes.\nNature 2002, 415:141-147. \n2. Uetz P, Giot L, Cagney G, Mansfield TA, Judson RS, Knight JR, Lockshon D, Narayan V, Srinivasan M, Pochart P, Qureshi-Emili A, et al.: A comprehensive analysis of protein-protein interactions in Saccharomyces cerevisiae.\nNature 2000, 403:623-627 \n3. Jeong H, Mason SP, Barabasi AL, Oltvai ZN: Lethality and centrality in protein networks.\nNature 2001, 411:41-42\n4. Han JD, Dupuy D, Bertin N, Cusick ME, Vidal M: Effect of sampling on topology predictions of protein-protein interaction networks.\nNat Biotechnol 2005, 23:839-844.\n5. Apic G, Ignjatovic T, Boyer S, Russell RB: Illuminating drug discovery with biological pathways.\nFEBS Lett 2005, 579:1872-1877.\n6. Fraser HB, Hirsh AE, Steinmetz LM, Scharfe C, Feldman MW: Evolutionary rate in the protein interaction network.\nScience 2002, 296:750-752.\n7. Han JD, Bertin N, Hao T, Goldberg DS, Berriz GF, Zhang LV, Dupuy D, Walhout AJ, Cusick ME, Roth FP, Vidal M, et al.: Evidence for dynamically organized modularity in the yeast protein-protein interaction network.\nNature 2004, 430:88-93.\n8. Fraser HB: Modularity and evolutionary constraint on proteins.\nNat Genet 2005, 37:351-352.\n9. Deane CM, Salwinski L, Xenarios I, Eisenberg D: Protein interactions: two methods for assessment of the reliability of high throughput observations.\nMol Cell Proteomics 2002, 1:349-356\n10. Salwinski L, Miller CS, Smith AJ, Pettit FK, Bowie JU, Eisenberg D: The Database of Interacting Proteins: 2004 update.\nNucleic Acids Res 2004, 32:D449-D451.\n11. Tatusov R, Fedorova ND, Jackson JD, Jacobs AR, Kiryutin B, Koonin EV, Krylov DM, Mazumder R, Mekhedov SL, Nikolskaya AN, Rao BS, et al.: The COG database: an updated version includes eukaryotes.\nBMC Bioinformatics 2003, 4:41.\n12. Sonnhammer EL, Eddy SR, Durbin R: Pfam: a Comprehensive database of protein domain families based on seed alignments.\nProteins Struct Funct Genet 1997, 28:405-420.\n13. Albert R, Jeong H, Barabasi AL: Error and attack tolerance of complex networks.\nNature 2000, 406:378-382.\n14. Papp B, Pal C, Hurst LD: Dosage sensitivity and the evolution of gene families in yeast.\nNature 2003, 424:194-197\n15. Remm M, Storm CE, Sonnhammer EL: Automatic clustering of orthologs and in-paralogs from pairwise species comparisons.\nJ Mol Biol 2001, 314:1041-1052.\n16. Byrne KP, Wolfe KH: The Yeast Gene Order Browser: combining curated homology and syntenic context reveals gene fate in polyploid species.\nGenome Res 2005, 15:1456-1461.\n17. Wagner A: Distributed robustness versus redundancy as causes of mutational robustness.\nBioessays 2005, 27:176-188.\n18. Smith TF, Gaitatzes C, Saxena K, Neer EJ: The WD repeat: a common architecture for diverse functions.\nTrends Biochem Sci 1999, 24:181-185.\n19. Maslov S, Sneppen K: Specificity and stability in topology of protein networks.\nScience 2002, 296:910-913.\n20. Qin H, Lu HH, Wu WB, Li WH: Evolution of the yeast protein interaction network.\nProc Nat Acad Sci USA 2003, 100:12820-12824.\n21. Wagner A: The yeast protein interaction network evolves rapidly and contains few redundant duplicate genes.\nMol Biol Evol 2001, 18:1283-1292.\n
Featuring the properties of hub proteins in the genome of //Saccharomyces cerevisiae.//
Hub proteins\n
/***\nRequired by Tiddlyspot\n***/\n//{{{\n\nconfig.options.chkHttpReadOnly = false; // make it so you can by default see edit controls via http\n\nif (window.location.protocol != "file:")\n config.options.chkGTDLazyAutoSave = false; // disable autosave in d3\n\nconfig.tiddlyspotSiteId = 'proteinnet';\n\n// probably will need to redo this for TW 2.2\nwith (config.shadowTiddlers) {\n SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';\n SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");\n OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");\n DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[Welcome to Tiddlyspot]] ");\n MainMenu = MainMenu.replace(/^/,"[[Welcome to Tiddlyspot]] ");\n}\n\nmerge(config.shadowTiddlers,{\n\n'Welcome to Tiddlyspot':[\n "This document is a ~TiddlyWiki from tiddlyspot.com. A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below. Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",\n "<<tiddler TspotControls>>",\n "See also GettingStarted.",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the \s"save to web\s" button in the column on the right.",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick. You can make changes and save them locally without being connected to the Internet. When you're ready to sync up again, just click \s"upload\s" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]]. Also visit [[TiddlyWiki Guides|http://tiddlywikiguides.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help. If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site. Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."\n].join("\sn"),\n\n'TspotControls':[\n "| tiddlyspot password:|<<option pasUploadPassword>>|",\n "| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<<br>>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",\n "| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[announcements|http://announce.tiddlyspot.com/]], [[blog|http://tiddlyspot.com/blog/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"\n].join("\sn"),\n\n'TspotSidebar':[\n "<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"\n].join("\sn"),\n\n'TspotOptions':[\n "tiddlyspot password:",\n "<<option pasUploadPassword>>",\n ""\n].join("\sn")\n\n});\n//}}}\n
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |\n| 25/4/2007 23:30:39 | YourName | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 25/4/2007 23:36:41 | YourName | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 25/4/2007 23:48:3 | YourName | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 26/4/2007 0:13:44 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 0:16:13 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 0:20:3 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 0:23:36 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 0:25:32 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 0:28:21 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 0:48:55 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 0:49:26 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 0:51:15 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 0:59:40 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 1:58:18 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 2:9:31 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 2:11:9 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 2:28:9 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 3:35:25 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 3:55:10 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 3:55:40 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 4:19:14 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 4:43:47 | AroDash | [[/|http://proteinnet.tiddlyspot.com/]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 26/4/2007 4:56:15 | AroDash | [[index.html|http://proteinnet.tiddlyspot.com/index.html]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 4:57:13 | AroDash | [[index.html|http://proteinnet.tiddlyspot.com/index.html]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 4:58:31 | AroDash | [[index.html|http://proteinnet.tiddlyspot.com/index.html]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 26/4/2007 4:59:58 | AroDash | [[index.html|http://proteinnet.tiddlyspot.com/index.html]] | [[store.cgi|http://proteinnet.tiddlyspot.com/store.cgi]] | . | index.html | . |
/***\n|''Name:''|UploadPlugin|\n|''Description:''|Save to web a TiddlyWiki|\n|''Version:''|3.4.5|\n|''Date:''|Oct 15, 2006|\n|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|\n|''Documentation:''|http://tiddlywiki.bidix.info/#UploadDoc|\n|''Author:''|BidiX (BidiX (at) bidix (dot) info)|\n|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|\n|''~CoreVersion:''|2.0.0|\n|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|\n|''Include:''|config.lib.file; config.lib.log; config.lib.options; PasswordTweak|\n|''Require:''|[[UploadService|http://tiddlywiki.bidix.info/#UploadService]]|\n***/\n//{{{\nversion.extensions.UploadPlugin = {\n major: 3, minor: 4, revision: 5, \n date: new Date(2006,9,15),\n source: 'http://tiddlywiki.bidix.info/#UploadPlugin',\n documentation: 'http://tiddlywiki.bidix.info/#UploadDoc',\n author: 'BidiX (BidiX (at) bidix (dot) info',\n license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',\n coreVersion: '2.0.0',\n browser: 'Firefox 1.5; InternetExplorer 6.0; Safari'\n};\n//}}}\n\n////+++!![config.lib.file]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.file) config.lib.file= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.file.dirname = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(0, lastpos);\n } else {\n return filePath.substring(0, filePath.lastIndexOf("\s\s"));\n }\n};\nconfig.lib.file.basename = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("#")) != -1) \n filePath = filePath.substring(0, lastpos);\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(lastpos + 1);\n } else\n return filePath.substring(filePath.lastIndexOf("\s\s")+1);\n};\nwindow.basename = function() {return "@@deprecated@@";};\n//}}}\n////===\n\n////+++!![config.lib.log]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.log) config.lib.log= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 1}, \n date: new Date(2006,8,19)\n};\nconfig.lib.Log = function(tiddlerTitle, logHeader) {\n if (version.major < 2)\n this.tiddler = store.tiddlers[tiddlerTitle];\n else\n this.tiddler = store.getTiddler(tiddlerTitle);\n if (!this.tiddler) {\n this.tiddler = new Tiddler();\n this.tiddler.title = tiddlerTitle;\n this.tiddler.text = "| !date | !user | !location |" + logHeader;\n this.tiddler.created = new Date();\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[tiddlerTitle] = this.tiddler;\n else\n store.addTiddler(this.tiddler);\n }\n return this;\n};\n\nconfig.lib.Log.prototype.newLine = function (line) {\n var now = new Date();\n var newText = "| ";\n newText += now.getDate()+"/"+(now.getMonth()+1)+"/"+now.getFullYear() + " ";\n newText += now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()+" | ";\n newText += config.options.txtUserName + " | ";\n var location = document.location.toString();\n var filename = config.lib.file.basename(location);\n if (!filename) filename = '/';\n newText += "[["+filename+"|"+location + "]] |";\n this.tiddler.text = this.tiddler.text + "\sn" + newText;\n this.addToLine(line);\n};\n\nconfig.lib.Log.prototype.addToLine = function (text) {\n this.tiddler.text = this.tiddler.text + text;\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[this.tiddler.tittle] = this.tiddler;\n else {\n store.addTiddler(this.tiddler);\n story.refreshTiddler(this.tiddler.title);\n store.notify(this.tiddler.title, true);\n }\n if (version.major < 2)\n store.notifyAll(); \n};\n//}}}\n////===\n\n////+++!![config.lib.options]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.options) config.lib.options = {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\n\nconfig.lib.options.init = function (name, defaultValue) {\n if (!config.options[name]) {\n config.options[name] = defaultValue;\n saveOptionCookie(name);\n }\n};\n//}}}\n////===\n\n////+++!![PasswordTweak]\n\n//{{{\nversion.extensions.PasswordTweak = {\n major: 1, minor: 0, revision: 3, date: new Date(2006,8,30),\n type: 'tweak',\n source: 'http://tiddlywiki.bidix.info/#PasswordTweak'\n};\n//}}}\n/***\n!!config.macros.option\n***/\n//{{{\nconfig.macros.option.passwordCheckboxLabel = "Save this password on this computer";\nconfig.macros.option.passwordType = "password"; // password | text\n\nconfig.macros.option.onChangeOption = function(e)\n{\n var opt = this.getAttribute("option");\n var elementType,valueField;\n if(opt) {\n switch(opt.substr(0,3)) {\n case "txt":\n elementType = "input";\n valueField = "value";\n break;\n case "pas":\n elementType = "input";\n valueField = "value";\n break;\n case "chk":\n elementType = "input";\n valueField = "checked";\n break;\n }\n config.options[opt] = this[valueField];\n saveOptionCookie(opt);\n var nodes = document.getElementsByTagName(elementType);\n for(var t=0; t<nodes.length; t++) \n {\n var optNode = nodes[t].getAttribute("option");\n if (opt == optNode) \n nodes[t][valueField] = this[valueField];\n }\n }\n return(true);\n};\n\nconfig.macros.option.handler = function(place,macroName,params)\n{\n var opt = params[0];\n if(config.options[opt] === undefined) {\n return;}\n var c;\n switch(opt.substr(0,3)) {\n case "txt":\n c = document.createElement("input");\n c.onkeyup = this.onChangeOption;\n c.setAttribute ("option",opt);\n c.className = "txtOptionInput "+opt;\n place.appendChild(c);\n c.value = config.options[opt];\n break;\n case "pas":\n // input password\n c = document.createElement ("input");\n c.setAttribute("type",config.macros.option.passwordType);\n c.onkeyup = this.onChangeOption;\n c.setAttribute("option",opt);\n c.className = "pasOptionInput "+opt;\n place.appendChild(c);\n c.value = config.options[opt];\n // checkbox link with this password "save this password on this computer"\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option","chk"+opt);\n c.className = "chkOptionInput "+opt;\n place.appendChild(c);\n c.checked = config.options["chk"+opt];\n // text savePasswordCheckboxLabel\n place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));\n break;\n case "chk":\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option",opt);\n c.className = "chkOptionInput "+opt;\n place.appendChild(c);\n c.checked = config.options[opt];\n break;\n }\n};\n//}}}\n/***\n!! Option cookie stuff\n***/\n//{{{\nwindow.loadOptionsCookie_orig_PasswordTweak = window.loadOptionsCookie;\nwindow.loadOptionsCookie = function()\n{\n var cookies = document.cookie.split(";");\n for(var c=0; c<cookies.length; c++) {\n var p = cookies[c].indexOf("=");\n if(p != -1) {\n var name = cookies[c].substr(0,p).trim();\n var value = cookies[c].substr(p+1).trim();\n switch(name.substr(0,3)) {\n case "txt":\n config.options[name] = unescape(value);\n break;\n case "pas":\n config.options[name] = unescape(value);\n break;\n case "chk":\n config.options[name] = value == "true";\n break;\n }\n }\n }\n};\n\nwindow.saveOptionCookie_orig_PasswordTweak = window.saveOptionCookie;\nwindow.saveOptionCookie = function(name)\n{\n var c = name + "=";\n switch(name.substr(0,3)) {\n case "txt":\n c += escape(config.options[name].toString());\n break;\n case "chk":\n c += config.options[name] ? "true" : "false";\n // is there an option link with this chk ?\n if (config.options[name.substr(3)]) {\n saveOptionCookie(name.substr(3));\n }\n break;\n case "pas":\n if (config.options["chk"+name]) {\n c += escape(config.options[name].toString());\n } else {\n c += "";\n }\n break;\n }\n c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";\n document.cookie = c;\n};\n//}}}\n/***\n!! Initializations\n***/\n//{{{\n// define config.options.pasPassword\nif (!config.options.pasPassword) {\n config.options.pasPassword = 'defaultPassword';\n window.saveOptionCookie('pasPassword');\n}\n// since loadCookies is first called befor password definition\n// we need to reload cookies\nwindow.loadOptionsCookie();\n//}}}\n////===\n\n////+++!![config.macros.upload]\n\n//{{{\nconfig.macros.upload = {\n accessKey: "U",\n formName: "UploadPlugin",\n contentType: "text/html;charset=UTF-8",\n defaultStoreScript: "store.php"\n};\n\n// only this two configs need to be translated\nconfig.macros.upload.messages = {\n aboutToUpload: "About to upload TiddlyWiki to %0",\n backupFileStored: "Previous file backuped in %0",\n crossDomain: "Certainly a cross-domain isue: access to an other site isn't allowed",\n errorDownloading: "Error downloading",\n errorUploadingContent: "Error uploading content",\n fileLocked: "Files is locked: You are not allowed to Upload",\n fileNotFound: "file to upload not found",\n fileNotUploaded: "File %0 NOT uploaded",\n mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\n passwordEmpty: "Unable to upload, your password is empty",\n urlParamMissing: "url param missing",\n rssFileNotUploaded: "RssFile %0 NOT uploaded",\n rssFileUploaded: "Rss File uploaded to %0"\n};\n\nconfig.macros.upload.label = {\n promptOption: "Save and Upload this TiddlyWiki with UploadOptions",\n promptParamMacro: "Save and Upload this TiddlyWiki in %0",\n saveLabel: "save to web", \n saveToDisk: "save to disk",\n uploadLabel: "upload" \n};\n\nconfig.macros.upload.handler = function(place,macroName,params){\n // parameters initialization\n var storeUrl = params[0];\n var toFilename = params[1];\n var backupDir = params[2];\n var uploadDir = params[3];\n var username = params[4];\n var password; // for security reason no password as macro parameter\n var label;\n if (document.location.toString().substr(0,4) == "http")\n label = this.label.saveLabel;\n else\n label = this.label.uploadLabel;\n var prompt;\n if (storeUrl) {\n prompt = this.label.promptParamMacro.toString().format([this.toDirUrl(storeUrl, uploadDir, username)]);\n }\n else {\n prompt = this.label.promptOption;\n }\n createTiddlyButton(place, label, prompt, \n function () {\n config.macros.upload.upload(storeUrl, toFilename, uploadDir, backupDir, username, password); \n return false;}, \n null, null, this.accessKey);\n};\nconfig.macros.upload.UploadLog = function() {\n return new config.lib.Log('UploadLog', " !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |" );\n};\nconfig.macros.upload.UploadLog.prototype = config.lib.Log.prototype;\nconfig.macros.upload.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {\n var line = " [[" + config.lib.file.basename(storeUrl) + "|" + storeUrl + "]] | ";\n line += uploadDir + " | " + toFilename + " | " + backupDir + " |";\n this.newLine(line);\n};\nconfig.macros.upload.UploadLog.prototype.endUpload = function() {\n this.addToLine(" Ok |");\n};\nconfig.macros.upload.basename = config.lib.file.basename;\nconfig.macros.upload.dirname = config.lib.file.dirname;\nconfig.macros.upload.toRootUrl = function (storeUrl, username)\n{\n return root = (this.dirname(storeUrl)?this.dirname(storeUrl):this.dirname(document.location.toString()));\n}\nconfig.macros.upload.toDirUrl = function (storeUrl, uploadDir, username)\n{\n var root = this.toRootUrl(storeUrl, username);\n if (uploadDir && uploadDir != '.')\n root = root + '/' + uploadDir;\n return root;\n}\nconfig.macros.upload.toFileUrl = function (storeUrl, toFilename, uploadDir, username)\n{\n return this.toDirUrl(storeUrl, uploadDir, username) + '/' + toFilename;\n}\nconfig.macros.upload.upload = function(storeUrl, toFilename, uploadDir, backupDir, username, password)\n{\n // parameters initialization\n storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);\n toFilename = (toFilename ? toFilename : config.options.txtUploadFilename);\n backupDir = (backupDir ? backupDir : config.options.txtUploadBackupDir);\n uploadDir = (uploadDir ? uploadDir : config.options.txtUploadDir);\n username = (username ? username : config.options.txtUploadUserName);\n password = config.options.pasUploadPassword; // for security reason no password as macro parameter\n if (!password || password === '') {\n alert(config.macros.upload.messages.passwordEmpty);\n return;\n }\n if (storeUrl === '') {\n storeUrl = config.macros.upload.defaultStoreScript;\n }\n if (config.lib.file.dirname(storeUrl) === '') {\n storeUrl = config.lib.file.dirname(document.location.toString())+'/'+storeUrl;\n }\n if (toFilename === '') {\n toFilename = config.lib.file.basename(document.location.toString());\n }\n\n clearMessage();\n // only for forcing the message to display\n if (version.major < 2)\n store.notifyAll();\n if (!storeUrl) {\n alert(config.macros.upload.messages.urlParamMissing);\n return;\n }\n // Check that file is not locked\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n if (BidiX.GroupAuthoring.lock.isLocked() && !BidiX.GroupAuthoring.lock.isMyLock()) {\n alert(config.macros.upload.messages.fileLocked);\n return;\n }\n }\n \n var log = new this.UploadLog();\n log.startUpload(storeUrl, toFilename, uploadDir, backupDir);\n if (document.location.toString().substr(0,5) == "file:") {\n saveChanges();\n }\n var toDir = config.macros.upload.toDirUrl(storeUrl, toFilename, uploadDir, username);\n displayMessage(config.macros.upload.messages.aboutToUpload.format([toDir]), toDir);\n this.uploadChanges(storeUrl, toFilename, uploadDir, backupDir, username, password);\n if(config.options.chkGenerateAnRssFeed) {\n //var rssContent = convertUnicodeToUTF8(generateRss());\n var rssContent = generateRss();\n var rssPath = toFilename.substr(0,toFilename.lastIndexOf(".")) + ".xml";\n this.uploadContent(rssContent, storeUrl, rssPath, uploadDir, '', username, password, \n function (responseText) {\n if (responseText.substring(0,1) != '0') {\n displayMessage(config.macros.upload.messages.rssFileNotUploaded.format([rssPath]));\n }\n else {\n var toFileUrl = config.macros.upload.toFileUrl(storeUrl, rssPath, uploadDir, username);\n displayMessage(config.macros.upload.messages.rssFileUploaded.format(\n [toFileUrl]), toFileUrl);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n });\n }\n return;\n};\n\nconfig.macros.upload.uploadChanges = function(storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var original;\n if (document.location.toString().substr(0,4) == "http") {\n original = this.download(storeUrl, toFilename, uploadDir, backupDir, username, password);\n return;\n }\n else {\n // standard way : Local file\n \n original = loadFile(getLocalPath(document.location.toString()));\n if(window.Components) {\n // it's a mozilla browser\n try {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]\n .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);\n converter.charset = "UTF-8";\n original = converter.ConvertToUnicode(original);\n }\n catch(e) {\n }\n }\n }\n //DEBUG alert(original);\n this.uploadChangesFrom(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password);\n};\n\nconfig.macros.upload.uploadChangesFrom = function(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var startSaveArea = '<div id="' + 'storeArea">'; // Split up into two so that indexOf() of this source doesn't find it\n var endSaveArea = '</d' + 'iv>';\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1))\n {\n alert(config.messages.invalidFileError.format([document.location.toString()]));\n return;\n }\n var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + \n allTiddlersAsHtml() + "\sn\st\st" +\n original.substr(posClosingDiv);\n var newSiteTitle;\n if(version.major < 2){\n newSiteTitle = (getElementText("siteTitle") + " - " + getElementText("siteSubtitle")).htmlEncode();\n } else {\n newSiteTitle = (wikifyPlain ("SiteTitle") + " - " + wikifyPlain ("SiteSubtitle")).htmlEncode();\n }\n\n revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");\n revised = revised.replaceChunk("<!--PRE-HEAD-START--"+">","<!--PRE-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPreHead","") + "\sn");\n revised = revised.replaceChunk("<!--POST-HEAD-START--"+">","<!--POST-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPostHead","") + "\sn");\n revised = revised.replaceChunk("<!--PRE-BODY-START--"+">","<!--PRE-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPreBody","") + "\sn");\n revised = revised.replaceChunk("<!--POST-BODY-START--"+">","<!--POST-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPostBody","") + "\sn");\n\n var response = this.uploadContent(revised, storeUrl, toFilename, uploadDir, backupDir, \n username, password, function (responseText) {\n if (responseText.substring(0,1) != '0') {\n alert(responseText);\n displayMessage(config.macros.upload.messages.fileNotUploaded.format([getLocalPath(document.location.toString())]));\n }\n else {\n if (uploadDir !== '') {\n toFilename = uploadDir + "/" + config.macros.upload.basename(toFilename);\n } else {\n toFilename = config.macros.upload.basename(toFilename);\n }\n var toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);\n if (responseText.indexOf("destfile:") > 0) {\n var destfile = responseText.substring(responseText.indexOf("destfile:")+9, \n responseText.indexOf("\sn", responseText.indexOf("destfile:")));\n toFileUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + destfile;\n }\n else {\n toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);\n }\n displayMessage(config.macros.upload.messages.mainFileUploaded.format(\n [toFileUrl]), toFileUrl);\n if (backupDir && responseText.indexOf("backupfile:") > 0) {\n var backupFile = responseText.substring(responseText.indexOf("backupfile:")+11, \n responseText.indexOf("\sn", responseText.indexOf("backupfile:")));\n toBackupUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + backupFile;\n displayMessage(config.macros.upload.messages.backupFileStored.format(\n [toBackupUrl]), toBackupUrl);\n }\n var log = new config.macros.upload.UploadLog();\n log.endUpload();\n store.setDirty(false);\n // erase local lock\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n BidiX.GroupAuthoring.lock.eraseLock();\n // change mtime with new mtime after upload\n var mtime = responseText.substr(responseText.indexOf("mtime:")+6);\n BidiX.GroupAuthoring.lock.mtime = mtime;\n }\n \n \n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n }\n );\n};\n\nconfig.macros.upload.uploadContent = function(content, storeUrl, toFilename, uploadDir, backupDir, \n username, password, callbackFn) {\n var boundary = "---------------------------"+"AaB03x"; \n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n if (window.netscape){\n try {\n if (document.location.toString().substr(0,4) != "http") {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');}\n }\n catch (e) {}\n } \n //DEBUG alert("user["+config.options.txtUploadUserName+"] password[" + config.options.pasUploadPassword + "]");\n // compose headers data\n var sheader = "";\n sheader += "--" + boundary + "\sr\snContent-disposition: form-data; name=\s"";\n sheader += config.macros.upload.formName +"\s"\sr\sn\sr\sn";\n sheader += "backupDir="+backupDir\n +";user=" + username \n +";password=" + password\n +";uploaddir=" + uploadDir;\n // add lock attributes to sheader\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n var l = BidiX.GroupAuthoring.lock.myLock;\n sheader += ";lockuser=" + l.user\n + ";mtime=" + l.mtime\n + ";locktime=" + l.locktime;\n }\n sheader += ";;\sr\sn"; \n sheader += "\sr\sn" + "--" + boundary + "\sr\sn";\n sheader += "Content-disposition: form-data; name=\s"userfile\s"; filename=\s""+toFilename+"\s"\sr\sn";\n sheader += "Content-Type: " + config.macros.upload.contentType + "\sr\sn";\n sheader += "Content-Length: " + content.length + "\sr\sn\sr\sn";\n // compose trailer data\n var strailer = new String();\n strailer = "\sr\sn--" + boundary + "--\sr\sn";\n //strailer = "--" + boundary + "--\sr\sn";\n var data;\n data = sheader + content + strailer;\n //request.open("POST", storeUrl, true, username, password);\n try {\n request.open("POST", storeUrl, true); \n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if (request.status == 200)\n callbackFn(request.responseText);\n else\n alert(config.macros.upload.messages.errorUploadingContent + "\snStatus: "+request.status.statusText);\n }\n };\n request.setRequestHeader("Content-Length",data.length);\n request.setRequestHeader("Content-Type","multipart/form-data; boundary="+boundary);\n request.send(data); \n};\n\n\nconfig.macros.upload.download = function(uploadUrl, uploadToFilename, uploadDir, uploadBackupDir, \n username, password) {\n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n try {\n if (uploadUrl.substr(0,4) == "http") {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n }\n else {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n }\n } catch (e) { }\n //request.open("GET", document.location.toString(), true, username, password);\n try {\n request.open("GET", document.location.toString(), true);\n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\n \n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if(request.status == 200) {\n config.macros.upload.uploadChangesFrom(request.responseText, uploadUrl, \n uploadToFilename, uploadDir, uploadBackupDir, username, password);\n }\n else\n alert(config.macros.upload.messages.errorDownloading.format(\n [document.location.toString()]) + "\snStatus: "+request.status.statusText);\n }\n };\n request.send(null);\n};\n\n//}}}\n////===\n\n////+++!![Initializations]\n\n//{{{\nconfig.lib.options.init('txtUploadStoreUrl','store.php');\nconfig.lib.options.init('txtUploadFilename','');\nconfig.lib.options.init('txtUploadDir','');\nconfig.lib.options.init('txtUploadBackupDir','');\nconfig.lib.options.init('txtUploadUserName',config.options.txtUserName);\nconfig.lib.options.init('pasUploadPassword','');\nsetStylesheet(\n ".pasOptionInput {width: 11em;}\sn"+\n ".txtOptionInput.txtUploadStoreUrl {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadFilename {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadDir {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadBackupDir {width: 25em;}\sn"+\n "",\n "UploadOptionsStyles");\nif (document.location.toString().substr(0,4) == "http") {\n config.options.chkAutoSave = false; \n saveOptionCookie('chkAutoSave');\n}\nconfig.shadowTiddlers.UploadDoc = "[[Full Documentation|http://tiddlywiki.bidix.info/l#UploadDoc ]]\sn"; \n\n//}}}\n////===\n\n////+++!![Core Hijacking]\n\n//{{{\nconfig.macros.saveChanges.label_orig_UploadPlugin = config.macros.saveChanges.label;\nconfig.macros.saveChanges.label = config.macros.upload.label.saveToDisk;\n\nconfig.macros.saveChanges.handler_orig_UploadPlugin = config.macros.saveChanges.handler;\n\nconfig.macros.saveChanges.handler = function(place)\n{\n if ((!readOnly) && (document.location.toString().substr(0,4) != "http"))\n createTiddlyButton(place,this.label,this.prompt,this.onClick,null,null,this.accessKey);\n};\n\n//}}}\n////===\n\n