----\n!!!Counter Strike\n__Counter Strike Server 1__ : 217.117.80.29:27015\n__Counter Strike Server 2__ : 217.117.80.29:27016\n\n----\n!!!World of Warcraft\n\n----\n!!!Lineage\n\n----\n
----\n!!Официальный форум сети Homenet: http://forum.hnet.ru\n[[Раздел р2р-сети|http://forum.hnet.ru/index.php?showforum=60]]\n\n----\n!!Форум Филина: http://owl.pp.ru\n\n-----\n!!Форум семерки: http://land7.nsu.ru\nСамый густонаселеный из универовских форумов\n\n----\n!!Форум БляХаба: http://192.168.1.104\nСтранное место, странные люди... :)\n----
[[Смотреть|http://192.168.128.6/photo/2zh/index.html]]
\nДата - 7 мая 2006 года. Клуб "Адреналин". Участники: администрация сети Homenet и модераторы официального форума.\n\n[[Смотреть|http://192.168.128.6/photo/moders/index.html]]\n
\nДата - 9 мая 2006 года. Бердск. Центральная площадь.\n\n[[Смотреть|http://192.168.128.6/photo/salute/index.html]]\n
!!Добро пожаловать в информационную систему фирмы Диадема!\n\nНа этом сайте будет размещаться информация, касающаяся работы фирмы, объявления, новости IT-рынка, обзоры новинок, новости от поставщиков, различная справочная информация.\n\nЗа наполнение сайта пока отвечает Рустам. Всю информацию для размещения здесь нужно передавать, пересылать или доставлять иным способом ему.\n\n
\n!!!Atlant, он же Atlant_is\n\nАдминистратор хаба Атлантида. \n\n//Имя в оффлайне:N/A\nICQ: N/A\ne-mail: N/A\nтелефон: N/A//\n\n
/***\n|''Name:''|CalendarMakerPlugin |\n|''Version:''|$Revision: 13 $ |\n|''Source:''|http://thePettersons.org/tiddlywiki.html#CalendarMakerPlugin |\n|''Author:''|[[Paul Petterson]] |\n|''Type:''|Macro Extension |\n|''Requires:''|TiddlyWiki 1.2.33 or higher and the newerTiddler macro |\n!Description\nBuilds a simple calendar that can be used to access tiddlers with date formatted names.\n\n!Syntax\n* {{{<<calendarMaker>>}}} - generates a calendar for this month\n* {{{<<calendarMaker 2005 10>>}}} - generates a calendar for a particular month/year\n\n!Sample Output\n<<calendarMaker>>\n\n!Sample Small Calendar (my target)\n| !< |>|>|>|>| !October 2005 | !> |\n| !Mon | !Tue | !Wed | !Thu | !Fri | !Sat | !Sun |\n|>|>|>|>|bgcolor(gray): | 01 | 02 |\n| 03 | 04 | 05 | 06 | 07 | 08 | 09 |\n| 10 | 11 | 12 | 13 | 14 | 15 | 16 |\n| 17 | 18 | 19 | 20 | 21 | 22 | 23 |\n| 24 | 25 | 26 | 27 | 28 | 29 | 30 |\n| 31 |>|>|>|>|>|bgcolor(gray): |\n\n!Known issues\n* Must have the new wikifier introduced in version 1.2.33, won't work at all in older version of TW...\n\n!Notes\n* cleanup the dowIndex stuff - you don't really need it...\n* Current Limitations (Stuff I plan on implementing)\n** You can't set the first day of the week for display\n** You can't change the size of the calendar\n** You can't //browse// the calendar\n** You can't change the button features\n\n\n!Revision history\n$History: PaulsNotepad.html $\n * \n * ***************** Version 1 *****************\n * User: paulpet Date: 2/26/06 Time: 7:44p\n * Created in $/PaulsNotepad3.0.root/PaulsNotepad3.0/PaulsPlugins/systemConfig\n * dusted it off!\nv0.1 - October 4th, 2005 - initial public release (beta)\n\n!Code\n***/\n//{{{\nconfig.macros.calendarMaker = { \ndays:["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],\nshortDays:["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],\nmonths:["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],\nshortMonths:["Jan", "Feb", "Mar", "Apr", "May", "Jun", "July", "Aug", "Sept", "Oct", "Nov", "Dec"],\nmakeButton: function( d ) {\n var y = d.getFullYear() ;\n var m = d.getMonth() ;\n var date = d.getDate();\n var dateString = y + "/" + (m+1) + "/" + date ;\n return "<<newerTiddler button:\s"" + date + "\s" name:\s"Inbox " + dateString + "\s" tags:\s"[[My Inbox]] [[" + dateString + "]]\s" text:\s"!Today: " + d + "\s">>" ;\n},\nhandler: function(place,macroName,params) {\n var dateNow = new Date() ;\n var year = params[0] ? params[0] : dateNow.getFullYear() ;\n var month = params[1] ? params[1] - 1 : dateNow.getMonth() ;\n\n // validation\n // if ( year < 100 ) year += 1900 ;\n\n var start = null ;\n try {\n start = new Date( year, month, 1 ) ;\n } catch(e) {\n displayMessage( "Invalid Date year:" + year + " month:" + month ) ;\n displayMessage( "Date Error: " + e ) ;\n }\n\n if ( start == null ) throw "Invalid Date Error" ;\n\n var calendarOutput = "| !< |>|>|>|>| !" + config.macros.calendarMaker.months[ month ] + ", " + year + " | !> |\sn"\n calendarOutput += "|" ;\n for( var i=0; i<config.macros.calendarMaker.shortDays.length; i++ )\n calendarOutput += " !" + config.macros.calendarMaker.shortDays[i] + " |" ;\n calendarOutput += "\sn"\n\n // skip weekdays until the 1st of the month\n var dowIndex = 0 ;\n if ( start.getDay() > 0 ) {\n calendarOutput += "|" ;\n while( ++dowIndex <= start.getDay()-1 )\n calendarOutput += ">|" ;\n calendarOutput += "bgcolor(gray): | " ;\n }\n\n while( start.getMonth() == month ) {\n // if we start a new week, open up the table...\n if ( dowIndex == 0 )\n calendarOutput += "|" ;\n\n // append the date to the calendar, increment the date, increment the day of the week index\n calendarOutput += " " + this.makeButton( start ) + " |" ;\n start.setDate( start.getDate() + 1 ) ;\n dowIndex++ ;\n\n // if we finished the week, close it off...\n if ( dowIndex > 6 ) {\n calendarOutput += "\sn" ;\n dowIndex = 0 ;\n }\n }\n\n // fill in the unused weekdays of the last week\n if ( dowIndex != 0 ) {\n while( dowIndex++ < 6 )\n calendarOutput += ">|" ;\n calendarOutput += "bgcolor(gray): |\sn" ;\n }\n\n wikify( calendarOutput, place, null, null ) ;\n}}\n//}}}\n/***\nThis plugin is released under the [[Creative Commons Attribution 2.5 License|http://creativecommons.org/licenses/by/2.5/]]\n***/\n
/***\nJust some bits and pieces\n***/\n//{{{\nconfig.messages.messageClose.text = "X"; // default is "close"\nconfig.views.wikified.defaultText = ""; // default is "The tiddler '%0' doesn't yet exist. Double-click to create it"\n//}}}
HomePage
\nВы можете скачать один из предложенных клиентов либо использовать любой другой, найденный на бескрайних просторах Интернета.\n\n<<<\n''[[Flylink r376 Homenet Edition|http://p2p.homenet/SetupFlylinkDC-HomeNet-r376.exe]]'' - ушедший далеко вперед потомок таких программ, как DC++, StrongDC и более поздних его ответвлений. Версия сборки - r370 от 20 ноября 2008 года. Обновляется регулярно. Сайт программы: http://flylinkdc.ru. На сайте есть подробный справочник, который поможет вам настроить программу в соответствии с Вашими потребностями. Рекомендуется к использованию.\n\nВсе замечания и предложения по настройкам этого дистрибутива отправляйте [[Wildcat'у|Wildcat]].\n<<<\n\n<<<\n''[[myP2P|http://owl.pp.ru/files/myp2p/myp2p.exe]]'' - клиент p2p, разработанный специально для сети HomeNet. Из особенностей стоит отметить:\n*оригинальный интерфейс\n*каталог описаний файлов\n*встроенные скрипты позволяющие менять поведение клиента\n*встроенный механизм обновления клиента по протоколу Direct Connect\n*доступность разработчиков жаждущих улучшить клиент в соответствии в Вашими желаниями :)\n\n''[[Инструкция пользователя|http://owl.pp.ru/files/myp2p/manual.doc]]''\n''[[Форум для обсуждения myP2P и общения с разработчиками|http://forum.hnet.ru/index.php?showforum=190]]''\n<<<\n\n\n\nЕсли же Вы решили скачать и настроить клиента сами, то Вам нужно указать параметры нужных [[хабов|Hubs]] вручную.\n
\n\n''Что такое P2P?''\n\n<<<\nВ больших сетях рано или поздно возникает проблема поиска нужных файлов на компьютерах пользователей. Чем больше пользователей, тем более трудоемким процессом это становится. Для облегчения поиска существуют P2P сети. P2P - иначе peer-to-peer, т.е. прямой обмен.\n<<<\n\n''Что такое myP2P?''\n\n<<<\nЭто клиент P2P для доступа в файлообменную сеть работающую по протоколу Direct Connect. Иначе говоря это специальная программа для обмена файлами внутри локальной сети. Таких клиентов есть много разновидностей и все они базируются исходном коде известного клиента DC++. А myP2P был разработан с нуля специально по заказу сети HomeNet.\n<<<\n\n''Зачем мне это нужно?''\n\n<<<\nЧтобы быстро найти необходимый файл, образ диска, музыку, видео и т.п.\n<<<\n\n''А оно работает без инета? Халява?''\n\n<<<\nДа, внутрисетевые хабы работают без интернета и скачивание с них бесплатно. Так же можно зайти на интернетовские Публичные Хабы (Public Hubs), скачивание с которых ПЛАТНО!\n<<<\n\n''Как это работает?''\n\n<<<\nАбоненты соединяются с выделенным сервером и с помощью клиента и открывают доступ на общие файлы. Сервер обрабатывает списки открытых файлов и осуществляет возможность поиска файлов по открытым ресурсам. Таким образом, у вас есть доступ к открытым для общего пользования папкам и возможность поиска необходимых файлов.\n<<<\n\n''Получается, что все абоненты сети скачивают файлы с одного сервера?''\n\n<<<\nНет! Сервер нужен только для обмена информацией о файлах, а скачиваете вы непосредственно с пользователя.\n<<<\n\n''Могут ли другие пользователи нанести вред моему компьютеру, если я использую DC++?''\n\n<<<\nНет! Вы сами выбираете, какие папки открыть для доступа и при этом НИКТО не имеет права записи в эти папки, т.е. вы 100% защищены от того, что кто-то закачает вам вирусы или другие опасные программы.\n<<<\n\n''Чем отличаются иконки и что они обозначают?''\n\n<<<\nИконка с кирпичиками - пользователь находится в пассивном режиме.\nИконка с ключиком - оператор хаба.\n<<<\n\n''Кто такой оператор?''\n\n<<<\nПользователь который следит за порядком на хабе. За нарушение может закрыть доступ к хабу (забанить).\n<<<\n\n''За что меня могут забанить?''\n\n<<<\nЕсли вы нарушаете правила хаба. Например, за спам.\n<<<\n\n''Где прочитать правила хаба?''\n\n<<<\nПри подключении к хабу, или на официальном сайте хаба (если такой существует).\n<<<\n\n''На какое время ставят баны?''\n\n<<<\nБан может стоять на 30 минут, на 1 день, пол года, максимально год. Срок определяется оператором в зависимости от нарушений.\n<<<\n\n''Что обозначают знаки <++V:0.674,M:P,H:1/0/0,S:10> рядом с ником?''\n\n<<<\nФормула кода: <++ V:x,M:x,H:x/y/z,S:x[,O:x]>\nV - версия используемой программы.\nM - статус пользователя, А - актив, Р - пассив (за firewall).\nH - количество хабов на которых находится пользователь x - количество хабов на которых вы не зарегистрированный пользователь.\ny - количество хабов на которых вы зарегистрированный пользователь.\nz - количество хабов на которых вы оператор хаба.\nS - количество слотов для скачивания.\nO - если общий upload - ниже этого значения, DC откроет другой слот.\n<<<\n \n\n''Регистрация псевдонима (ника)''\n\n<<<\nБывает, что DC++ глючит и скидывает соединение. В этом случае вы остаетесь зарегистрированными на сервере... и при попытке реконекта возникает это сообщение. Лекарство - регистрировать ник. Для регистрации необходимо связаться с Вашей администрацией и попросить зарегистрировать Вам ник. В письме не забудьте указать ник, который Вы желаете зарегистрировать, а так же пароль. Ник и пароль должны быть на английском языке. Для того, чтоб не писать пароль постоянно его можно вписать в настройки хаба (как указано на скриншоте), для этого зайдите в Вид -> Избранные хабы (или нажмите Ctrl + F), далее зайдите в настройки, в появившемся окне впишите имя и пароль.\n<<<\n \n\n''Как искать в DC++?''\n\n<<<\nВвести желаемое Вами название файла в поисковую строку и нажать "Ввод" если хотите найти файлы всех типов и каталоги с этим названием. Если Вам нужны файлы определенных типов, то нажмите на соответствующую иконку в левом столбце ниже поисковой строки.\n\nПосле нажатия кнопки Search (Поиск) или кнопки на клавиатуре Enter справа Вы увидите результаты поиска. При этом, если Вы хотите скачать только один файл - можете сразу начать закачку, нажав правой кнопкой мыши на нужном файле и выбрав пункт в меню Скачать (или Закачать). Если же Вам необходимо несколько файлов из найденной папки - нажмите на файле правой кнопкой мыши и выберите пункт меню Взять список файлов. После этого отроется стандартный список файлов, однако сразу будет выделена нужная Вам папка. После этого, по своему усмотрению, Вы можете скачать всю папку целиком или выборочные файлы (например, определенные серии сериала, или, скажем, несколько песен с альбома).\n<<<\n\n''От чего зависит скорость скачивания?''\n\n<<<\nВ первую очередь от скорости вашего подключения. Потом от скорости подключения пользователя с которого вы хотите скачать и от расстояния на котором он находится.\n<<<\n \n\n''Что плохого в пассивном режиме?''\n\n<<<\nЕдинственное, что в нем плохого - вы не сможете скачивать данные с пользователей, которые тоже находятся в пассивном режиме.\n<<<\n\n''Что такое Fake share ?''\n\n<<<\nДословно - фальшивый шаринг. Когда пользователь каким-либо образом подделывает шаринг и когда вы берёте у него файл лист, там файлы, которых на самом деле нет и их невозможно скачать.\n<<<\n\n\n''Почему я не могу зайти на хаб?''\n\n<<<\nВозможно несколько причин:\n1. Нет соединения с компьютером, на котором работает хаб. \n2. Закрыт доступ к хабу (бан).\n3. Недостаточно зашарино файлов или открыто слотов.\n4. Хаб не работает или перегружен.\n5. Пользователь с таким ником который задали Вы уже подключен к хабу.\n<<<\n\n''Что такое шары?''\n\n<<<\nШары - от share (англ. доля, часть, квота, участие) - т.е. шарить (расшаривать). Все это одно и тоже. Смысл один - добавлять в список ваши файлы, которые будут доступны всем остальным.\n<<<\n\n''Почему я не могу ничего скачать?''\n\n<<<\nВозможно несколько причин:\n1. Отсутствуют свободные слоты, нужно подождать.\n2. Ваш хард переполнен, нужно удалить что-нибудь.\n3. Пользователь удалил файл из шаринга.\n4. Пользователь запретил вам скачивать этот файл.\n5. Заблокированы порты, попробуйте поставить режим Passive.\n<<<\n\n''Некоторые команды''\n\n<<<\n/join ............присоединение к хабу\n/ts....................проставляет время каждого сообщения, повторная команда отключает показ времени\n/showjoins.............показывает пришедших и уходящих в основном окне, повторная команда отключает показ\n/search (x)............поиск x\n/clear.................очищает основное окно\n/away (message)........отправляет сообщение в авто-ответ\n/back..................выключает команду /away\n/slots (x).............изменяет количество слотов на x\n/grant.................открытие grants a slot пользователю с которым вы приват чате\n/close.................закрытие активного окна\n/refresh...............обновление общих файлов\n/help..................встроенные в DC команды\n/dc++..................информация о DC и ссылка где можно скачать DC\n/fav /favorite.........добавляет активный хаб в "избраное"\n<<<\n \n\n''Расшариваются не все файлы''\n\n<<<\nПо-умолчанию файлы с одинаковыми именами (например, setup.exe) не расшариваются в DC. Лучше всего запаковать дистрибутив в архив и дать зипу уникальное имя (my-k3wl-prog-v12b.zip).\nЕсли Вы хотите сделать так, чтобы расшаривались дубликаты файлов (на общий размер шаров (т.е. расшаренных файлов) это не повлияет): в File -> Settings (Файл -> Настройки) выбираем вкладку Advanced (Дополнительно) и ставим галочку у параметра Keep duplicate files in you file list. \n<<<\n \n\n''Как расшарить сетевые диски?''\n\n<<<\nВ DC++ начиная с версии 0.404 и выше добавляем как обычный локальный диск File -> Settings -> Sharing -> Add Folder \n<<<\n \n\n''Файлы расшариваются не сразу, и мне приходится перезаходить''\n\n<<<\nИспользуйте команду /refresh, чтобы не перезаходить. Написать команду следует в строке, где вы обычно пишите сообщения. В клонах DC++ подобной проблемы нет, файлы расшариваются сразу. См. обзор клонов. \n<<<\n \n\n''File is not available (Файл недоступен)''\n\n<<<\nПользователь удалил файл из шаринга, то есть в поиске выдаётся только название файла, а сам файл не установлен по данной директории. Происходит из за того, что пользователь не обновил файл лист или использует Fake share. \n<<<\n \n\n''Скачиваю файл в DC++ размером больше 4 Гб, скачалось 4 Гб и пишет, что нет места на диске, хотя на диске сободно больше 4 Гб.''\n\n<<<\nСкорей всего вы скачиваете файл на диск, который имеет файловую систему FAT 32. Эта система имеет ограничение на размер файла - 4 Гб. Поэтому необходимо скачивать файлы, имеющие размер больше, чем 4 Гб. на диск, имеющий файловую систему NTFS (если по каким-либо причинам вы не можете создать такой раздел, можно попросить пользователя, у которого вы скачиваете файл, порезать его на несколько частей). \n<<<\n \n\n''Я хочу отказаться от загрузки файла, а он продолжает загружаться снова''\n\n<<<\nДля отмены загрузки файла не достаточно простого нажатия в нижнем окне и выборе в меню Close connection (Закрыть соединение). Надо открыть окно Finished Uploads (Запросы на скачивание), открыть можно через меню View -> Finished Uploads (Вид -> Запросы на скачивание) или нажатием Ctrl + D) и удалить оттуда те файлы, которые вы не хотите загружать.\n<<<\n \n''Сообщения клиента:''\n \n<<<\nConnection Timeout (Тайм-аут соединения или Время вышло)\n\nПолная версия ответа (на английском) - dcplusplus.sourceforge.net/faq/print.php?faqnr=29&catnr=3&prog=1?=en&onlynewfaq=1\nПро настройку правил в файерволле прочитать можно тут (на английском) - www.dslreports.com/faq/dc?r=784#4\nДополнительно (на английском) читаем тут - www.microsoft.com/security/protect/ports.asp\n\nТакое сообщение вы можете увидеть в случае, если файерволл блокирует DC++.\nПроверьте встроенный в XP файерволл, или другой (Kerio, Norton Personal Firewall, Zone Alarm, Sygate, и т.д.).\n\nВарианты решения:\nВариант 1. Разрешить входящие соединения на порт 444 по протоколу TCP и UDP (UDP-порт используется при поиске, tcp при скачивании). Номера портов, которые DC++ должен использовать, можно задать прямо из свойств.\nВариант 2. Доступен только в windows xp - разрешить приложению dcplusplus.exe делать что угодно, когда windows спросит можно ли ему ходить в сеть.\n\n\nВариант 3. Использовать не active режим, а passive - он специально разработан для преодоления проблемы с firewall'ом. Единственный минус такого режима - нельзя подключаться к клиентам находящимся в таком же режиме passive.\n\nОтключение встроенного в XP файерволла.\nПредупрждение: отключение файерволла - это самоубийство компьютера из-за вирусов.\nИдем по цепочке Пуск -> Настройка -> Сетевые подключения, затем выбираем Подключение по локальной сети, заходим в Свойства, выбираем закладку Дополнительно и отключаем использование брандмауэра. После этого перезагружаем компьютер и загружаем ДС.\n<<<\n\n\n\n''Connection refused by target machine (Соединение оборвано указанным компьютером)''\n\n<<<\nТочнее слово refused в сетевой терминологии означает "активное сопротивление попытке установить сессию". То есть компьютер на той стороне включен, но сервис (в нашем случае dc-server) либо не запущен, либо ещё не загрузился, либо просто "упал" от нагрузки и операционная система освободила порт).\nПаниковать не надо, надо некоторое время подождать :)\nЭто сообщение также может появиться, если ваш файерволл блокирует DC. \n<<<\n \n\n''TTH inconsistency (несовместимость TTH(Tiger Tree Hashing))''\n\n<<<\nTTH, думаю, никак на русский не переводится, это название технологии. А если перевести дословно, то получится "Хеширование Тигрового Дерева". Суть её в следующем: для каждого файла создается хеш - контрольная сумма, такой уникальный набор цифр и букв, который подходит только для этого файла, и ни для какого другого.\n\nИспользование TTH позволяет:\n1. Различать файлы если у них одинаковый размер, но разное содержимое. Понимать, что два файла одинаковые, если у них одинаковое содержимое, но разные названия. Поиск альтернативных источников для скачки осуществляется по TTH.\n2. Писать специальные клиенты для web-сайтов (Magnet Links).\n3. Разбивать файл на сегменты и качать одновременно из нескольких мест, не заботясь о том, что один из источников может оказаться битым или не тем файлом.\n\nКогда при загрузке DC++ пишет Hashing files, программа занята как раз созданием TTH для каждого расшареного файла.\n\nСообщение inconsistency говорит о том, что имена файлов совпадают, а размеры - нет. Иногда объясняется плохой связью, но чаще всего, я думаю, это глюки dc++, потому что на dcpro такого я не видел никогда.\nСовет же можно дать такой - обновите версию клиента на более новую, и просто подождите. DC++ начнет качать автоматически через какое-то время. \n<<<\n\n''Еще про ТТН:''\n\n<<<\nTTH - в двух словах, уникальное имя файла, не зависящая от того, как его назвали вы. То есть, если 2 файла одинаковы, то независимо от их обычных названий, ТТН у них будет одинаков. Но даже если названия и даже размер одинаковы, но ТТН разный, то это РАЗНЫЕ файлы.(и один из них скорее всего битый).\nХеширование (hashing) - это получение "уникального имени" путём анализа файла. Это требует ресурсов компа, так что при первом запуске ДС++ и хешировании ваших файлов, комп будет тормозить.\nTTH используется для индексирования файлов. Инфа делется на маленькие кусочки, которые индексируются отдельно, потом всё собирается вместе в один Хеш. ТТН выглядит так: 4NIABZVGR4HOTNRPOMH2IRIJQSJYKFHEEIQUJWY\nТТН есть начиная с DC++ 0.400. ДС++ прохеширует всю вашу шару (да, это займёт какое-то время), потом будет хешировать только новые поступления. Хеширование в ДС++ идёт с низким приоритетом, поэтому это не должно сильно тормозить комп (и скорость хеширования можно уменьшить при желании)\n<<<\n \n''Your IP or Hostname is banned (Ваш IP или псевдоним запрещены)''\n\n<<<\nСкорее всего, вас забанили за мат/флуд (многократное повторение одного и того же). Для того, чтобы вас разбанили, обращайтесь к администрации. Бан обычно даётся на 15-30 дней.\nИ в будущем соблюдайте нормы общения в сети. В частности - в DC++.\n\nЧаще всего банят по ip, а не по псевдониму (ник-нейму). В связи с неэффективностью такого подхода (бан по нику). Например, есть приватные p2p-сети, которые позволяют качать только внутри страны и там изначально закрыт доступ для "неправильных" ip. Думаю в этом случае сообщение будет таким же. Для обхода ограничения можно использовать proxy-сервера в той стране, где находится dc hub. \n<<<\n \n\n''Your nick was already taken, please change to something else! (Ваш псевдоним уже используется, выберите другой!)''\n\n<<<\nДанное сообщение может возникать при попытке записи данных в расшаренную папку (если DC++ включена).\n\nТакже бывает, что DC++ глючит и скидывает соединение. В этом случае вы остаетесь зарегистрированными на сервере... и при попытке реконекта возникает это сообщение. Лекарство - регистрировать ник.\n<<<\n \n\n''Когда у меня начинают скачивать файлы - загрузка моего проца достигает 20% (30%, 40%...)''\n\n<<<\nВ Файл (File) -> Настройки (Settings) -> Дополнительные(advanced):\nСНЯТЬ галку в пункте "Разрешить безопасные и сжатые передачи" - тогда данные при передаче не будут сжиматься (а зачем оно в локалке?) и загрузка проца будет 0%-1%\n<<<\n \n\n''Когда у меня начинают качать, резко падает скорость моих закачек''\n\n<<<\nФайл (File) -> Настройки (Settings) -> Дополнительные(advanced):\nПОСТАВИТЬ галку в пункте "use small send buffer (enable is uploads slow downloads a lot)" ("использовать уменьшенный буфер передачи(если передача сильно тормозит закачку")\n<<<\n \n\n''Как скачивать файлы?''\n\n<<<\nЗайти на хаб, выбрать в списке пользователя, нажать два раза левой кнопкой мыши.\nСкачается файл-лист. Выбрать файл для скачивания, правой кнопкой мыши в меню можно указать куда именно будет качаться файл. В нижнем окне будет показываться состояние закачки. Если файл не докачался, при следующем запуске ДС докачка начнётся автоматически (если будет найден пользователь с которого качалось).\n<<<\n\n''Как ПРЕКРАТИТЬ закачку файла? я нажимаю close connection, но потом он снова начинает его качать!''\n\n<<<\nВ меню вверху: View(Вид)\s Download quene(Очередь). Это список того что стоит в очереди на скачивание. Именно там нужно проводить подобные операции.\n<<<\n \n\n''Ничего не могу скачать и поиск на дает никаких результатов''\n\n<<<\nЕсли вы в Active Mode - попробуите перейти в Passive Mode, и если все заработало и вы попрежнему хотите быть в Active Mode - настройте ваш файрвол или роутер. Есть еще одна причина, которая встречается чаще: при работе в Active Mode справа от надписи Active есть окно, там должен быть ваш IP. В принципе, после старта DC IP в этом окне должен обновиться, если этого не произошло - впишите ваш новый IP и проблема должна исчезнуть.\n<<<\n\n''Есть ли возможность скачивать ОДИН И ТОТ ЖЕ файл с разных источников?''\n\n<<<\nЕсть, но не в стандартном DC++. Клиенты StrongDC и zDC++. Если источники не добавляются автоматически, нажмите "Search alternatives" и начните закачку всех найденных одинаковых файлов в одну и ту же папку\n<<<\n\n''Тормозит компьютер! Есть ли возможность ограничить скорость Download'a и Upload'a?''\n\n<<<\nИспользовать клиенты StrongDC++ или zDC++. закладка "ограничения(limits)"\nТак же, само использование sDC и zDC тормозит компьютер. \nТак как в них намного больше функций. Так же мультизакачка жрёт очень много ресурсов!\n<<<\n \n\n''Разное''\n \n\n\n''Можно ли сделать так, что бы при повтором поиске не надо было ждать 5 секунд?''\n\n<<<\nМожно, но только в клоне StrongDC. Но если свести на 0, то тогда сообщения достанут о слишком быстром повторном поиске.\nЗайдите в настройки StrongDC, далее Advanced (дополнительно), параметр Minimum search interval (минимальный интервал поиска). Выставлять 1 не рекомендую. Например я, даже с дефолтных 5 поднял до 10, сейчас еще больше выставил. Но уменьшать смысла нет, т.к. во время скачивания искать что-то станет просто невозможно. К тому же, как мне кажется, и на хабе стоит ограничение по времени следующего поиска. Так что меньше этого времени ставить смысла вообще нет. \n<<<\n \n\n''Версия для Линукс''\n\n<<<\nПрочитать подробнее и скачать можно тут (на английском языке):\n[[dcplusplus.sourceforge.net/faq/faq.php?display=faq&faqnr=6&catnr=2&prog=1?=en&onlynewfaq=1]]\n\nДополнение: версия под linux/unix вроде умерла. Есть DC-GUI. Из-за лицензионных ограничений теперь он называется valknut. \n<<<\n \n\n''Когда с меня качают, мой компьютер очень сильно тормозит''\n\n<<<\nВ меню File -> Settings (Файл -> Настройки) на вкладке Advanced (Дополнительно) снять галочку с пункта Enable safe and compressed transfers, чтобы отменить программное сжатие DC++, которое сильно тормозит систему. Также можно попробовать понизить приоритет у процесса dcplusplus.exe, используя диспетчер задач Windows.\n\nТакже, для запуска приложения с низким приоритетом можно создать .bat файл (создайте текстовый документ, измените расширение на .bat). Пропишите в нем что-то вроде этого:\n\nstart /low c:\sProgr~1\sDC++\sDCPlusPlus.exe\n\nLOW - Запуск DC++ с приоритетом IDLE.\nNORMAL - Запуск DC++ с приоритетом NORMAL.\nHIGH - Запуск DC++ с приоритетом HIGH.\nREALTIME - Запуск DC++ с приоритетом REALTIME. \n<<<\n \n\n''Ведение логов разговоров в чате / в привате и логов загрузок / выгрузок файлов''\n\n<<< \nВыбрать в File -> Settings (Файл -> Настройки) на вкладке Logs and Sound (Логи и звуки) флажки Log main chat и Log private chat, предварительно выбрав директорию для логов (Directory (Директория), по умолчанию - <КАТАЛОГ DC>/Logs)\nТам же можно поставить птички для ведения логов загруженных (Log downloads) и выгруженных (Log uploads) файлов.\n\nВывод логов можно прикрутить к интернет-пейджеру Миранда через плагин logsend, тогда сообщения на канале или в привате будут не только писаться в файл, но и появлятся в сплывающем окошке на экране. Плагин в розыске. \n<<<\n \n\n''Как бы мне посмотреть, что ищут другие пользователи?''\n \n<<<\nВыбрать View -> Search spy (Вид -> Поисковый шпион) и подождать. \n<<<\n \n\n''Легкий тюнинг - сворачиваем в трей, default away message (сообщение по умолчанию)''\n\n<<<\nДля того, чтобы свернуть DC++ в трей зайдите в настройки (File -> Settings (Файл -> Настройки)) далее закладка Appearance (Вид), там отметить Minimize to tray (Свернуть в значок).\nТам же находится Default away message - то сообщение, которое будет показываться в приват чате при обращении к вам другого пользователя. Можно написать, например, "Отвечу, когда приду".\n<<<\n \n\n''Как сделать, чтобы в чате показывалось время сообщений?''\n\n<<<\nСуществует команда /ts - для показа времени и /showjoins - для показа входящих и уходящих с хаба. Чтобы эти опции работали на всех хабах, в (File -> Settings (Файл -> Настройки)) далее закладка Appearance (Вид) нужно поставить галочку на Show timestamps in chat default (показ времени в чатах) и Show joins / parts in chat by default (показ входящих и уходящих). \n<<<\n \n\n''Finished uploads (Завершенная загрузка, или список того, что скачали из моих ресурсов)''\n \n<<<\nМожно посмотреть, что скачали из ваших файлов, что бы вы могли видеть, на что из файлов идет ажиотаж и что стоит обновлять по чаще. Окно открывается через меню View -> Finished Uploads (Вид -> Выгруженные). \n<<<\n \n\n''Мне написали информацию, надо быстро ее сохранить''\n\n<<< \nВоспользуйтесь встроенным в программу Блокнотом. Для отображения окна выберите View -> Notepad (Вид -> Блокнот), или нажмите Ctrl + N. \n<<<\n \n\n''Как поставить звук на приходящее в приват сообщение?''\n \n<<<\nДля этого надо отметить File -> Settings (Файл -> Настройки) на вкладке Logs and Sound (Логи и звуки) флажки Make an annoying sound every time a private message is received и Make an annoying sound when a private message window is opened. При этом файлы звуков выбрать нельзя, поэтому при происхождении этих событий вы услышите стандартный звук винды - ding.wav. Но услышите только в том случае, если в самой windows будет включена звуковая палитра, а в ней определён звук на событие "Восклицание" или "Стандартный звук". Там же его можно поменять. Если звуковая палитра отключена - звуков не будет. Кстати, в той же zDC можно определять звуки в настройках, при этом они не зависят от системной палитры. \n<<<\n \n\n''Ссылки вида dchub://''\n\n<<<\nИногда встречаются ссылки вида dchub://, чтобы можно было давать прямые ссылки на файлы в DC, и чтобы ссылки обрабатывались, в File -> Settings (Файл -> Настройки) выбираем вкладку Advanced (Дополнительно) и ставим галочку у параметра Install URL handler on startup (to handle dchub:// links) (Установить URL захват при старте (для захвата dchub:// ссылок))\n<<<\n
Несколько фотогалерей. Выберите нужную из списка слева.
This "empty" TiddlyWiki file contains the latest <<version>> version of TiddlyWiki as well as all [[Plugins]] and [[Styles]] that give http://TiddlyWikiTips.com its look and feel.\n\nTo get started with this blank TiddlyWiki, you'll want to modify the following tiddlers:\n* SiteTitle & SiteSubtitle: This is 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 at the top, below the Title.\n* DefaultTiddlers: Contains the names of all tiddlers that you want to appear when the TiddlyWiki is opened.\n* SideBarOptions: This contains the definitions for the sidebar buttons and sliders on the right.
Хочешь в доме интернет - подключайся к HomeNet!\nСайт - http://hnet.ru\nФорум - http://forum.hnet.ru\nФотогалерея - http://photo.hnet.ru\nСетевые радио - http://hnet.ru/files/radio/radio.m3u
\n!Добро пожаловать на сайт файлообменной сети\n\n\n''Что такое локальная p2p-сеть?''\n<<<\nЛокальная p2p-сеть - это некоммерческий проект, призванный облегчить пользователям локальной сети обмен данными. \n<<<\n\n''Внимание!'' Зарегистрированными р2р-хабами в сети HomeNet являются: ''[[Кошкин дом|dchub://p2p.homenet]]'', ''[[Atlantida|dchub://atlantidap2p.homenet]]'' и ''[[BLYHub|dchub://blyhub.homenet]]'' . Подключаясь к другим хабам с открытым сеансом ''Интернет'', Вы имеете реальный шанс скачать какой либо файл ''за деньги'', которые будут ''списаны с Вашего счета''. \n\n''Как это работает?''\n<<<\nС помощью [[программы-клиента p2p-сети|Download]] вы находите нужный вам файл через поиск по всем компьютерам p2p-сети или при просмотре списка расшаренных файлов на компьютере одного из пользователей, и добавляете этот файл в очередь закачки. После этого программа-клиент сама:\n*скачает файл\n*если файл большой - скачает его по частям одновременно с нескольких компьютеров сети\n*при отключении хозяина файла, или если его компьютер перегружен запросами, попытается найти файл на других компьютерах\n*при слишком медленной скорости найдет источник, скачка с которого быстрее\n*при подключении каждого пользователя попытается найти нужный вам файл на его компьютере\n*после закачки проверит целостность файла.\nВ это время вы можете искать и качать другие файлы или общаться во встроенном чате с другими пользователями.\n<<<\n\n''Почему Вам нужно это попробовать?''\n<<<\n*p2p - это удобно: вам не нужно знать адреса компьютеров или сканировать сеть: клиент все сделает за вас.\n*p2p - это быстро: клиенты соединяются напрямую, за счет чего достигается скорость, большая, чем при работе через сетевое окружение или ftp.\n*p2p - это надежно: проверка контрольной суммы файла гарантирует, что файл не "побился" при скачке.\n*p2p - это доступно: самый легкий способ поделиться своей информацией с другими пользователями сети.\n*p2p - это комфортно: ограничивая скорость скачки с вашего компьютера, вы можете избежать "тормозов", которые часто бывают при расшаривании через сетевое окружение.\n*p2p - это экономно: абсолютно бесплатный доступ к десяткам терабайт фильмов, музыки, игр и программ.\n*p2p - это универсально: клиенты на любой вкус с различными возможностями и под любую ОС – от Windows до MAC.\n<<<\n\n''Как подключиться к p2p-сети?''\n<<<\nВсе, что нужно – установить на компьютер один из клиентов p2p-сети. [[Скачайте|Download]] тот, который Вам больше понравится - и подключайтесь!\n<<<\n
To upload a TiddlyWiki on your web server :\n\n#Import all tiddlers tagged with Upload from http://TiddlyWiki.bidix.info/#Upload\n#Install UploadPlugin //as usual//\n#Configure and upload [[store.php]] on your webserver\n#set a {{{<<upload>>}}} button for example in your SideBarOptions\n#Set UploadOptions in conformity with [[store.php]]\n#click on <<upload>> button\n
\n''На данный момент для сетей Homenet, ~NSUNet и ОКС доступны следующие хабы:''\n\n!!!__Кошкин дом__\n<<<\nСтарейший хаб файлообменной сети. Запущен 12 марта 2005 года. Клиенты, которых Вы можете [[скачать|Download]] с сайта, по умолчанию соединяются именно с ним.\n\n\n//Адрес хаба: - ''p2p.homenet'', порт: ''411''. (Вы также можете указать ~IP-адрес ''10.168.13.50'' в случае если доменное имя не распознается) \nАдминистратор хаба: ''[[Wildcat]]''.//\n\n<<<\n\n!!!__Атлантида__\n<<<\nДолгое время этот хаб был единственным доступным для жителей Нижней Ельцовки.\nПосле воссоединения ее с остальной сетью, совместно с ''Кошкиным домом'' стал основой файлообменной сети. На хабе запущено большое количество развлекательных сервисов.\n\n//Адрес хаба: ''atlantidap2p.homenet'', порт: ''411''. (Вы также можете указать ~IP-адрес ''10.168.13.54'' в случае если доменное имя не распознается)\nАдминистратор хаба: ''[[Atlant]]''.//\n<<<\n\n!!!__БляХаб__\n<<<\nХаб со столь экзотическим названием был создан в знак протеста против произвола ботов-цензоров на ''Кошкином доме'' и ''Атлантиде''. Очень быстро\nприобрел популярность среди приверженцев таких языков как: русский сильно разговорный, албанский, падоначий и прочих новоязов. Основное\nотличие этого хаба от прочих - полное отсутствие цензуры в чате. На этом хабе понравится тем, кто не терпит никаких ограничений :)\n\n//Адрес хаба: ''blyhub.homenet'', порт: ''411''. (Вы также можете указать ~IP-адрес ''10.168.13.66'' в случае если доменное имя не распознается)\nАдминистратор хаба: ''[[andreich]]''.//\n<<<\n\n\n\n
I'm Jim! I manage the http://TuddlyWikiTips.com site as well as several other "tips" sites including;\n*http://JimsTips.com\n*http://GmailTips.com\n*http://MoxiTips.com\n\nand my personal site:\n*http://jim.barr.net\n\nI can be contacted via email at: jim@barr.net
/***\n|''Name:''|ListWithTagPlugin |\n|''Version:''|$Revision: 13 $ |\n|''Source:''|http://thePettersons.org/tiddlywiki.html#ListWithTagPlugin |\n|''Author:''|[[Paul Petterson]] |\n|''Type:''|List Macro Extension |\n|''Requires:''|TiddlyWiki 1.2.32 or higher |\n!Description\nExtends the TiddlyWiki ''list'' macro by adding the capability to list all tiddlers with a given tag.\n\n!Syntax\n{{{<<list withTag systemConfig>>}}}\n\n!Sample Output\n<<list withTag systemConfig>>\n\n!Known issues\n\n!Notes\n\n!Revision history\n$History: PaulsNotepad.html $ \n * \n * ***************** Version 2 *****************\n * User: paulpet Date: 2/22/06 Time: 11:10a\n * Updated in $/PaulsNotepad3.0.root/PaulsNotepad3.0/PaulsPlugins/systemConfig\n\n!Code\n***/\n//{{{\nconfig.macros.list.withTag = {\nhandler: function(params) {\n return store.getTaggedTiddlers(params[1]);\n}}\n//}}}\n/***\nThis plugin is released under the [[Creative Commons Attribution 2.5 License|http://creativecommons.org/licenses/by/2.5/]]\n***/\n
/***\n|''Name:''|ListWithTagsPlugin |\n|''Version:''|$Revision: 13 $ |\n|''Source:''|http://thePettersons.org/tiddlywiki.html#ListWithTagsPlugin |\n|''Author:''|[[Paul Petterson]] |\n|''Type:''|List Macro Extension |\n|''Requires:''|TiddlyWiki 1.2.32 or higher |\n!Description\nExtends the TiddlyWiki ''list'' macro by adding the capability to list tiddlers that have a tag, a set of tags, or a complex criteria of tags. You can use tags, AND, OR, NOT (or && for AND, || for OR, and ! for NOT) as well as paranthese when building your expression.\n\n!Syntax\n* {{{<<list withTags Projects and Todo and not done>>}}}\n* {{{<<list withTags Tasks and (Urgent or Important)>>}}}\n\n!Sample Output\n''Example:'' lists all systemTiddlers that aren't also tagged with system (tests shorter/longer bug) and aren't also tagged with a big ugly non-existant tag. - so it should list systemTiddlers only!\n{{{<<list withTags systemTiddlers and not OIJDSFOIJSDFOIJSDFOIJSDF and not system>>}}}\n<<list withTags systemTiddlers and not OIJDSFOIJSDFOIJSDFOIJSDF and not system>>\n\n!Revision history\n$History: PaulsNotepad.html $\n * \n * ***************** Version 3 *****************\n * User: paulpet Date: 2/26/06 Time: 1:49p\n * Updated in $/PaulsNotepad3.0.root/PaulsNotepad3.0/PaulsPlugins/systemConfig\n * ported to TW 2.0\n * \n * ***************** Version 2 *****************\n * User: paulpet Date: 2/26/06 Time: 8:47a\n * Updated in $/PaulsNotepad3.0.root/PaulsNotepad3.0/PaulsPlugins/systemConfig\nv1.0.2 November 5th 2005 - fixed bugs arounding handling non-existing tags sometimes screwing up the expression.\nv1.0.1 October 12th 2005 - fixed bugs with single char tags, and tags with symbols in them showing up as non-existant tags.\nv1.0 October 11th, 2005 - Fixed all known bugs!\n<<<\n''Fixed:''\n* If a tag used in the expression doesn't exist (no tiddlers have that tag) then nothing will get listed.\n* If a tag //contains// another tag, then using the shorter tag will list results from the shorter and longer tags. For example if you have the tags ''test'' and ''testing'' and use ''test'' in an expression it will match tiddlers with both ''test'' and ''testing'' tags.\n* {{{<<list withTags not systemConfig>>}}} doesn't work but {{{<<list withTags !systemConfig>>}}} does.\n<<<\nv0.8 first public release (on purpose!)\nv0.7.5 fixed some bugs relating to non-existant tags throwing exceptions (simple comment block)\nv0.7 first accidental public release (no comment block on that one)\n\n!Code\n***/\n//{{{\n// For backward compatibility with TW 1.2.x\n// from UdoBorkowski\nif (!TiddlyWiki.prototype.forEachTiddler) {\n TiddlyWiki.prototype.forEachTiddler = function(callback) {\n for(var t in this.tiddlers) {\n callback.call(this,t,this.tiddlers[t]);\n }\n };\n}\nconfig.macros.list.withTags = {\nmakeTagRegexp: function() {\n // build us a regex of all our 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 null ;\n var tags = tgs.sort( function(a,b) { return (a[0].length < b[0].length) - (a[0].length > b[0].length) ; } );\n\n var exp = "(" + tags.join("|") + ")" ;\n exp = exp.replace( /(,[\sd]+)/g, "" ) ;\n var regex = new RegExp( exp, "ig" );\n\n return regex ;\n},\nnewCleaner: function( orig, cond ) {\n var tags = config.macros.list.withTags.makeTagRegexp() ;\n var step0 = orig ;\n var step1 = step0.replace( tags, "|" ) ;\n var step2 = step1.replace( /(?:^|\ss|\s||\s(|\s))(?:and)(?:\ss|\s||\s(|\s))/gi, "|" ) ;\n var step2 = step2.replace( /(?:^|\ss|\s||\s(|\s))(?:or)(?:\ss|\s||\s(|\s))/gi, "|" ) ;\n var step2 = step2.replace( /(?:^|\ss|\s||\s(|\s))(?:not)(?:\ss|\s||\s(|\s))/gi, "|" ) ;\n var step3 = "|" + step2.replace( /[\s(\s)]+|[&\s|]{2}|[!]{1}|[\ss]+/gi, "|" ) + "|" ;\n var step4 = step3.replace( /\s|{2,}/g, "|" ) ;\n\n var step5 ;\n if (step4.length > 1 ) {\n step5 = "(\s\s(|\s\s)|\s\s!|\s\ss|^)" + step4.substr(1, step4.length - 2) + "(\s\s(|\s\s)|\s\s!|\s\ss|\s\sn|$)" ;\n } else {\n step5 = null ;\n }\n\n return cond.replace( new RegExp( step5, "g" ), "$1false$2" ) ;\n},\nregexpBuilder: function(params) {\n var regex = this.makeTagRegexp() ;\n\n // build us string such that an expression that looks like this:\n // "tag1 AND tag2 OR NOT tag3" turns into :\n // /tag1/.test(...) && /tag2/.test(...) || ! /tag2/.test(...)\n var cond = params.slice(1).join(" ");\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 return cond ;\n},\nhandler: function(params) {\n var results = [];\n if ( !params || !params[1] ) return config.macros.list.all.handler( params );\n\n // var cond = this.regexpCleaner( this.regexpBuilder( params )) ;\n var cond = this.newCleaner( params.slice(1).join(" "), this.regexpBuilder( params )) ;\n if ( cond == null ) return results ;\n\n // look through the tiddlers, make a string of the tags in the tiddler\n // and eval the 'cond' string we made against that string - \n // if it's TRUE then the tiddler qualifies!\n store.forEachTiddler( function( title, tiddler ) {\n var tiddlerTags = (tiddler.tags?tiddler.tags.join("|"):"")+"|" ;\n try {\n if ( eval( cond ) ) results.push( tiddler );\n } catch( e ) {\n //if ( this[twd-logger] ) this[twd-logger].logMsg( "exception on eval()=" + e.description ) ;\n //displayMessage( "Exception = '" + e + "'" ) ;\n }\n });\n \n return results.sort(function (a,b) { return (a[0] > b[0]) - (a[0] < b[0]); });\n}}\n//}}}\n/***\nThis plugin is released under the [[Creative Commons Attribution 2.5 License|http://creativecommons.org/licenses/by/2.5/]]\n***/\n
[[Главная|HomePage]] [[Хабы|Hubs]] [[Клиенты|Download]] [[FAQ]] [[Частные ресурсы|Resources]] [[Фотографии|Galleries]]\n
!THE PILOTS\n\n!!Pilot 1: Jet-Assisted Chevy, Pop Rocks and Soda\nThe story of the jet-assisted Chevy goes like this. The Arizona Highway Patrol stumbled across a blackened crater in the side of a mountain at the end of a long stretch of desert road. After an investigation, they learned that an Air Force sergeant from a nearby military base had attached a rocket-assisted takeoff unit to the roof of a 1967 Chevy Impala. He got up to about 80 mph, and then fired the things off. Within seconds the car was traveling at 350 mph. The crater was found in the mountainside 100 feet off the ground. Who do you think will be the "dummy" to test this myth?\n\nThe Pop Rocks and soda legend concerns a boy known as little Mikey, who was featured in commercials for Life cereal. Some years later, Mikey was challenged by his friends to eat six packs of Pop Rocks candy with six cans of soda. According to the myth, the carbon dioxide in the candy combined with the carbon dioxide in the soda to create so much pressure that Mikey's stomach exploded and he died. Our MythBusters risk their lives for you, the viewer, in these two death-defying experiments.\n\n!!Pilot 2: Vacuum Toilet, Biscuit Bazooka, Leaping Lawyer\nIn this episode, Jamie and Adam take on a few legends involving dubious behavior. First, they contemplate the one about an obese woman on a trans-Atlantic flight whose derriere is suctioned into the plane's toilet after flushing, forcing the plane to land before she can be removed. Will the bottom fall out of this myth? How about the one involving a friend of a friend who thought she was shot while sitting in her car in a supermarket parking lot on a very hot day? The story goes that when the paramedics arrived, they found her head splattered with a mass of raw biscuit dough.\n\nAnd then there's the leaping lawyer. Some guy (apparently a lawyer), kept bouncing off a plate-glass window on the 24th floor of a high-rise building. After one too many impacts, the window shattered and the guy fell 24 floors to the ground, where he promptly died. Another day, another deadly myth.\n\n!!Pilot 3: Larry's Lawn-Chair Balloon, Goldfinger, Poppy-Seed Drug Test\nSo, this guy named Larry Walters attached something like 45 weather balloons to this lawn chair. One of the tethers broke on the unemployed truck driver's little invention, shooting him straight up into the air. Apparently he sailed to 16,000 feet, where he was spotted by airline pilots, eventually closing LAX airport. He was finally rescued by a helicopter after he floated out to sea. Is this popular Internet legend full of hot air? Will Jamie and Adam close LAX?\n\nIn the 1964 James Bond classic, Goldfinger, the villain's secretary is murdered with the dreaded gold body paint, causing death by skin suffocation. Supposedly, leaving a small patch of skin unpainted at the base of the spine will save the victim. Unfortunately, the movie's producers didn't have this vital piece of information, dooming actress Shirley Eaton to death on set. Who will be the guinea pig in this experiment? On a tastier note, can eating a poppy-seed bagel produce a positive result for opiate use in a drug screen? Our brave hosts test these stories so you don't have to.\n\n!THE SPECIALS\n\n!!Viewers-Choice/Christmas Special\nOn this special episode, Jamie and Adam present the winners from our fall 2004 favorite-myths online poll. So, did you guys vote for Stinky Car? Or will Pop Rocks and Coke emerge triumphant? Also, the MythBusters try their hand at a few holiday myths: Will putting a silver spoon in a champagne bottle keep it fizzy? Does a snowman melt faster with its clothes on ... or off? Tune in and find out.\npremiere: Dec. 22, 2004\n\n!SEASON 1\n\n!!Episode 1: Ice Bullet, Exploding Toilet, Who Gets Wetter?\nJamie and Adam set out to methodically bust three urban legends in the premiere episode of Mythbusters. Smoking in the bathroom — a bad habit made worse when shards of flaming toilet start flying. But is it really possible to explode a commode by spraying a flammable substance down the bowl then lighting a match? Jamie and Adam find out if this myth holds water. Speaking of soggy, do you get wetter running or walking in the rain? And can assassins use bullets made of ice in order to not leave evidence in their victims? Our guys put these fables to the test.\n\n!!Episode 2: Cell Phone Destruction, Silicone Breasts, CD-ROM Shattering\nIn this episode, Jamie and Adam test several explosive theories. Can chatting on a cell phone while pumping gas cause the pump to blow up? Our mythbusters put themselves at risk so you don't have to. They also put silicone breast implants to the test at high altitude. Will they burst under pressure? Finally, we'll learn once and for all if high-speed CD-ROM players can really shatter a compact disc.\n\n!!Episode 3: Barrel of Bricks, Pissing on the Third Rail, Eel Skin Wallet\nIs it really that dangerous to answer the call of nature on the electrified third rail of a train track? Can an eel skin wallet erase all the magnetic information on your credit cards if the skin came from an electric eel? How about the story of the unluckiest construction worker on earth? A pulley system breaks down while he is lifting a barrel filled with 500 pounds of bricks. Will the barrel come straight down on the guy doing the pulling, or will he walk away without a scratch? Jamie and Adam take a crack at these classic legends.\n\n!!Episode 4: Penny Drop, Deadly Microwaves, Radio Tooth Fillings\nCan pennies from heaven kill? Or, more specifically, can a penny dropped from a skyscraper kill a pedestrian on the sidewalk below? Jamie and Adam take the challenge, hopefully without deadly results. Speaking of fatal fallacies, is it possible to literally bake yourself on a tanning bed from the inside out? The guys also investigate the claim that Lucille Ball exposed a Japanese spy ring by listening to radio signals transmitted by her tooth fillings. Hmmm ...\n\n!!Episode 5: Hammer Bridge Drop, Buried Alive, Cola\nCan Jamie and Adam cheat death? We'll find out. First, they test the theory that a person could survive a leap from a bridge by throwing a hammer in the water first. According to urban legend, the hammer should break the plane of the water's surface, thereby softening the landing. They'll also investigate whether it's possible to survive being buried alive. How long would it take before all oxygen is cut off inside the coffin causing suffocation? On the lighter side, the guys will take a look at the many myths about cola. Can it remove bloodstains, clean rust or cook a steak? They'll get back to you on that.\n\n!!Episode 6: Lightning Strikes Tongue Piercing, Tree Cannon, Beat the Breath Test\nIn this episode, Jamie and Adam test the limits of a homemade tree cannon. Their interest comes from the story of a small town in Hungary where the inhabitants supposedly built a working cannon out of a tree. Or maybe Jamie and Adam just want to blow things up ... according to the story, the contraption accidentally exploded with deadly results. Then they get jiggy with a Breathalyzer, testing the theory that very drunk people are lucid enough to fool technology. Oh, and can Adam's tongue piercing withstand the electric force of a lightning bolt? We'll see.\n\n!!Episode 7: Stinky Car, Raccoon Rocket\nIs the myth of the stinky car true? Jamie and Adam put their noses on the line to find out if that nasty smell in your car is there to stay. Then they follow the gasoline trail to flush out the truth of the "raccoon in the drain" myth. Will our mythbusters become human cannonballs?\n\n!!Episode 8: Escape From Alcatraz, Duck Quack, Stud Finder\nIn this episode, Jamie and Adam retrace the steps of the infamous prisoners who escaped from Alcatraz without a trace in 1962. Although all were presumed drowned, our mythbusters are determined to find out if it's possible to survive the tides of the San Francisco Bay in a homemade raft. On a less precarious, but still hilarious note, they'll attempt to answer the age-old question: Does a duck's quack echo? And then there's the simply unhinged notion that a stud finder can prove whether or not human beings have been guinea pigs in mind control experiments. Yes, really.\n\n!!Episode 9: Chicken Gun, Octopus Egg Pregnancy, Killer Washing Machine\nWill launching a chicken at an airplane disrupt its flight? Or will the bird be blown out of the way by the jet engines? Jamie and Adam want to know. And they're pretty sure you want to watch them find out. Then they'll journey inside the human body, where they'll take on a whopper. A woman claims she swallowed an octopus egg — and then gave birth to an eight-legged offspring. Finally, this question needs answering, quickly: Can your washing machine kill you?\n\n!!Episode 10: Explosive Decompression, Frog Giggin', Rear Axle\nJamie and Adam get trigger-happy trying to shoot down myths regarding firearms. First, they fire a bullet into the shell of an aircraft to find out if a single shot can cause explosive decompression — and total aircraft destruction. Speaking of heavy artillery, they'll test the story of two hunters who claim to have used a loaded .22 caliber gun cartridge as a replacement fuse in a car's ignition. Will the experiment backfire? Finally, they take on a movie myth when they try to rip a car off its rear axle. What could possibly go wrong?\n\n!!Episode 11: Sinking Titanic, Goldfish Memory, Trombone Explosion\nIn this episode, Jamie and Adam explore a "titanic" legend: Will a sinking ship suck you down as it goes under? Things keep flowing as they try to find an answer to the eternal question: Are goldfish bored or just plain stupid? Our mythbusters will determine once and for all whether the fish can remember anything for longer than three seconds. On a more explosive note: Will throwing a lit firecracker down the neck of a trombone make your music sweeter? Uh—huh.\n\n!!Episode: 12: Break Step Bridge, Toothbrush Surprise, Rowing Water Skier\nWill the athletes of Stanford University's varsity rowing team be strong enough to pull Jamie up on water skis behind a fragile eight—person shell? Sounds like an excuse for a dip, no? Jamie and Adam move on to a myth with more legs when they take a stroll across a bridge to see if the rhythm of soldiers marching together can cause a bridge to collapse. Finally, watch where you put your toothbrush — the guys will attempt to learn if the bacteria from a toilet will settle in their toothbrushes. How did the toothbrushes get in the toilet again?\n\n!!Episode 13: Buried in Concrete, Daddy—Longlegs, Jet Taxi\nJamie and Adam make a brave attempt to solve a legendary mafia mystery by searching for the decomposed body of Jimmy Hoffa, allegedly buried in the concrete under Giants Stadium. Will they meet the same fate as Geraldo Rivera at the tomb of Al Capone? The mythbusters then fire up a jet engine and find out if the power and force of a 737 could launch a taxicab 75 feet in the air. Finally, will Adam's arachnophobia prevent him from finding out if the daddy—longlegs is the most venomous spider? Brave indeed.\n\n\n!SEASON 2\n\n!!Episode 14: Myths Revisited\nAnd you thought the MythBusters usually got it right the first time. Psych! In this episode, Jamie and Adam, with a little help from you, the viewer, revisit some of the most popular and controversial myths, putting their own experiments to the test. You might not get electrocuted urinating on the third rail, but how shocking would it be to pee on an electrified fence? Did Adam apply enough pressure to test the exploding implants correctly? And are cell phones truly dangerous at gas stations?\npremiere: June 8, 2004\n\n!!Episode 15: Scuba Diver, Car Capers\nAdam and Jamie are back at it, challenging new myths and taking one (or ten) for the team. If you've ever spotted a wetsuit dripping from a charred tree and asked yourself: Can an unsuspecting scuba diver be sucked out of the water by a fire-fighting helicopter and get spit out in the middle of a forest fire? Well, you're in luck. The MythBusters are going to solve this puzzling question. Then, they take on Hollywood in an attempt to discover if those zany motor-myths and car capers can live up to their urban legend status. The guys try shoving a banana in a car's tailpipe to find out if it stalls, then they'll pour sugar in the car's gas tank, trying to destroy its engine. Adding fuel to the fire, they'll fire a bullet at a gas tank, hoping to produce explosive results.\npremiere: July 27, 2004\n\n!!Episode 16: : Ancient Death Ray, Skunk Cleaning, What Is Bulletproof?\nIn this episode, Jamie and Adam reflect on one of the world's oldest urban legends — did the Greek scientist Archimedes set fire to a Roman fleet of ships using only mirrors and sunlight? Back in this century, they'll see which methods are effective at removing the fetid funk of a skunk. Easy enough to test, if only the MythBusters can find a skunk that will spray. And will a bulletproof shield really stop a direct hit from a bullet? Will Jamie be prepared to face the results?\npremiere: Sept. 29, 2004\n\n!!Episode 17: Elevator of Death, Levitation Machine\nJamie and Adam test their luck in the elevator of death. If an elevator suddenly falls, can you save yourself in the nick of time by jumping just before it hits bottom? Or will this leap of faith have disastrous consequences for Buster? Then, let the competition begin. The MythBusters challenge their imaginations and their building skills as they each try to create a homemade levitation machine. Will their appliances keep them afloat or leave them flat?\npremiere: Oct. 6, 2004\n\n!!Episode 18: Beat the Radar Detector\nJamie and Adam look into the myth about the construction worker who, while holding a piece of plywood, is blown from his building by a gust of wind and falls several stories, only to be swept back onto a lower floor. Then the crew tests several speed-radar-busting tricks, including hanging a disco ball from the rearview mirror, covering the car entirely with aluminum foil, and painting the car with flat black paint to scatter the radar's laser beams.\npremiere: Oct. 13, 2004\n\n!!Episode 19: Quicksand\nHas Hollywood gotten it right all this time? Can you really murder someone by dropping an electrical appliance into a bathtub? In a truly electrifying experiment, the guys find out what actually happens when hair dryer and water collide. Then follow the MythBuilders as they pursue the case of the exploding tattoo in the MRI. How, if at all, will the traces of metal found in the ink of Scottie's tattoos react with the MRI's rays? And Tarzan used it successfully against his enemies, but will killer quicksand take down the MythBusters?\npremiere: Oct. 20, 2004\n\n!!Episode 20: Exploding Jawbreaker\nIs it possible to throw a regular playing card fast enough to inflict bodily harm? Jamie and Adam put the "killer card" myth under the microscope, then look into whether a heated jawbreaker can explode in your mouth. Finally, the guys invent their own static cannon to learn if an unfortunate construction worker really died from sandblasting a PVC pipe on the job.\npremiere: Oct. 27, 2004\n\n!!Episode 21: Pingpong Rescue\nIt's wet-suit time for the MythBusters as Adam and Jamie investigate whether it's possible to lift a sunken boat from the ocean floor using only pingpong balls. Then Scottie, Tori and Kari get carried away testing a common Hollywood scene: Just how many balloons does it take to lift a 3-year-old child off the ground?\npremiere: Nov. 3, 2004\n\n!!Episode 22: Boom-Lift Catapult\nBuster lends a hand as the MythBusters explore the myth of the boom-lift catapult. Will Buster overcome the raw power of a 30,000-pound piece of machinery, or will the boom-lift turn into the ultimate medieval catapult? Then, worried about the price of gas? Tune in to Jamie and Adam's investigation into the most fuel-efficient way to keep cool in the car: turning on the air conditioning or opening the windows.\npremiere: Nov. 10, 2004\n\n!!Episode 23: Exploding House\nJust how hard is it to find a needle in a haystack? Egos fly as the MythBusters get competitive creating the supreme needle-finding machine. Then, returning to their familiar territory of blowing stuff up in the name of science, Jamie and Adam arm themselves with roach foggers and an abandoned apartment building to find out if toxic fumes and bug bombs really are an explosive combination. Finally, the MythBuilders hit the roof to prove whether or not whispering sweet nothings to your plants is the secret to gardening success.\npremiere: Nov. 16, 2004\n\n!!Episode 24: Ming Dynasty Astronaut\nDeep in the Mojave Desert Buster takes the hot seat in the MythBusters' quest to test the myth of the Ming Dynasty Astronaut. Will he defy the laws of gravity and survive an explosive launch into space? Or ... not? Then "mad scientists" Adam and Jamie search for a source of free energy, as Adam's stunt double faces nearly losing his head at the hands of the MythBuilders' killer fan. It takes two heads, three fans and five MythBusters to test this head-turning, stomach-churning story.\npremiere: Dec. 5, 2004\n\n!!Episode 25: Brown Note\nEver the chance-taker, Adam puts his body to the test for science. Will he be able to withstand subsonic frequencies, or will adult diapers be his only hope with the Brown Note? Next, he and Jamie put legendary Hollywood gunfights to the test. Finally, we'll see whether a constant drip of water falling on your (or in this case, Kari's) head really can be unbearable torture.\npremiere: Feb. 16, 2005\n\n!!Episode 26: Salsa Escape\nAdam and Jamie go head to head in a madcap Mexican jailbreak as they taste-test the theory of the Salsa Escape. And take one cement truck, add 850 pounds of dynamite, and what's left? Absolutely nothing, apparently. Adam and Jamie join forces with the FBI to find out if you can remove cement build-up from a mixer's barrel using dynamite.\npremiere: Feb. 23, 2005\n\n!!Episode 27: Exploding Port-a-Potty\nCan a person receive third-degree burns if he or she lights a cigarette while inside a port-a-potty? Armed with Adam's "special sample," the build team explores whether human waste can create enough methane to produce an explosive result. Then the MythBusters test whether a broken drive shaft on the front joint of a car vault can cause a car to pole vault after it hits a pothole. Just how high can this car fly?\npremiere: March 2, 2005\n\n!!Episode 28: Is Yawning Contagious?\nUsing a specially fabricated chamber complete with two-way mirror and a hidden camera, Kari, Scottie and Tory set out to see whether a yawn, like a cold, truly can be caught. Next on the docket: Does toast really fall buttered-side down? Jamie and Adam are on the case, each building a rig to simulate toast being dropped from the dining room table. Finally, the whole team tests the myth that a toy car can beat a real car (in this case, a Dodge Viper) in a gravity slope race.\npremiere: March 9, 2005\n\n!!Episode 29: Cooling a Six-Pack\nThe mystery is finally over! Watch as the MythBusters use ice, water, refrigerators, freezers and fire to test the fastest way to cool a six-pack. Then the team builds a new crash-test dummy ... and drops it 60 feet from a crane. The result is baptism by destruction for Buster 2.0, and a high-speed, high-impact crash the likes of which ... well, see for yourself. And finally, they may not have had iPods or remote controls to use them in, but did ancient peoples have batteries? Learn whether a crude form was invented more than 2,000 years ago.\npremiere: March 23, 2005\n\n!!Episode 30: Son of a Gun\nIt's survived untried for nearly 150 years: The myth of the Civil War soldier who was shot clean through his nether regions and the nearby woman who became pregnant when hit by the traveling bullet. Good luck, Jamie and Adam! Then the two test just how dangerous it is to use the telephone or take a shower during a thunderstorm. Finally, Scottie and Kari attempt to re-create the voyage of a hapless pair of boating greenhorns who set out to sea without first detaching their boat from their car trailer.\npremiere: March 30, 2005\n\n!!Episode 31: Breaking Glass\nCan a singer really break glass with just his or her voice? Jamie and Adam pair up with rock singer and voice coach Jaime Vendera to find out. Then, in "Shop Vac Jet Engine," the MythBuilders take on the challenge of building an explosive jet engine out of vacuum cleaner parts. Then, finally, after a moss-and-rock shopping spree, the guys explore whether a rolling stone truly gathers no moss.\npremiere: May 18, 2005\n\n!!Episode 32: Jet Pack\nIn this "twin-taled" episode, Adam and Jamie embark on the longest and most ambitious build they've ever undertaken: creating their own personal flying machine from scratch. Are these machines as magnificent as their designers claim? To make the project more realistic, the two limit themselves to a build period of one month and a budget of $10,000. Then, the MythBuilders tackle the myth that preserving the pharaohs involved much more than mummification, that it was the shape of the pyramids themselves — in particular, their cosmically inspired geometry — that kept the bodies of Egyptian kings intact. Is it all a load of rot, or can the build team's homemade pyramids keep fruit fresh and razors sharp, as new-age gurus claim?\npremiere: June 9, 2005\n\n!!Episode 33: Killer Brace Position\nEveryone knows that talking on a cell phone while driving is potentially dangerous, but is it as risky as driving drunk? To find out, Adam and Kari head to a local raceway to try their hand at driving a skills course, first, while being distracted on a cell phone, and then after knocking back a couple of rounds of beers. Then, the guys strap themselves into their own homemade mock airplane and go for a little ride straight down to test the efficacy of that oh-so-familiar brace position that airlines outline in their safety procedures.\npremiere: June 22, 2005\n\n!!Episode 34: Bulletproof Water\nHow deep must you dive to survive a gunshot? Adam and Jamie are on the case, unleashing their arsenal of pistols, shotguns and supersonic rifles to find the answer. Then the guys join forces with the MythBuilders in some playground pandemonium as they test a myth straight from the schoolyard. If you push hard enough, can you get a swing to go all the way around the swing-set bar? Everyone's tried this at some point in their lives, but this time there's a difference: On MythBusters, failure is not an option; if at first you don't succeed, then add some high explosives!\npremiere: July 13, 2005 \n\n!!Episode 35: Border Slingshot\nIs it feasible to fly over the frontier? In this episode, Adam and Jamie take on the myth that illegal immigrants are firing themselves 200 yards across the border and into the United States with a slingshot so accurate, it can land the human projectiles safely on a carefully placed mattress. Border patrols are reportedly baffled — can the MythBusters' handbuilt human-sized slingshot solve the puzzle?\npremiere: July 27, 2005\n\n!!Episode 36: Killer Tissue Box\nA must-see for anyone with the foresight to keep tissues on the rear shelf of their car — in a crash, will that box be propelled forward with enough force to crush your skull? The MythBusters are on the case, with surprising results. Then, the build team — and their arrow-shooting robot — take on Robin Hood ... or at least the legend that Mr. Hood once fired an arrow into an opponent's, splitting it completely in two.\npremiere: Aug. 3, 2005\n\n!!Episode 37: Escape Slide Parachute\nJoin the MythBusters as they test three tall tales of high flying and free falling. The first pits them against Hollywood logic with Buster doing his best Indiana Jones impression, the second tests the explosive properties and decapitation potential of hair cream, and the third addresses surviving a fall from 33,000 feet without a parachute. So, basically, it's business as usual at the "Mythbusters Flying Circus"!\npremiere: Aug. 10, 2005\n\n!!Episode 38: MythBusters Revisited\nAdam and Jamie take their detractors head on as they revisit some of their favorite myths. They're going to answer them once and for all and forever silence their critics!\npremiere: Oct. 12, 2005\n\n!!Episode 39: Chinese Invasion Alarm\nThe MythBusters take a pot shot at an ancient Chinese text that alludes to a subterranean sonar system that could apparently detect and intercept an invasion from below. And watch Adam and Jamie test out a myth that millions of hungry Americans invoke every day — if it's been on the floor for less than five seconds, is it really safe to eat?\npremiere: Oct. 19, 2005 \n\n!!Episode 40: Confederate Rocket\nThe American Civil War was fought with bayonets, muskets and cannons. But was that all? Not according to the MythBusters. So Adam, Jamie and the build team join forces to find out if the Confederate Army had a secret deadly weapon — the world's first long-range missile, which according to rumor, was launched from Richmond, Va., and aimed at the White House over 100 miles away.\npremiere: Oct. 26, 2005\n\n!!Episode 41: Vodka Myths\nAccording to myth, in a high-speed, head-on collision, a pair of trucks fused together upon impact, sealing the unfortunate car and driver between them. The team needs a traffic-free stretch of freeway. By amazing coincidence, they find one in Alameda that was specially constructed by the makers of Matrix Reloaded to film their own head-on collision between two semitrailers. Also, Kari hosts some urban legends about Russia's national drink, vodka (a.k.a. "Fire Wine").\npremiere: Nov. 2, 2005\n\n!!Episode 42: Steel Toe-Cap Amputation\nAdam and Jamie slice and dice a myth from the construction industry. According to some laborers, steel-toed boots can be more dangerous than the regular variety. Apparently, a worker from Down Under was awarded financial compensation for losing three toes when a heavy weight fell on his steel toe-capped boot. But were the unfortunate Aussie's steel toe caps turned into toe cutters, as the myth stipulates?\npremiere: Nov. 9, 2005\n\n!!Episode 43: Seasickness — Kill or Cure\nThe whole team takes on the challenge of finding the holy grail of the sea, i.e., an effective remedy for mal de mer, in this episode. From electric shock therapy to homeopathic tongue tinglers, can the MythBusters find a cure to this frequently regurgitated problem? Returning to shore, Adam and Jamie hit the road in a fuel efficiency special. They seek to answer the age-old question: Does driving with your pickup's tailgate down save gas and, hence, money?\npremiere: Nov. 16, 2005\n\n!!Episode 44: Paper Crossbow\nAdam and Jamie unleash a deadly myth from a supermax prison, attempting to make a deadly weapon out of nothing more dangerous than newspaper and underwear. While they are being tested to their wits' end, Grant, Kari and Tory unscrew the cap on some more vodka myths, the latest in an occasional series of tall tales about the popular Russian tipple.\npremiere: Jan. 11, 2006 \n\n!!Episode 45: Shredded Plane\nAdam and Jamie have been emailed a photo of a light plane, with precise, clean tears on the side. Is the photo genuine and what caused the carnage? Was it the jilted lover, who took to her ex's plane with a chainsaw and a taste for vengeance? Or did the propeller of another aircraft somehow do all that damage?\npremiere: Jan. 18, 2006\n\n!!Episode 46: Archimedes Death Ray\nChallenged from fan mailbags to retest the "Archimedes Death Ray," Adam and Jamie accept. In turn, fans and a M.I.T. team were invited to perform this challenge.\npremiere: Jan. 25, 2006\n\n!!Episode 47: Helium Football\nThis time around, Adam and Jamie test a myth that footballs filled with helium will fly farther and hang longer than ones filled with regulation air. Then the build team seeks to answer the age-old question: Are teeth strong enough to withstand the force of a bullet?\npremiere: Feb. 1, 2006\n\n!!Episode 48: Franklin's Kite\nThe build team kicks off the episode with discovering electricity by flying a kite in a thunderstorm. Next up, Adam and Jamie test the top 2 most requested flatulent myths posted by fans on the Discovery Channel Web site. Do innocuous legumes really increase the output of colon cologne? Is it possible to break wind so much that you can suffocate to death?\npremiere: March 8, 2006\n\n!!Episode 49: Cell Phones on Planes\nSo supposedly, if you fill a normal raft with helium, you can fly. Let's see it — get ready for the biggest Mythbusters' build ever. Meanwhile, Tory and Kari tackle a conspiracy theory familiar to many frequent fliers. Can your cell phone interfere with a plane's instruments?\npremiere: March 15, 2006 \n\n\n
/***\n|''Name:''|NewerTiddlerPlugin|\n|''Version:''|$Revision: 13 $ |\n|''Source:''|http://thePettersons.org/tiddlywiki.html#NewerTiddlerPlugin |\n|''Author:''|[[Paul Petterson]] |\n|''Type:''|Macro Extension |\n|''Requires:''|TiddlyWiki 1.2.33 or higher |\n!Description\nCreate a 'new tiddler' button with lots more options! Specify the text to show on the button, the name of the new tiddler (with date macro expansion), one or more tags for the new tiddlers, and what text if any to include in the new tiddler body! Uses a named parameter format, simalar to the reminder plugin.\n\nAlso - if the tiddler already exists it won't replace any of it's existing data (like tags).\n\n!Syntax\n* {{{<<newerTiddler button:"Inbox" name:"Inbox YYYY/MM/DD" tags:"Journal, inbox" text:"New stuff for today:">>}}}\n* {{{<<newerTiddler button:"@Action" name:"Action: what" tags:"@Action" text:"Add project and describe action">>}}}\n* {{{<<newerTiddler button:"New Project" name:"Project Name?" tags:"My Projects, My Inbox, Journal" template:"MyTemplate">>}}}\n!!Parameters\n* name:"Name of Tiddler"\n* tags:"Tag1, Tag2, Tag3" - tags for new tiddler, comma seperated //don't use square brackets //({{{[[}}})// for tags!//\n* button:"name for button" - the name to display instead of "new tiddler"\n* body:"what to put in the tiddler body"\n* template:"Name of a tiddler containing the text to use as the body of the new tiddler"\n\n''Note:'' if you sepecify both body and template parameters, then template parameter will be used and the body parameter overridden.\n\n!Sample Output\n* <<newerTiddler button:"Inbox" name:"Inbox YYYY/MM/DD" tags:"Journal inbox" text:"New stuff for today:">>\n* <<newerTiddler button:"@Action" name:"Action: what" tags:"@Action" text:"Add project and describe action">>\n* <<newerTiddler button:"New Project" name:"Project Name?" tags:"[[My Projects]] [[My Inbox]] Journal" template:"MyTemplate">>\n\n!Todo\n<<projectTemplate>>\n\n!Known issues\n* Must use double quotes (") around parameter values if they contain a space, can't use single quotes (').\n* can't use standard bracketted style tags, ust type in the tags space and all and put a comma between them. For example tags:"one big tag, another big tag" uses 2 tags ''one big tag'' and ''another big tag''.\n\n!Notes\n* It works fine, and I use it daily, however I haven't really tested edge cases or multiple platforms. If you run into bugs or problems, let me know!\n\n!Requests\n* Have delta-date specifiers on the name: name:"Inbox YYY/MM/DD+1" ( ceruleat@gmail.com )\n* Option to just open the tiddler instead of immediately edit it ( ceruleat@gmail.com )\n* Have date formatters in tags as well as in name (me)\n\n!Revision history\n$History: PaulsNotepad.html $\n * \n * ***************** Version 2 *****************\n * User: paulpet Date: 2/26/06 Time: 7:25p\n * Updated in $/PaulsNotepad3.0.root/PaulsNotepad3.0/PaulsPlugins/systemConfig\n * Port to tw2.0, bug fixes, and simplification!\nv1.0.2 (not released) - fixed small documentation issues.\nv1.0.1 October 13th - fixed a bug occurring only in FF\nv1.0 October 11th - Initial public release\nv0.8 October 10th - Feature complete... \nv0.7 Initial public preview\n\n!Code\n***/\n//{{{\nconfig.macros.newerTiddler = { \nname:"New(er) Tiddler",\ntags:"",\ntext:"Type Tiddler Contents Here.",\nbutton:"new(er) tiddler",\n\nreparse: function( params ) {\n var re = /([^:\s'\s"\ss]+)(?::([^\s'\s":\ss]+)|:[\s'\s"]([^\s'\s"\s\s]*(?:\s\s.[^\s'\s"\s\s]*)*)[\s'\s"])?(?=\ss|$)/g;\n var ret = new Array() ;\n var m ;\n\n while( (m = re.exec( params )) != null )\n ret[ m[1] ] = m[2]?m[2]:m[3]?m[3]:true ;\n\n return ret ;\n},\nhandler: function(place,macroName,params,wikifier,paramString,tiddler) {\n if ( readOnly ) return ;\n\n var input = this.reparse( paramString ) ;\n var tiddlerName = input["name"]?input["name"].trim():config.macros.newerTiddler.name ;\n var tiddlerTags = input["tags"]?input["tags"]:config.macros.newerTiddler.tags ;\n var tiddlerBody = input["text"]?input["text"]:config.macros.newerTiddler.text ;\n var buttonText = input["button"]?input["button"]:config.macros.newerTiddler.button ;\n var template = input["template"]?input["template"]:null;\n\n // if there is a template, use it - otherwise use the tiddlerBody text\n if ( template ) {\n tiddlerBody = store.getTiddlerText( template );\n }\n if ( tiddlerBody == null || tiddlerBody.length == 0 )\n tiddlerBody = config.macros.newerTiddler.text ;\n\n var now = new Date() ;\n tiddlerName = now.formatString( tiddlerName ) ;\n \n createTiddlyButton( place, buttonText, "", function() {\n var exists = store.tiddlerExists( tiddlerName );\n var t = store.createTiddler( tiddlerName );\n if ( ! exists )\n t.assign( tiddlerName, tiddlerBody, config.views.wikified.defaultModifier, now, tiddlerTags.readBracketedList() );\n \n story.displayTiddler(null,tiddlerName,DEFAULT_EDIT_TEMPLATE);\n story.focusTiddler(tiddlerName,"title");\n return false;\n });\n}}\n//}}}\n/***\nThis plugin is released under the [[Creative Commons Attribution 2.5 License|http://creativecommons.org/licenses/by/2.5/]]\n***/\n\n
<div class='header' macro='gradient vert #000 #069'>\n <div class='headerShadow'>\n <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>\n <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n </div>\n <div class='headerForeground'>\n <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\n <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n </div>\n <div id='topMenu' refresh='content' tiddler='MainMenu'></div>\n</div>\n<div id='sidebar'>\n <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n <div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n <div id='messageArea'></div>\n <div id='tiddlerDisplay'></div>\n</div>
Люди, создавшие и поддерживающие р2р-сеть\n\n\n\n\n\n
function onClickDefaultHome(e) {\nstory.closeAllTiddlers();\nconfig.options.txtDefaultTiddlers = "";\nsaveOptionCookie('txtDefaultTiddlers');\nvar start = store.getTiddlerText("DefaultTiddlers");\nif(start)\nstory.displayTiddlers(null,start.readBracketedList());\n}\n\nconfig.macros["defaultHome"] = {label: "Home", prompt: "Show the default tiddlers", title: "Home"};\nconfig.macros.defaultHome.handler = function(place) {\ncreateTiddlyButton(place,this.label,this.prompt,onClickDefaultHome);\n\n}
/***\n|''Name:''|ForEachTiddlerPlugin|\n|''Version:''|1.0.5 (2006-02-05)|\n|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''Macros:''|[[ForEachTiddlerMacro]] v1.0.5|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n!Description\n\nCreate customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.\n\n''Syntax:'' \n|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|\n|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|\n|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|\n|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|\n|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\nSee details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].\n\n!Revision history\n* v1.0.5\n** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.\n** Support Firefox 1.5.0.1\n** Internal\n*** Make "JSLint" conform\n*** "Only install once"\n* v1.0.4 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.3 (2005-12-22)\n** Features: \n*** Write output to a file supports multi-byte environments (Thanks to Bram Chen) \n*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)\n** Enhancements:\n*** Improved error messages on InternetExplorer.\n* v1.0.2 (2005-12-10)\n** Features: \n*** context object also holds reference to store (TiddlyWiki)\n** Fixed Bugs: \n*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)\n* v1.0.1 (2005-12-08)\n** Features: \n*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".\n*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.\n*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).\n*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .\n*** Improved script evaluation (for where/sort clause and write scripts).\n* v1.0.0 (2005-11-20)\n** initial version\n\n!Code\n***/\n//{{{\n\n \n//============================================================================\n//============================================================================\n// ForEachTiddlerPlugin\n//============================================================================\n//============================================================================\n\n// Only install once\nif (!version.extensions.ForEachTiddlerPlugin) {\n\nversion.extensions.ForEachTiddlerPlugin = {major: 1, minor: 0, revision: 5, date: new Date(2006,2,5), source: "http://tiddlywiki.abego-software.de/#ForEachTiddlergPlugin"};\n\n// For backward compatibility with TW 1.2.x\n//\nif (!TiddlyWiki.prototype.forEachTiddler) {\n TiddlyWiki.prototype.forEachTiddler = function(callback) {\n for(var t in this.tiddlers) {\n callback.call(this,t,this.tiddlers[t]);\n }\n };\n}\n\n//============================================================================\n// forEachTiddler Macro\n//============================================================================\n\nversion.extensions.forEachTiddler = {major: 1, minor: 0, revision: 5, date: new Date(2006,2,5), provider: "http://tiddlywiki.abego-software.de"};\n\n// ---------------------------------------------------------------------------\n// Configurations and constants \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler = {\n // Standard Properties\n label: "forEachTiddler",\n prompt: "Perform actions on a (sorted) selection of tiddlers",\n\n // actions\n actions: {\n addToList: {},\n write: {}\n }\n};\n\n// ---------------------------------------------------------------------------\n// The forEachTiddler Macro Handler \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler.getContainingTiddler = function(e) {\n while(e && !hasClass(e,"tiddler"))\n e = e.parentNode;\n var title = e ? e.getAttribute("tiddler") : null; \n return title ? store.getTiddler(title) : null;\n};\n\nconfig.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n // config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);\n\n if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n // Parse the "in" clause\n var tiddlyWikiPath = undefined;\n if ((i < params.length) && params[i] == "in") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "TiddlyWiki path expected behind 'in'.");\n return;\n }\n tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the where clause\n var whereClause ="true";\n if ((i < params.length) && params[i] == "where") {\n i++;\n whereClause = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the sort stuff\n var sortClause = null;\n var sortAscending = true; \n if ((i < params.length) && params[i] == "sortBy") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "sortClause missing behind 'sortBy'.");\n return;\n }\n sortClause = this.paramEncode(params[i]);\n i++;\n\n if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {\n sortAscending = params[i] == "ascending";\n i++;\n }\n }\n\n // Parse the script\n var scriptText = null;\n if ((i < params.length) && params[i] == "script") {\n i++;\n scriptText = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the action. \n // When we are already at the end use the default action\n var actionName = "addToList";\n if (i < params.length) {\n if (!config.macros.forEachTiddler.actions[params[i]]) {\n this.handleError(place, "Unknown action '"+params[i]+"'.");\n return;\n } else {\n actionName = params[i]; \n i++;\n }\n } \n \n // Get the action parameter\n // (the parsing is done inside the individual action implementation.)\n var actionParameter = params.slice(i);\n\n\n // --- Processing ------------------------------------------\n try {\n this.performMacro({\n place: place, \n inTiddler: tiddler,\n whereClause: whereClause, \n sortClause: sortClause, \n sortAscending: sortAscending, \n actionName: actionName, \n actionParameter: actionParameter, \n scriptText: scriptText, \n tiddlyWikiPath: tiddlyWikiPath});\n\n } catch (e) {\n this.handleError(place, e);\n }\n};\n\n// Returns an object with properties "tiddlers" and "context".\n// tiddlers holds the (sorted) tiddlers selected by the parameter,\n// context the context of the execution of the macro.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {\n\n var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);\n\n var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;\n context["tiddlyWiki"] = tiddlyWiki;\n \n // Get the tiddlers, as defined by the whereClause\n var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);\n context["tiddlers"] = tiddlers;\n\n // Sort the tiddlers, when sorting is required.\n if (parameter.sortClause) {\n this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);\n }\n\n return {tiddlers: tiddlers, context: context};\n};\n\n// Returns the (sorted) tiddlers selected by the parameter.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlers = function(parameter) {\n return this.getTiddlersAndContext(parameter).tiddlers;\n};\n\n// Performs the macros with the given parameter.\n//\n// @param parameter holds the parameter of the macro as separate properties.\n// The following properties are supported:\n//\n// place\n// whereClause\n// sortClause\n// sortAscending\n// actionName\n// actionParameter\n// scriptText\n// tiddlyWikiPath\n//\n// All properties are optional. \n// For most actions the place property must be defined.\n//\nconfig.macros.forEachTiddler.performMacro = function(parameter) {\n var tiddlersAndContext = this.getTiddlersAndContext(parameter);\n\n // Perform the action\n var actionName = parameter.actionName ? parameter.actionName : "addToList";\n var action = config.macros.forEachTiddler.actions[actionName];\n if (!action) {\n this.handleError(parameter.place, "Unknown action '"+actionName+"'.");\n return;\n }\n\n var actionHandler = action.handler;\n actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);\n};\n\n// ---------------------------------------------------------------------------\n// The actions \n// ---------------------------------------------------------------------------\n\n// Internal.\n//\n// --- The addToList Action -----------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n\n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);\n return;\n }\n\n // Perform the action.\n var list = document.createElement("ul");\n place.appendChild(list);\n for (var i = 0; i < tiddlers.length; i++) {\n var tiddler = tiddlers[i];\n var listItem = document.createElement("li");\n list.appendChild(listItem);\n createTiddlyLink(listItem, tiddler.title, true);\n }\n};\n\n// Internal.\n//\n// --- The write Action ---------------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n if (p >= parameter.length) {\n this.handleError(place, "Missing expression behind 'write'.");\n return;\n }\n\n var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n\n // Parse the "toFile" option\n var filename = null;\n var lineSeparator = undefined;\n if ((p < parameter.length) && parameter[p] == "toFile") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");\n return;\n }\n \n filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));\n p++;\n if ((p < parameter.length) && parameter[p] == "withLineSeparator") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");\n return;\n }\n lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n }\n }\n \n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);\n return;\n }\n\n // Perform the action.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);\n var count = tiddlers.length;\n var text = "";\n for (var i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n text += func(tiddler, context, count, i);\n }\n \n if (filename) {\n if (lineSeparator !== undefined) {\n lineSeparator = lineSeparator.replace(/\s\sn/mg, "\sn").replace(/\s\sr/mg, "\sr");\n text = text.replace(/\sn/mg,lineSeparator);\n }\n saveFile(filename, convertUnicodeToUTF8(text));\n } else {\n var wrapper = createTiddlyElement(place, "span");\n wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);\n }\n};\n\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {\n return {\n place : placeParam, \n whereClause : whereClauseParam, \n sortClause : sortClauseParam, \n sortAscending : sortAscendingParam, \n script : scriptText,\n actionName : actionNameParam, \n actionParameter : actionParameterParam,\n tiddlyWikiPath : tiddlyWikiPathParam,\n inTiddler : inTiddlerParam\n };\n};\n\n// Internal.\n//\n// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of \n// the given path.\n//\nconfig.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {\n if (!idPrefix) {\n idPrefix = "store";\n }\n var lenPrefix = idPrefix.length;\n \n // Read the content of the given file\n var content = loadFile(this.getLocalPath(path));\n if(content === null) {\n throw "TiddlyWiki '"+path+"' not found.";\n }\n \n // Locate the storeArea div's\n var posOpeningDiv = content.indexOf(startSaveArea);\n var posClosingDiv = content.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1)) {\n throw "File '"+path+"' is not a TiddlyWiki.";\n }\n var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);\n \n // Create a "div" element that contains the storage text\n var myStorageDiv = document.createElement("div");\n myStorageDiv.innerHTML = storageText;\n myStorageDiv.normalize();\n \n // Create all tiddlers in a new TiddlyWiki\n // (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)\n var tiddlyWiki = new TiddlyWiki();\n var store = myStorageDiv.childNodes;\n for(var t = 0; t < store.length; t++) {\n var e = store[t];\n var title = null;\n if(e.getAttribute)\n title = e.getAttribute("tiddler");\n if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)\n title = e.id.substr(lenPrefix);\n if(title && title !== "") {\n var tiddler = tiddlyWiki.createTiddler(title);\n tiddler.loadFromDiv(e,title);\n }\n }\n tiddlyWiki.dirty = false;\n\n return tiddlyWiki;\n};\n\n\n \n// Internal.\n//\n// Returns a function that has a function body returning the given javaScriptExpression.\n// The function has the parameters:\n// \n// (tiddler, context, count, index)\n//\nconfig.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {\n var script = context["script"];\n var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";\n var fullText = (script ? script+";" : "")+functionText+";theFunction;";\n return eval(fullText);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {\n var result = [];\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);\n tiddlyWiki.forEachTiddler(function(title,tiddler) {\n if (func(tiddler, context, undefined, undefined)) {\n result.push(tiddler);\n }\n });\n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {\n var message = "Extra parameter behind '"+actionName+"':";\n for (var i = firstUnusedIndex; i < parameter.length; i++) {\n message += " "+parameter[i];\n }\n this.handleError(place, message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? -1 \n : +1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? +1 \n : -1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {\n // To avoid evaluating the sortClause whenever two items are compared \n // we pre-calculate the sortValue for every item in the array and store it in a \n // temporary property ("forEachTiddlerSortValue") of the tiddlers.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);\n var count = tiddlers.length;\n var i;\n for (i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);\n }\n\n // Do the sorting\n tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);\n\n // Delete the temporary property that holds the sortValue. \n for (i = 0; i < tiddlers.length; i++) {\n delete tiddlers[i].forEachTiddlerSortValue;\n }\n};\n\n\n// Internal.\n//\nconfig.macros.forEachTiddler.trace = function(message) {\n displayMessage(message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {\n var message ="<<"+macroName;\n for (var i = 0; i < params.length; i++) {\n message += " "+params[i];\n }\n message += ">>";\n displayMessage(message);\n};\n\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.forEachTiddler.createErrorElement = function(place, exception) {\n var message = (exception.description) ? exception.description : exception.toString();\n return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);\n};\n\n// Internal.\n//\n// @param place [may be null]\n//\nconfig.macros.forEachTiddler.handleError = function(place, exception) {\n if (place) {\n this.createErrorElement(place, exception);\n } else {\n throw exception;\n }\n};\n\n// Internal.\n//\n// Encodes the given string.\n//\n// Replaces \n// "$))" to ">>"\n// "$)" to ">"\n//\nconfig.macros.forEachTiddler.paramEncode = function(s) {\n var reGTGT = new RegExp("\s\s$\s\s)\s\s)","mg");\n var reGT = new RegExp("\s\s$\s\s)","mg");\n return s.replace(reGTGT, ">>").replace(reGT, ">");\n};\n\n// Internal.\n//\n// Returns the given original path (that is a file path, starting with "file:")\n// as a path to a local file, in the systems native file format.\n//\n// Location information in the originalPath (i.e. the "#" and stuff following)\n// is stripped.\n// \nconfig.macros.forEachTiddler.getLocalPath = function(originalPath) {\n // Remove any location part of the URL\n var hashPos = originalPath.indexOf("#");\n if(hashPos != -1)\n 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 return localPath;\n};\n\n// ---------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// ---------------------------------------------------------------------------\n//\nsetStylesheet(\n ".forEachTiddlerError{color: #ffffff;background-color: #880000;}",\n "forEachTiddler");\n\n//============================================================================\n// End of forEachTiddler Macro\n//============================================================================\n\n\n//============================================================================\n// String.startsWith Function\n//============================================================================\n//\n// Returns true if the string starts with the given prefix, false otherwise.\n//\nversion.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.startsWith = function(prefix) {\n var n = prefix.length;\n return (this.length >= n) && (this.slice(0, n) == prefix);\n};\n\n\n\n//============================================================================\n// String.endsWith Function\n//============================================================================\n//\n// Returns true if the string ends with the given suffix, false otherwise.\n//\nversion.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.endsWith = function(suffix) {\n var n = suffix.length;\n return (this.length >= n) && (this.right(n) == suffix);\n};\n\n\n//============================================================================\n// String.contains Function\n//============================================================================\n//\n// Returns true when the string contains the given substring, false otherwise.\n//\nversion.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.contains = function(substring) {\n return this.indexOf(substring) >= 0;\n};\n\n//============================================================================\n// Array.indexOf Function\n//============================================================================\n//\n// Returns the index of the first occurance of the given item in the array or \n// -1 when no such item exists.\n//\n// @param item [may be null]\n//\nversion.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.indexOf = function(item) {\n for (var i = 0; i < this.length; i++) {\n if (this[i] == item) {\n return i;\n }\n }\n return -1;\n};\n\n//============================================================================\n// Array.contains Function\n//============================================================================\n//\n// Returns true when the array contains the given item, otherwise false. \n//\n// @param item [may be null]\n//\nversion.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.contains = function(item) {\n return (this.indexOf(item) >= 0);\n};\n\n//============================================================================\n// Array.containsAny Function\n//============================================================================\n//\n// Returns true when the array contains at least one of the elements \n// of the item. Otherwise (or when items contains no elements) false is returned.\n//\nversion.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAny = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (this.contains(items[i])) {\n return true;\n }\n }\n return false;\n};\n\n\n//============================================================================\n// Array.containsAll Function\n//============================================================================\n//\n// Returns true when the array contains all the items, otherwise false.\n// \n// When items is null false is returned (even if the array contains a null).\n//\n// @param items [may be null] \n//\nversion.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAll = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (!this.contains(items[i])) {\n return false;\n }\n }\n return true;\n};\n\n\n} // of "install only once"\n\n// Used Globals (for JSLint) ==============\n// ... DOM\n/*global document */\n// ... TiddlyWiki Core\n/*global convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, \n displayMessage, endSaveArea, hasClass, loadFile, saveFile, \n startSaveArea, store, wikify */\n//}}}\n\n\n/***\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n***/\n\n
/***\n| Name:|QuickOpenTagPlugin|\n| Purpose:|Makes tag links into a Taggly style open tag plus a normal style drop down menu|\n| Creator:|SimonBaird|\n| Source:|http://simonbaird.com/mptw/#QuickOpenTagPlugin|\n| Requires:|TW 2.x|\n| Version|1.1 (7-Feb-06)|\n\n!History\n* Version 1.1 (07/02/2006)\n** Fix Firefox 1.5.0.1 crashes\n** Updated by ~BidiX[at]~BidiX.info\n* Version 1.0 (?/01/2006)\n** First release\n\n***/\n//{{{\n\n//⊻ ⊽ ⋁ ▼ \n\nwindow.createTagButton_orig_mptw = createTagButton;\nwindow.createTagButton = function(place,tag,excludeTiddler) {\n var sp = createTiddlyElement(place,"span",null,"quickopentag");\n createTiddlyLink(sp,tag,true,"button");\n var theTag = createTiddlyButton(sp,config.macros.miniTag.dropdownchar,config.views.wikified.tag.tooltip.format([tag]),onClickTag);\n theTag.setAttribute("tag",tag);\n if(excludeTiddler)\n theTag.setAttribute("tiddler",excludeTiddler);\n return(theTag);\n};\n\nconfig.macros.miniTag = {handler:function(place,macroName,params,wikifier,paramString,tiddler) {\n var tagged = store.getTaggedTiddlers(tiddler.title);\n if (tagged.length > 0) {\n var theTag = createTiddlyButton(place,config.macros.miniTag.dropdownchar,config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);\n theTag.setAttribute("tag",tiddler.title);\n theTag.className = "miniTag";\n }\n}};\n\nconfig.macros.miniTag.dropdownchar = (document.all?"▼":"▾"); // the fat one is the only one that works in IE\n\nconfig.macros.allTags.handler = function(place,macroName,params)\n{\n var tags = store.getTags();\n var theDateList = createTiddlyElement(place,"ul",null,null,null);\n if(tags.length === 0)\n createTiddlyElement(theDateList,"li",null,"listTitle",this.noTags);\n for (var t=0; t<tags.length; t++)\n {\n var theListItem =createTiddlyElement(theDateList,"li",null,null,null);\n var theLink = createTiddlyLink(theListItem,tags[t][0],true);\n var theCount = " (" + tags[t][1] + ")";\n theLink.appendChild(document.createTextNode(theCount));\n\n var theDropDownBtn = createTiddlyButton(theListItem," "+config.macros.miniTag.dropdownchar,this.tooltip.format([tags[t][0]]),onClickTag);\n theDropDownBtn.setAttribute("tag",tags[t][0]);\n }\n};\n\n\nsetStylesheet(\n ".quickopentag { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }\sn"+\n ".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }\sn"+\n ".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}\sn"+\n "a.miniTag {font-size:150%;}\sn"+\n "",\n"QuickOpenTagStyles");\n\n//}}}\n\n/***\n<html>&#x22bb; &#x22bd; &#x22c1; &#x25bc; &#x25be;</html>\n***/\n
/***\n''SearchOptionsPlugin for TiddlyWiki version 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#SearchOptionsPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nThe TiddlyWiki search function normally looks in both tiddler titles and tiddler body content ('text'). However, narrowing the search so that it examines only titles or only text, or expanding the search to include text contained in tiddler tags can be very helpful, especially when searching on common words or phrases. In addition, it is often useful for the search results to show tiddlers with matching titles before tiddlers that contain matching text or tags.\n\n!!!!!Usage\n<<<\nThis plugin adds checkboxes (see below and in AdvancedOptions) to let you selectively configure the TiddlyWiki search function to just examine any combination of tiddler titles, text, or tags. It also provides an option to switch the search results order between 'titles mixed in' (default) and 'titles shown first', as well as an option display the search results as a list of links (in an auto-generated "SearchResults" tiddler), rather than actually displaying all matching tiddlers. You can also enable/disable the "incremental search" (key-by-key searching), so that a search is only initiated when you press the ENTER key or click on the "search:" prompt text.\n<<<\n!!!!!Configuration\n<<<\nIn additional to the checkboxes in AdvancedOptions, a self-contained control panel is included here for your convenience:\n<<option chkSearchTitles>> Search tiddler titles\n<<option chkSearchText>> Search tiddler text\n<<option chkSearchTags>> Search in tiddler tags\n<<option chkSearchTitlesFirst>> Show title matches first\n<<option chkSearchList>> Show list of matching tiddlers\n<<option chkSearchIncremental>> Incremental searching\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''SearchOptionsPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for SearchOptionsPlugin handling^^\n\nWhen installed, this plugin automatically adds checkboxes in the AdvancedOptions shadow tiddler so you can enable/disable the extended search behavior. However, if you have customized your AdvancedOptions, you will need to manually add {{{<<option chkSearchTitles>>}}}, {{{<<option chkSearchText>>}}} and {{{<<option chkSearchTitlesFirst>>}}} (with suitable prompt text) to your customized tiddler.\n<<<\n!!!!!Revision History\n<<<\n''2006.02.03 [2.2.1]''\nrewrite timeout clearing code and blank search text handling to match 2.0.4 core release changes. note that core no longer permits "blank=all" searches, so neither does this plugin. To search for all, use "." with text patterns enabled.\n''2006.02.02 [2.2.0]''\nin search.handler(), KeyHandler() function clears 'left over' timeout when search input is < 3 chars. Prevents searching on shorter text when shortened by rapid backspaces (<500msec)\n''2006.02.01 [2.1.9]''\nin Story.prototype.search(), correct inverted logic for using/not using regular expressions when searching\nalso, blank search text now presents "No search text. Continue anyway?" confirm() message box, so search on blank can still be processed if desired by user.\n''2006.02.01 [2.1.8]''\nin doSearch(), added alert/return if search text is blank\n''2006.01.20 [2.1.7]''\nfixed setting of config.macros.search.reportTitle so that Tweaks can override it.\n''2006.01.19 [2.1.6]''\nimproved SearchResults formatting, added a "search again" form to the report (based on a suggestion from MorrisGray)\ndefine results report title using config.macros.search.reportTitle instead of hard-coding the tiddler title\n''2006.01.18 [2.1.5]''\nCreated separate functions for reportSearchResults(text,matches) and discardSearchResults(), so that other developers can create alternative report generators.\n''2006.01.17 [2.1.4]''\nUse regExp.search() instead of regExp.test() to scan for matches. Correctd the problem where only half the matching tiddlers (the odd-numbered ones) were being reported.\n''2006.01.15 [2.1.3]''\nAdded information (date/time, username, search options used) to SearchResults output\n''2006.01.10 [2.1.2]''\nuse displayTiddlers() to render matched tiddlers. This lets you display multiple matching tiddlers, even if SinglePageModePlugin is enabled.\n''2006.01.08 [2.1.1]''\ncorrected invalid variable reference, "txt.value" to "text" in story.search()\n''2006.01.08 [2.1.0]''\nre-write to match new store.search(), store.search.handler() and story.search() functions.\n''2005.12.30 [2.0.0]''\nUpgraded to TW2.0\nwhen rendering SearchResults tiddler, closeTiddler() first to ensure display is refreshed.\n''2005.12.26 [1.4.0]''\nadded option to search for matching text in tiddler tags\n''2005.12.21 [1.3.7]''\nuse \s\s to 'escape' single quotes in tiddler titles when generating "Open all matching tiddlers" link. Also, added access key: "O", to trigger "open all" link.\nBased on a suggestion by UdoBorkowski.\n''2005.12.18 [1.3.6]''\ncall displayMessage() AFTER showing matching tiddlers so message is not cleared too soon\n''2005.12.17 [1.3.5]''\nif no matches found, just display message and delete any existing SearchResults tiddler.\n''2005.12.17 [1.3.4]''\nuse """{{{""" and """}}}""" to 'escape' display text in SearchResults tiddler to ensure that formatting contained in search string is not rendered \nBased on a suggestion by UdoBorkowski.\n''2005.12.14 [1.3.3]''\ntag SearchResults tiddler with 'excludeSearch' so it won't list itself in subsequent searches\nBased on a suggestion by UdoBorkowski.\n''2005.12.14 [1.3.2]''\nadded "open all matching tiddlers..." link to search results output.\nBased on a suggestion by UdoBorkowski.\n''2005.12.10 [1.3.1]''\nadded "discard search results" link to end of search list tiddler output for quick self-removal of 'SearchResults' tiddler.\n''2005.12.01 [1.3.0]''\nadded chkSearchIncremental to enable/disable 'incremental' searching (i.e., search after each keystroke) (default is ENABLED).\nadded handling for Enter key so it can be used to start a search.\nBased on a suggestion by LyallPearce\n''2005.11.25 [1.2.1]''\nrenamed from SearchTitleOrTextPlugin to SearchOptionsPlugin\n''2005.11.25 [1.2.0]''\nadded chkSearchList option\nBased on a suggestion by RodneyGomes\n''2005.10.19 [1.1.0]''\nadded chkSearchTitlesFirst option.\nBased on a suggestion by ChristianHauck\n''2005.10.18 [1.0.0]''\nInitial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\nBased on a suggestion by LyallPearce.\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.SearchTitleOrText = {major: 2, minor: 2, revision: 1, date: new Date(2006,2,3)};\n//}}}\n\n//{{{\nif (config.options.chkSearchTitles==undefined) config.options.chkSearchTitles=true;\nif (config.options.chkSearchText==undefined) config.options.chkSearchText=true;\nif (config.options.chkSearchTags==undefined) config.options.chkSearchTags=true;\nif (config.options.chkSearchTitlesFirst==undefined) config.options.chkSearchTitlesFirst=false;\nif (config.options.chkSearchList==undefined) config.options.chkSearchList=false;\nif (config.options.chkSearchIncremental==undefined) config.options.chkSearchIncremental=true;\n\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchTitles>> Search in tiddler titles";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchText>> Search in tiddler text";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchTags>> Search in tiddler tags";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchTitlesFirst>> Search results show title matches first";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchList>> Search results show list of matching tiddlers";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchIncremental>> Incremental searching";\n//}}}\n\n//{{{\nif (config.macros.search.reportTitle==undefined)\n config.macros.search.reportTitle="SearchResults";\n//}}}\n\n//{{{\nconfig.macros.search.handler = function(place,macroName,params)\n{\n var lastSearchText = "";\n var searchTimeout = null;\n var doSearch = function(txt)\n {\n if (txt.value.length>0)\n {\n story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);\n lastSearchText = txt.value;\n }\n };\n var clickHandler = function(e)\n {\n doSearch(this.nextSibling);\n return false;\n };\n var keyHandler = function(e)\n {\n if (!e) var e = window.event;\n switch(e.keyCode)\n {\n case 13: // ELS: handle enter key\n doSearch(this);\n break;\n case 27:\n this.value = "";\n clearMessage();\n break;\n }\n if (config.options.chkSearchIncremental)\n {\n if(this.value.length > 2)\n {\n if(this.value != lastSearchText)\n {\n if(searchTimeout) clearTimeout(searchTimeout);\n var txt = this;\n searchTimeout = setTimeout(function() {doSearch(txt);},500);\n }\n }\n else\n if(searchTimeout) clearTimeout(searchTimeout);\n }\n };\n var focusHandler = function(e)\n {\n this.select();\n };\n var btn = createTiddlyButton(place,this.label,this.prompt,clickHandler);\n var txt = createTiddlyElement(place,"input",null,null,null);\n if(params[0])\n txt.value = params[0];\n txt.onkeyup = keyHandler;\n txt.onfocus = focusHandler;\n txt.setAttribute("size",this.sizeTextbox);\n txt.setAttribute("accessKey",this.accessKey);\n txt.setAttribute("autocomplete","off");\n if(config.browser.isSafari)\n {\n txt.setAttribute("type","search");\n txt.setAttribute("results","5");\n }\n else\n txt.setAttribute("type","text");\n}\n//}}}\n\n//{{{\nStory.prototype.search = function(text,useCaseSensitive,useRegExp)\n{\n highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");\n var matches = store.search(highlightHack,"title","excludeSearch");\n var q = useRegExp ? "/" : "'";\n clearMessage();\n if (!matches.length) {\n if (config.options.chkSearchList) discardSearchResults();\n displayMessage(config.macros.search.failureMsg.format([q+text+q]));\n } else {\n if (config.options.chkSearchList) \n reportSearchResults(text,matches);\n else {\n var titles = []; for(var t=0; t<matches.length; t++) titles.push(matches[t].title);\n this.closeAllTiddlers(); story.displayTiddlers(null,titles);\n displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));\n }\n }\n highlightHack = null;\n}\n//}}}\n\n//{{{\nTiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag)\n{\n var candidates = this.reverseLookup("tags",excludeTag,false,sortField);\n\n // scan for matching titles\n var title_results = [];\n if (config.options.chkSearchTitles)\n for(var t=0; t<candidates.length; t++)\n if(candidates[t].title.search(searchRegExp)!=-1)\n title_results.push(candidates[t]);\n\n // scan for matching text\n var text_results = [];\n if (config.options.chkSearchText)\n for(var t=0; t<candidates.length; t++)\n if(candidates[t].text.search(searchRegExp)!=-1)\n text_results.push(candidates[t]);\n\n // scan for matching tags\n var tag_results = [];\n if (config.options.chkSearchTags)\n for(var t=0; t<candidates.length; t++)\n if(candidates[t].tags.join(" ").search(searchRegExp)!=-1)\n tag_results.push(candidates[t]);\n\n // merge the results, eliminating redundant matches\n var results = [];\n for(var t=0; t<title_results.length; t++) results.pushUnique(title_results[t]);\n for(var t=0; t<text_results.length; t++) results.pushUnique(text_results[t]);\n for(var t=0; t<tag_results.length; t++) results.pushUnique(tag_results[t]);\n\n // if not 'titles first', re-sort results to so titles, text and tag matches are mixed together\n if(!sortField) sortField = "title";\n var bySortField=function (a,b) {if(a[sortField] == b[sortField]) return(0); else return (a[sortField] < b[sortField]) ? -1 : +1; }\n if (!config.options.chkSearchTitlesFirst) results.sort(bySortField);\n return results;\n}\n//}}}\n\n// // ''REPORT GENERATOR''\n//{{{\nif (!window.reportSearchResults) window.reportSearchResults=function(text,matches)\n{\n var title=config.macros.search.reportTitle\n var q = config.options.chkRegExpSearch ? "/" : "'";\n var body="";\n\n // summary: nn tiddlers found matching '...', options used\n body+="''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''\sn";\n body+="^^//searched in:// ";\n body+=(config.options.chkSearchTitles?"''titles'' ":"");\n body+=(config.options.chkSearchText?"''text'' ":"");\n body+=(config.options.chkSearchTags?"''tags'' ":"");\n if (config.options.chkCaseSensitiveSearch||config.options.chkRegExpSearch) {\n body+=" //with options:// ";\n body+=(config.options.chkCaseSensitiveSearch?"''case sensitive'' ":"");\n body+=(config.options.chkRegExpSearch?"''text patterns'' ":"");\n }\n body+="^^";\n\n // numbered list of links to matching tiddlers\n body+="\sn<<<";\n for(var t=0;t<matches.length;t++) body+="\sn# [["+matches[t].title+"]]";\n body+="\sn<<<\sn";\n\n // open all matches button\n body+="<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n body+="onclick=\s"story.displayTiddlers(null,["\n for(var t=0;t<matches.length;t++)\n body+="'"+matches[t].title.replace(/\s'/mg,"\s\s'")+"'"+((t<matches.length-1)?", ":"");\n body+="],1);\s" ";\n body+="accesskey=\s"O\s" ";\n body+="value=\s"open all matching tiddlers\s"></html> ";\n\n // discard search results button\n body+="<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n body+="onclick=\s"story.closeTiddler('"+title+"'); store.deleteTiddler('"+title+"');\s" ";\n body+="value=\s"discard "+title+"\s"></html>";\n\n // search again\n body+="\sn\sn----\sn";\n body+="<<search \s""+text+"\s">> ";\n body+="<<option chkSearchTitles>>titles ";\n body+="<<option chkSearchText>>text ";\n body+="<<option chkSearchTags>>tags";\n body+="<<option chkCaseSensitiveSearch>>case-sensitive ";\n body+="<<option chkRegExpSearch>>text patterns";\n\n // create/update the tiddler\n var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();\n tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch");\n store.addTiddler(tiddler); story.closeTiddler(title);\n\n // use alternate "search again" label in <<search>> macro\n var oldprompt=config.macros.search.label;\n config.macros.search.label="search again";\n\n // render tiddler\n story.displayTiddler(null,title,1); // force refresh\n\n // restore standard search label\n config.macros.search.label=oldprompt;\n\n}\n\nif (!window.discardSearchResults) window.discardSearchResults=function()\n{\n // remove the tiddler\n story.closeTiddler(config.macros.search.reportTitle);\n store.deleteTiddler(config.macros.search.reportTitle);\n}\n//}}}\n\n\n
config.macros.listTags = { text: "Hello" };\nconfig.macros.listTags.handler = function(place,macroName,params)\n{\n var tagged = store.getTaggedTiddlers(params[0]);\n var ul = createTiddlyElement(place,"ul",null,null,"");\n for(var r=0;r<tagged.length;r++)\n {\n var li = createTiddlyElement(ul,"li",null,null,"");\n createTiddlyLink(li,tagged[r].title,true);\n }\n}
/***\nPre-check AutoSave\n***/\n//{{{\nconfig.options.chkAutoSave = true;\n//}}}\n/***\nPre-check SinglePageMode\n***/\n//{{{\nconfig.options.chkSinglePageMode=false;\n//}}}\n\n/***\nPre-check SearchList\n***/\n//{{{\nconfig.options.chkSearchList=true;\n//}}}\n/***\nChange "close" message to "X"\n***/\n//{{{\nconfig.messages.messageClose.text = "X";\n//}}}\n/***\nRemove default "The tiddler '%0' doesn't yet exist. Double-click to create it" Tiddler body message\n***/\n//{{{\nconfig.views.wikified.defaultText = ""; \n//}}}
This is a list of Plugins that are currently installed and in use at [[TiddlyWikiTips.com]].\n\nClicking a Plugin on the left will open it for you to view. \n\nIf you want to use any of these Plugins on //your// TiddlyWiki, just edit the Plugin, Copy and Paste the text into a new Tiddler in your TiddlyWiki file, and Tag it as "systemConfig". The next time you reload your TiddlyWiki file, the Plugin will be active...simple as that!
Очередная попытка собрать в кучу и систематизировать ссылки на интересные ресурсы сетей Homenet, ОКС1 и НГУ. \n\n
''1 tiddlers found matching '{{{_Style}}}'''\n^^//searched in:// ''titles'' ''text'' ''tags'' ^^\n<<<\n# [[_StyleSheet]]\n<<<\n<html><input type="button" href="javascript:;" onclick="story.displayTiddlers(null,['_StyleSheet'],1);" accesskey="O" value="open all matching tiddlers"></html> <html><input type="button" href="javascript:;" onclick="story.closeTiddler('SearchResults'); store.deleteTiddler('SearchResults');" value="discard SearchResults"></html>\n\n----\n<<search "_Style">> <<option chkSearchTitles>>titles <<option chkSearchText>>text <<option chkSearchTags>>tags<<option chkCaseSensitiveSearch>>case-sensitive <<option chkRegExpSearch>>text patterns
<<search>><<closeAll>><<permaview>><<newTiddler>><<saveChanges>><<upload>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>><<slider chkSliderContents [[TabContents]] 'contents »' 'contents'>>
файлообменная сеть Direct Connect
p2p.homenet
http://p2p.homenet/
/***\nIncluded Styles\n***/\n/*{{{*/\n[[Styles TagglyTagging]]\n[[Styles HorizontalMainMenu]]\n[[Styles MessageArea]]\n[[Styles SideBarOptions]]\n[[Styles Calendar]]\n[[Styles Editor]]\n[[Styles Breadcrumbs]]\n/*}}}*/\n\n\n\n\n/***\nCosmetic fixes\n***/\n/*{{{*/\nh1,h2,h3,h4,h5 { color: #000; background: transparent; }\n\nbody { \n\n\n background: #fff; \n}\n\n\n\n\n.headerShadow {\n padding: 1.0em; }\n\n.headerForeground {\n padding: 1.0em; }\n\n.selected .tagging, .selected .tagged {\n padding: 0.5em;\n background-color: #eee;\n border-top: 1px solid #ccc; \n border-left: 1px solid #ccc; \n border-bottom: 3px solid #ccc; \n border-right: 3px solid #ccc; \n -moz-border-radius: 1em; }\n\n.shadow .title {\n color: #999; }\n\n.siteTitle {\n font-size: 2.5em; }\n\n.siteSubtitle {\n font-size: 1.0em; }\n\n.tabSelected{\n padding-top: 0.0em;\n padding-left: 1em;\n padding-right: 1em;\n -moz-border-radius-topleft: 0.5em; \n -moz-border-radius-topright: 0.5em;}\n\n.tabUnselected {\n padding-top: 0.0em;\n padding-left: 1em;\n padding-right: 1em;\n -moz-border-radius-topleft: 0.5em; \n -moz-border-radius-topright: 0.5em;}\n\n.tabContents {\n margin: 0px;\n padding-top: 0px;\n padding-bottom: 0px;\n padding-left: 2px;\n padding-right: 2px;\n -moz-border-radius: 1em; }\n\n.tagging, .tagged {\n padding: 0.5em;\n background-color: #eee;\n border-top: 1px solid #ccc; \n border-left: 1px solid #ccc; \n border-bottom: 3px solid #ccc; \n border-right: 3px solid #ccc; \n -moz-border-radius: 1em; }\n\n.tiddler {\n border-top: 1px solid #ccc; \n border-left: 1px solid #ccc; \n border-bottom: 3px solid #ccc; \n border-right: 3px solid #ccc; \n margin: 0.5em; \n \n padding: 0.5em; \n -moz-border-radius: 1em; }\n\n.title {\n color:black; \n font-size: 2em; \nbackground: #eee}\n\n.viewer .listTitle { \n list-style-type: none; \n margin-left: -2em; }\n\n.viewer pre { \n background-color: #f8f8ff; \n border-color: #ddf }\n\n/*}}}*/\n\n\n/***\nClint's fix for weird IE behaviour\n***/\n/*{{{*/\nbody {position:static;}\n.tagClear{margin-top:1em;clear:both;}\n/*}}}*/ \n\n\n\n\n
@media print {\n#mainMenu, #sidebar, #messageArea, #breadCrumbs, #topMenu, .siteTitle, .siteSubtitle {display: none ! important;}\n#displayArea {margin: 0.5em 0.5em 0em 0.5em;}\n}\n
These Styles represent all of the CSS Style data that control the look and feel of this site.\n\nNote that I recently "modularized" the StyleSheet Tiddler so that "Styles xxxx" Tiddlers are "called" by StyleSheet. This makes for better troubleshooting.\n\nIf you wish to use these Styles, please be sure to copy them all, because they are all called from within StyleSheet.
/***\nCalendar\n***/\n/*{{{*/\n.calendar a { margin:0px !important; padding:0px !important; } \n/*}}}*/\n
/***\nStyles Editor\n***/\n/*{{{*/\n.editor textarea {height:200px;background-color:#F2F2F2;}\n\n.editorFooter .button { \n padding-top: 0px; \n padding-bottom:0px; \n background: #fff;\n color: #000; \n border-top: 1px solid #ccc; \n border-left: 1px solid #ccc; \n border-bottom: 2px solid #ccc; \n border-right: 2px solid #ccc; \n margin-left: 3px;\n padding-top: 1px;\n padding-bottom: 1px;\n padding-left: 5px;\n padding-right: 5px; }\n \n.editorFooter .button:hover { \n border-top: 2px solid #ccc; \n border-left: 2px solid #ccc; \n border-bottom: 1px solid #ccc; \n border-right: 1px solid #ccc; \n margin-left: 3px;\n padding-top: 1px;\n padding-bottom: 1px;\n padding-left: 5px;\n padding-right: 5px; }\n/*}}}*/\n
/***\nTo use, add {{{[[Styles HorizontalMainMenu]]}}} to your StyleSheet tiddler, or you can just paste the CSS in directly. See also HorizontalMainMenu and PageTemplate.\n***/\n/*{{{*/\n\n#topMenu br {display:none; }\n#topMenu { background: #39a; }\n#topMenu { padding:2px; }\n#topMenu .button, #topMenu .tiddlyLink { padding-left:1em; padding-right:1em; color:white; font-size:115%;}\n#displayArea { margin: 1em 15.7em 0em 1em; }\n\n/* just in case want some QuickOpenTags in your topMenu */\n#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }\n#topMenu .quickopentag .tiddlyLink { padding-right:1px; }\n#topMenu .quickopentag .button { padding-left:1px; border:0px; }\n\n\n/*}}}*/
/***\nStyle Message Area\n***/\n/*{{{*/\n#messageArea { \n background-color: #eee; \n border-color: #8ab; \n border-width: 4px; \n border-style: dotted; \n font-size: 90%; \n padding: 0.5em; \n -moz-border-radius: 1em; }\n#messageArea .button { text-decoration:none; font-weight:bold; background:transparent; border:0px; }\n#messageArea .button:hover {background: #acd; }\n/*}}}*/\n
/***\nStyles SideBarOptions\n***/\n/*{{{*/\n#sidebarOptions .sliderPanel {\n border: 0px solid #ccc; \n background-color: #eee;\n margin: 0px;\n margin-left: 0.5em;\n padding: 0px;\n -moz-border-radius: 1em; }\n\n#sidebarOptions .sliderPanel .tabSelected{\n border: 1px solid #ccc; \n background-color: #fff;\n margin: 0px;\n padding-top: 5px;\n padding-bottom: 0px;\n padding-left: 2px;\n padding-right: 2px;\n -moz-border-radius-topleft: 1em; \n -moz-border-radius-topright: 1em;}\n\n#sidebarOptions .sliderPanel .tabUnselected{\n border: 1px solid #ccc; \n background-color: #eee;\n margin: 0px;\n padding-top: 5px;\n padding-bottom: 0px;\n padding-left: 2px;\n padding-right: 2px;\n -moz-border-radius-topleft: 1em; \n -moz-border-radius-topright: 1em;}\n\n#sidebarOptions { \n border-top: 1px solid #ccc; \n border-left: 1px solid #ccc; \n border-bottom: 3px solid #ccc; \n border-right: 3px solid #ccc; \n padding: 0.5em; \n margin: 0.5em; \n -moz-border-radius: 1em; }\n\n#sidebarOptions .button {\n margin: 1px;\n border-color:white;\n border-top: 1px solid #ccc; \n border-left: 1px solid #ccc; \n border-bottom: 2px solid #ccc; \n border-right: 2px solid #ccc; \n}\n\n#sidebarOptions .button:hover {\n color: #000;\n background: #fff;\n border-top: 2px solid #ccc; \n border-left: 2px solid #ccc; \n border-bottom: 1px solid #ccc; \n border-right: 1px solid #ccc; \n}\n\n#sidebarOptions .button:active {\n color: #000;\n background: #fff;\n}\n/*}}}*/\n
/***\nTo use, add {{{[[Styles TagglyTagging]]}}} to your StyleSheet tiddler, or you can just paste the CSS in directly. See also ViewTemplate, EditTemplate and TagglyTagging.\n***/\n/*{{{*/\n.tagglyTagged li.listTitle { display:none;}\n.tagglyTagged li { display: inline; font-size:90%; }\n.tagglyTagged ul { margin:0px; padding:0px; }\n.tagglyTagging { padding-top:0.5em; }\n.tagglyTagging li.listTitle { display:none;}\n.tagglyTagging ul { margin-top:0px; padding-top:0.5em; padding-left:2em; margin-bottom:0px; padding-bottom:0px; }\n\n/* .tagglyTagging .tghide { display:inline; } */\n\n.tagglyTagging .button { display:none; margin-left:3px; margin-right:3px; }\n.tagglyTagging .button, .hidebutton { color:#aaa; font-size:90%; border:0px; padding-left:0.3em;padding-right:0.3em;}\n.tagglyTagging .button:hover, .hidebutton:hover { background:#eee; color:#888; }\n.selected .tagglyTagging .button { display:inline; }\n\n.tagglyLabel { color:#aaa; font-size:90%; }\n\n\n.editLabel { font-size:90%; padding-top:0.5em; }\n/*}}}*/\n
<<tabs txtMainTab Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>
A TiddlyWiki is like a blog because it's divided up into neat little chunks, but it encourages you to read it by hyperlinking rather than sequentially: if you like, a non-linear blog analogue that binds the individual microcontent items into a cohesive whole. I think that TiddlyWiki represents a novel medium for writing, and will promote it's own distinctive WritingStyle. This is the ThirdVersion of TiddlyWiki, which adds several NewFeatures. There are also several TiddlyWikiAdaptations by other developers based on earlier versions.
[[TiddlyWikiTips.com]] is a tips site developed by [[Jim Barr]] to provide Tips for TiddlyWiki users. [[TiddlyWikiTips.com]] is hosted on [[Flexihostings.net|http://flexihostings.net]] and uses TiddlyWiki.
Here are The TiddlyWiki Tips! \n\nClick on a Tip title at the left to open it. \n\nTips marked with a ({{{*}}} were either submitted or inspired by [[TiddlyWikiTips.com]] visitors!
Get all this tiddler simply using EricShulman's ImportTiddlersPlugin and selecting all tiddlers tagged [[Upload]].\n\n[[Upload]] is <<tagging Upload>>
This form is provided for uploading any file with the store.php script describe in UploadPlugin\n----\n<html><center>\n<form enctype="multipart/form-data" action="http://web.bidix.info/TiddlyWiki/store2.php" method="post">\n <input type="hidden" name="MAX_FILE_SIZE" value="3000000" />\nThis file : <input name="userfile" type="file" /><p>\nOptions* : <input type="text" name="UploadPlugin" size=70 value="backupDir=backupDir;user=UPLOAD_USER;password=UPLOAD_PASSWORD;" /><p>\n <input type="submit" value="Upload" />\n</form></center>\n</html>\n----\n * Don't save your real username and password in any tiddler
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |\n| 24/4/2006 13:42:37 | Wildcat | [[/|http://127.0.0.1/]] | [[store.php|store.php]] | | index.html | |\n| 24/4/2006 14:37:42 | Wildcat | [[/|http://127.0.0.1/]] | [[store.php|store.php]] | | index.html | | Ok |\n| 24/4/2006 14:38:30 | Wildcat | [[/|http://127.0.0.1/]] | [[store.php|store.php]] | | index.html | |\n| 29/3/2008 11:57:52 | YourName | [[index.html|file:///D:/wildcat.homenet/index.html]] | [[store.php|store.php]] | | index.html | |
!Options used by UploadPlugin\nUsername: <<option txtUploadUserName>>\nPassword: <<option pasUploadPassword>>\n\nUrl of the [[store.php]] script^^(1)^^: <<option txtUploadStoreUrl 50>>\nRelative Directory to store the file^^(2)^^: <<option txtUploadDir 50>>\nFilename of the uploaded file^^(3)^^: <<option txtUploadFilename 40>>\nDirectory to backup file on webserver^^(4)^^: <<option txtUploadBackupDir>>\n\n^^(1)^^Mandatory either in UploadOptions or in MacroParameter\n^^(2)^^If empty stores in the [[store.php]] directory\n^^(3)^^If empty takes the actual filename\n^^(4)^^If empty existing the file with same name on webserver will be overwriten\n\n!Upload\n{{{<<upload [[UploadStoreUrl]}}}^^(1)^^{{{ [UploadFilename] [UploadBackupDir]]>>}}}\n\n<<upload>>
/***\n<<tiddler UploadPluginDoc>>\n!Code\n***/\n//{{{\nversion.extensions.UploadPlugin = {\n major: 3, minor: 3, revision: 1, \n date: new Date(2006,3,30),\n type: 'macro',\n source: 'http://tiddlywiki.bidix.info/#UploadPlugin',\n docs: 'http://tiddlywiki.bidix.info/#UploadPluginDoc'\n};\n//}}}\n\n////+++!![config.lib.file]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.file) config.lib.file= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.file.dirname = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(0, lastpos);\n } else {\n return filePath.substring(0, filePath.lastIndexOf("\s\s"));\n }\n};\nconfig.lib.file.basename = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("#")) != -1) \n filePath = filePath.substring(0, lastpos);\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(lastpos + 1);\n } else\n return filePath.substring(filePath.lastIndexOf("\s\s")+1);\n};\nwindow.basename = function() {return "@@deprecated@@";};\n//}}}\n////===\n\n////+++!![config.lib.log]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.log) config.lib.log= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.Log = function(tiddlerTitle, logHeader) {\n if (version.major < 2)\n this.tiddler = store.tiddlers[tiddlerTitle];\n else\n this.tiddler = store.getTiddler(tiddlerTitle);\n if (!this.tiddler) {\n this.tiddler = new Tiddler();\n this.tiddler.title = tiddlerTitle;\n this.tiddler.text = "| !date | !user | !location |" + logHeader;\n this.tiddler.created = new Date();\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[tiddlerTitle] = this.tiddler;\n else\n store.addTiddler(this.tiddler);\n }\n return this;\n};\n\nconfig.lib.Log.prototype.newLine = function (line) {\n var now = new Date();\n var newText = "| ";\n newText += now.getDate()+"/"+(now.getMonth()+1)+"/"+now.getFullYear() + " ";\n newText += now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()+" | ";\n newText += config.options.txtUserName + " | ";\n var location = document.location.toString();\n var filename = config.lib.file.basename(location);\n if (!filename) filename = '/';\n newText += "[["+filename+"|"+location + "]] |";\n this.tiddler.text = this.tiddler.text + "\sn" + newText;\n this.addToLine(line);\n};\n\nconfig.lib.Log.prototype.addToLine = function (text) {\n this.tiddler.text = this.tiddler.text + text;\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[this.tiddler.tittle] = this.tiddler;\n else {\n store.addTiddler(this.tiddler);\n story.refreshTiddler(this.tiddler.title);\n store.notify(this.tiddler.title, true);\n }\n if (version.major < 2)\n store.notifyAll(); \n};\n//}}}\n////===\n\n////+++!![config.lib.options]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.options) config.lib.options = {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\n\nconfig.lib.options.init = function (name, defaultValue) {\n if (!config.options[name]) {\n config.options[name] = defaultValue;\n saveOptionCookie(name);\n }\n};\n//}}}\n////===\n\n////+++!![PasswordTweak]\n\n//{{{\nversion.extensions.PasswordTweak = {\n major: 1, minor: 0, revision: 2, date: new Date(2006,3,11),\n type: 'tweak',\n source: '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 var optNode = nodes[t].getAttribute("option");\n if (opt == optNode) \n nodes[t][valueField] = this[valueField];\n }\n }\n return(true);\n};\n\nconfig.macros.option.handler = function(place,macroName,params)\n{\n var opt = params[0];\n var size = 15;\n if (params[1])\n size = params[1];\n if(config.options[opt] === undefined) {\n return;}\n var c;\n switch(opt.substr(0,3)) {\n case "txt":\n c = document.createElement("input");\n c.onkeyup = this.onChangeOption;\n c.setAttribute ("option",opt);\n c.size = size;\n c.value = config.options[opt];\n place.appendChild(c);\n break;\n case "pas":\n // input password\n c = document.createElement ("input");\n c.setAttribute("type",config.macros.option.passwordType);\n c.onkeyup = this.onChangeOption;\n c.setAttribute("option",opt);\n c.size = size;\n c.value = config.options[opt];\n place.appendChild(c);\n // checkbox link with this password "save this password on this computer"\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option","chk"+opt);\n place.appendChild(c);\n c.checked = config.options["chk"+opt];\n // text savePasswordCheckboxLabel\n place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));\n break;\n case "chk":\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option",opt);\n place.appendChild(c);\n c.checked = config.options[opt];\n break;\n }\n};\n//}}}\n/***\n!! Option cookie stuff\n***/\n//{{{\nwindow.loadOptionsCookie_orig_PasswordTweak = window.loadOptionsCookie;\nwindow.loadOptionsCookie = function()\n{\n var cookies = document.cookie.split(";");\n for(var c=0; c<cookies.length; c++) {\n var p = cookies[c].indexOf("=");\n if(p != -1) {\n var name = cookies[c].substr(0,p).trim();\n var value = cookies[c].substr(p+1).trim();\n switch(name.substr(0,3)) {\n case "txt":\n config.options[name] = unescape(value);\n break;\n case "pas":\n config.options[name] = unescape(value);\n break;\n case "chk":\n config.options[name] = value == "true";\n break;\n }\n }\n }\n};\n\nwindow.saveOptionCookie_orig_PasswordTweak = window.saveOptionCookie;\nwindow.saveOptionCookie = function(name)\n{\n var c = name + "=";\n switch(name.substr(0,3)) {\n case "txt":\n c += escape(config.options[name].toString());\n break;\n case "chk":\n c += config.options[name] ? "true" : "false";\n // is there an option link with this chk ?\n if (config.options[name.substr(3)]) {\n saveOptionCookie(name.substr(3));\n }\n break;\n case "pas":\n if (config.options["chk"+name]) {\n c += escape(config.options[name].toString());\n } else {\n c += "";\n }\n break;\n }\n c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";\n document.cookie = c;\n};\n//}}}\n/***\n!! Initializations\n***/\n//{{{\n// define config.options.pasPassword\nif (!config.options.pasPassword) {\n config.options.pasPassword = 'defaultPassword';\n window.saveOptionCookie('pasPassword');\n}\n// since loadCookies is first called befor password definition\n// we need to reload cookies\nwindow.loadOptionsCookie();\n//}}}\n////===\n\n////+++!![config.macros.upload]\n\n//{{{\nconfig.macros.upload = {\n accessKey: "U",\n formName: "UploadPlugin",\n contentType: "text/html;charset=UTF-8",\n defaultStoreScript: "store.php"\n};\n\n// only this two configs need to be translated\nconfig.macros.upload.messages = {\n aboutToUpload: "About to upload TiddlyWiki to %0",\n errorDownloading: "Error downloading",\n errorUploadingContent: "Error uploading content",\n fileNotFound: "file to upload not found",\n fileNotUploaded: "File %0 NOT uploaded",\n mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\n urlParamMissing: "url param missing",\n rssFileNotUploaded: "RssFile %0 NOT uploaded",\n rssFileUploaded: "Rss File uploaded to %0"\n};\n\nconfig.macros.upload.label = {\n promptOption: "Save and Upload this TiddlyWiki with UploadOptions",\n promptParamMacro: "Save and Upload this TiddlyWiki in %0",\n saveLabel: "save to web", \n saveToDisk: "save to disk",\n uploadLabel: "upload" \n};\n\nconfig.macros.upload.handler = function(place,macroName,params){\n // parameters initialization\n var storeUrl = params[0];\n var toFilename = params[1];\n var backupDir = params[2];\n var uploadDir = params[3];\n var username = params[4];\n var password; // for security reason no password as macro parameter\n var label;\n if (document.location.toString().substr(0,4) == "http")\n label = this.label.saveLabel;\n else\n label = this.label.uploadLabel;\n var prompt;\n if (storeUrl) {\n prompt = this.label.promptParamMacro.toString().format([this.dirname(storeUrl)]);\n }\n else {\n prompt = this.label.promptOption;\n }\n createTiddlyButton(place, label, prompt, \n function () {\n config.macros.upload.upload(storeUrl, toFilename, uploadDir, backupDir, username, password); \n return false;}, \n null, null, this.accessKey);\n};\nconfig.macros.upload.UploadLog = function() {\n return new config.lib.Log('UploadLog', " !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |" );\n};\nconfig.macros.upload.UploadLog.prototype = config.lib.Log.prototype;\nconfig.macros.upload.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {\n var line = " [[" + config.lib.file.basename(storeUrl) + "|" + storeUrl + "]] | ";\n line += uploadDir + " | " + toFilename + " | " + backupDir + " |";\n this.newLine(line);\n};\nconfig.macros.upload.UploadLog.prototype.endUpload = function() {\n this.addToLine(" Ok |");\n};\nconfig.macros.upload.basename = config.lib.file.basename;\nconfig.macros.upload.dirname = config.lib.file.dirname;\nconfig.macros.upload.upload = function(storeUrl, toFilename, uploadDir, backupDir, username, password)\n{\n // parameters initialization\n storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);\n toFilename = (toFilename ? toFilename : config.options.txtUploadFilename);\n if (toFilename === '') {\n toFilename = config.lib.file.basename(document.location.toString());\n }\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\n clearMessage();\n // only for forcing the message to display\n if (version.major < 2)\n store.notifyAll();\n if (!storeUrl) {\n alert(config.macros.upload.messages.urlParamMissing);\n return;\n }\n \n var log = new this.UploadLog();\n log.startUpload(storeUrl, toFilename, uploadDir, backupDir);\n if (document.location.toString().substr(0,5) == "file:") {\n saveChanges();\n }\n displayMessage(config.macros.upload.messages.aboutToUpload.format([this.dirname(storeUrl)]), this.dirname(storeUrl));\n this.uploadChanges(storeUrl, toFilename, uploadDir, backupDir, username, password);\n if(config.options.chkGenerateAnRssFeed) {\n //var rssContent = convertUnicodeToUTF8(generateRss());\n var rssContent = generateRss();\n var rssPath = toFilename.substr(0,toFilename.lastIndexOf(".")) + ".xml";\n this.uploadContent(rssContent, storeUrl, rssPath, uploadDir, '', username, password, \n function (responseText) {\n if (responseText.substring(0,1) != '0') {\n displayMessage(config.macros.upload.messages.rssFileNotUploaded.format([rssPath]));\n }\n else {\n if (uploadDir) {\n rssPath = uploadDir + "/" + config.macros.upload.basename(rssPath);\n } else {\n rssPath = config.macros.upload.basename(rssPath);\n }\n displayMessage(config.macros.upload.messages.rssFileUploaded.format(\n [config.macros.upload.dirname(storeUrl)+"/"+rssPath]), config.macros.upload.dirname(storeUrl)+"/"+rssPath);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n });\n }\n return;\n};\n\nconfig.macros.upload.uploadChanges = function(storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var original;\n if (document.location.toString().substr(0,4) == "http") {\n original = 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 revised = revised.replace(new RegExp("<title>[^<]*</title>", "im"),"<title>"+ newSiteTitle +"</title>");\n var response = this.uploadContent(revised, storeUrl, toFilename, uploadDir, backupDir, \n username, password, function (responseText) {\n if (responseText.substring(0,1) != '0') {\n alert(responseText);\n displayMessage(config.macros.upload.messages.fileNotUploaded.format([getLocalPath(document.location.toString())]));\n }\n else {\n if (uploadDir !== '') {\n toFilename = uploadDir + "/" + config.macros.upload.basename(toFilename);\n } else {\n toFilename = config.macros.upload.basename(toFilename);\n }\n displayMessage(config.macros.upload.messages.mainFileUploaded.format(\n [config.macros.upload.dirname(storeUrl)+"/"+toFilename]), config.macros.upload.dirname(storeUrl)+"/"+toFilename);\n var log = new config.macros.upload.UploadLog();\n log.endUpload();\n store.setDirty(false);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n }\n );\n};\n\nconfig.macros.upload.uploadContent = function(content, storeUrl, toFilename, uploadDir, backupDir, \n username, password, callbackFn) {\n var boundary = "---------------------------"+"AaB03x"; \n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n if (window.netscape){\n try {\n if (document.location.toString().substr(0,4) != "http") {\n 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 = "\sr\sn";\n sheader += "--" + boundary + "\sr\snContent-disposition: form-data;name=\s"";\n sheader += config.macros.upload.formName +"\s"\sr\sn\sr\sn";\n sheader += "backupDir="+backupDir\n +";user=" + username \n +";password=" + password\n +";uploaddir=" + uploadDir\n + ";;\sr\sn"; \n sheader += "\sr\sn" + "--" + boundary + "\sr\sn";\n sheader += "Content-disposition: form-data;name=\s"userfile\s";filename=\s""+toFilename+"\s"\sr\sn";\n sheader += "Content-Type: " + config.macros.upload.contentType + "\sr\sn";\n sheader += "Content-Length: " + content.length + "\sr\sn\sr\sn";\n // compose trailer data\n var strailer = new String();\n strailer = "\sr\sn--" + boundary + "--\sr\sn";\n var data;\n data = sheader + content + strailer;\n //request.open("POST", storeUrl, true, username, password);\n request.open("POST", storeUrl, true);\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if (request.status == 200)\n callbackFn(request.responseText);\n else\n alert(config.macros.upload.messages.errorUploadingContent);\n }\n };\n request.setRequestHeader("Content-Length",data.length);\n request.setRequestHeader("Content-Type","multipart/form-data; boundary="+boundary);\n request.send(data); \n};\n\n\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 request.open("GET", document.location.toString(), true);\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if(request.status == 200) {\n config.macros.upload.uploadChangesFrom(request.responseText, uploadUrl, \n uploadToFilename, uploadDir, uploadBackupDir, username, password);\n }\n else\n alert(config.macros.upload.messages.errorDownloading.format(\n [document.location.toString()]));\n }\n };\n request.send(null);\n};\n\n//}}}\n////===\n\n////+++!![Initializations]\n\n//{{{\nconfig.lib.options.init('txtUploadStoreUrl','store.php');\nconfig.lib.options.init('txtUploadFilename','');\nconfig.lib.options.init('txtUploadDir','');\nconfig.lib.options.init('txtUploadBackupDir','');\nconfig.lib.options.init('txtUploadUserName',config.options.txtUserName);\nconfig.lib.options.init('pasUploadPassword','');\nconfig.shadowTiddlers.UploadPluginDoc = "[[Full Documentation|http://tiddlywiki.bidix.info/l#UploadPluginDoc ]]\sn"; \n\n\n//}}}\n////===\n\n////+++!![Core Hijacking]\n\n//{{{\nconfig.macros.saveChanges.label_orig_UploadPlugin = config.macros.saveChanges.label;\nconfig.macros.saveChanges.label = config.macros.upload.label.saveToDisk;\n//}}}\n////===
/***\n|''Name:''|UploadPlugin|\n|''Type:''|Plugin|\n|''Version:''|3.3.1 (30/03/2006)|\n|''Source:''|[[TiddlyWiki.BidiX.info/#UploadPlugin|http://tiddlywiki.BidiX.info/#UploadPlugin]]|\n|''Documentation:''|[[TiddlyWiki.BidiX.info/#UploadPluginDoc|http://tiddlywiki.BidiX.info/#UploadPluginDoc]]|\n|''Author:''|BidiX[at]BidiX.info |\n|''Required:''|TW 2.0.6 |\n\n!Description\nUploadPlugin, with [[store.php]], provides @@upload@@ and @@save to web@@ functions. See HowToUpload ([[HowToUpload|http://TiddlyWiki.bidix.info/#HowToUpload]]).\nUploadPlugin uses Username and Password from UploadOptions stored in cookies to authenticate itself to [[store.php]].\nFrench translation available as a separate tiddler UploadPluginMsgFR\n\n!!UploadPlugin\n*If the TiddlyWiki is viewed from @@local disk@@ :\n**{{{<<saveChanges>>}}} \n***display as ''save to disk''\n***work as usual\n**{{{<<upload>>}}}\n***display as ''upload''\n***after saving to disk, upload in the storeUrl directory.\n*If the TiddlyWiki is viewed from @@website@@ and is @@readOnly@@ (in core TiddlyWiki since 2.0.6) :\n**{{{<<saveChanges>>}}} \n***print nothing\n***has been disabled\n**{{{<<upload>>}}}\n***display as '''save to web''\n***save in the uploadDir directory.\n*If GenerateAnRssFeed in AdvancedOptions is set :\n**generate the content of the RSSFeed \n**upload the RssFile in uploadDir directory\n**Caution : use the SiteUrl tiddler to specify the right url of the TiddlyWiki in the generated RssFile\n*DisplayMessage\n*Log upload action in UploadLog\nhint : if UploadLog is the first tiddler in the Timeline Tab, no tiddler has been updated since last upload.\n\n!![[store.php]]\n*UserVariables to set :\n//{{{\n$AUTHENTICATE_USER = true; // true | false\n$USERS = array(\n 'UserName1'=>'Password1', \n 'UserName2'=>'Password2', \n 'UserName3'=>'Password3'); // set usernames and strong passwords\n$DEBUG = false; // true | false\n//}}}\n*method GET\n**display an information page\n*method POST\n**if $~AUTHENTICATE_USER is ''true''\n***presence and value of user and password are checked with $USER and $PASSWORD \n**if toFilename already exists and backDir parameter specified\n***rename toFilename to backupDir/toFilename.AAAAMMDD.HHSS.html\n**copy temporaryUploadedFile to toFilename\n** return status\n\n!Usage : \n{{{\n<<upload>>\n uses UploadOptions saved in cookies :\n txtUploadUserName: username\n pasUploadPassword : password\n txtUploadStoreUrl : store script\n txtUploadDir : relative path for upload directory\n txtUploadFilename : upload filename\n txtUploadBackupDir : relative path for backup directory\n\n<<upload [storeUrl [toFilename [backupDir [uploadDir [username]]]]]>>\n optional positional parameters can be passed to overwrite UploadOptions in this order. \n}}}\n\nInstall the {{{<<upload ... >>}}} macro in SideBarOptions just below {{{<<saveChanges>>}}} macro.\n\n\n!User manual\nSee HowToUpload\n\n!Installation :\n*Install the UploadPlugin as usual\n*Upload the [[store.php]] file on your php aware webserver in your TiddlyWiki directory\n*Protect your server against malicious upload. Two approaches :\n**set $~AUTHENTICATE_USER to true in the [[store.php]] script\n***configure $USER and $PASSWORD in the [[store.php]] script on your webserver\n***set UploadOptions in conformity with [[store.php]]\n**Use server protection :\n***for Apache web server ([[for detail see Apache documentation|http://httpd.apache.org/docs/1.3/howto/htaccess.html]]) : \n****configure and upload the [[.htaccess]] [[.passwd]]\n***for other web servers see the appropriate documentation\n*Configure an upload button, for example in the SideBarOptions\n!Suppported Browser\n*Firefox : tested Ok\n*Internet Explorer : tested Ok\n*Safari : reported ok on OS X\n*Others : Not tested, please report status.\n\n!Revision history\n*V 3.3.1 (30/03/2006)\n**bug in backup folder when uploading rssfile fixed\n*V 3.3.0 (12/03/2006)\n**Code refactoring\n**suppress saveChanges hijacking\n*V3.2.2 (25/02/2006)\n**Use PasswordTweak 1.0.1\n**uploaddir is a relative path\n**backupdir is a relative path\n+++[previous revisions]\n*V3.2.1 (13/02/2006)\n**name and password added to open.request (Thanks to TedPavlic)\n*V3.2.0 (14/02/2006)\n**Use PassworDTweak (http://tiddlyWiki.bidix.info/#PasswordTweak) for password\n*V3.1.0 (12/02/2006)\n**UploadOptions in Cookies\n**Username and password from UploadOptions pass to store.php script for authentification check\n*V3.0.3 (03/02/2006)\n**Firefox 1.5.0.1 crashes due to global var fixed\n*V3.0.2 (25-Jan-2006)\n**HTTPS compatible\n*V3.0.1 (18-Jan-2006)\n**UTF8toUnicode conversion problem in Firefox\n*V3.0.0 (15-Jan-2006)\n**Asynchronous upload\n**Synchronous upload before unload of the page\n**All strings extracted in macro config\n**Compatibility checked with TW 2.0.2 & TW 1.2.39 for both FF 1.5 and IE 6\n*V2.0.2 (8-Jan-2006)\n**conversion of SiteTitle and SiteSubtitle in web page Title\n*V2.0.1 (8-Jan-2006)\n**Compatibilty with TiddlyWiki 2.0.1\n*V2.0.0 (3-Jan-2006)\n**Save to web\n**Compatibilty with TiddlyWiki 1.2.39 and TiddlyWiki 2.0.0 Beta 6\n*v1.1.0 (27-Dec-2005)\n**Upload RSS File\n*v1.0.3 (26-Dec-2005)\n**UploadLog tiddler\n*v1.0.2 (24-Dec-2005)\n**Optional parameter toFilename\n**Optional parameter backupDir\n*v1.0.1 (23-Dec-2005)\n**reformatting code\n* v1.0.0 (17-Dec-2005)\n** first public working version\n===\n\n
/***\n<<tiddler UploadToFileMacroDoc>>\n!Code\n***/\n//{{{\nversion.extensions.UploadToFileMacro = {\n major: 1, minor: 0, revision: 0, \n date: new Date(2006,3,13),\n type: 'macro',\n source: 'http://tiddlywiki.bidix.info/#UploadToFilePlugin',\n docs: 'http://tiddlywiki.bidix.info/#UploadToFilePluginDoc'\n};\n\nconfig.macros.uploadToFile = {\n label: "uploadToFile",\n prompt: "upload tiddler '%0' to file '%1' ",\n warning: "Are you sure you want to upload '%0'?",\n dirname: config.lib.file.dirname,\n basename: config.lib.file.dirname\n};\n\nconfig.macros.uploadToFile.messages = {\n fileUploaded: "tiddler '%0' uploaded to file '%1'",\n fileNotUploaded: "tiddler '%0' NOT uploaded"\n};\n\nconfig.macros.uploadToFile.handler = function(place, macroName, params, wikifier,paramString, tiddler) {\n // parameters initialization\n var toFilename = params[0];\n var tiddlerTitle = params[1];\n if (!tiddlerTitle) { \n tiddlerTitle = tiddler.title;\n } else {\n tiddler = store.getTiddler(tiddlerTitle);\n }\n if (!toFilename) { \n toFilename = tiddlerTitle;\n } \n var prompt = this.prompt.format([tiddlerTitle, toFilename]);\n createTiddlyButton(place, this.label, this.prompt.format([tiddlerTitle, toFilename]), \n function () {\n config.macros.uploadToFile.upload(tiddler, toFilename); \n return false;}, \n null, null, null);\n};\n\nconfig.macros.uploadToFile.upload = function(tiddler, toFilename, storeUrl, toFilename, uploadDir, backupDir, username, password) {\n var uploadIt = true; \n if (this.warning)\n uploadIt = confirm(this.warning.format([tiddler.title])); \n if (uploadIt) {\n if (!tiddler) {\n alert("Tiddler not found.");\n return;\n }\n if (!config.macros.upload.uploadContent) {\n alert ("no UploadPlugin extension");\n return;\n }\n // parameters initialization\n storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);\n toFilename = (toFilename ? toFilename : tiddler.title);\n backupDir = (backupDir ? backupDir : config.options.txtUploadBackupDir);\n uploadDir = (uploadDir ? uploadDir : config.options.txtUploadDir);\n username = (username ? username : config.options.txtUploadUserName);\n password = (password ? password :config.options.pasUploadPassword); \n config.macros.upload.uploadContent(tiddler.text, storeUrl, toFilename, uploadDir, backupDir, username, password, \n function (responseText) {\n if (responseText.substring(0,1) != '0') {\n displayMessage(config.macros.uploadToFile.messages.fileNotUploaded.format([tiddler.title]));\n }\n else {\n if (uploadDir) {\n toFilename = uploadDir + "/" + config.macros.uploadToFile.basename(toFilename);\n } \n displayMessage(config.macros.uploadToFile.messages.fileUploaded.format(\n [tiddler.title, config.macros.uploadToFile.dirname(storeUrl)+"/"+toFilename]), config.macros.upload.dirname(storeUrl)+"/"+toFilename);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n });\n }\n return false;\n};\n\nconfig.shadowTiddlers.UploadToFileMacroDoc= "[[Full Documentation|http://tiddlywiki.bidix.info/l#UploadToFileMacroDoc]]\sn"; \n//}}}
|''Name:''|UploadToFileMacro|\n|''Type:''|Macro|\n|''Version:''|1.0.0 (14/03/2006)|\n|''Source:''|[[TiddlyWiki.BidiX.info/#UploadToFileMacro|http://tiddlywiki.BidiX.info/#UploadToFileMacro]]|\n|''Documentation:''|[[TiddlyWiki.BidiX.info/#UploadToFileMacroDoc|http://tiddlywiki.BidiX.info/#UploadToFileMacroDoc]]|\n|''Author:''|BidiX[at]BidiX.info |\n|''Required:''|[[UploadPlugin|http://tiddlywiki.BidiX.info/#UploadPlugin]] |\n\n!Description\nUpload a tiddler as a file using UploadPlugin context. Used with the SimonBaird's RunMacroIfTagged in [[ViewTemplate|BidiXStyleViewTemplate]] provides a new command in the tiddler toolbar.\n\n!Usage\n{{{\n <<uploadToFile>>\n <<uploadTofile [filename [tiddlerTitle]]>>\n \n tiddlerTitle: if omitted the title of the current tiddler \n filename: if omitted the title of the current tiddler\n\n}}}\n\n!Revision history\n* v1.0.0 (14/03/2006)\n** initial release\n
<div class='toolbar' macro='toolbar -closeTiddler closeOthers +editTiddler permalink jump newHere'></div>\n<div class='title' macro='view title'></div>\n<div class='tagging' macro='tagging'></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>
\n!!!Wildcat, он же Дикий Кошк.\n\nАдминистратор хаба Кошкин дом. \n\n//Имя в оффлайне: Панин Рустам\nICQ: 11359066\ne-mail, Jabber, GoogleTalk, MSN: rustam@panin.su\n
<div class='toolbar' macro='toolbar -closeTiddler closeOthers +editTiddler permalink references jump newHere'></div>\n<div class='title' macro='view title'></div>\n<div class='subtitle'>modified <span macro='view modified date [[DD MMM YYYY]]'></span>, created <span macro='view created date [[DD MMM YYYY]]'></span></div>\n<div class='tagging' macro='tagging'></div>\n<div class='tagged' macro='tags'></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>
!!!andreich, он же Андреич\n\nАдминистратор хаба Атлантида. \n\n//Имя в оффлайне: N/A\nICQ: N/A\ne-mail: N/A\nтелефон: N/A//\n\n
config.macros.listTags = { text: "Hello" };\nconfig.macros.listTags.handler = function(place,macroName,params)\n{\n var tagged = store.getTaggedTiddlers(params[0],params[1]); \n//<< Second parameter is field to sort by (eg, title, modified, modifier or text)\n var ul = createTiddlyElement(place,"ul",null,null,"");\n for(var r=0;r<tagged.length;r++)\n {\n var li = createTiddlyElement(ul,"li",null,null,"");\n createTiddlyLink(li,tagged[r].title,true);\n }\n}\n
<?php\n/***\n! User settings\nEdit these lines according to your need\n***/\n//{{{\n$AUTHENTICATE_USER = true; // true | false\n$USERS = array(\n 'UserName1'=>'Password1', \n 'UserName2'=>'Password2', \n 'UserName3'=>'Password3'); // set usernames and strong passwords\n$DEBUG = false; // true | false\n//}}}\n/***\n!Code\nNo change needed under\n***/\n//{{{\n\n/***\n * store.php - upload a file in this directory\n * version :1.4.1 - 15/03/2006 - BidiX@BidiX.info\n * \n * see : \n * http://tiddlywiki.bidi.info/#UploadPlugin for usage\n * http://www.php.net/manual/en/features.file-upload.php \n * for détails on uploading files\n * usage : \n * POST \n * UploadPlugin[backupDir=<backupdir>;user=<user>;password=<password>;uploadir=<uploaddir>]\n * userfile <file>\n * GET\n *\n * Revision history\n * v 1.4.1 - 15/03/2006\n * add chmo 0664 on the uploadedFile\n * v 1.4 - 23/02/2006 :\n * add uploaddir option : a path for the uploaded file relative to the current directory\n * backupdir is a relative path\n * make recusively directories if necessary for backupDir and uploadDir\n * v 1.3 - 17/02/2006 :\n * presence and value of user are checked with $USERS Array (thanks to PauloSoares)\n * v 1.2 - 12/02/2006 : \n * POST \n * UploadPlugin[backupDir=<backupdir>;user=<user>;password=<password>;]\n * userfile <file>\n * if $AUTHENTICATE_USER\n * presence and value of user and password are checked with \n * $USER and $PASSWORD\n * v 1.1 - 23/12/2005 : \n * POST UploadPlugin[backupDir=<backupdir>] userfile <file>\n * v 1.0 - 12/12/2005 : \n * POST userfile <file>\n *\n * Copyright (c) BidiX@BidiX.info 2005-2006\n ***/\n//}}}\n\n//{{{\n\nif ($_SERVER['REQUEST_METHOD'] == 'GET') {\n /*\n * GET Request\n */\n ?>\n <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n <html>\n <head>\n <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >\n <title>BidiX.info - TiddlyWiki UploadPlugin - Store script</title>\n </head>\n <body>\n <p>\n <p>store.php V 1.4\n <p>BidiX@BidiX.info\n <p>&nbsp;</p>\n <p>&nbsp;</p>\n <p>&nbsp;</p>\n <p align="center">This page is designed to upload a <a href="http://www.tiddlywiki.com/">TiddlyWiki<a>.</p>\n <p align="center">for details see : <a href="http://TiddlyWiki.bidix.info/#HowToUpload">TiddlyWiki.bidix.info/#HowToUpload<a>.</p> \n </body>\n </html>\n <?php\n}\nelse {\n /*\n * POST Request\n */\n \n // Recursive mkdir\n function mkdirs($dir) {\n if( is_null($dir) || $dir === "" ){\n return false;\n }\n if( is_dir($dir) || $dir === "/" ){\n return true;\n }\n if( mkdirs(dirname($dir)) ){\n return mkdir($dir);\n }\n return false;\n }\n \n // var definitions\n $uploadDir = './';\n $uploadDirError = false;\n $backupError = false;\n $optionStr = $_POST['UploadPlugin'];\n $optionArr=explode(';',$optionStr);\n $options = array();\n $backupFilename = '';\n $filename = $_FILES['userfile']['name'];\n \n // get options\n foreach($optionArr as $o) {\n list($key, $value) = split('=', $o);\n $options[$key] = $value;\n }\n \n // authenticate User\n if ((!$AUTHENTICATE_USER) \n || (($options['user']) && ($options['password']) && ($USERS[$options['user']] == $options['password']))) {\n // make uploadDir\n if ($options['uploaddir']) {\n if (! is_dir($options['uploaddir'])) {\n mkdirs($options['uploaddir']);\n }\n if (! is_dir($options['uploaddir'])) {\n $uploadDirError = "uploadDir mkdir error";\n }\n $uploadDir = $uploadDir . $options['uploaddir'];\n if ($uploadDir{strlen($uploadDir)-1} != '/') {\n $uploadDir = $uploadDir . '/';\n }\n }\n if (!$uploadDirError) {\n // backup existing file\n if (file_exists($uploadDir . $_FILES['userfile']['name']) && ($options['backupDir'])) {\n if (! is_dir($options['backupDir'])) {\n mkdirs($options['backupDir']);\n if (! is_dir($options['backupDir'])) {\n $backupError = "backup mkdir error";\n }\n }\n $backupFilename = $options['backupDir'].'/'.substr($filename, 0, strpos($filename, '.'))\n .date('.Ymd.His').substr($filename,strpos($filename,'.'));\n $filename = $uploadDir . $_FILES['userfile']['name'];\n rename($filename, $backupFilename) or ($backupError = "rename error");\n }\n // move uploaded file to to uploadDir\n if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadDir . $_FILES['userfile']['name'])) {\n chmod($uploadDir . $_FILES['userfile']['name'], 0644);\n if (!$backupError) {\n if($DEBUG) {\n echo "debug mode \sn\sn";\n }\n echo "0 - File successfully loaded in " .$uploadDir . $_FILES['userfile']['name']. "\sn";\n if ($backupFilename)\n echo "backupFile=$backupFilename;\sn";\n } else {\n echo "BackupError : $backupError - File successfully loaded in " .$uploadDir . $_FILES['userfile']['name']. "\sn";\n }\n } \n else {\n echo "Error : " . $_FILES['error']." - File NOT uploaded !\sn";\n }\n }\n else {\n echo "UploadDirError : $uploadDirError - File NOT uploaded !\sn";\n }\n }\n else {\n echo "Error : UserName or Password do not match \sn";\n echo "UserName : [".$options['user']. "] Password : [". $options['password'] . "]\sn";\n }\n if ($DEBUG) {\n echo ("\snHere is some debugging info : \sn");\n echo("\s$filename : $filename \sn");\n echo("\s$backupFilename : $backupFilename \sn");\n print ("\s$_FILES : \sn");\n print_r($_FILES);\n print ("\s$options : \sn");\n print_r($options);\n }\n}\n//}}}\n?>